訓練)
一、RT-DETR 模型介紹在計算機視覺領域目標檢測作為一項基礎任務其性能的提升對于自動駕駛、視頻監(jiān)控、智能安防等應用至關重要。而目標檢測任務近年來一直被YOLO系列模型主導截止該文章發(fā)布目前YOLO已經(jīng)更新到了V11版本了這也預示著YOLO系列有很大的優(yōu)化空間。不過隨著大模型的進一步發(fā)展另一個分支Transformer架構也逐漸在CV領域嶄露頭角其中基于Transformer架構的多模態(tài)模型層出不窮VIT也在視覺分類任務上也取得了不錯的成績。這都進一步表示了Transformer在CV領域的大有可為。其中DETR便是第一個將Transformer架構應用在目標檢測領域的模型其創(chuàng)新性地將目標檢測任務轉化為一個序列生成問題移除了之前傳統(tǒng)模型依賴的NMS過程核心思想是利用Transformer的強大特征提取和序列建模能力直接對圖像中的目標進行定位和分類。 整體過程如下圖所示不過DETR雖然移除了NMS過程不過相比于YOLO系列還是在速度上要慢很多。為此由百度公司提出的新一代的RT-DETR模型在DETR的基礎上又進行了多項優(yōu)化。進一步解決了該問題。RT-DETR整體結構如下圖所示RT-DETR采用了高效的混合編碼器和IoU感知有效降低了計算成本、提高了檢測精度。在速度和精度方面均超過了YOLOV8。主要特點高效混合編碼器采用高效混合編碼器通過解耦尺度內(nèi)交互和跨尺度融合來處理多尺度特征。這種獨特的基于Vision Transformers的設計降低了計算成本并允許實時物體檢測。IoU 感知查詢選擇通過IoU感知查詢選擇改進了對象查詢初始化。這使得模型能夠?qū)W⒂趫鼍爸凶钕嚓P的對象從而提高檢測精度。推理速度可調(diào)支持通過使用不同的解碼器層靈活調(diào)整推理速度無需重新訓練。這種適應性有助于在各種實時目標檢測場景中的實際應用。RT-DETR 模型使用本文使用ultralytics框架進行測試和后續(xù)微調(diào)訓練其中ultralytics和pytorch的版本如下torch1.13.1cu116ultralytics8.3.0Ultralytics提供了不同尺度的預訓練RT-DETR模型RT-DETR-L53,0% AP auf COCO val2017, 114 FPS auf T4 GPURT-DETR-X54,8% AP auf COCO val2017, 74 FPS auf T4 GPU預訓練模型下載地址https://docs.ultralytics.com/de/models/rtdetr/模型使用測試圖片預測目標fromultralyticsimportRTDETR# Load a modelmodelRTDETR(rtdetr-l.pt)model.info()resultsmodel.predict(../img/1.png)results[0].show()可以觀察到就連手里拿著的手機都被檢測出來了效果確實非常不錯。二、微調(diào)訓練自定義的目標檢測數(shù)據(jù)集使用本專欄前面實驗YOLO-V10時標注的人臉數(shù)據(jù)集 這里你可以收集一些自定義的圖片然后根據(jù)下面文章中介紹的方式進行標注基于 YOLO V10 Fine-Tuning 訓練自定義的目標檢測模型微調(diào)訓練其中face.yaml文件內(nèi)容和上面文章YOLO-V10時的一致fromultralyticsimportRTDETR# 加載模型modelRTDETR(rtdetr-l.pt)# 訓練model.train(dataface.yaml,# 訓練配置文件epochs50,# 訓練的周期imgsz640,# 圖像的大小device[0],# 設備如果是 cpu 則是 devicecpuworkers0,lr00.01,# 學習率batch8,# 批次大小ampFalse# 是否啟用混合精度訓練)運行后可以看到打印的網(wǎng)絡結構from n params module arguments0-1125248ultralytics.nn.modules.block.HGStem[3,32,48]1-16155072ultralytics.nn.modules.block.HGBlock[48,48,128,3,6]2-111408ultralytics.nn.modules.conv.DWConv[128,128,3,2,1, False]3-16839296ultralytics.nn.modules.block.HGBlock[128,96,512,3,6]4-115632ultralytics.nn.modules.conv.DWConv[512,512,3,2,1, False]5-161695360ultralytics.nn.modules.block.HGBlock[512,192,1024,5,6, True, False]6-162055808ultralytics.nn.modules.block.HGBlock[1024,192,1024,5,6, True, True]7-162055808ultralytics.nn.modules.block.HGBlock[1024,192,1024,5,6, True, True]8-1111264ultralytics.nn.modules.conv.DWConv[1024,1024,3,2,1, False]9-166708480ultralytics.nn.modules.block.HGBlock[1024,384,2048,5,6, True, False]10-11524800ultralytics.nn.modules.conv.Conv[2048,256,1,1, None,1,1, False]11-11789760ultralytics.nn.modules.transformer.AIFI[256,1024,8]12-1166048ultralytics.nn.modules.conv.Conv[256,256,1,1]13-110torch.nn.modules.upsampling.Upsample[None,2,nearest]1471262656ultralytics.nn.modules.conv.Conv[1024,256,1,1, None,1,1, False]15[-2, -1]10ultralytics.nn.modules.conv.Concat[1]16-132232320ultralytics.nn.modules.block.RepC3[512,256,3]17-1166048ultralytics.nn.modules.conv.Conv[256,256,1,1]18-110torch.nn.modules.upsampling.Upsample[None,2,nearest]1931131584ultralytics.nn.modules.conv.Conv[512,256,1,1, None,1,1, False]20[-2, -1]10ultralytics.nn.modules.conv.Concat[1]21-132232320ultralytics.nn.modules.block.RepC3[512,256,3]22-11590336ultralytics.nn.modules.conv.Conv[256,256,3,2]23[-1,17]10ultralytics.nn.modules.conv.Concat[1]24-132232320ultralytics.nn.modules.block.RepC3[512,256,3]25-11590336ultralytics.nn.modules.conv.Conv[256,256,3,2]26[-1,12]10ultralytics.nn.modules.conv.Concat[1]27-132232320ultralytics.nn.modules.block.RepC3[512,256,3]28[21,24,27]17303907ultralytics.nn.modules.head.RTDETRDecoder[1,[256,256,256]]訓練結束后可以在runs目錄下面看到訓練的結果其中weights下面的就是訓練后保存的模型這里可以先看下訓練時loss的變化圖三、模型測試在runs\detect\train\weights下可以看到best.pt和last.pt兩個模型表示最佳和最終模型下面使用best.pt模型進行測試fromultralyticsimportRTDETRfrommatplotlibimportpyplotaspltimportos plt.rcParams[font.sans-serif][SimHei]# 測試圖片地址base_path../data/images# 加載模型modelRTDETR(runs/detect/train/weights/last.pt)forimg_nameinos.listdir(base_path):img_pathos.path.join(base_path,img_name)imageplt.imread(img_path)# 預測resultsmodel.predict(image,devicecpu)boxesresults[0].boxes.xyxy confsresults[0].boxes.conf axplt.gca()forindex,boxeinenumerate(boxes):x1,y1,x2,y2boxe[0],boxe[1],boxe[2],boxe[3]scoreconfs[index].item()ax.add_patch(plt.Rectangle((x1,y1),(x2-x1),(y2-y1),linewidth2,fillFalse,colorred))plt.text(xx1,yy1-10,s{:.2f}.format(score),fontsize15,colorwhite,bboxdict(facecolorblack,alpha0.5))plt.imshow(image)plt.show()