海面垃圾檢測數(shù)據(jù)集實戰(zhàn):VOC/YOLO雙格式與YOLO訓(xùn)練調(diào)優(yōu)指南)
1. 項目緣起與數(shù)據(jù)集整體設(shè)計思路1.1 為什么盯上了“無人機(jī)海面垃圾”這個方向做視覺檢測這行的朋友應(yīng)該都有體會通用數(shù)據(jù)集刷到90%以上的mAP已經(jīng)很難帶來什么興奮感了真正讓人頭疼的是那些場景特殊、樣本稀缺、標(biāo)注成本極高的垂直領(lǐng)域。海面漂浮垃圾檢測就是典型中的一個——它不像COCO、VOC那樣有幾十萬張標(biāo)注圖等著你去調(diào)參也不像工業(yè)質(zhì)檢那樣有穩(wěn)定的光照和背景。你要面對的是動態(tài)水面反光、波浪紋理干擾、目標(biāo)尺度劇烈變化、無人機(jī)視角下的透視畸變以及最要命的——正負(fù)樣本極度不平衡。我拿到這個數(shù)據(jù)集的時候第一反應(yīng)是“9627張、單類別、VOCYOLO雙格式”這個體量在垂直領(lǐng)域里算是相當(dāng)能打的了。要知道很多海面垃圾相關(guān)的公開數(shù)據(jù)集要么只有幾百張要么是多類別混標(biāo)導(dǎo)致單類樣本被稀釋。單類別“垃圾”雖然粗粒度但對于海漂垃圾巡檢、水面清潔船路徑規(guī)劃、近岸環(huán)境監(jiān)測這類應(yīng)用來說先解決“有沒有”的問題遠(yuǎn)比“是什么垃圾”更緊迫。你不可能讓一架無人機(jī)在海上先分辨塑料瓶和泡沫箱再決定要不要上報實際工程中都是先框出來、傳回岸基、人工復(fù)核分類。這個數(shù)據(jù)集的核心價值在于它把無人機(jī)低空拍攝這個特定視角下的海面垃圾檢測問題做成了一個可以直接拿來訓(xùn)練、驗證、對比的標(biāo)準(zhǔn)化基準(zhǔn)。不管你是做學(xué)術(shù)研究要跑baseline還是做工程落地要快速驗證模型可行性這9627張圖能幫你省掉至少兩三個月的數(shù)據(jù)采集和標(biāo)注周期。1.2 VOC與YOLO雙格式并存的工程意義很多剛?cè)腴T的同學(xué)會問為什么同一個數(shù)據(jù)集要提供VOC和YOLO兩種格式直接用YOLO格式不就行了嗎這個問題我在帶新人的時候被問過不下十次。答案其實很簡單VOC格式是“母版”YOLO格式是“派生版”。VOC格式用XML文件存儲標(biāo)注信息每個目標(biāo)用bndbox標(biāo)簽記錄xmin, ymin, xmax, ymax四個絕對坐標(biāo)值。這種格式的好處是信息完整、可讀性強(qiáng)、方便做數(shù)據(jù)增強(qiáng)和格式轉(zhuǎn)換。你拿到VOC格式的標(biāo)注想轉(zhuǎn)成COCO、轉(zhuǎn)成YOLO、轉(zhuǎn)成CSV、甚至自己寫個腳本做統(tǒng)計分析都非常直接。而且VOC格式保留了圖像的原始尺寸信息對于后續(xù)要做多尺度訓(xùn)練或者切片推理的場景來說這個信息至關(guān)重要。YOLO格式則是把標(biāo)注歸一化成了class_id x_center y_center width height五個值全部是0到1之間的相對坐標(biāo)。這種格式的好處是直接喂給YOLO系列模型就能訓(xùn)練不需要在數(shù)據(jù)加載階段做額外的坐標(biāo)變換訓(xùn)練效率更高。但缺點是丟失了絕對尺寸信息如果你要做一些依賴原始像素尺寸的操作比如按目標(biāo)實際像素面積過濾小目標(biāo)就得反歸一化回去。這個數(shù)據(jù)集同時提供兩種格式說明制作者是懂工程實際的。我的建議是永遠(yuǎn)保留VOC格式作為原始存檔每次訓(xùn)練前用腳本動態(tài)生成YOLO格式。這樣當(dāng)你需要調(diào)整類別映射、過濾某些樣本、或者做格式轉(zhuǎn)換實驗時不會因為反復(fù)轉(zhuǎn)換導(dǎo)致精度損失或信息丟失。1.3 單類別設(shè)計的利與弊單類別“垃圾”這個設(shè)計乍一看好像太粗糙了但仔細(xì)想想其實很合理。海面漂浮垃圾的形態(tài)差異極大——塑料瓶、泡沫板、漁網(wǎng)碎片、木板、海藻團(tuán)有時候會被誤標(biāo)——如果強(qiáng)行分成多個細(xì)類每個類的樣本量可能只有幾百張訓(xùn)練出來的模型大概率過擬合。而且在實際巡檢場景中發(fā)現(xiàn)垃圾的位置比識別垃圾的種類更重要后續(xù)的清理決策可以由人工或更高層級的分類模型來完成。但單類別也有它的坑。最大的問題是類內(nèi)差異過大一個透明塑料瓶和一個黑色輪胎在視覺特征上幾乎沒有共性。模型要學(xué)會把它們都?xì)w為“垃圾”需要非常大的樣本多樣性和足夠強(qiáng)的特征提取能力。這也是為什么這個數(shù)據(jù)集9627張的體量顯得尤為重要——樣本量不夠單類別反而比多類別更難訓(xùn)因為模型沒有類別間的對比信號只能靠海量樣本來覆蓋類內(nèi)變化。我在實際訓(xùn)練中發(fā)現(xiàn)對于這種類內(nèi)差異大的單類別檢測數(shù)據(jù)增強(qiáng)策略比模型結(jié)構(gòu)選擇更關(guān)鍵。后面我會專門講這塊的實操細(xì)節(jié)。2. 數(shù)據(jù)集核心細(xì)節(jié)解析與實操要點2.1 標(biāo)注質(zhì)量評估與清洗策略拿到任何數(shù)據(jù)集第一件事不是急著跑訓(xùn)練而是做標(biāo)注質(zhì)量抽檢。我見過太多人直接拿數(shù)據(jù)集開訓(xùn)結(jié)果mAP卡在0.5上不去排查半天才發(fā)現(xiàn)是標(biāo)注框大量漏標(biāo)、錯標(biāo)、重疊框?qū)е碌?。對于這個海面垃圾數(shù)據(jù)集我建議按以下流程做質(zhì)量評估第一步隨機(jī)抽樣目視檢查。從9627張里隨機(jī)抽200張用LabelImg或者自己寫個可視化腳本把標(biāo)注框畫出來逐張看。重點看三類問題漏標(biāo)圖里有明顯垃圾但沒框、過框框的范圍遠(yuǎn)大于實際目標(biāo)、誤標(biāo)把浪花反光、海鳥、船體陰影標(biāo)成了垃圾。海面場景特別容易出現(xiàn)浪花被誤標(biāo)的情況因為白色浪花和白色泡沫垃圾在低分辨率下確實很像。第二步統(tǒng)計標(biāo)注框尺寸分布。用Python腳本讀一遍所有XML文件統(tǒng)計每個框的寬高像素值畫出直方圖。這個數(shù)據(jù)集的無人機(jī)拍攝高度決定了目標(biāo)像素尺寸的分布范圍。如果發(fā)現(xiàn)大量框的寬高小于10像素說明存在大量極小目標(biāo)訓(xùn)練時需要特別注意輸入分辨率和特征金字塔的設(shè)計。如果發(fā)現(xiàn)有些框的寬高比極端異常比如寬高比大于10或小于0.1大概率是標(biāo)注錯誤需要人工復(fù)核。第三步檢查類別標(biāo)簽一致性。雖然只有一個類別但要確認(rèn)所有XML里的name字段是否完全一致。我遇到過有的數(shù)據(jù)集里同時存在“garbage”、“trash”、“waste”三種寫法導(dǎo)致訓(xùn)練時被當(dāng)成三個類別處理。這個數(shù)據(jù)集標(biāo)稱單類別但拿到手后還是用腳本掃一遍確認(rèn)最穩(wěn)妥。注意標(biāo)注清洗不要過度。有些框看起來“不太準(zhǔn)”但只要IoU在0.5以上對訓(xùn)練的影響其實有限。把大量時間花在微調(diào)標(biāo)注框上不如多跑幾組對比實驗。我的經(jīng)驗是標(biāo)注質(zhì)量從60分提到80分帶來的收益遠(yuǎn)大于從80分提到95分。2.2 無人機(jī)視角下的圖像特性分析無人機(jī)低空拍攝和地面手持拍攝、衛(wèi)星遙感拍攝有本質(zhì)區(qū)別這些區(qū)別直接決定了模型設(shè)計和訓(xùn)練策略的選擇。第一透視畸變與尺度變化。無人機(jī)通常以一定傾角拍攝海面導(dǎo)致圖像中的目標(biāo)存在透視變形??拷鼒D像邊緣的目標(biāo)被拉伸靠近中心的目標(biāo)相對正常。更麻煩的是同一類垃圾在不同飛行高度下像素尺寸可能相差幾十倍——低空5米拍的塑料瓶可能有200像素寬高空30米拍的同樣塑料瓶可能只有20像素。這種極端尺度變化要求模型必須有很強(qiáng)的多尺度檢測能力。第二水面反光與紋理干擾。海面不是均勻背景波浪、泡沫、陽光反射都會產(chǎn)生大量高頻紋理。這些紋理在淺層特征上和垃圾的邊緣特征非常相似容易導(dǎo)致誤檢。我在可視化模型特征圖時發(fā)現(xiàn)水面反光區(qū)域的激活值往往和真實垃圾區(qū)域相當(dāng)這說明模型確實被干擾了。第三運(yùn)動模糊。無人機(jī)在飛行中拍攝如果快門速度不夠快海面波浪和移動中的垃圾會產(chǎn)生運(yùn)動模糊。這個數(shù)據(jù)集里應(yīng)該有一部分圖像存在不同程度的模糊訓(xùn)練時如果全部當(dāng)清晰樣本處理模型對模糊目標(biāo)的檢測能力會偏弱。第四光照條件多變。海面場景的光照從正午強(qiáng)光到陰天散射光動態(tài)范圍極大。強(qiáng)光下水面反光可能過曝陰影區(qū)垃圾可能欠曝。這要求訓(xùn)練時必須有充分的光照增強(qiáng)。針對這些特性我在訓(xùn)練這個數(shù)據(jù)集時采用的策略是輸入分辨率不低于640優(yōu)先用1280做高分辨率微調(diào)數(shù)據(jù)增強(qiáng)中必須包含隨機(jī)亮度對比度調(diào)整、運(yùn)動模糊模擬、以及隨機(jī)透視變換。這些后面會展開講。2.3 VOC與YOLO格式轉(zhuǎn)換的實操細(xì)節(jié)雖然數(shù)據(jù)集已經(jīng)提供了兩種格式但實際訓(xùn)練中你很可能需要自己再做一次轉(zhuǎn)換比如調(diào)整類別映射、過濾特定樣本、或者做訓(xùn)練集/驗證集重新劃分。這里把轉(zhuǎn)換腳本的核心邏輯和踩過的坑說清楚。VOC轉(zhuǎn)YOLO的核心公式x_center (xmin xmax) / 2.0 / image_width y_center (ymin ymax) / 2.0 / image_height width (xmax - xmin) / image_width height (ymax - ymin) / image_height看起來很簡單但有幾個坑坑一坐標(biāo)越界。有些標(biāo)注框的xmax可能等于image_width轉(zhuǎn)換后x_center width/2 1.0剛好在邊界上。YOLO訓(xùn)練時如果做了隨機(jī)裁剪增強(qiáng)這個框可能被裁掉一部分導(dǎo)致寬高變成負(fù)數(shù)。建議轉(zhuǎn)換后做一次clamp把所有值限制在[0, 1]范圍內(nèi)并且過濾掉寬或高小于0.001的框??佣D像尺寸不一致。VOC格式的XML里雖然有size標(biāo)簽記錄寬高但有些標(biāo)注工具寫進(jìn)去的尺寸和實際圖像尺寸不一致。必須以實際讀取到的圖像尺寸為準(zhǔn)不要信XML里的size標(biāo)簽。我吃過這個虧用XML里的尺寸做歸一化結(jié)果訓(xùn)練時發(fā)現(xiàn)框全部偏移??尤悇e映射表。單類別看似簡單但YOLO要求類別從0開始編號。如果VOC里的類別名是“garbage”你需要建一個{garbage: 0}的映射表。如果后續(xù)要擴(kuò)展多類別這個映射表要提前規(guī)劃好不然后面改起來很麻煩??铀挠?xùn)練集驗證集劃分。不要隨機(jī)劃分海面垃圾數(shù)據(jù)集如果隨機(jī)劃分可能出現(xiàn)同一段視頻的連續(xù)幀被分到訓(xùn)練集和驗證集兩邊導(dǎo)致驗證集精度虛高。正確做法是按拍攝架次或時間段劃分確保驗證集的圖像來自訓(xùn)練集未覆蓋的場景。如果數(shù)據(jù)集沒有提供架次信息至少按圖像文件名前綴做分組劃分。3. 從零到一YOLO訓(xùn)練完整實操流程3.1 環(huán)境搭建與數(shù)據(jù)準(zhǔn)備我用的訓(xùn)練環(huán)境是Ubuntu 20.04 CUDA 11.3 PyTorch 1.10 Ultralytics YOLOv5/v8。這個組合在V100和3090上都跑過穩(wěn)定性沒問題。如果你用Windows建議直接上WSL2原生Windows下的DataLoader多進(jìn)程效率會打折扣。數(shù)據(jù)目錄結(jié)構(gòu)建議這樣組織dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml的內(nèi)容path: /path/to/dataset train: images/train val: images/val test: images/test nc: 1 names: [garbage]這里有個細(xì)節(jié)images和labels的目錄結(jié)構(gòu)必須嚴(yán)格對應(yīng)YOLO加載數(shù)據(jù)時是根據(jù)圖像路徑替換images為labels、替換擴(kuò)展名為.txt來找標(biāo)注文件的。如果目錄名不一致訓(xùn)練時會報“找不到標(biāo)簽”的錯誤。數(shù)據(jù)準(zhǔn)備階段還要做一件事統(tǒng)計訓(xùn)練集和驗證集的樣本量、目標(biāo)數(shù)量分布。我一般會跑一個腳本輸出每個子集有多少張圖、多少個標(biāo)注框、平均每張圖幾個目標(biāo)。這個統(tǒng)計信息對后續(xù)判斷模型表現(xiàn)是否合理非常重要。比如驗證集mAP突然比訓(xùn)練集低很多如果驗證集的目標(biāo)密度和訓(xùn)練集差異大那可能是數(shù)據(jù)劃分問題而不是過擬合。3.2 模型選型與參數(shù)配置YOLOv5和YOLOv8我都試過最終在這個數(shù)據(jù)集上我傾向于YOLOv8m作為baseline。原因有三第一YOLOv8的C2f結(jié)構(gòu)和解耦頭在小目標(biāo)檢測上比v5的C3結(jié)構(gòu)有優(yōu)勢第二v8的Anchor-Free設(shè)計省去了調(diào)Anchor的麻煩對于海面垃圾這種形狀極不規(guī)則的類別更友好第三v8的訓(xùn)練腳本更簡潔超參數(shù)默認(rèn)值在垂直領(lǐng)域數(shù)據(jù)集上表現(xiàn)更穩(wěn)。模型配置的關(guān)鍵參數(shù)參數(shù)推薦值說明imgsz640基線/ 1280高精度1280能顯著提升小目標(biāo)召回但顯存占用翻倍batch16640/ 81280根據(jù)顯存調(diào)整V100 32G可以跑batch32640epochs200-300垂直領(lǐng)域數(shù)據(jù)集需要更多輪次收斂lr00.01初始學(xué)習(xí)率配合cosine調(diào)度lrf0.01最終學(xué)習(xí)率系數(shù)warmup_epochs3預(yù)熱輪次防止初期梯度爆炸box7.5框回歸損失權(quán)重cls0.5分類損失權(quán)重單類別可以適當(dāng)降低dfl1.5分布焦點損失權(quán)重v8特有這里重點說imgsz的選擇。640是YOLO系列的默認(rèn)值速度快、顯存友好但對于無人機(jī)高空拍攝的小目標(biāo)640分辨率下可能只有幾個像素模型根本學(xué)不到有效特征。我的做法是先用640跑一輪baseline看驗證集的小目標(biāo)召回率。如果小目標(biāo)面積小于32x32像素的召回低于0.4就切到1280重新訓(xùn)。1280下小目標(biāo)的像素面積是640下的4倍特征信息豐富得多。代價是訓(xùn)練時間大約增加2.5倍顯存占用增加3倍左右。還有一個容易被忽略的參數(shù)是anchor。雖然YOLOv8是Anchor-Free但如果你用YOLOv5一定要用kmeans重新聚類這個數(shù)據(jù)集的標(biāo)注框。海面垃圾的寬高比分布和COCO差異很大用默認(rèn)anchor會導(dǎo)致正樣本匹配率低。我實測過重新聚類anchor后YOLOv5s的mAP0.5能提升3-5個百分點。3.3 數(shù)據(jù)增強(qiáng)策略的針對性設(shè)計數(shù)據(jù)增強(qiáng)是這個小項目里最值得花時間打磨的環(huán)節(jié)。通用增強(qiáng)策略翻轉(zhuǎn)、縮放、色彩抖動當(dāng)然要用但針對海面垃圾場景我額外加了幾個“特效”。第一隨機(jī)透視變換。無人機(jī)拍攝角度不固定透視變換能模擬不同傾角下的目標(biāo)形變。在Albumentations里用Perspectivescale參數(shù)設(shè)0.05-0.1概率0.3。注意透視變換后要檢查標(biāo)注框是否還在圖像范圍內(nèi)超出邊界的框要裁剪或丟棄。第二運(yùn)動模糊模擬。用MotionBlurblur_limit設(shè)3-7概率0.2。這個增強(qiáng)能顯著提升模型對模糊目標(biāo)的魯棒性。但概率不要太高否則清晰樣本的檢測精度會下降。第三水面反光模擬。這個沒有現(xiàn)成的庫我的做法是用RandomBrightnessContrast配合RandomGamma再加上局部的高光增強(qiáng)。具體來說隨機(jī)選圖像中10%-20%的區(qū)域把這些區(qū)域的亮度提升30%-50%模擬陽光反射。這個增強(qiáng)對降低水面反光誤檢非常有效。第四Mosaic與MixUp。YOLOv8默認(rèn)開啟Mosaic概率1.0最后10個epoch關(guān)閉。Mosaic對海面垃圾檢測的幫助很大因為它能合成出目標(biāo)密度更高的訓(xùn)練樣本緩解正負(fù)樣本不平衡。MixUp我建議概率設(shè)0.1-0.15太高會導(dǎo)致訓(xùn)練不穩(wěn)定。第五隨機(jī)裁剪與縮放。這個要小心。海面垃圾數(shù)據(jù)集中很多圖像的目標(biāo)集中在圖像中央?yún)^(qū)域隨機(jī)裁剪可能把目標(biāo)裁掉。我的做法是用RandomSizedBBoxSafeCrop確保裁剪后至少保留一個完整標(biāo)注框。實操心得數(shù)據(jù)增強(qiáng)不是越多越好。我試過同時開15種增強(qiáng)結(jié)果模型收斂極慢驗證集精度還不如只開5種核心增強(qiáng)。增強(qiáng)策略要圍繞數(shù)據(jù)集的真實變化維度來設(shè)計海面場景的核心變化是光照、視角、模糊那就重點增強(qiáng)這三個維度。3.4 訓(xùn)練過程監(jiān)控與調(diào)參訓(xùn)練啟動后不要只盯著loss看。我一般同時監(jiān)控這幾個指標(biāo)train/box_loss、train/cls_loss、train/dfl_loss三個損失要同步下降。如果box_loss降但cls_loss不降說明模型在學(xué)定位但學(xué)不會分類可能是類別標(biāo)簽有問題。metrics/mAP0.5和mAP0.5:0.95mAP0.5到0.8以上算及格0.85以上算不錯。mAP0.5:0.95如果只有mAP0.5的一半左右說明定位精度不夠需要檢查標(biāo)注框質(zhì)量。val/box_loss和val/cls_loss如果train loss持續(xù)降但val loss開始升就是過擬合了。這時候要么加數(shù)據(jù)增強(qiáng)要么加正則化weight_decay調(diào)大要么早停。學(xué)習(xí)率曲線cosine調(diào)度下學(xué)習(xí)率應(yīng)該平滑下降。如果學(xué)習(xí)率震蕩檢查warmup設(shè)置和batch size是否匹配。我在這個數(shù)據(jù)集上遇到過一個典型問題前50個epoch mAP漲得很快到0.75左右就卡住了再訓(xùn)100個epoch也只漲到0.78。排查后發(fā)現(xiàn)兩個原因一是學(xué)習(xí)率衰減太慢后期學(xué)習(xí)率還是太大模型在最優(yōu)解附近震蕩二是數(shù)據(jù)增強(qiáng)中的Mosaic一直開著導(dǎo)致后期模型看到的都是合成圖對真實分布的擬合不夠。解決方案是把cosine調(diào)度的周期縮短到150個epoch并且在最后20個epoch關(guān)閉Mosaic和MixUp。調(diào)整后mAP0.5最終到了0.84。4. 常見問題排查與避坑指南4.1 訓(xùn)練不收斂或mAP異常低這是最常見的問題原因可能有很多按以下順序排查第一步檢查數(shù)據(jù)加載是否正確。寫個腳本隨機(jī)抽幾張訓(xùn)練圖把標(biāo)注框畫出來確認(rèn)框的位置和類別都對。我遇到過有人把images和labels的路徑配反了訓(xùn)練時加載的全是空標(biāo)簽?zāi)P彤?dāng)然學(xué)不到東西。第二步檢查類別數(shù)和類別名。data.yaml里的nc必須和實際類別數(shù)一致names的順序必須和標(biāo)注文件里的class_id對應(yīng)。單類別的話nc: 1names: [garbage]class_id必須是0。第三步檢查輸入歸一化。YOLO默認(rèn)會把圖像像素值從0-255歸一化到0-1。如果你自己改了數(shù)據(jù)加載邏輯確認(rèn)歸一化沒做錯。我見過有人把圖像歸一化到-1到1結(jié)果模型完全不收斂。第四步檢查學(xué)習(xí)率。學(xué)習(xí)率太大會導(dǎo)致loss震蕩不下降太小會導(dǎo)致收斂極慢。YOLOv8的默認(rèn)lr00.01在大多數(shù)數(shù)據(jù)集上沒問題但如果你的batch size特別小比如小于8學(xué)習(xí)率要相應(yīng)調(diào)小。第五步檢查預(yù)訓(xùn)練權(quán)重。用COCO預(yù)訓(xùn)練權(quán)重初始化能顯著加速收斂。如果從零開始訓(xùn)前幾十個epoch mAP為0是正常的不要慌。4.2 小目標(biāo)漏檢嚴(yán)重海面垃圾數(shù)據(jù)集中小目標(biāo)占比很高漏檢是主要誤差來源。提升小目標(biāo)召回的手段按性價比排序提高輸入分辨率640提到1280小目標(biāo)召回通常能提升10-20個百分點。這是最直接有效的方法。增加P2特征層YOLOv8默認(rèn)用P3-P5做檢測加一個P2層 stride4專門檢測小目標(biāo)。代價是計算量增加推理速度下降。調(diào)整Anchor尺寸如果用YOLOv5把最小的Anchor縮小匹配更多小目標(biāo)。切片推理訓(xùn)練時用640推理時把大圖切成640x640的小塊分別檢測再合并。這個方法對小目標(biāo)效果極好但推理耗時成倍增加。Copy-Paste增強(qiáng)把小目標(biāo)復(fù)制粘貼到其他圖像上增加小目標(biāo)樣本密度。這個增強(qiáng)對小目標(biāo)檢測提升明顯但要注意粘貼位置不要遮擋其他目標(biāo)。4.3 水面反光導(dǎo)致的誤檢水面反光誤檢是海面場景的特有難題。模型會把陽光反射的高亮區(qū)域當(dāng)成垃圾因為兩者在淺層特征上都是高對比度的邊緣紋理。解決方案方案一在訓(xùn)練數(shù)據(jù)中增加負(fù)樣本。收集一批沒有垃圾但有強(qiáng)烈水面反光的圖像作為背景負(fù)樣本加入訓(xùn)練集。YOLO訓(xùn)練時這些圖像沒有對應(yīng)的標(biāo)注文件或者標(biāo)注文件為空模型會學(xué)會抑制這些區(qū)域的激活。方案二在數(shù)據(jù)增強(qiáng)中模擬反光。前面提到的局部亮度增強(qiáng)就是干這個的。讓模型在訓(xùn)練階段就見過各種反光模式推理時就不容易上當(dāng)。方案三后處理過濾。如果誤檢框集中在圖像的上半部分天空/遠(yuǎn)海區(qū)域可以在后處理階段根據(jù)框的位置做過濾。但這個方案比較粗暴可能誤殺真實目標(biāo)。方案四換用更強(qiáng)的 backbone。反光和垃圾的區(qū)別在高層語義特征上更明顯用更大的模型YOLOv8l或x能提升區(qū)分能力。但推理速度會下降需要權(quán)衡。4.4 常見問題速查表問題現(xiàn)象可能原因排查方法解決方案loss不下降學(xué)習(xí)率過大/過小打印學(xué)習(xí)率曲線調(diào)整lr0加warmupmAP0.5高但mAP0.5:0.95低定位精度不夠可視化預(yù)測框檢查標(biāo)注質(zhì)量加box loss權(quán)重驗證集mAP遠(yuǎn)低于訓(xùn)練集過擬合對比train/val loss加數(shù)據(jù)增強(qiáng)加正則化早停小目標(biāo)漏檢多輸入分辨率不夠統(tǒng)計小目標(biāo)占比提高imgsz加P2層水面反光誤檢多負(fù)樣本不足可視化誤檢區(qū)域加負(fù)樣本加反光增強(qiáng)訓(xùn)練速度慢batch太小/圖像太大看GPU利用率減小imgsz用混合精度推理結(jié)果框重疊NMS閾值不當(dāng)調(diào)整NMS IoU閾值降低NMS IoU閾值到0.5-0.65. 模型評估與部署落地要點5.1 評估指標(biāo)的正確解讀mAP不是唯一指標(biāo)。在實際部署中我更關(guān)注召回率Recall和誤檢率False Positive Rate。海面垃圾巡檢場景下漏檢一個垃圾的代價遠(yuǎn)大于誤檢一個反光區(qū)域——漏檢意味著垃圾繼續(xù)漂浮污染環(huán)境誤檢只是多派一次人工復(fù)核。所以我的評估策略是在保證召回率不低于0.85的前提下盡量壓低誤檢率。具體做法是調(diào)整推理時的置信度閾值。默認(rèn)conf0.25我會降到0.15甚至0.1先把召回拉滿然后看誤檢情況。如果誤檢太多再逐步提高閾值找到平衡點。另外按目標(biāo)尺寸分層評估也很重要。把驗證集的目標(biāo)按面積分成小32x32、中32x32到96x96、大96x96三檔分別算AP。如果小目標(biāo)AP明顯低于中大目標(biāo)說明模型對小目標(biāo)檢測能力不足需要針對性優(yōu)化。5.2 模型導(dǎo)出與推理優(yōu)化訓(xùn)練完的PyTorch模型要部署到實際系統(tǒng)中通常需要導(dǎo)出成ONNX或TensorRT。YOLOv8的導(dǎo)出命令yolo export modelbest.pt formatonnx opset12 simplifyTrue yolo export modelbest.pt formatengine halfTrue device0導(dǎo)出ONNX時注意opset版本12兼容性最好。simplifyTrue會做圖優(yōu)化去掉冗余算子。導(dǎo)出TensorRT引擎時halfTrue開啟FP16推理速度能提升30%-50%精度損失通常在1個百分點以內(nèi)。推理優(yōu)化方面如果部署在邊緣設(shè)備如Jetson系列建議用TensorRT DLA加速。如果部署在服務(wù)器端ONNX Runtime CUDA Execution Provider就夠用了。不要直接用PyTorch模型做推理速度慢且顯存占用高。5.3 實際部署中的經(jīng)驗技巧技巧一多尺度推理融合。推理時把圖像縮放到多個尺度如640、960、1280分別檢測然后用NMS融合結(jié)果。這個方法能提升小目標(biāo)召回但推理耗時成倍增加。適合對實時性要求不高的巡檢場景。技巧二時序濾波。無人機(jī)視頻是連續(xù)的相鄰幀的檢測結(jié)果可以做時序平滑。如果某一幀檢測到垃圾但前后幀都沒有大概率是誤檢可以過濾掉。這個后處理能顯著降低誤檢率。技巧三地理圍欄過濾。如果無人機(jī)有GPS信息可以把檢測框映射到地理坐標(biāo)然后根據(jù)已知的陸地/海域邊界過濾掉陸地上的誤檢。海面垃圾檢測中岸邊建筑、船只、浮標(biāo)都可能被誤檢地理圍欄能有效過濾這些。技巧四模型量化。如果部署設(shè)備算力有限可以對模型做INT8量化。YOLOv8支持PTQ訓(xùn)練后量化用幾百張校準(zhǔn)圖就能完成。量化后模型體積縮小4倍推理速度提升2-3倍精度損失通常在2-3個百分點。對于海面垃圾檢測這種對精度要求不是極端苛刻的場景INT8量化完全可用。最后分享一個小技巧在實際部署前一定要用真實場景的視頻流做一次端到端測試而不是只看驗證集的mAP。驗證集是靜態(tài)圖像視頻流有幀間相關(guān)性、有運(yùn)動模糊、有編碼壓縮偽影這些都會影響實際檢測效果。我見過太多模型在驗證集上mAP 0.9一到視頻流上就各種漏檢誤檢。用視頻流測試能提前暴露這些問題給你留出優(yōu)化時間。