檢測(cè)模型介紹及微調(diào)訓(xùn)練)
一、RT-DETR 模型介紹在計(jì)算機(jī)視覺(jué)領(lǐng)域目標(biāo)檢測(cè)作為一項(xiàng)基礎(chǔ)任務(wù)其性能的提升對(duì)于自動(dòng)駕駛、視頻監(jiān)控、智能安防等應(yīng)用至關(guān)重要。而目標(biāo)檢測(cè)任務(wù)近年來(lái)一直被YOLO系列模型主導(dǎo)截止該文章發(fā)布目前YOLO已經(jīng)更新到了V11版本了這也預(yù)示著YOLO系列有很大的優(yōu)化空間。不過(guò)隨著大模型的進(jìn)一步發(fā)展另一個(gè)分支Transformer架構(gòu)也逐漸在CV領(lǐng)域嶄露頭角其中基于Transformer架構(gòu)的多模態(tài)模型層出不窮VIT也在視覺(jué)分類任務(wù)上也取得了不錯(cuò)的成績(jī)。這都進(jìn)一步表示了Transformer在CV領(lǐng)域的大有可為。其中DETR便是第一個(gè)將Transformer架構(gòu)應(yīng)用在目標(biāo)檢測(cè)領(lǐng)域的模型其創(chuàng)新性地將目標(biāo)檢測(cè)任務(wù)轉(zhuǎn)化為一個(gè)序列生成問(wèn)題移除了之前傳統(tǒng)模型依賴的NMS過(guò)程核心思想是利用Transformer的強(qiáng)大特征提取和序列建模能力直接對(duì)圖像中的目標(biāo)進(jìn)行定位和分類。 整體過(guò)程如下圖所示不過(guò)DETR雖然移除了NMS過(guò)程不過(guò)相比于YOLO系列還是在速度上要慢很多。為此由百度公司提出的新一代的RT-DETR模型在DETR的基礎(chǔ)上又進(jìn)行了多項(xiàng)優(yōu)化。進(jìn)一步解決了該問(wèn)題。RT-DETR整體結(jié)構(gòu)如下圖所示RT-DETR采用了高效的混合編碼器和IoU感知有效降低了計(jì)算成本、提高了檢測(cè)精度。在速度和精度方面均超過(guò)了YOLOV8。主要特點(diǎn)高效混合編碼器采用高效混合編碼器通過(guò)解耦尺度內(nèi)交互和跨尺度融合來(lái)處理多尺度特征。這種獨(dú)特的基于Vision Transformers的設(shè)計(jì)降低了計(jì)算成本并允許實(shí)時(shí)物體檢測(cè)。IoU 感知查詢選擇通過(guò)IoU感知查詢選擇改進(jìn)了對(duì)象查詢初始化。這使得模型能夠?qū)W⒂趫?chǎng)景中最相關(guān)的對(duì)象從而提高檢測(cè)精度。推理速度可調(diào)支持通過(guò)使用不同的解碼器層靈活調(diào)整推理速度無(wú)需重新訓(xùn)練。這種適應(yīng)性有助于在各種實(shí)時(shí)目標(biāo)檢測(cè)場(chǎng)景中的實(shí)際應(yīng)用。RT-DETR 模型使用本文使用ultralytics框架進(jìn)行測(cè)試和后續(xù)微調(diào)訓(xùn)練其中ultralytics和pytorch的版本如下torch1.13.1cu116ultralytics8.3.0Ultralytics提供了不同尺度的預(yù)訓(xùn)練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預(yù)訓(xùn)練模型下載地址https://docs.ultralytics.com/de/models/rtdetr/模型使用測(cè)試圖片預(yù)測(cè)目標(biāo)fromultralyticsimportRTDETR# Load a modelmodelRTDETR(rtdetr-l.pt)model.info()resultsmodel.predict(../img/1.png)results[0].show()可以觀察到就連手里拿著的手機(jī)都被檢測(cè)出來(lái)了效果確實(shí)非常不錯(cuò)。二、微調(diào)訓(xùn)練自定義的目標(biāo)檢測(cè)數(shù)據(jù)集使用本專欄前面實(shí)驗(yàn)YOLO-V10時(shí)標(biāo)注的人臉數(shù)據(jù)集 這里你可以收集一些自定義的圖片然后根據(jù)下面文章中介紹的方式進(jìn)行標(biāo)注基于 YOLO V10 Fine-Tuning 訓(xùn)練自定義的目標(biāo)檢測(cè)模型微調(diào)訓(xùn)練其中face.yaml文件內(nèi)容和上面文章YOLO-V10時(shí)的一致fromultralyticsimportRTDETR# 加載模型modelRTDETR(rtdetr-l.pt)# 訓(xùn)練model.train(dataface.yaml,# 訓(xùn)練配置文件epochs50,# 訓(xùn)練的周期imgsz640,# 圖像的大小device[0],# 設(shè)備如果是 cpu 則是 devicecpuworkers0,lr00.01,# 學(xué)習(xí)率batch8,# 批次大小ampFalse# 是否啟用混合精度訓(xùn)練)運(yùn)行后可以看到打印的網(wǎng)絡(luò)結(jié)構(gòu)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]]訓(xùn)練結(jié)束后可以在runs目錄下面看到訓(xùn)練的結(jié)果其中weights下面的就是訓(xùn)練后保存的模型這里可以先看下訓(xùn)練時(shí)loss的變化圖三、模型測(cè)試在runs\detect\train\weights下可以看到best.pt和last.pt兩個(gè)模型表示最佳和最終模型下面使用best.pt模型進(jìn)行測(cè)試fromultralyticsimportRTDETRfrommatplotlibimportpyplotaspltimportos plt.rcParams[font.sans-serif][SimHei]# 測(cè)試圖片地址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)# 預(yù)測(cè)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()