:從數(shù)據(jù)集準備到訓練調參全流程解析)
簡介面向目標檢測學習者和船只識別應用開發(fā)者這是一套完整的YOLOv5艦船檢測資源包內置訓練好的多類別船只檢測權重、PR曲線與loss曲線等評估文件并附帶數(shù)千張標注圖像覆蓋艦艇、游輪、帆船、軍艦等類別。標注文件同時提供txt與xml兩種格式分別存放于獨立文件夾中既能直接訓練YOLOv5也方便轉換為其他檢測框架數(shù)據(jù)集。代碼基于PyTorch實現(xiàn)復用YOLOv5環(huán)境即可加載權重后可直接完成圖片或視頻中的船只檢測。壓縮包共288個文件主要包含jpg圖片數(shù)據(jù)、yaml與yml配置、py推理腳本、pt權重、sh啟動腳本、csv訓練記錄、說明文檔及notebook示例等整體約760.77MB。已有1677人學習下載適合需要快速獲得可靠船只檢測模型或高質量標注數(shù)據(jù)的研究者與工程人員可極大縮短模型從零訓練與數(shù)據(jù)準備周期尤其適合用于畢業(yè)設計、算法復現(xiàn)與工程落地前的快速驗證。 艦船檢測這個方向在目標檢測的畢設和橫向項目里一直是高頻選題。YOLOv5做艦船檢測配上幾千張標注好的數(shù)據(jù)集這套組合我見了太多次自己也完整跑通過好幾輪。說句實在話這個題目看起來簡單真正動手做的時候坑基本都藏在數(shù)據(jù)準備和訓練細節(jié)里。很多人以為下載個數(shù)據(jù)集、克隆個倉庫、跑個train.py就完事了結果不是loss不收斂就是mAP低得沒法看最后連問題出在哪都說不清。這篇文章我就圍繞“YOLOv5艦船檢測 艦船檢測模型 幾千張標注數(shù)據(jù)集”這個完整組合把從數(shù)據(jù)準備、格式轉換、工程配置到訓練調參、問題排查的完整鏈路拆開講一遍。做畢設、做課程設計或者只是想系統(tǒng)入門目標檢測實戰(zhàn)的朋友都可以直接照著操作。不是那種只貼命令的教程我會把每一步背后的為什么也講清楚。1. 為什么是YOLOv5 幾千張數(shù)據(jù)集1.1 這個組合為什么流行YOLOv5能在艦船檢測這種任務里成為首選不是因為它精度最高而是因為它在“精度、速度、易用性、部署成本”四個維度上取得了一個絕大多數(shù)人都能接受的平衡點。艦船檢測常見的落地場景是港口監(jiān)控、航道管理、海事巡邏這些場景對實時性有硬要求動輒幾十上百路視頻流接入推理速度直接決定方案能不能用。YOLOv5在邊緣設備、普通顯卡上都能跑得動這點比很多兩階段模型更有優(yōu)勢。另外YOLOv5的工程化成熟度確實高。數(shù)據(jù)格式、訓練流程、評估腳本、導出部署都做得比較順滑一個新手嚴格按照文檔操作大概率能跑通。相比之下如果用更復雜的檢測框架光是環(huán)境依賴就能勸退不少人。項目周期短、驗收要求“能跑、能看、能匯報”的話YOLOv5幾乎是唯一不需要糾結的答案。1.2 “幾千張”這個規(guī)模的背后邏輯再說數(shù)據(jù)集規(guī)模。很多人的誤區(qū)是覺得標注數(shù)據(jù)“越多越好”但實際項目中幾千張標注圖片是一個很有性價比的區(qū)間。艦船檢測屬于單類或少數(shù)類別的目標檢測類別數(shù)少模型需要學習的模式相對單一——船體輪廓、甲板結構、船舶與背景的對比特征。這種情況下高質量的三五千張圖片已經(jīng)足夠讓模型達到一個可用的水平。我個人的體感是如果標注質量靠譜、場景覆蓋多樣4000張左右的艦船數(shù)據(jù)訓練出來的模型mAP50可以做到0.85以上。真正決定上限的不是數(shù)量而是數(shù)據(jù)的多樣性。全是同一視角、同一海況、同一光照條件下的圖哪怕給你一萬張泛化能力也堪憂。反過來如果圖片覆蓋了不同海況、近岸遠海、不同天氣、不同船型2000張也能給你驚喜。所以“幾千張”這個規(guī)模本身是合理的關鍵在數(shù)據(jù)質量。2. 數(shù)據(jù)集的獲取、清洗與格式轉換2.1 數(shù)據(jù)從哪來開源數(shù)據(jù)與自建標注艦船檢測的數(shù)據(jù)獲取主要有三條路。第一條是直接用開源數(shù)據(jù)集常用的有SeaShips、HRSC2016還有一些遙感艦船數(shù)據(jù)集。SeaShips是目前用的比較多的一個包含上萬個實例涵蓋貨船、漁船、集裝箱船、客輪等多種類型場景貼近實際水域監(jiān)控。HRSC2016偏向遙感影像圖片來自谷歌地球分辨率高但視角單一適合做遙感方向的檢測。第二條路是自己爬圖標注。用爬蟲從圖庫網(wǎng)站抓取艦船圖片然后用LabelImg或者X-AnyLabeling標注。這條路的問題是版權和標注成本——幾千張圖的標注熟練工也要兩三周還不算返工。第三條路是混合路線先用開源數(shù)據(jù)訓練一個初版模型再用這個模型去自動標注新采集的圖片人工只做修正。這個方案效率最高但對初版模型的精度有要求通常適合已有一定基礎數(shù)據(jù)的情況。不管哪條路數(shù)據(jù)質量把關都躲不掉。我的習慣是拿到數(shù)據(jù)后先做一輪快速篩查刪掉明顯重復的、嚴重模糊的、目標占比過小的圖片。千萬不要把臟數(shù)據(jù)帶進訓練集后面排查問題會非常痛苦。2.2 標注格式轉換從任意格式轉到YOLOYOLOv5使用的標注格式是txt文件每行對應一個目標格式為“類別id 中心點x 中心點y 寬度w 高度h”其中x、y、w、h都是相對于圖片寬度和高度的歸一化值。比如一張1920x1080的圖某個目標的中心點像素坐標是(960, 540)寬480高270那么對應的一行是“0 0.5 0.5 0.25 0.25”。很多公開數(shù)據(jù)集的標注并不是這個格式。HRSC2016的標注是XML格式帶旋轉框信息SeaShips的標注格式在不同版本里還不太一樣。另一種常見情況是之前用LabelImg標注生成的是Pascal VOC格式的XML或者用labelme標注生成的是JSON。這些格式都需要轉成YOLO的txt格式。數(shù)據(jù)格式規(guī)范是訓練的第一步。如果不確定自己的標注格式是否正確可以用一行代碼快速驗證——把圖片和對應的txt放進同一個目錄然后用可視化腳本把標注框畫出來肉眼檢查。這個步驟別省我見過太多人訓練半天最后發(fā)現(xiàn)是坐標歸一化算錯了所有框的位置都是歪的。2.3 數(shù)據(jù)劃分與目錄結構YOLOv5對數(shù)據(jù)集目錄結構的要求是固定的官方推薦的結構是datasets/ship/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/注意圖片和標注文件的文件名必須一一對應比如00001.jpg對應00001.txt。劃分比例一般用8:2或者9:1訓練集和驗證集要確保分布一致比如同一個港口的圖片不能全跑進訓練集否則驗證集上看到的全是“熟悉”的場景指標會虛高。這里有個常用的劃分腳本思路import os import random import shutil random.seed(42) image_dir all_images label_dir all_labels train_ratio 0.8 images [f for f in os.listdir(image_dir) if f.endswith(.jpg)] random.shuffle(images) split_idx int(len(images) * train_ratio) for i, img in enumerate(images): src_img os.path.join(image_dir, img) src_lbl os.path.join(label_dir, img.replace(.jpg, .txt)) if i split_idx: dst_img os.path.join(datasets/ship/images/train, img) dst_lbl os.path.join(datasets/ship/labels/train, img.replace(.jpg, .txt)) else: dst_img os.path.join(datasets/ship/images/val, img) dst_lbl os.path.join(datasets/ship/labels/val, img.replace(.jpg, .txt)) shutil.copy(src_img, dst_img) shutil.copy(src_lbl, dst_lbl)注意劃分的時候不要只shuffle文件名后直接切要確認沒有同名文件殘留。跑完之后檢查一下train和val的圖片數(shù)量比例是否符合預期。3. 訓練前的工程準備3.1 環(huán)境配置要點YOLOv5的環(huán)境配置沒有太多玄學PyTorch、CUDA、cuDNN版本匹配好就行。我建議直接創(chuàng)建一個干凈的conda環(huán)境Python用3.8或者3.9PyTorch選擇與顯卡驅動匹配的版本。說一個實操細節(jié)裝PyTorch的時候用官方源或者鏡像源不要在pip默認源硬啃幾個G的包容易中途失敗或者慢到懷疑人生。YOLOv5倉庫本身依賴不多pip install -r requirements.txt就夠了。如果你打算訓練時用WB或者TensorbBoard看曲線記得把對應的依賴一起裝上。這塊沒什么坑但顯卡驅動的CUDA版本和PyTorch要求的CUDA版本不匹配是新手最容易卡殼的地方。3.2 data.yaml與模型選擇YOLOv5的數(shù)據(jù)配置靠一個YAML文件搞定。艦船檢測的data.yaml長這樣train: datasets/ship/images/train val: datasets/ship/images/val nc: 1 names: [ship]如果你的數(shù)據(jù)集是區(qū)分船型的比如貨船、漁船、客輪三類那就改成nc: 3names列表對應順序寫正確。這里有個很多人會忽略的細節(jié)——names的順序必須和標注txt文件里的類別id完全一致。如果訓練時發(fā)現(xiàn)類別標簽錯亂先檢查這里。模型規(guī)格方面YOLOv5提供了n/s/m/l/x幾個檔位。艦船檢測這種場景輸入圖片分辨率一般是640x640或者1280x1280。如果是邊緣設備部署建議用s模型起步參數(shù)量適中精度也夠如果是論文刷指標m或者l模型上限更高。我之前對比過s和m在同一批艦船數(shù)據(jù)上的表現(xiàn)m的mAP50大約能提升2到3個百分點但推理速度下降40%左右。這個取舍要看你的落地場景沒有標準答案。3.3 先跑通再上量我強烈建議不要一上來就全量數(shù)據(jù)、大批次直接開訓。正確做法是先用一個非常小的配置——幾十張圖、幾個epoch——把整個流程跑通確認沒有路徑錯誤、顯存爆掉、維度不匹配這類問題。這個小規(guī)模驗證通常只需要十幾分鐘能幫你省下非常多排查時間。具體來說你可以在命令行中指定--epochs 3 --batch-size 4觀察一下訓練能否正常啟動、loss是否在下降、驗證集指標是否有輸出。跑通之后再改成正式參數(shù)。這一步很多人看不上但我在實際項目里靠它躲過了好幾次“訓練兩小時失敗重來”的悲劇。4. 訓練全流程與調參心得4.1 關鍵超參數(shù)怎么定YOLOv5訓練時的超參數(shù)主要在兩個地方命令行參數(shù)和hyp.scratch.yaml。命令行參數(shù)里最核心的幾個是--img、--batch、--epochs、--weights。輸入分辨率--img直接影響檢測精度和速度。對于艦船檢測我的建議是不要低于640。艦船目標往往比較小尤其遙感影像里普通的近岸監(jiān)控畫面還好遙感圖上一艘船可能就幾十個像素640以下的輸入會把小目標細節(jié)全部抹掉。如果顯卡允許用1280效果明顯更好但訓練時間和顯存占用會大幅上升。--batch的大小受顯存限制。一張RTX 309024GB顯存YOLOv5s在img640時batch可以開到32甚至更大如果顯存不夠優(yōu)先降低batch而不是降低分辨率。batch太小會導致梯度噪聲大收斂不穩(wěn)定尤其艦船這種目標尺度差異明顯的任務太小的batch會讓模型學到不穩(wěn)定的特征。--epochs的設置要看data規(guī)模。幾千張數(shù)據(jù)的情況下100到150個epoch是合理的區(qū)間。我通常的做法是先訓100個epoch觀察驗證集mAP的趨勢如果到后期還在穩(wěn)步上升就追加訓練。YOLOv5支持在已有權重上繼續(xù)訓練--weights指定到上次訓練的last.pt--resume可以自動恢復。學習率方面YOLOv5在yolov5s.pt預訓練權重基礎上繼續(xù)訓練時默認的0.01初始學習率是合理的選擇。如果你是加載自己的模型繼續(xù)訓練建議把lr調到0.001以下避免破壞已學到的特征。4.2 訓練過程監(jiān)控與斷點恢復訓練啟動后終端會輸出每個epoch的box_loss、cls_loss、obj_loss和驗證集指標。我的習慣是重點看兩個指標訓練時的box_loss和驗證集的mAP50。box_loss持續(xù)下降說明模型在學mAP50整體上升說明學的東西有用。如果loss下降但mAP紋絲不動大概率是數(shù)據(jù)標注有問題或者類別定義模糊。TensorbBoard在這里幫了大忙。--project和--name參數(shù)可以指定輸出目錄訓練日志和驗證圖片都會自動保存。我經(jīng)常干的一件事是去驗證結果里翻圖片看模型預測的框和真實標注的差異。這種直觀觀察比看曲線更能發(fā)現(xiàn)問題。比如模型總是漏檢遠處的小船或者總是把碼頭的起重機誤檢成船這些信息直接決定了后續(xù)優(yōu)化方向。務必養(yǎng)成斷點恢復的習慣。YOLOv5每次epoch結束都會保存last.pt和best.ptbest.pt是驗證集mAP最高的權重。如果訓練中途斷了用下面這個命令可以恢復python train.py --resume runs/train/exp/weights/last.pt省一次重新訓練的時間就多一次調參的機會。4.3 指標解讀P、R、mAP50、mAP50-95訓練結束時驗證集上會輸出四個核心指標。Precision代表查準率——模型檢出來的框里有多少確實是船Recall代表查全率——真實的船里面有多少被模型檢出來了。mAP50是IoU閾值0.5下的平均精度這是最常用的評價指標mAP50-95是多個IoU閾值下的平均更能反映定位精度。艦船檢測的特殊性在于不同場景對P和R的側重不一樣。航道監(jiān)控里漏檢一艘船可能是安全事故所以R的優(yōu)先級更高但如果是港口流量統(tǒng)計誤檢太多會干擾統(tǒng)計結果P就更重要。調節(jié)置信度閾值--conf-thres可以直接控制這個平衡調低閾值可以提高召回率代價是誤檢變多調高閾值則反過來。部署階段的閾值和訓練階段的默認值可以分開調不用受訓練設置限制。5. 艦船檢測常見問題與排查記錄5.1 典型故障速查表這里整理了我自己在艦船檢測項目中遇到的高頻問題以及對應的排查思路和解決辦法。問題現(xiàn)象可能原因排查方法解決建議訓練時loss不下降或反而上升學習率過大/數(shù)據(jù)標注錯亂查看loss曲線抽查標注可視化調低初始學習率重新檢查數(shù)據(jù)集mAP50低但訓練loss正常驗證集與訓練集分布差異大查看驗證集的圖片構成重新劃分數(shù)據(jù)集確保分布一致小目標艦船大量漏檢輸入分辨率不足/標注框過小統(tǒng)計目標框的像素尺寸提高img到1280或使用SAHI切片推理顯存不足OOMbatch過大或分辨率過高觀察顯存占用減小batch開啟梯度累積誤檢碼頭、島嶼等背景訓練數(shù)據(jù)中背景單一檢查負樣本是否充足增加無目標的純背景圖片作為負樣本訓練到后期P高R低置信度過高攔截了低分目標測試不同conf-thres下的結果部署時適當降低置信度閾值第二行說的情況我踩過最大的跟頭。有次用了一個港口的視頻截幀做驗證訓練集是另一批近海航行的圖片兩個場景在光照、背景、目標尺度上都差很多訓練了100個epoch訓練集loss已經(jīng)很低驗證集mAP卻一直卡在0.3。最后重新按場景混合劃分數(shù)據(jù)同樣配置下mAP直接翻倍。5.2 數(shù)據(jù)增強導致的兩個特殊坑艦船檢測里數(shù)據(jù)增強有一正一反兩個坑要特別注意。正面的坑是過度使用旋轉增強。艦船目標有明確的方向性船頭和船尾的特征差異大如果你把圖片旋轉90度或180度當做新的訓練樣本模型需要額外學習所有朝向。這本身不是壞事但如果驗證集里全是統(tǒng)一朝向的圖片比如都是船頭朝左訓練結果會在驗證集上表現(xiàn)虛高部署到實際場景又崩掉。正確做法是根據(jù)真實應用場景決定是否用旋轉增強——監(jiān)控場景攝像頭固定不需要旋轉遙感影像方向隨機旋轉增強就能明顯提升泛化。反面的坑是mosaic增強導致小目標信息丟失。YOLOv5默認開啟mosaic它會把四張圖拼在一起同時做隨機縮放。對艦船這種目標小、數(shù)量密集的任務mosaic縮放后小船的像素尺寸可能只剩十幾個模型根本學不到有效特征。如果發(fā)現(xiàn)小目標檢測效果差先檢查訓練時mosaic增強是不是一直都在開啟狀態(tài)訓練后期可以關掉mosaic只用普通增強精調。YOLOv5在epochs的最后10到20個epoch會自動關閉mosaic這個機制對艦船這類小目標密集任務非常重要。5.3 推理階段的兩個實用建議部署推理時我額外推薦兩個做法。第一個是使用SAHI切片推理。艦船檢測尤其適用于大圖中小目標的場景——一張遙感大圖4096x4096直接resize到640再推理小船早就糊成幾個像素了。SAHI的思路是把大圖切成小塊每塊獨立推理再合并結果。如果你的數(shù)據(jù)來源是大尺寸遙感影像SAHI的提升是質的飛躍甚至不需要重新訓練模型。第二個是合理處理重疊檢測框。艦船密集停靠的港口場景中相鄰船只的檢測框很容易重疊。NMS的IoU閾值默認是0.45如果發(fā)現(xiàn)兩艘靠得很近的船被合并成一個框適當調低NMS的IoU閾值到0.3左右試試反過來如果一艘船被拆成多個框就把閾值調高一點。這個參數(shù)改起來非??靺s能解決很多視覺形態(tài)上“臟亂差”的問題。最后再分享一點個人經(jīng)驗。這類項目型任務數(shù)據(jù)準備階段的時間至少要占整個項目周期的60%。模型結構、訓練參數(shù)這些都可以在幾天內調整到位但數(shù)據(jù)的清洗、篩選、格式轉換、質量抽查一個都省不了。艦船檢測的各種公開baseline已經(jīng)很成熟你面對的真正難題永遠是“數(shù)據(jù)長什么樣模型就學成什么樣”。把幾千張數(shù)據(jù)整理到標注精準、場景均衡、格式統(tǒng)一你的模型就已經(jīng)贏了大半。本文還有配套的精品資源點擊獲取