指南:從環(huán)境搭建到訓(xùn)練部署全流程解析)
做目標(biāo)檢測的朋友應(yīng)該都清楚YOLO系列在工業(yè)界的地位而YOLOv5在很長一段時間里是絕對的主流。不管是做安防、缺陷檢測還是自動駕駛感知很多項目最后都落在YOLOv5上。這篇文章我不打算復(fù)讀官方文檔而是從一個實際用過的角度把YOLOv5的安裝、訓(xùn)練、調(diào)試和部署完整捋一遍包含我踩過的坑和注意事項希望能幫剛接觸的人少走彎路。YOLOv5這個項目用起來其實很簡單但簡單的前提是你得把環(huán)境、數(shù)據(jù)格式、訓(xùn)練參數(shù)這幾塊搞明白。否則卡在安裝階段就夠你受的。我見過很多人裝了一天依賴最后發(fā)現(xiàn)是Python版本不對或者CUDA沒配好。這篇文章會覆蓋從環(huán)境準(zhǔn)備到模型導(dǎo)出部署的全流程適合剛?cè)腴T的同學(xué)也適合已經(jīng)跑通過但想優(yōu)化訓(xùn)練細(xì)節(jié)的人。1. 項目概覽與環(huán)境準(zhǔn)備1.1 YOLOv5是什么解決什么問題YOLOv5是一種基于單階段檢測思路的目標(biāo)檢測模型它的核心優(yōu)勢是速度快、精度高、部署方便。相比兩階段檢測器YOLOv5只需要一次前向就能同時輸出目標(biāo)框和類別概率在保持較高精度的同時把推理速度拉到實時級別。對很多業(yè)務(wù)場景來說比如生產(chǎn)線上的零件計數(shù)、園區(qū)里的車輛行人檢測、工地的安全帽佩戴檢測YOLOv5可以說是第一選擇。它的另一個特點是工程化做得非常好。官方倉庫把訓(xùn)練、驗證、推理、導(dǎo)出都封裝成了命令行工具幾乎不需要自己寫模型代碼。你只要準(zhǔn)備好標(biāo)注好的數(shù)據(jù)改一下配置文件就能訓(xùn)練出一個可用模型。這一點是早期YOLO版本不具備的也是YOLOv5能在社區(qū)里廣泛流行的重要原因。1.2 環(huán)境要求與依賴分析先說結(jié)論YOLOv5對硬件的要求不算高但也不低。如果你只用CPU推理那基本是個電腦就能跑但訓(xùn)練的話強(qiáng)烈建議有NVIDIA顯卡。顯存方面以默認(rèn)的YOLOv5s模型為例輸入尺寸640x640batch size設(shè)為16在8GB顯存上能跑但很緊張。我建議至少12GB顯存如果用YOLOv5l或者更大的模型最好上24GB。操作系統(tǒng)方面Windows、Linux、macOS都可以但我個人推薦Ubuntu系統(tǒng)尤其是用Docker部署的時候。Windows也能跑只是有些編譯依賴需要額外裝比如pycocotools在Windows下要裝預(yù)編譯版本否則會編譯報錯。Python版本建議3.8到3.11太老或太新的版本容易出現(xiàn)兼容性問題。PyTorch建議使用1.12以上的穩(wěn)定版我自己用的比較多的是PyTorch 1.13和2.0系列配合CUDA 11.7或12.1整體很穩(wěn)。如果你裝了GPU版PyTorch還需要對應(yīng)的NVIDIA驅(qū)動和CUDA runtime這些裝好后用nvidia-smi確認(rèn)一下。1.3 獲取代碼與安裝依賴YOLOv5的安裝分三步拉代碼、建虛擬環(huán)境、裝依賴。我一般會先用Anaconda創(chuàng)建獨立的虛擬環(huán)境避免把系統(tǒng)環(huán)境搞亂。conda create -n yolov5 python3.9 conda activate yolov5然后是拉取官方倉庫代碼git clone https://github.com/ultralytics/yolov5 cd yolov5接下來安裝依賴。官方提供了一個requirements.txt你可以直接pip install -r requirements.txt但這里有個小坑默認(rèn)的requirements.txt會把torch和torchvision也裝進(jìn)去。如果你已經(jīng)有可用的PyTorch比如已經(jīng)在其他環(huán)境里裝好對應(yīng)CUDA的版本建議把這兩行注釋掉只裝其他依賴。否則pip可能會重新裝一個CPU版或者不匹配的版本白白浪費下載時間。我自己習(xí)慣先手動裝PyTorch再裝其余依賴# 先裝PyTorch選擇匹配你CUDA的版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 再裝其他依賴 pip install -r requirements.txt裝完后跑一個簡單的檢測命令驗證環(huán)境python detect.py --weights yolov5s.pt --source data/images/bus.jpg如果沒有報錯并且在runs/detect/exp下生成了帶框的圖片說明安裝成功。1.4 驗證安裝以及常見環(huán)境坑第一次跑detect.py會自動下載yolov5s.pt權(quán)重如果網(wǎng)絡(luò)比較慢可以手動下載放到項目根目錄。另外國內(nèi)網(wǎng)絡(luò)有時候訪問GitHub不穩(wěn)定建議提前配置好代理或者從鏡像站下載。這里不展開你自己想辦法。驗證過程中我最常遇到的問題是torch.cuda.is_available()返回False。遇到這種情況先別急著卸載重裝按順序排查第一NVIDIA驅(qū)動是否正常運行nvidia-smi看看能不能輸出第二PyTorch是否裝了CUDA版pip list | grep torch看看版本號里有沒有cu標(biāo)記第三如果用的是conda環(huán)境確認(rèn)自己激活的是哪個Python。還有一個小細(xì)節(jié)首次運行會下載yolov5s.pt大約14MB但如果你的網(wǎng)絡(luò)對下載域名有限制可能會卡很久。我建議下載后把權(quán)重文件放在項目根目錄同時確認(rèn)一下文件的擴(kuò)展名是.pt不要因為瀏覽器自動改名變成.pt.txt這種低級錯誤真有人遇到過。2. 核心概念與模型結(jié)構(gòu)解讀2.1 從YOLOv5的模型結(jié)構(gòu)看它的設(shè)計思路雖然我們只是用工具但了解模型結(jié)構(gòu)能幫你在調(diào)參的時候明白每一步在做什么。YOLOv5整體分為三部分Backbone、Neck和Head。Backbone負(fù)責(zé)提取圖像特征YOLOv5用的是修改過的CSPDarknet簡單說就是通過跨階段部分連接讓梯度流動更高效在減少計算量的同時保持特征提取能力。Neck負(fù)責(zé)融合不同尺度的特征YOLOv5用的是PANet結(jié)構(gòu)自頂向下和自底向上的路徑都能把語義信息和位置信息揉在一起。Head則輸出三個尺度的預(yù)測結(jié)果分別對應(yīng)大目標(biāo)、中目標(biāo)和小目標(biāo)。為什么要分三個尺度因為目標(biāo)檢測任務(wù)里目標(biāo)大小差異很大。如果只在一個尺度上做預(yù)測小目標(biāo)很容易被下采樣之后的信息丟掉。YOLOv5通過不同步長的特征層讓模型既能檢測大目標(biāo)也能捕捉小目標(biāo)。理解了這一點你就知道為什么輸入尺寸不能隨便縮得太小否則小目標(biāo)就沒了。2.2 模型配置文件的作用與選擇YOLOv5的模型定義不是直接寫在代碼里的而是通過YAML文件配置。在models/目錄下有yolov5s.yaml、yolov5m.yaml、yolov5l.yaml等文件對應(yīng)不同體量的模型。后綴s、m、l、x分別代表small、medium、large、xlarge遞增的是網(wǎng)絡(luò)寬度和深度也就是通道數(shù)和骨干層數(shù)。為什么官方要提供這么多配置因為在不同場景下你對速度和精度的取舍不一樣。比如嵌入式設(shè)備上推理你可能會選yolov5s或者更輕的n模型如果是離線做高精度檢測對速度不敏感就可以上yolov5x。選擇的原則是先跑默認(rèn)的yolov5s建立baseline再根據(jù)自己的設(shè)備算力和精度要求逐步嘗試更大的模型。這個YAML文件里幾個關(guān)鍵參數(shù)值得看一下nc: 80 depth_multiple: 0.33 width_multiple: 0.50 anchors: - [10,13, 16,30, 33,23] - [30,61, 62,45, 59,119] - [116,90, 156,198, 373,326]nc是類別數(shù)量一定要改成你自己的類別數(shù)。depth_multiple和width_multiple是縮放系數(shù)決定了模型的大小。anchors是預(yù)設(shè)的錨框如果你不想自己計算訓(xùn)練時代碼會自動使用k-means重新算保持默認(rèn)也行但改類別數(shù)的時候要注意錨框數(shù)量是否跟檢測層匹配。2.3 預(yù)訓(xùn)練權(quán)重與遷移學(xué)習(xí)YOLOv5訓(xùn)練時強(qiáng)烈建議使用預(yù)訓(xùn)練模型。官方提供了COCO數(shù)據(jù)集上訓(xùn)練好的權(quán)重文件比如yolov5s.pt、yolov5m.pt。這些權(quán)重在學(xué)習(xí)新任務(wù)時是很好的起點。因為你自己的數(shù)據(jù)集通常沒有COCO那么多類別直接用隨機(jī)初始化的權(quán)重去訓(xùn)練收斂會很慢而且最終精度往往不如用預(yù)訓(xùn)練權(quán)重微調(diào)。使用預(yù)訓(xùn)練權(quán)重的原理很直觀網(wǎng)絡(luò)在COCO上已經(jīng)學(xué)會了通用的邊緣、紋理、形狀等特征遷移到你的數(shù)據(jù)集時只需要微調(diào)高層參數(shù)去適配新的類別。這就像你請了一個在通用領(lǐng)域很有經(jīng)驗的工程師他來做新項目上手速度肯定比一個什么經(jīng)驗都沒有的新人快。在訓(xùn)練命令里通過--weights yolov5s.pt指定預(yù)訓(xùn)練權(quán)重即可。注意如果你的數(shù)據(jù)集類別數(shù)和COCO不一致代碼會自動處理最后一層輸出你不用手動改權(quán)重文件。官方實現(xiàn)里加載權(quán)重時會調(diào)整類別輸出層的維度。2.4 幾個你必須清楚的訓(xùn)練參數(shù)YOLOv5的訓(xùn)練參數(shù)很多但常用的核心參數(shù)就這幾個--epochs訓(xùn)練輪數(shù)一般等于100到300取決于數(shù)據(jù)量和任務(wù)復(fù)雜度。--batch-size批大小越大顯存占用越高一般來說batch size越大梯度估計越準(zhǔn)確但會受到顯存限制。--img輸入圖像尺寸默認(rèn)640越大越能檢測小目標(biāo)但速度越慢。--device指定GPU編號比如--device 0多卡用0,1。--data數(shù)據(jù)集配置文件路徑后面會詳細(xì)說。--hyp超參數(shù)配置默認(rèn)是data/hyps/hyp.scratch-low.yaml里面包含學(xué)習(xí)率、動量、數(shù)據(jù)增強(qiáng)的各種設(shè)置。還要注意一個參數(shù)--cache它可以預(yù)先加載數(shù)據(jù)到內(nèi)存加速訓(xùn)練。如果內(nèi)存夠大比如32GB以上加上這個參數(shù)能讓每個epoch的時間明顯縮短。但如果你內(nèi)存不夠加了反而會因為換頁導(dǎo)致變慢甚至崩潰。3. 數(shù)據(jù)集準(zhǔn)備與標(biāo)注格式3.1 數(shù)據(jù)目錄結(jié)構(gòu)規(guī)范YOLOv5使用的數(shù)據(jù)集目錄結(jié)構(gòu)比較固定你需要按下面的方式組織your_dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/其中images/train放訓(xùn)練圖片images/val放驗證圖片labels目錄下放對應(yīng)圖片的標(biāo)注文件文件名要和圖片名保持一致只是擴(kuò)展名是.txt。比如一張img001.jpg的圖片對應(yīng)的標(biāo)注文件就是labels/train/img001.txt。很多人習(xí)慣把數(shù)據(jù)集直接copy到Y(jié)OLOv5項目里其實沒必要。你完全可以用絕對路徑或相對路徑指向外部數(shù)據(jù)集只要在數(shù)據(jù)配置文件里寫好就行。這樣項目的干凈度和靈活性都更高。3.2 YOLO標(biāo)注格式詳解YOLO的標(biāo)簽格式是每一行一個目標(biāo)每行有五個數(shù)字class_id x_center y_center width height注意這里的x_center、y_center、width、height全部是相對于圖片寬高的歸一化值范圍在0到1之間。比如一張寬1000像素、高800像素的圖片某個目標(biāo)的中心點落在(500, 400)寬為200高為160那么在標(biāo)簽文件中這行數(shù)據(jù)是0 0.5 0.5 0.2 0.2這里的class_id從0開始計算對應(yīng)你數(shù)據(jù)集yaml中類別列表里的順序。寫標(biāo)注的時候很容易出錯的是歸一化計算很多人直接把像素坐標(biāo)寫進(jìn)去不歸一化或者除以錯誤的值導(dǎo)致模型怎么訓(xùn)都不收斂。建議寫完標(biāo)注后先用可視化工具檢查一遍。3.3 自定義數(shù)據(jù)集的yaml配置在訓(xùn)練之前你需要創(chuàng)建一個數(shù)據(jù)配置文件內(nèi)容大致如下# data.yaml train: /path/to/your_dataset/images/train val: /path/to/your_dataset/images/val nc: 2 names: [person, car]這里train和val指向圖片目錄nc是類別數(shù)量names是類別名稱列表。注意類別順序要跟標(biāo)注文件中的class_id一致。官方代碼還支持把圖片路徑寫成txt文件列表的形式但我比較推薦直接寫目錄路徑簡單明了。配置好之后驗證一下數(shù)據(jù)路徑是否正確??梢詫憘€小腳本或者直接跑訓(xùn)練前的一句話檢查。我通常會用下面這個命令看標(biāo)注和圖片是否匹配python train.py --data data.yaml --weights yolov5s.pt --epochs 1 --img 640 --batch-size 2跑一個epoch如果沒有報錯再看log里的指標(biāo)曲線基本就能確認(rèn)數(shù)據(jù)沒問題。3.4 數(shù)據(jù)增強(qiáng)與標(biāo)注檢查的注意事項YOLOv5內(nèi)置了不少數(shù)據(jù)增強(qiáng)策略比如Mosaic、MixUp、隨機(jī)裁剪等。在訓(xùn)練過程中這些增強(qiáng)策略會自動生效你不需要額外配置但要注意一點如果數(shù)據(jù)增強(qiáng)過強(qiáng)而你的數(shù)據(jù)集本身已經(jīng)很小模型可能反而欠擬合或訓(xùn)練不穩(wěn)定。官方默認(rèn)的超參數(shù)文件是不同的增強(qiáng)檔位初學(xué)者直接使用hyp.scratch-low.yaml即可如果你對增強(qiáng)比較熟悉可以再嘗試hyp.scratch-med.yaml或者自定義。另外一個非常關(guān)鍵是檢查標(biāo)注框的完整性。訓(xùn)練前務(wù)必做一次可視化檢查把標(biāo)注框畫在圖上看看有沒有錯位、漏標(biāo)、類別標(biāo)錯的問題。我這里有個簡單的方式用官方提供的一個小腳本思路讀取圖片和對應(yīng)的txt用OpenCV畫矩形框。批量檢查幾百張圖片能幫你發(fā)現(xiàn)很多隱含問題。標(biāo)注質(zhì)量直接決定了模型上限這個環(huán)節(jié)省不得。4. 訓(xùn)練自己的模型4.1 訓(xùn)練命令與參數(shù)選擇一切就緒后就可以開始訓(xùn)練了。一個典型的訓(xùn)練命令是python train.py \ --weights yolov5s.pt \ --data data.yaml \ --epochs 100 \ --batch-size 16 \ --img 640 \ --device 0如果你想從頭訓(xùn)練不推薦就把--weights換成--weights 。如果你想從某個中間狀態(tài)的權(quán)重繼續(xù)訓(xùn)練可以通過--resume參數(shù)指定權(quán)重路徑。訓(xùn)練過程會自動在runs/train/exp下生成日志和模型檢查點默認(rèn)每10個epoch保存一次同時保存最佳模型best.pt和最后一個模型last.pt。剛開始訓(xùn)練時建議先把--epochs設(shè)小一點比如50跑通整個流程確認(rèn)沒有問題后再加大輪數(shù)。否則一次性設(shè)300輪跑了一天發(fā)現(xiàn)數(shù)據(jù)路徑有誤那就太心痛了。4.2 訓(xùn)練過程監(jiān)控與指標(biāo)解讀訓(xùn)練過程中終端會實時打印P、R、mAP、box loss、obj loss等信息。這幾個指標(biāo)怎么看PPrecision是查準(zhǔn)率表示預(yù)測出的目標(biāo)里有多少是正確目標(biāo)。RRecall是查全率表示實際目標(biāo)里有多少被檢測到了。mAP是綜合P和R的評估指標(biāo)YOLOv5默認(rèn)用mAP0.5和mAP0.5:0.95。box loss是邊界框損失的均值越低代表框得越準(zhǔn)。obj loss是目標(biāo)置信度損失越低代表分類和定位整體越可靠。訓(xùn)練時觀察曲線一般前10個epoch loss會快速下降之后變緩。如果box_loss和obj_loss持續(xù)下降但很平緩說明模型還在學(xué)習(xí)如果loss反彈或者震蕩劇烈可能是學(xué)習(xí)率太高或batch size太小。mAP曲線在最后階段會趨于平穩(wěn)如果還沒有平穩(wěn)說明epoch數(shù)可能不夠。4.3 調(diào)優(yōu)技巧分享我自己在實際項目中總結(jié)過幾個調(diào)優(yōu)方向不一定適合所有場景但可以參考。第一學(xué)習(xí)率。官方默認(rèn)學(xué)習(xí)率是0.01配合warm-up一般來說沒問題。但如果你發(fā)現(xiàn)loss前期下降太慢可以稍微調(diào)高到0.02試試如果震蕩降到0.005。調(diào)學(xué)習(xí)率時要把--hyp對應(yīng)的yaml文件改一下比如修改lr0和lrf。第二輸入尺寸。在顯存允許的情況下把--img從640提高到768甚至896往往能顯著提高小目標(biāo)檢測能力。代價是訓(xùn)練時間變長。我當(dāng)時在檢測小零件的時候把img從640改到768mAP漲了接近3個點。但要注意推理時的圖片尺寸最好和訓(xùn)練尺寸保持一致不然會有精度損失。第三訓(xùn)練輪數(shù)和早停。YOLOv5自帶早停機(jī)制patience默認(rèn)100輪。如果你觀察到mAP連續(xù)很多輪沒有提升訓(xùn)練會提前結(jié)束這樣省時間。第四類別不平衡。如果你的數(shù)據(jù)集中某些類別的樣本很少可以考慮調(diào)整每個類別在損失中的權(quán)重或者在采樣時做類別重加權(quán)。YOLOv5沒有直接提供這個參數(shù)需要修改代碼但可以在準(zhǔn)備數(shù)據(jù)集時通過過采樣或者數(shù)據(jù)增強(qiáng)來緩解。4.4 中斷恢復(fù)與多卡訓(xùn)練訓(xùn)練途中因為電腦重啟或者顯存不夠被kill是再正常不過的事。這時候不要慌用--resume就能接上。比如python train.py --resume runs/train/exp/weights/last.pt注意恢復(fù)訓(xùn)練時要保證數(shù)據(jù)和參數(shù)與之前一致代碼會自己讀取opt.yaml保存的配置。如果你手動改了參數(shù)可能會導(dǎo)致結(jié)果對不上。多卡訓(xùn)練也很簡單python train.py --device 0,1,2,3 --batch-size 64這里batch size是總batch代碼會自動分配到各卡上。個人經(jīng)驗多卡訓(xùn)練時batch size可以適當(dāng)調(diào)大因為全局梯度平均后相當(dāng)于更大的batch有時能提升穩(wěn)定性。但要注意學(xué)習(xí)率也要相應(yīng)調(diào)整可以參考線性縮放規(guī)則batch size翻一倍學(xué)習(xí)率也翻一倍。5. 模型測試與推理部署5.1 使用測試集評估模型效果訓(xùn)練完成后要用測試集或者驗證集評估模型而不是只看訓(xùn)練時的mAP。因為訓(xùn)練時的mAP是在驗證集上算的可能存在過擬合風(fēng)險。如果你有單獨的測試集可以這樣跑python val.py --weights runs/train/exp/weights/best.pt --data data.yaml --img 640val.py會輸出各類別的P、R、mAP以及一個混淆矩陣圖同時在runs/val/exp下保存預(yù)測結(jié)果圖。我一般重點關(guān)注難類別的mAP尤其是樣本少的類別如果這些類別的AP明顯偏低說明數(shù)據(jù)不夠或者特征不明顯需要補(bǔ)充數(shù)據(jù)。5.2 對圖片、視頻、攝像頭進(jìn)行推理推理是部署前最常做的事。YOLOv5的detect.py支持多種輸入源例如python detect.py --weights runs/train/exp/weights/best.pt --source ./test_img.jpg python detect.py --weights runs/train/exp/weights/best.pt --source ./test_video.mp4 python detect.py --weights runs/train/exp/weights/best.pt --source 0最后一個0表示調(diào)用攝像頭。--source甚至可以傳入一個目錄會批量推理目錄下所有圖片。輸出結(jié)果保存在runs/detect/exp下。--conf參數(shù)可以調(diào)整置信度閾值默認(rèn)0.25。如果你覺得誤檢太多可以調(diào)高到0.5如果漏檢多可以調(diào)低到0.1。推理速度方面在GPU上YOLOv5s處理640x640的圖片單張大約只要幾個毫秒到幾十毫秒具體看顯卡型號。CPU上則慢很多可能達(dá)到幾百毫秒。5.3 導(dǎo)出為ONNX和TensorRT訓(xùn)練好的模型要部署到服務(wù)或者邊緣設(shè)備通常需要導(dǎo)出成中間格式。YOLOv5官方提供了export.py腳本支持多種導(dǎo)出格式python export.py --weights runs/train/exp/weights/best.pt --include onnx engine--include可以傳多個格式比如onnx、engine、torchscript、openvino等。導(dǎo)出ONNX前需要安裝onnx和onnxruntime導(dǎo)出TensorRT engine需要TensorRT庫。這里最大的坑是版本匹配尤其是TensorRT和PyTorch的算子兼容性。如果導(dǎo)出失敗優(yōu)先檢查CUDA、TensorRT、PyTorch三者版本是否匹配網(wǎng)上版本對應(yīng)表很多對著表檢查一遍基本能解決。導(dǎo)出ONNX后你可以用ONNX Runtime跑推理速度比PyTorch快不少而且不依賴PyTorch環(huán)境。TensorRT又比ONNX Runtime進(jìn)一步提速適合高端GPU部署。我實測過YOLOv5s在T4上用TensorRT推理單張640x640的延遲能降到5毫秒以內(nèi)這個性能在很多實時場景已經(jīng)非常能打了。5.4 部署到邊緣設(shè)備與Web服務(wù)把導(dǎo)出的engine文件拷到目標(biāo)設(shè)備用TensorRT python API寫推理邏輯或者直接用官方提供的detect.py替換權(quán)重路徑也可以把它嵌入更輕量的推理框架。邊緣設(shè)備比如Jetson系列同樣是用TensorRT但要注意算力版本。做Web服務(wù)的話比較簡單的方式是直接用Flask或FastAPI包裝一個接口接收圖片調(diào)用ONNX Runtime推理返回坐標(biāo)和類別。響應(yīng)速度主要取決于推理時間和圖片解碼時間把圖片解碼也放在GPU上會更快。還有一個容易被忽略的地方輸入前要把圖片resize到模型輸入尺寸并且做相同的填充方式Y(jié)OLOv5默認(rèn)是letterbox也就是保持長寬比填充灰邊。推理代碼里一定要和訓(xùn)練時的預(yù)處理保持一致否則精度會掉。6. 常見問題與排查技巧實錄6.1 安裝階段的問題安裝依賴時最經(jīng)典的問題是pycocotools在Windows下編譯失敗。解決辦法是不要直接pip install pycocotools而是安裝pycocotools-windows或者先安裝Visual C Build Tools再重新編譯。還有個常見問題是torch和torchvision版本不匹配導(dǎo)致無法導(dǎo)入。這通常是因為分別安裝時版本號沒對應(yīng)上建議用PyTorch官網(wǎng)的命令一次性裝好避免混裝。另外git clone速度慢甚至中斷可以改用鏡像地址或者直接在瀏覽器下載壓縮包解壓。這個不影響后續(xù)工作只要目錄結(jié)構(gòu)完整就行。6.2 訓(xùn)練時顯存不足顯存不足是新手最常碰到的攔路虎。報錯通常是CUDA out of memory。處理方法從輕到重有三種減小batch size、減小img尺寸、換更小的模型。比如把batch size從16降到8或者img從640降到480顯存占用立刻下降。如果這些還不夠就把模型從yolov5s換成yolov5n這是最輕量的版本。還有一個技巧是開啟梯度累積。YOLOv5代碼里沒有直接給這個參數(shù)但你可以通過--batch-size很小但訓(xùn)練多步再更新來實現(xiàn)。不過最簡單的還是調(diào)低配置。我一般建議在跑通流程時用最小配置等驗證無誤后再逐步放大。6.3 訓(xùn)練不收斂或精度差如果你發(fā)現(xiàn)loss始終不降先檢查數(shù)據(jù)標(biāo)注是否正確這是最常見的原因。把訓(xùn)練圖片和標(biāo)注可視化出來看一遍很多問題立刻暴露。比如框坐標(biāo)歸一化出錯、類別ID跟names對不上、圖片擴(kuò)展名和標(biāo)注文件不一致這些都會導(dǎo)致模型學(xué)不到規(guī)律。精度低還有可能是key數(shù)據(jù)太少。如果每個類別只有幾十張圖片數(shù)據(jù)增強(qiáng)再強(qiáng)也很難學(xué)好。我的經(jīng)驗是每個類別至少幾百張并且要有不同角度、不同光照下的圖像。另外遷移學(xué)習(xí)時預(yù)訓(xùn)練權(quán)重是否選對也很重要不要拿著yolov5x的權(quán)重去訓(xùn)你只有幾百張圖的小數(shù)據(jù)集那樣容易過擬合反而不如山規(guī)模小一點的模型。最后一點確認(rèn)訓(xùn)練和驗證是否使用了同一個數(shù)據(jù)分布。有時候訓(xùn)練集是白天圖像驗證集是夜間圖像效果當(dāng)然好不了。盡量讓訓(xùn)練集與驗證集分布一致或者通過數(shù)據(jù)增強(qiáng)模擬多種風(fēng)格。6.4 推理結(jié)果不理想推理結(jié)果不理想分兩種情況。第一種是目標(biāo)檢測出來了但框不準(zhǔn)這種情況往往是模型本身精度不夠需要重新訓(xùn)練或者提高輸入分辨率。第二種是漏檢或誤檢可以先調(diào)節(jié)置信度閾值。如果還不行再看是不是測試圖片跟訓(xùn)練場景差異太大。比如訓(xùn)練時用的是高空俯拍測試時用低角度仰拍模型沒見過這種視角自然表現(xiàn)不好。另外檢查預(yù)處理是否一致。我在實際項目中就遇到過訓(xùn)練時用letterbox填充推理代碼里卻直接resize導(dǎo)致目標(biāo)拉伸變形模型精度掉了很多。確保使用同樣的預(yù)處理函數(shù)這里我推薦直接復(fù)用YOLOv5倉庫里的letterbox函數(shù)。還有一個容易忽略的細(xì)節(jié)類別輸出順序。當(dāng)你把模型導(dǎo)出成ONNX或TensorRT后得到的結(jié)果是按訓(xùn)練時names的順序排列的。如果你在demo代碼里用另一套順序解析那結(jié)果全亂。所以導(dǎo)出前確認(rèn)類別表部署端跟訓(xùn)練端保持一致。個人經(jīng)驗總結(jié)一路用下來我的體會是YOLOv5確實是工程落地利器很多細(xì)節(jié)官方已經(jīng)幫你處理好了但真正決定項目成敗的還是數(shù)據(jù)質(zhì)量和對訓(xùn)練機(jī)制的理解。你在上面投入的每一分精力最終都會反映在模型精度上。最后分享一個我常用的排查思路每次跑新實驗前先用最小數(shù)據(jù)集、最小模型、最小epoch數(shù)驗證整條鏈路通的再逐步增加數(shù)據(jù)量和訓(xùn)練規(guī)模。這樣能避免很多低級錯誤浪費大量時間。如果你準(zhǔn)備開始做自己的目標(biāo)檢測項目不妨先拿YOLOv5s配合公開數(shù)據(jù)集跑一遍流程把訓(xùn)練、驗證、導(dǎo)出、推理全走通再替換成自己的數(shù)據(jù)集。這個過程走下來你基本就入門了。后續(xù)再根據(jù)硬件條件和需求探索模型剪枝、量化、知識蒸餾這些進(jìn)階方向路會越走越寬。