注到Y(jié)OLOv8訓(xùn)練:竹簽數(shù)據(jù)集小樣本目標(biāo)檢測(cè)實(shí)戰(zhàn))
簡(jiǎn)介竹簽數(shù)據(jù)集是一份經(jīng)過(guò)完整標(biāo)注的圖像數(shù)據(jù)集共包含210張JPEG圖片及對(duì)應(yīng)的210個(gè)XML標(biāo)注文件適用于計(jì)算機(jī)視覺(jué)、機(jī)器學(xué)習(xí)和深度學(xué)習(xí)方向的目標(biāo)檢測(cè)、圖像識(shí)別與圖像分割算法訓(xùn)練與評(píng)估。壓縮包總大小約441.21MB圖片覆蓋不同拍攝角度、背景和光照條件XML標(biāo)注中詳細(xì)記錄了目標(biāo)邊界框坐標(biāo)可直接用于YOLO、Faster R-CNN、SSD等常見(jiàn)目標(biāo)檢測(cè)框架的數(shù)據(jù)加載與預(yù)處理流程。數(shù)據(jù)集面向計(jì)算機(jī)視覺(jué)初學(xué)者、算法工程師及科研人員既可作為入門目標(biāo)檢測(cè)的練習(xí)數(shù)據(jù)也能用于驗(yàn)證檢測(cè)算法或搭建自動(dòng)化竹簽檢測(cè)原型配合數(shù)據(jù)歸一化、隨機(jī)裁剪、翻轉(zhuǎn)、顏色抖動(dòng)等增強(qiáng)操作以及平均精度、交并比等評(píng)估指標(biāo)可幫助使用者系統(tǒng)熟悉從標(biāo)注解析、模型訓(xùn)練到模型驗(yàn)證的完整流程。目前已有921人學(xué)習(xí)下載資源以zip壓縮包形式提供內(nèi)部文件結(jié)構(gòu)清晰便于直接解壓使用。 很多做檢測(cè)的朋友應(yīng)該都有這種感覺(jué)跑公開(kāi)數(shù)據(jù)集COCO、VOC這些練手時(shí)一切順利一換到自己的實(shí)際場(chǎng)景模型就各種“水土不服”。我自己接過(guò)幾個(gè)需要識(shí)別細(xì)長(zhǎng)物體的項(xiàng)目比如燒烤店的自動(dòng)盤(pán)點(diǎn)、竹簽加工廠的殘次品分揀發(fā)現(xiàn)一個(gè)很現(xiàn)實(shí)的問(wèn)題——這類專用數(shù)據(jù)集市面上幾乎沒(méi)有想復(fù)現(xiàn)別人的方案都找不到合適的起點(diǎn)。最近整理資料時(shí)翻到一份“竹簽數(shù)據(jù)集已標(biāo)注xml格式內(nèi)含有210張圖片”正好借著這個(gè)由頭把從數(shù)據(jù)集解析到模型訓(xùn)練的全流程寫(xiě)清楚。這份數(shù)據(jù)集的價(jià)值在于兩個(gè)點(diǎn)一是目標(biāo)物體非常聚焦竹簽這種細(xì)長(zhǎng)、小尺寸、密集排列的物體檢測(cè)難度其實(shí)不低拿來(lái)練手比“貓狗分類”這類入門數(shù)據(jù)有意義得多二是XML標(biāo)注格式也就是Pascal VOC格式是目標(biāo)檢測(cè)領(lǐng)域最通用的標(biāo)注形態(tài)之一學(xué)會(huì)處理它你就能自由地在VOC、YOLO、COCO之間做數(shù)據(jù)轉(zhuǎn)換以后自己標(biāo)數(shù)據(jù)、改數(shù)據(jù)、造數(shù)據(jù)都不慌。無(wú)論你是剛學(xué)YOLOv8怎么訓(xùn)練自定義數(shù)據(jù)集還是已經(jīng)在做工業(yè)檢測(cè)項(xiàng)目但卡在數(shù)據(jù)預(yù)處理環(huán)節(jié)這篇文章都能給你一套能直接落地的參考方案。1. 數(shù)據(jù)集整體設(shè)計(jì)與核心思路1.1 210張圖片的規(guī)模到底夠不夠用先說(shuō)結(jié)論210張圖片對(duì)于目標(biāo)檢測(cè)訓(xùn)練來(lái)說(shuō)屬于“小樣本但可啟動(dòng)”的規(guī)模關(guān)鍵看你怎么用它。如果直接從零訓(xùn)練一個(gè)網(wǎng)絡(luò)210張圖連“塞牙縫”都不夠但如果你用遷移學(xué)習(xí)的方式在YOLOv8或YOLOv5的預(yù)訓(xùn)練權(quán)重基礎(chǔ)上微調(diào)這個(gè)數(shù)據(jù)量足以讓模型學(xué)會(huì)“竹簽”這個(gè)新類別。我的實(shí)際體感是單類別檢測(cè)任務(wù)200到300張經(jīng)過(guò)質(zhì)量把控的圖片配合適當(dāng)?shù)臄?shù)據(jù)增強(qiáng)往往比盲目湊到1000張但標(biāo)注混亂的數(shù)據(jù)集效果更好。因?yàn)樾?shù)據(jù)集意味著你能逐張檢查標(biāo)注質(zhì)量而標(biāo)注質(zhì)量對(duì)模型上限的影響比數(shù)量更大。此前做過(guò)一個(gè)類似的小型物體計(jì)數(shù)項(xiàng)目180張圖起步最終模型的mAP50做到了0.92左右說(shuō)明這條路是可行的。1.2 為什么選XML格式作為標(biāo)注載體XML格式本質(zhì)上是Pascal VOC的標(biāo)注標(biāo)準(zhǔn)每個(gè)XML文件對(duì)應(yīng)一張圖片里面用bndbox標(biāo)簽記錄目標(biāo)的邊界框坐標(biāo)。選擇這種格式有很實(shí)際的原因工具兼容性好LabelImg、Label Studio等主流標(biāo)注工具默認(rèn)支持導(dǎo)出XML格式不需要額外寫(xiě)轉(zhuǎn)換腳本。信息密度高除了邊界框XML還能存儲(chǔ)目標(biāo)的名稱、姿態(tài)、截?cái)嗲闆r、困難樣本標(biāo)記等額外屬性方便后期篩選。遷移成本低幾乎所有檢測(cè)框架都提供從VOC格式讀取數(shù)據(jù)的官方腳本或社區(qū)方案轉(zhuǎn)YOLO格式、轉(zhuǎn)COCO格式都是一行命令或者一個(gè)腳本的事。如果你手頭的數(shù)據(jù)是JSONLabelMe格式、TXTYOLO格式或者其他自定義格式也建議統(tǒng)一把中間態(tài)轉(zhuǎn)成XML做數(shù)據(jù)質(zhì)檢理由很簡(jiǎn)單XML是“給人看的”結(jié)構(gòu)清晰標(biāo)注錯(cuò)誤肉眼就能發(fā)現(xiàn)。2. 核心細(xì)節(jié)解析XML標(biāo)注到底寫(xiě)了什么2.1 一個(gè)標(biāo)準(zhǔn)XML標(biāo)注的結(jié)構(gòu)速覽用VOC格式標(biāo)注一張包含兩個(gè)竹簽的圖片生成的XML文件長(zhǎng)這樣annotation folderimages/folder filenameskewer_001.jpg/filename path/data/skewer_001.jpg/path source databaseUnknown/database /source size width1280/width height720/height depth3/depth /size segmented0/segmented object nameskewer/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin356/xmin ymin189/ymin xmax891/xmax ymax214/ymax /bndbox /object /annotation這里面有幾個(gè)容易忽略但很重要的點(diǎn)。size里的width和height必須和圖片實(shí)際分辨率一致如果不一致后續(xù)做坐標(biāo)歸一化時(shí)所有邊界框都會(huì)偏移。truncated標(biāo)記目標(biāo)是否超出圖像邊界difficult標(biāo)記目標(biāo)是否難以辨認(rèn)這兩項(xiàng)在訓(xùn)練時(shí)通常都會(huì)忽略但如果你用的是官方VOC評(píng)估腳本difficult目標(biāo)默認(rèn)不參與計(jì)算。bndbox中的四個(gè)坐標(biāo)值xmin和ymin是左上角xmax和ymax是右下角全部基于像素坐標(biāo)系。2.2 坐標(biāo)系統(tǒng)與YOLO格式的本質(zhì)區(qū)別訓(xùn)練YOLO系列模型時(shí)標(biāo)準(zhǔn)做法是把XML轉(zhuǎn)成TXT格式核心就是坐標(biāo)系的轉(zhuǎn)換。VOC存的是“絕對(duì)像素坐標(biāo)”YOLO存的是“相對(duì)歸一化坐標(biāo)”公式如下x_center ((xmin xmax) / 2) / width y_center ((ymin ymax) / 2) / height box_width (xmax - xmin) / width box_height (ymax - ymin) / height舉個(gè)例子上面的竹簽坐標(biāo)代入公式后得到的一行訓(xùn)練標(biāo)簽就是0 0.487109 0.279861 0.417969 0.034722第一個(gè)數(shù)字是類別ID0代表skewer后面四個(gè)數(shù)分別是中心點(diǎn)x、中心點(diǎn)y、寬度、高度取值都在0到1之間。這個(gè)轉(zhuǎn)換的意義在于無(wú)論圖片尺寸是1280x720還是640x480標(biāo)簽都能直接用于訓(xùn)練模型不需要感知絕對(duì)尺寸。實(shí)操提醒竹簽這種細(xì)長(zhǎng)物體邊界框通常是極端的長(zhǎng)寬比寬度很小、高度很大或者反過(guò)來(lái)。如果你用默認(rèn)的錨框anchor box設(shè)置去訓(xùn)可能會(huì)出現(xiàn)收斂慢、召回率低的問(wèn)題。后面我會(huì)講怎么在YOLOv8里自動(dòng)適配錨框。3. 實(shí)操過(guò)程從XML到Y(jié)OLOv8訓(xùn)練全流程3.1 數(shù)據(jù)集的命名與目錄組織拿到210張圖片和對(duì)應(yīng)的XML之后第一步不是急著訓(xùn)練而是把目錄結(jié)構(gòu)理順。我的推薦布局是dataset/ ├── images/ │ ├── skewer_001.jpg │ ├── skewer_002.jpg │ └── ... ├── annotations/ │ ├── skewer_001.xml │ ├── skewer_002.xml │ └── ...圖片名與XML文件名必須一一對(duì)應(yīng)最好完全同名。如果你懶得自己寫(xiě)腳本檢查可以用下面這條命令快速找出“有圖無(wú)標(biāo)注”或“有標(biāo)注無(wú)圖”的文件for file in images/*.jpg; do base$(basename $file .jpg) if [ ! -f annotations/$base.xml ]; then echo Missing annotation for $file fi done這一步能省掉后面很多“莫名的訓(xùn)練報(bào)錯(cuò)”因?yàn)楹芏嗫蚣茉谧x取數(shù)據(jù)時(shí)如果圖片對(duì)應(yīng)的標(biāo)簽文件缺失會(huì)直接報(bào)錯(cuò)中斷訓(xùn)練或者靜默跳過(guò)導(dǎo)致數(shù)據(jù)量“縮水”。3.2 劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集210張圖片不能全扔去訓(xùn)練至少需要留出一部分作為驗(yàn)證集用來(lái)監(jiān)控模型是否過(guò)擬合。通常的建議比例是7:2:1或8:2:0分別對(duì)應(yīng)訓(xùn)練集、驗(yàn)證集和測(cè)試集。小數(shù)據(jù)集下我推薦8:2:0把測(cè)試集先不做因?yàn)闇y(cè)試集的意義在于最終評(píng)估泛化能力但210張圖分出去20張做測(cè)試留給訓(xùn)練的就更少了。先復(fù)制一份images目錄為images_all然后運(yùn)行這個(gè)Python腳本做隨機(jī)劃分import os import random import shutil random.seed(42) image_dir dataset/images_all train_dir dataset/images/train val_dir dataset/images/val os.makedirs(train_dir, exist_okTrue) os.makedirs(val_dir, exist_okTrue) images [f for f in os.listdir(image_dir) if f.endswith(.jpg)] random.shuffle(images) val_count int(len(images) * 0.2) val_images images[:val_count] train_images images[val_count:] for img in train_images: shutil.copy(os.path.join(image_dir, img), os.path.join(train_dir, img)) for img in val_images: shutil.copy(os.path.join(image_dir, img), os.path.join(val_dir, img)) print(fTrain: {len(train_images)}, Val: {len(val_images)})把random.seed(42)固定住這樣每次運(yùn)行劃分結(jié)果一致排障時(shí)可以復(fù)現(xiàn)。驗(yàn)證集里每一張圖都要檢查一下如果竹簽的姿態(tài)、光線、背景明顯和訓(xùn)練集分布不一致建議手動(dòng)互換幾張保證驗(yàn)證集有代表性。3.3 分組標(biāo)簽XML轉(zhuǎn)YOLO格式Y(jié)OLO訓(xùn)練需要的標(biāo)簽是TXT文件而且每個(gè)TXT文件和圖片同名放在同目錄下或者放在框架指定的標(biāo)簽?zāi)夸?。我自己更?xí)慣在圖片同目錄下建一個(gè)labels子目錄結(jié)構(gòu)如下dataset/ ├── images/ │ ├── train/ │ │ ├── skewer_001.jpg │ │ └── skewer_001.txt │ └── val/ │ ├── skewer_002.jpg │ └── skewer_002.txt轉(zhuǎn)換腳本用Python的xml.etree.ElementTree解析XML然后按上面的公式生成TXT內(nèi)容import os import xml.etree.ElementTree as ET def convert_xml_to_yolo(xml_file, txt_file, class_names): tree ET.parse(xml_file) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_names: continue class_id class_names.index(name) bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h box_w (xmax - xmin) / img_w box_h (ymax - ymin) / img_h lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) with open(txt_file, w) as f: f.write(\n.join(lines)) class_names [skewer] # 按項(xiàng)目實(shí)際類別修改 for subset in [train, val]: xml_dir fdataset/annotations_{subset} txt_dir fdataset/images/{subset} os.makedirs(txt_dir, exist_okTrue) for xml_name in os.listdir(xml_dir): if not xml_name.endswith(.xml): continue xml_path os.path.join(xml_dir, xml_name) txt_path os.path.join(txt_dir, xml_name.replace(.xml, .txt)) convert_xml_to_yolo(xml_path, txt_path, class_names)代碼里我加了一個(gè)class_names列表若你的XML里包含多個(gè)類別把所有類名按固定順序?qū)戇M(jìn)去就行。這里有個(gè)容易踩的坑類別的ID順序必須全局一致訓(xùn)練集和驗(yàn)證集不能各用各的順序否則模型學(xué)到的類別對(duì)應(yīng)關(guān)系就亂了。3.4 編寫(xiě)數(shù)據(jù)集配置文件并啟動(dòng)訓(xùn)練在YOLOv8里自定義數(shù)據(jù)集需要一個(gè)YAML配置文件指定數(shù)據(jù)集路徑、類別數(shù)量和類別名稱。新建一個(gè)skewer.yamlpath: /absolute/path/to/dataset train: images/train val: images/val nc: 1 names: [skewer]然后啟動(dòng)訓(xùn)練的命令如下yolo detect train dataskewer.yaml modelyolov8n.pt epochs100 imgsz640 batch16這幾行參數(shù)解釋一下modelyolov8n.pt是加載YOLOv8的nano版本預(yù)訓(xùn)練權(quán)重小模型在數(shù)據(jù)量有限時(shí)更不容易過(guò)擬合imgsz640是輸入分辨率如果原圖是1280x720縮放到640x360輸入竹簽這種細(xì)線條還能保持可辨識(shí)度batch16取決于顯存大小如果訓(xùn)練時(shí)顯存溢出CUDA OOM先降到8或4。4. 小樣本檢測(cè)的訓(xùn)練策略與避坑指南4.1 用數(shù)據(jù)增強(qiáng)彌補(bǔ)數(shù)量不足210張圖模型翻來(lái)覆去就“看”這210張非常容易把背景紋理也當(dāng)成竹簽特征。解決思路是開(kāi)啟和加強(qiáng)數(shù)據(jù)增強(qiáng)。YOLOv8默認(rèn)帶了一部分增強(qiáng)Mosaic、HSV擾動(dòng)、隨機(jī)翻轉(zhuǎn)等對(duì)于小數(shù)據(jù)集我建議把增強(qiáng)參數(shù)調(diào)得更激進(jìn)一些yolo detect train dataskewer.yaml modelyolov8n.pt epochs150 imgsz640 batch16 \ hsv_h0.015 hsv_s0.7 hsv_v0.4 \ degrees10 translate0.1 scale0.5 fliplr0.5 \ mosaic1.0 mixup0.2mosaic1.0會(huì)把4張圖拼成一張訓(xùn)練這個(gè)增強(qiáng)對(duì)小目標(biāo)檢測(cè)特別有效讓模型學(xué)會(huì)在小尺寸下識(shí)別物體degrees10是隨機(jī)旋轉(zhuǎn)正負(fù)10度因?yàn)橹窈灁[放不可能是絕對(duì)水平的旋轉(zhuǎn)增強(qiáng)能模擬實(shí)際情況scale0.5是縮放擾動(dòng)模擬竹簽離相機(jī)遠(yuǎn)近不同的情況。這些增強(qiáng)手段合在一起相當(dāng)于把210張圖“變”成了幾千張不同形態(tài)的訓(xùn)練樣本。4.2 自動(dòng)錨框的計(jì)算邏輯YOLO系列有個(gè)“自動(dòng)錨框”機(jī)制訓(xùn)練時(shí)會(huì)根據(jù)你數(shù)據(jù)集中所有標(biāo)注框的寬高聚類重新計(jì)算最適合這批數(shù)據(jù)的錨框尺寸。細(xì)長(zhǎng)物體用默認(rèn)錨框效果不好所以訓(xùn)練時(shí)不需要手動(dòng)指定但要確保開(kāi)啟這個(gè)機(jī)制。從輸出日志里看到AutoAnchor相關(guān)提示時(shí)留意一下它最終選擇的錨框值如果發(fā)現(xiàn)錨框?qū)捀弑群湍愕闹窈為L(zhǎng)寬比明顯不匹配比如竹簽是長(zhǎng)條形的錨框卻是接近正方形的就要檢查標(biāo)注的坐標(biāo)是否規(guī)范。有個(gè)快速驗(yàn)證方法訓(xùn)練前用下面這段代碼統(tǒng)計(jì)所有標(biāo)注框的長(zhǎng)寬比分布import os import numpy as np ratios [] for subset in [train, val]: label_dir fdataset/images/{subset} for txt_name in os.listdir(label_dir): if not txt_name.endswith(.txt): continue with open(os.path.join(label_dir, txt_name)) as f: for line in f: parts line.strip().split() w float(parts[3]) h float(parts[4]) if h 0 and w 0: ratios.append(w / h) ratios np.array(ratios) print(fMean ratio: {ratios.mean():.3f}, Median ratio: {np.median(ratios):.3f})這個(gè)統(tǒng)計(jì)可以幫助你判斷標(biāo)注框的質(zhì)量如果同一個(gè)物體在不同圖片中的長(zhǎng)寬比波動(dòng)極大很可能是標(biāo)注時(shí)框選范圍忽大忽小需要回頭修正。4.3 過(guò)擬合監(jiān)控與早停策略小數(shù)據(jù)集訓(xùn)練最典型的癥狀就是過(guò)擬合訓(xùn)練集loss一路下將驗(yàn)證集mAP反而掉頭向下。這個(gè)數(shù)據(jù)量級(jí)別我建議開(kāi)啟早停patience參數(shù)來(lái)防止浪費(fèi)時(shí)間和算力yolo detect train dataskewer.yaml modelyolov8n.pt epochs300 imgsz640 \ patience30 save_period10patience30表示如果驗(yàn)證集指標(biāo)連續(xù)30個(gè)epoch沒(méi)有提升就提前終止save_period10每10個(gè)epoch保存一次權(quán)重這樣即使最后過(guò)擬合了也能回退到中間最優(yōu)的權(quán)重。訓(xùn)練結(jié)束后用yolo detect val單獨(dú)驗(yàn)證最優(yōu)權(quán)重yolo detect val modelruns/detect/train/weights/best.pt dataskewer.yaml重點(diǎn)關(guān)注mAP50和mAP50-95這兩個(gè)指標(biāo)。mAP50IoU閾值0.5下的平均精度反映基礎(chǔ)檢測(cè)能力mAP50-95從0.5到0.95多個(gè)閾值下的平均值對(duì)邊界框的精細(xì)程度更敏感。對(duì)于竹簽這種細(xì)長(zhǎng)物體mAP50-95會(huì)比mAP50低不少這正常但不代表不能用。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 訓(xùn)練不收斂的常規(guī)體檢表訓(xùn)練過(guò)程如果出現(xiàn)指標(biāo)異常不必急著調(diào)模型先按下面這張表排查數(shù)據(jù)鏈路的問(wèn)題因?yàn)閿?shù)據(jù)問(wèn)題占了這類故障的大多數(shù)現(xiàn)象可能原因排查方法Loss不下降標(biāo)簽全部無(wú)效全零或全越界寫(xiě)腳本打印每個(gè)TXT首行檢查坐標(biāo)是否在0~1之間驗(yàn)證集mAP為0類別ID和names順序不對(duì)應(yīng)用yolo detect predict跑一張圖看輸出label名稱訓(xùn)練集loss驟降為0大量圖片沒(méi)對(duì)應(yīng)TXT標(biāo)簽對(duì)比images/train和labels目錄文件數(shù)量推理結(jié)果框和物體錯(cuò)位圖片尺寸和XML的size不一致用Python逐個(gè)讀取圖片寬高和XML比對(duì)模型只能檢出大目標(biāo)小目標(biāo)像素占比太少調(diào)大imgsz到960或1280或使用SAHI切片推理排查時(shí)最忌諱“病急亂投醫(yī)”改模型結(jié)構(gòu)先確認(rèn)“喂進(jìn)去的數(shù)據(jù)是對(duì)的”所有坑都排除一遍訓(xùn)練效果往往自己就正常了。5.2 竹簽類細(xì)長(zhǎng)目標(biāo)的兩個(gè)特有陷阱第一邊界框的框選習(xí)慣會(huì)直接影響模型輸出。標(biāo)注竹簽時(shí)有些標(biāo)注員習(xí)慣把竹簽兩端的尖角露在框內(nèi)留出很多空白有些則把框貼得很緊。這兩種風(fēng)格混在一起模型很難學(xué)到穩(wěn)定特征。建議在標(biāo)注準(zhǔn)則里明確規(guī)定框必須緊貼竹簽可見(jiàn)部分的最外緣被遮擋的部分不算。第二背景中的“干擾物”問(wèn)題。如果210張圖里有大量圖片的桌面紋理、容器邊緣和竹簽顏色接近模型很容易把這些背景特征學(xué)進(jìn)去。處理辦法是數(shù)據(jù)可視化檢查隨機(jī)抽樣訓(xùn)練集中20張圖把標(biāo)注框和預(yù)測(cè)框同時(shí)畫(huà)出來(lái)看。如果發(fā)現(xiàn)驗(yàn)證集里出現(xiàn)大量誤檢在桌面紋理處就要回訓(xùn)練集里檢查是否有類似的“虛假正樣本”——比如把背景紋路誤標(biāo)成了竹簽。5.3 算力不足時(shí)的降級(jí)方案如果你只有一張老顯卡比如6GB顯存batch16和imgsz640很可能跑不起來(lái)。兩個(gè)降級(jí)方案一是縮小imgsz到416或320配合yolov8n.ptnano版本顯存占用基本能控制在2GB以內(nèi)。代價(jià)是檢測(cè)小目標(biāo)的能力變?nèi)醯鳛榫毷趾土鞒舔?yàn)證完全夠用。二是使用Ultralytics官方支持的內(nèi)存管理參數(shù)yolo detect train dataskewer.yaml modelyolov8n.pt epochs100 imgsz640 \ batch8 device0 workers1workers1可以降低數(shù)據(jù)加載時(shí)的內(nèi)存和CPU開(kāi)銷有時(shí)候卡頓不是顯存不夠而是數(shù)據(jù)加載線程太多把內(nèi)存吃滿了。還有確認(rèn)訓(xùn)練時(shí)沒(méi)有別的程序搶占GPU顯存nvidia-smi看一眼。6. 數(shù)據(jù)集的擴(kuò)展思路與個(gè)人經(jīng)驗(yàn)210張只是一個(gè)起點(diǎn)。如果后續(xù)你想提升模型魯棒性有幾個(gè)低成本的擴(kuò)展方向。一是“自制數(shù)據(jù)增強(qiáng)”把現(xiàn)有的210張圖做亮度、對(duì)比度、模糊的批量處理生成一份圖片副本加入訓(xùn)練集這個(gè)過(guò)程不需要重新標(biāo)注因?yàn)樽鴺?biāo)不變只是像素變了。二是“困難樣本挖掘”用訓(xùn)練好的模型去跑一些沒(méi)有標(biāo)注的實(shí)拍照片把置信度低的檢測(cè)結(jié)果抽出來(lái)手動(dòng)修正后追加進(jìn)數(shù)據(jù)集這樣擴(kuò)充出來(lái)的數(shù)據(jù)比隨機(jī)找圖標(biāo)注更有效。我個(gè)人在做過(guò)幾個(gè)類似的目標(biāo)檢測(cè)數(shù)據(jù)集項(xiàng)目之后最大的體會(huì)是小數(shù)據(jù)集本身不是問(wèn)題問(wèn)題是標(biāo)注是否嚴(yán)格一致、數(shù)據(jù)鏈路是否順暢。210張圖片針對(duì)一個(gè)專門類別配合遷移學(xué)習(xí)和數(shù)據(jù)增強(qiáng)完全能訓(xùn)出一個(gè)實(shí)用水平的檢測(cè)器。這份竹簽數(shù)據(jù)集無(wú)論是用來(lái)學(xué)習(xí)處理VOC和XML格式還是直接作為訓(xùn)練起點(diǎn)跑通檢測(cè)流程都是不錯(cuò)的切入素材。如果你手頭也有標(biāo)注好的專用數(shù)據(jù)不妨按照這篇文章的流程跑一遍把數(shù)據(jù)鏈路理順了后續(xù)換再大的數(shù)據(jù)集也只是“換湯不換藥”。最后再分享一個(gè)小技巧不管數(shù)據(jù)集是210張還是2000張養(yǎng)成“數(shù)據(jù)處理步驟留痕”的習(xí)慣。每步操作寫(xiě)一個(gè)簡(jiǎn)短的腳本放在項(xiàng)目根目錄命名清晰如01_split.py、02_convert.py。下次你回頭調(diào)整數(shù)據(jù)、復(fù)盤(pán)效果或者換框架復(fù)現(xiàn)時(shí)省下的時(shí)間會(huì)超出你的想象。本文還有配套的精品資源點(diǎn)擊獲取