檢測數(shù)據(jù)集清洗與YOLOv8訓(xùn)練避坑全指南)
簡介海洋魚類目標(biāo)檢測數(shù)據(jù)集是一份面向目標(biāo)檢測任務(wù)的行業(yè)數(shù)據(jù)集適用于海洋生態(tài)監(jiān)測、水產(chǎn)養(yǎng)殖管理、海洋保護(hù)區(qū)物種跟蹤及學(xué)術(shù)研究等場景。資源總計1844個文件包含921張真實(shí)海洋環(huán)境拍攝的JPEG/PNG圖片及對應(yīng)的921個YOLO格式txt標(biāo)注文件并附有類別配置文件yaml和說明文檔docx壓縮包大小約62.15MB。數(shù)據(jù)覆蓋大西洋鯧魚、石首魚、籃子魚和刺尾魚四種常見海洋魚類邊界框標(biāo)注精準(zhǔn)支持主流深度學(xué)習(xí)框架直接訓(xùn)練也可擴(kuò)展用于物種識別、種群統(tǒng)計等相關(guān)視覺任務(wù)。目前已有186人學(xué)習(xí)下載。這份數(shù)據(jù)集的亮點(diǎn)在于全部圖像源自實(shí)拍場景樣本包含多個體、多角度情況能夠幫助模型更好地適應(yīng)復(fù)雜水下環(huán)境提升泛化能力。配套的yaml與docx簡化了環(huán)境配置與理解流程使用戶可以快速啟動訓(xùn)練、驗(yàn)證與評估為海洋生物自動識別和生態(tài)保護(hù)提供高質(zhì)量的數(shù)據(jù)支撐。1. 海洋魚類目標(biāo)檢測數(shù)據(jù)集為什么拿到手先別急著解壓做水下機(jī)器人感知或養(yǎng)殖監(jiān)測的工程師看到“海洋魚類目標(biāo)檢測數(shù)據(jù)集.zip”這種壓縮包第一反應(yīng)多半是解壓、看目錄、直接跑訓(xùn)練。這個流程在公開數(shù)據(jù)集上可能順手但在網(wǎng)上下載的魚群數(shù)據(jù)上大概率會在訓(xùn)練中段毫無征兆地翻車有的類標(biāo)錯、有的框越界、有的圖片和標(biāo)注根本對不上。海洋魚類目標(biāo)檢測的特點(diǎn)決定了它比通用目標(biāo)檢測更依賴數(shù)據(jù)質(zhì)量——水下光照衰減、魚群密集遮擋、同類在不同水域顏色差異極大這些因素讓標(biāo)注噪聲被成倍放大。這篇文章不評價具體某個包的好壞只講拿到壓縮包之后怎么驗(yàn)貨、怎么清洗、怎么組織成yolov8能認(rèn)的目錄結(jié)構(gòu)以及中途會遇到哪些坑。適合做水下機(jī)器人視覺、養(yǎng)殖監(jiān)測、漁業(yè)資源評估和海洋牧場感知方案的人照著復(fù)現(xiàn)。2. 解壓與校驗(yàn)先跑通文件完整性再談訓(xùn)練數(shù)據(jù)拿到“海洋魚類目標(biāo)檢測數(shù)據(jù)集.zip”后的第一反應(yīng)通常是右鍵解壓但這一步的風(fēng)險被大多數(shù)人低估了。zip包在網(wǎng)絡(luò)傳輸中可能損壞部分解壓工具對損壞條目會靜默跳過或報錯但不中斷更隱蔽的是zip偽加密——文件被標(biāo)記為加密但實(shí)際沒有加密內(nèi)容雙擊能瀏覽程序批量讀取時卻拋異常。兩類問題都能在解壓前發(fā)現(xiàn)代價只是幾十秒。2.1 用CRC32校驗(yàn)zip完整性拒絕“半路損壞”的標(biāo)注文件zip包內(nèi)每個文件都帶CRC32校驗(yàn)值unzip的test操作會把所有條目解壓到內(nèi)存并與記錄值比對不落盤、不改文件。命令行直接跑unzip -t 海洋魚類目標(biāo)檢測數(shù)據(jù)集.zip | tail -20-t表示test只讀不寫管道到tail -20是只看最后二十行避免校驗(yàn)幾千張圖片時刷屏。輸出里出現(xiàn)“No errors detected in compressed data”就可以放心解壓出現(xiàn)bad CRC說明某個文件損壞。我一般還會順手看一眼文件安全屬性zipinfo -v 海洋魚類目標(biāo)檢測數(shù)據(jù)集.zip | grep -i file securityzipinfo的File security status一欄如果顯示encrypted而剛才unzip -t又能正常通過那就要警惕偽加密。真加密會遇到輸入密碼提示偽加密則沒有。偽加密的zip用python的zipfile庫讀取時會報RuntimeError: File is encrypted但解壓工具卻能正常解出內(nèi)容這種狀態(tài)最容易讓腳本在批量處理時中斷。提示不要默認(rèn)“解壓到當(dāng)前文件夾”。先建目錄再解壓數(shù)據(jù)集通常幾百張到幾萬張圖散落一地之后只能手動收拾。mkdir -p fish_dataset unzip 海洋魚類目標(biāo)檢測數(shù)據(jù)集.zip -d fish_dataset-d指定目標(biāo)目錄把解壓動作與后續(xù)清洗隔離。文件名如果帶中文建議解壓后先整體重命名為簡單的英文前綴避免后續(xù)腳本在部分Linux發(fā)行版上因locale編碼問題出現(xiàn)路徑解析錯誤。2.2 透視目錄結(jié)構(gòu)與標(biāo)注格式COCO、VOC還是YOLO解壓后先做一次不加工的結(jié)構(gòu)體檢用文件擴(kuò)展名統(tǒng)計快速了解內(nèi)容構(gòu)成find fish_dataset -maxdepth 3 -type f | awk -F. {print $NF} | sort | uniq -c這一步能看出包內(nèi)是jpg還是png有沒有混入pdf、exe、臨時文件。正常情況下應(yīng)該只有圖像文件和標(biāo)注文件兩類。接著看標(biāo)注文件的實(shí)際路徑和命名find fish_dataset -name *.txt | head -5 find fish_dataset -name *.xml | head -5txt對應(yīng)YOLO格式或COCO的某類子集xml對應(yīng)VOC格式。海洋魚類數(shù)據(jù)集最常見的是YOLO格式——每行class x_center y_center width height坐標(biāo)值歸一化到0到1之間也有少量包用VOC的bndbox節(jié)點(diǎn)直接存像素坐標(biāo)。這兩類格式的轉(zhuǎn)換腳本誰都會寫真正會讓訓(xùn)練前處理翻車的是格式不統(tǒng)一一部分圖有txt一部分只有xml還有一部分txt是空文件??諛?biāo)注優(yōu)先排查for f in $(find fish_dataset -name *.txt); do if [ ! -s $f ]; then echo empty_label: $f fi done-s判斷文件大小是否為0輸出所有空標(biāo)注文件路徑??瘴募灰欢ù韴D里沒有魚更多時候是標(biāo)注工具導(dǎo)出時漏了寫內(nèi)容。這個清單先留著后面統(tǒng)一過濾。2.3 用Python做數(shù)據(jù)畫像類別數(shù)、圖像數(shù)、漏標(biāo)檢查一次看全命令行只能做粗查數(shù)據(jù)畫像我用python一次算完。按YOLO標(biāo)注格式讀import os from collections import Counter label_dir fish_dataset/labels stats Counter() empty_files [] total_boxes 0 boxes_per_image [] for name in os.listdir(label_dir): if not name.endswith(.txt): continue path os.path.join(label_dir, name) with open(path) as f: lines [line.strip() for line in f if line.strip()] if not lines: empty_files.append(name) continue boxes_per_image.append(len(lines)) for line in lines: cls line.split()[0] stats[cls] 1 total_boxes 1 print(類別分布:, dict(stats)) print(標(biāo)注框總數(shù):, total_boxes) print(空標(biāo)注文件數(shù):, len(empty_files)) print(單圖框數(shù)中位數(shù):, sorted(boxes_per_image)[len(boxes_per_image) // 2])讀文件用純文本逐行讀不調(diào)json庫因?yàn)閅OLO格式本身就是一行一個框。統(tǒng)計以box為最小單位而不是圖像數(shù)量類別不均衡會更早暴露。boxes_per_image的中位數(shù)反映真實(shí)擁擠程度——中位數(shù)是1但均值是8說明少數(shù)密集魚群圖貢獻(xiàn)了大量框模型會被這些極端圖牽著走。三個數(shù)值的組合能快速判斷數(shù)據(jù)集的下限類別數(shù)多但每類只有幾十個框的這類數(shù)據(jù)直接扔進(jìn)訓(xùn)練集只會教模型學(xué)噪聲??諛?biāo)注文件占比超過5%時優(yōu)先排查標(biāo)注遺漏而不是真的沒有目標(biāo)這是一個能節(jié)省大量訓(xùn)練時間的前置判斷。3. 海洋魚類的標(biāo)注質(zhì)量怎么驗(yàn)bbox面積、遮擋與類別長尾能解壓只是文件層面完整標(biāo)注可信度是另一回事。海洋魚類標(biāo)注的難點(diǎn)集中在兩點(diǎn)目標(biāo)小且相互遮擋類別在視覺上高度相似。兩個特點(diǎn)決定了直接套用通用目標(biāo)檢測的數(shù)據(jù)處理流程大概率吃虧——VOC和COCO的框基本是“一個物體一個框”而魚群數(shù)據(jù)經(jīng)常是“一條魚半個框、兩條魚共用一個框”。3.1 可視化標(biāo)注抽檢別讓壞樣本混進(jìn)訓(xùn)練集統(tǒng)計腳本不會告訴你某張圖上框錯了位置。我會按類別隨機(jī)抽圖把標(biāo)注框畫出來保存成圖片一張一張翻。畫框腳本import cv2 import os image_dir fish_dataset/images label_dir fish_dataset/labels # names按數(shù)據(jù)集實(shí)際類名順序填這里只是示例 names [surgeonfish, clownfish, grouper] def draw_sample(image_name): img cv2.imread(os.path.join(image_dir, image_name .jpg)) h, w img.shape[:2] with open(os.path.join(label_dir, image_name .txt)) as f: for line in f: cls, cx, cy, bw, bh line.split() cx, cy, bw, bh map(float, (cx, cy, bw, bh)) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, names[int(cls)], (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) cv2.imwrite(fcheck_{image_name}.jpg, img)坐標(biāo)換算用的是歸一化到像素的逆變換畫框時注意原點(diǎn)在左上角。抽樣策略不是均勻隨機(jī)而是每類先看最少的那一部分某類只有30個框就全看某類有2000個框就看50張重點(diǎn)挑該類別數(shù)量最少的那些圖。數(shù)量多的類里容易看不出問題數(shù)量少的類反而最暴露標(biāo)注者偷懶——把小丑魚標(biāo)成“damsel”、漏掉背景里的那一只這類錯誤在密集場景里幾乎必然發(fā)生。3.2 過濾“無效框”超小目標(biāo)、越界坐標(biāo)、空標(biāo)注圖可視化看完一輪寫清洗腳本。一次性腳本邏輯要穩(wěn)先處理三類高頻問題坐標(biāo)越界、寬或高過小、同一目標(biāo)被重復(fù)框選。def is_valid_box(line, img_w, img_h, min_area_ratio0.0005): cls, cx, cy, bw, bh line.split() cx, cy, bw, bh map(float, (cx, cy, bw, bh)) x1 (cx - bw / 2) * img_w y1 (cy - bh / 2) * img_h x2 (cx bw / 2) * img_w y2 (cy bh / 2) * img_h if x1 0 or y1 0 or x2 img_w or y2 img_h: return False w, h x2 - x1, y2 - y1 if w * h / (img_w * img_h) min_area_ratio: return False return Truemin_area_ratio取0.0005意味著1920x1080的畫面里目標(biāo)面積至少要1045像素大約是一塊33x33的區(qū)域。這個閾值對海洋魚群偏保守小于它的目標(biāo)大多是遠(yuǎn)景里的模糊魚影放進(jìn)訓(xùn)練集只會教模型認(rèn)噪聲。閾值不能拍腦袋定先跑一遍全量統(tǒng)計看框面積分布再取底部5%作為丟棄線。越界坐標(biāo)的處理我傾向直接丟——越界通常來自標(biāo)注工具默認(rèn)值或格式換算錯誤說明這張圖本身有問題裁掉坐標(biāo)只是掩蓋錯誤。3.3 類別長尾怎么處理前先算清楚這一筆賬海洋魚類的類別分布幾乎一定是長尾少數(shù)常見種占了80%的框剩下的稀有種零星出現(xiàn)。處理長尾之前先做兩個維度統(tǒng)計按框數(shù)和按圖像數(shù)。類別情況建議做法框數(shù)多、圖像數(shù)少單圖內(nèi)目標(biāo)密集先做樣本去重或限制單圖最大標(biāo)注數(shù)框數(shù)少、圖像數(shù)也少不足50框的類別直接砍掉或并到相近的“其他魚類”類框數(shù)少但圖像數(shù)尚可復(fù)制粘貼增強(qiáng)或?qū)φ麍D做仿射變換擴(kuò)充類間視覺相似度高優(yōu)先合并類不要強(qiáng)迫模型學(xué)細(xì)微差異兩個維度差很大時說明某類經(jīng)常在一張圖里出現(xiàn)多只訓(xùn)練時單個batch里同類重復(fù)率高模型對單個目標(biāo)特征的泛化會比預(yù)期差。復(fù)制粘貼增強(qiáng)是把樣本實(shí)例裁剪出來貼到?jīng)]有該目標(biāo)的背景圖上對魚類這種可移動目標(biāo)很適用但注意貼圖后要刪除粘貼區(qū)域里原有的小目標(biāo)否則兩個框重疊會讓模型學(xué)混。這些增強(qiáng)操作不改變標(biāo)注坐標(biāo)的推理方式只改變樣本分布。4. 喂給yolov8訓(xùn)練數(shù)據(jù)YAML、目錄重組與關(guān)鍵參數(shù)驗(yàn)證清洗過后下一步是把數(shù)據(jù)集組織成yolov8能直接讀取的結(jié)構(gòu)。yolov8的數(shù)據(jù)加載邏輯很簡單images/train和labels/train目錄對等圖片文件和同名txt一一對應(yīng)。但很多下載的數(shù)據(jù)集解壓后是“原生態(tài)”的圖像和標(biāo)注混在一起需要重組。4.1 把數(shù)據(jù)集重新組織成YOLO目錄結(jié)構(gòu)目標(biāo)結(jié)構(gòu)fish_yolo/ images/ train/ val/ labels/ train/ val/轉(zhuǎn)換腳本用shutil做文件復(fù)制不移動原文件保留一份原始數(shù)據(jù)做后悔藥import random import shutil from pathlib import Path src Path(fish_dataset) dst Path(fish_yolo) for split in [train, val]: (dst / images / split).mkdir(parentsTrue, exist_okTrue) (dst / labels / split).mkdir(parentsTrue, exist_okTrue) image_paths sorted((src / images).glob(*.jpg)) # 文件名形如 seq001_frame_002.jpg取seq前綴做場景分組鍵 # 如果文件名沒有下劃線改成你自己的分組規(guī)則 groups {} for p in image_paths: key p.stem.split(_)[0] groups.setdefault(key, []).append(p) val_seqs set(random.sample(list(groups), max(1, int(len(groups) * 0.15)))) for key, paths in groups.items(): split val if key in val_seqs else train for img in paths: shutil.copy(img, dst / images / split / img.name) lbl src / labels / (img.stem .txt) if lbl.exists(): shutil.copy(lbl, dst / labels / split / (img.stem .txt)) else: (dst / labels / split / (img.stem .txt)).touch()按場景分組而不是按單張圖隨機(jī)劃分是我做水下數(shù)據(jù)后養(yǎng)成的習(xí)慣。水下視頻連續(xù)幀之間的背景、光線、魚群位置高度相似隨機(jī)劃分會讓驗(yàn)證集“提前看過”訓(xùn)練集的背景精度虛高分組劃分犧牲了一部分驗(yàn)證集數(shù)量但得到的分?jǐn)?shù)可信。val占比15%是起點(diǎn)數(shù)據(jù)總量少于2000張時建議提高到20%否則驗(yàn)證集置信區(qū)間太寬。復(fù)制完成后跑一遍find fish_yolo/images/train -name *.jpg | wc -l和labels目錄的計數(shù)兩邊數(shù)量應(yīng)該一致不一致說明有圖片缺標(biāo)注那條touch命令已經(jīng)用空文件補(bǔ)位了。4.2 數(shù)據(jù)YAML的寫法與路徑陷阱data.yaml是yolov8讀取數(shù)據(jù)集的入口放在fish_yolo目錄下即可path: ../fish_yolo train: images/train val: images/val names: 0: surgeonfish 1: clownfish 2: grouper 3: sardine常見坑有兩個。第一個是path字段寫絕對路徑換一臺機(jī)器訓(xùn)練必炸相對路徑基于yaml文件位置解析數(shù)據(jù)集目錄和yaml一起移動就不會出錯。第二個是names索引必須從0開始且連續(xù)中間跳了一個序號訓(xùn)練會在日志里報但不會馬上停白白耗一兩個小時。names里的類名建議用英文或拼音——中文類名在部分版本的日志和plot輸出里會亂碼不影響權(quán)重但排查時很難受。4.3 訓(xùn)練時的關(guān)鍵參數(shù)imgsz、batch、數(shù)據(jù)增強(qiáng)開關(guān)訓(xùn)練啟動命令yolo detect train \ datafish.yaml \ modelyolov8n.pt \ imgsz640 \ batch16 \ epochs100 \ mosaic0.5 \ patience30 \ projectfish_runs \ nameexp1逐參數(shù)說。imgsz640是主流基準(zhǔn)原始圖像是4K或更高時先縮圖再訓(xùn)練不要直接喂原尺寸。mosaic0.5是最影響數(shù)據(jù)分布的一項(xiàng)增強(qiáng)——四張圖拼成一張水下的藍(lán)色背景會被混合成不可能出現(xiàn)的顏色分布魚群特征反而被稀釋。我的習(xí)慣是分兩階段前60個epoch用mosaic訓(xùn)練后40個epoch關(guān)閉mosaic做微調(diào)讓模型從增強(qiáng)構(gòu)建的偽分布回到真實(shí)分布上。patience30表示驗(yàn)證集30個epoch沒提升就早停水下數(shù)據(jù)驗(yàn)證集波動大標(biāo)準(zhǔn)默認(rèn)值太小容易提前掐斷訓(xùn)練。batch按顯存定先設(shè)16跑一步看占用再加不要一次拉滿batch過大導(dǎo)致batch內(nèi)目標(biāo)數(shù)量波動劇烈BN層統(tǒng)計不穩(wěn)定。模型尺寸選擇上數(shù)據(jù)量小于5000張就用n或s不要直接上l或x——小模型在這個規(guī)模下已經(jīng)開始過擬合大模型只會更嚴(yán)重。提示顯存不足時優(yōu)先降imgsz而不是batch。imgsz從640降到512顯存占用大約降三分之一mAP掉得卻不多。5. 避坑海洋魚類數(shù)據(jù)集最常見的5個翻車現(xiàn)場這部分是我跑過多個水下數(shù)據(jù)集后沉淀下來的排查順序。遇到問題先按現(xiàn)象對號入座再檢查原因不要一上來就換模型結(jié)構(gòu)。5.1 解壓提示文件損壞標(biāo)注txt讀到一半崩了現(xiàn)象解壓過程報錯中斷解壓工具提示“是否繼續(xù)”選擇繼續(xù)后目錄里少了一部分圖片訓(xùn)練時報FileNotFoundError甚至能跑完但val集缺了關(guān)鍵類別。原因zip包傳輸損壞或打包工具對中文文件名編碼不兼容導(dǎo)致個別條目名亂碼。rar解壓軟件對某些zip條目的處理并不總是可靠。解決按第2章的unzip -t先校驗(yàn)壞了就重新下載。源文件是rar的話先轉(zhuǎn)成zip再校驗(yàn)?zāi)鼙荛_不少奇怪的編碼分支。這條檢查30秒就能完成但能省下訓(xùn)練到一半才發(fā)現(xiàn)數(shù)據(jù)缺失的幾小時。5.2 圖片里其實(shí)沒有魚水下環(huán)境讓模型學(xué)會“檢測水”現(xiàn)象訓(xùn)練loss能降到很低測試時模型把水草、氣泡、潛水員背影都檢測成魚。原因標(biāo)注里有些圖的目標(biāo)實(shí)際是背景噪聲尤其是有波紋和反光的水面。模型學(xué)到的不是魚的紋理而是特定水域的顏色分布和波紋模式換一片水域立刻失效。海洋魚類數(shù)據(jù)集經(jīng)常由不同來源拼湊某批圖片標(biāo)注質(zhì)量差就會整體拉低數(shù)據(jù)可信度。解決清洗階段把這類誤標(biāo)樣本移出數(shù)據(jù)集同時從原始視頻里截取一批無魚背景圖作為難例。關(guān)鍵不是“教模型認(rèn)識背景”而是把標(biāo)注錯誤暴露出來并修正讓模型只在魚出現(xiàn)時激活。水下環(huán)境的光線、渾濁度、植被顏色差異極大凡是標(biāo)注框中心不在魚身上的全部刪掉重標(biāo)不要留著湊數(shù)。5.3 同一個類被拆成好幾種標(biāo)注花鱸、鱸魚、海鱸互不統(tǒng)一現(xiàn)象訓(xùn)練集mAP看著不錯部署時某種魚總是漏檢且預(yù)測框穩(wěn)定偏移到頭部方向。原因標(biāo)注人員按自己習(xí)慣命名同一種魚在label里同時出現(xiàn)三個類名。模型被迫把同一個視覺模態(tài)擬合到多個輸出通道每個通道的樣本量都被稀釋自然學(xué)不充分。解決合并前先做視覺對照表把顏色、體型、紋理接近的類列在一起。兩個類在視覺上區(qū)分度本來就不高優(yōu)先合并而不是讓模型學(xué)微妙差異。魚類數(shù)據(jù)集的“同物異名”問題比通用目標(biāo)檢測嚴(yán)重得多公開數(shù)據(jù)集經(jīng)過多輪審核而網(wǎng)上下載的打包數(shù)據(jù)集往往連一輪交叉驗(yàn)證都沒有。合并后重新統(tǒng)計類別分布低于閾值的小類繼續(xù)并入相鄰類或刪除直到每個類都有足夠樣本支撐訓(xùn)練。5.4 訓(xùn)練集和驗(yàn)證集有重疊圖像精度虛高現(xiàn)象訓(xùn)練日志val mAP達(dá)到0.9以上部署到實(shí)拍數(shù)據(jù)只有0.5甚至更低。原因數(shù)據(jù)集按連續(xù)視頻幀劃分train和val相鄰幀間隔幾十毫秒目標(biāo)位置和背景幾乎不變val相當(dāng)于開卷考試。網(wǎng)上下載的包經(jīng)常直接按文件序號前80%后20%切分沒做場景去重。解決用第4.1節(jié)的場景分組邏輯重新劃分。跑完訓(xùn)練后看混淆矩陣如果某類幾乎不出現(xiàn)在預(yù)測錯誤里也要警惕是過擬合到特定背景而不是真正學(xué)到了該類的判別特征。驗(yàn)證集不是用來刷分的是用來暴露問題的——精度高得反常先懷疑數(shù)據(jù)泄題。5.5 大尺寸圖像直接進(jìn)模型顯存翻車現(xiàn)象訓(xùn)練中途報CUDA out of memory或訓(xùn)練用小圖推理用原圖檢測效果差。原因高分辨率水下圖像直接以原尺寸輸入或訓(xùn)練與推理的輸入尺寸不一致。4K圖像直接resize到640魚群密集的小目標(biāo)幾乎消失但顯存先撐不住。解決先統(tǒng)計數(shù)據(jù)集的寬高分布按中位數(shù)縮放到統(tǒng)一尺寸。訓(xùn)練和推理的imgsz必須保持一致不一致時模型看到的特征尺度完全不同之前的訓(xùn)練等于白做。如果目標(biāo)是4K圖像里的極小目標(biāo)用切圖檢測更合理一張大圖切成若干640x640的塊分別推理再合并結(jié)果不要硬塞單張圖。6. 標(biāo)注信息的進(jìn)階復(fù)用用開放詞匯目標(biāo)檢測跟分類缺陷較勁6.1 數(shù)據(jù)集中段復(fù)檢一個類別一個類別地驗(yàn)證模型“真的在盯魚”固定類別訓(xùn)練要求類別清單封閉而海洋魚類數(shù)據(jù)集里總有標(biāo)錯但沒被發(fā)現(xiàn)的樣本。一個可行的復(fù)驗(yàn)方式是引入開放詞匯目標(biāo)檢測模型用自然語言描述“a fish in underwater scene”做提示詞跑一遍推理再用模型輸出的檢測框和人工標(biāo)注框做交并比匹配找出人工漏標(biāo)或錯標(biāo)的圖片。開放詞匯模型的優(yōu)勢是不依賴固定類別能發(fā)現(xiàn)“標(biāo)注者沒見過的類”但它在密集魚群中也會漏檢所以我把這個檢查當(dāng)作第二道標(biāo)注審核不直接當(dāng)自動標(biāo)注工具用。拿到差異清單后回到原圖逐個確認(rèn)保留修正后的標(biāo)注這才是數(shù)據(jù)集的真實(shí)價值所在。6.2 構(gòu)建小樣本驗(yàn)證集你會重新認(rèn)識這批數(shù)據(jù)的邊界清洗和訓(xùn)練跑過幾輪后我建議構(gòu)建一個固定的小驗(yàn)證集每個類別挑15張最具代表性的測試圖像覆蓋遮擋、低光、密集三類典型環(huán)境。這個小集合不參與訓(xùn)練所有實(shí)驗(yàn)用它評估相當(dāng)于每次改動后的“裸考”。魚類數(shù)據(jù)集的訓(xùn)練結(jié)果在不同批次間波動很大沒有固定評價集時改動帶來的2%提升可能只是抽樣噪聲。有了這個集合前后對比才有意義哪怕它只有幾百張圖也比隨機(jī)劃分的驗(yàn)證集更能反映模型在真實(shí)場景的邊界。6.3 這是一個值得投入的方向但先想清楚三個問題投入前先回答三個問題。第一你的目標(biāo)類別是固定物種列表還是開放式識別固定列表用常規(guī)目標(biāo)檢測夠用開放式識別則需要考慮檢索或開放詞匯方案。第二現(xiàn)有數(shù)據(jù)里每個類參與訓(xùn)練的樣本量能否支撐少于50框的那些類是砍掉還是合并這個決策要基于第3節(jié)的統(tǒng)計而不是直覺。第三部署環(huán)境的數(shù)據(jù)分布和數(shù)據(jù)集里的分布是否一致——近海養(yǎng)殖、遠(yuǎn)洋拖網(wǎng)、珊瑚礁調(diào)查三種場景魚種、光線、背景完全不同清洗策略也要跟著變。我把這類數(shù)據(jù)集當(dāng)作鏈路驗(yàn)證的起點(diǎn)而非終點(diǎn)它負(fù)責(zé)讓人快速打通從數(shù)據(jù)到模型到部署的完整流程真正的精度提升來源于后續(xù)持續(xù)補(bǔ)充的新拍攝數(shù)據(jù)。這是我用過多個海洋魚類目標(biāo)檢測數(shù)據(jù)集之后最想保留的習(xí)慣希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取