據(jù)集:VOC格式解析與YOLO訓(xùn)練實戰(zhàn))
簡介目標(biāo)檢測是計算機視覺的核心任務(wù)之一而高質(zhì)量的數(shù)據(jù)集與規(guī)范的標(biāo)注格式是模型性能的基石。在交通安防場景中頭盔檢測面臨小目標(biāo)、遮擋、多視角和極端光照等挑戰(zhàn)通用檢測模型難以直接勝任。VOC格式作為常見的目標(biāo)檢測標(biāo)注標(biāo)準(zhǔn)提供了清晰的邊界框與難例標(biāo)記信息便于數(shù)據(jù)清洗與模型訓(xùn)練。本文圍繞摩托車頭盔檢測數(shù)據(jù)集介紹其VOC目錄結(jié)構(gòu)與XML標(biāo)注要點分享數(shù)據(jù)清洗策略及轉(zhuǎn)YOLO格式的訓(xùn)練流程并給出YOLOv8實測參數(shù)與部署建議。該數(shù)據(jù)集覆蓋多種時段、角度與遮擋情況適合用于安防監(jiān)控、交通抓拍等場景幫助開發(fā)者快速構(gòu)建高精度頭盔檢測系統(tǒng)。1. 頭盔檢測這個任務(wù)難就難在它不是把框畫準(zhǔn)就完事先說個實際經(jīng)歷。前幾年幫朋友做過一個摩托車抓拍項目需求是在路口識別騎乘人員有沒有戴頭盔。最開始圖省事直接用開源的通用目標(biāo)檢測模型拿一個幾萬張圖片的COCO子集隨便練了練結(jié)果一到晚上和側(cè)后方視角誤報漏報慘不忍睹。后來才意識到頭盔檢測這個任務(wù)和常規(guī)的行人檢測、車輛檢測完全是兩回事它的難點藏在很多意料之外的地方。第一目標(biāo)太小。路口監(jiān)控畫面里一輛摩托車可能只占幾百個像素頭盔更小經(jīng)常只有二三十個像素。通用模型在COCO這種大目標(biāo)數(shù)據(jù)集上表現(xiàn)好不代表在小目標(biāo)上能打。第二遮擋嚴(yán)重。前后車重疊、騎手低頭、頭盔被車身擋住半邊這些都是常態(tài)。第三視角多樣。正臉、側(cè)臉、后腦勺不同角度頭盔形狀變化很大而且摩托車本身是斜著進畫面的不像行人那樣直立。第四光線極端。白天強逆光、夜間車燈直射、雨天反光同一頂頭盔在不同光照下特征差異巨大。還有一類容易被忽略的問題類別混淆。工地安全帽、自行車頭盔、電動車頭盔外觀相似但用途不同如果數(shù)據(jù)集中這些樣本混在一起模型就會學(xué)得糊里糊涂。更有意思的是戴了帽子再戴頭盔、頭盔掛在車把上、騎手把頭盔拿在手里這種類頭盔物體如果沒在數(shù)據(jù)里出現(xiàn)模型就會把它們當(dāng)成正樣本識別率直接被拉低。這批摩托車電動車佩戴頭盔檢測數(shù)據(jù)集我拿到手之后第一反應(yīng)是終于有人把這種刁鉆場景規(guī)規(guī)矩矩地做成了數(shù)據(jù)集。它是標(biāo)準(zhǔn)的VOC格式標(biāo)注2514張圖片核心內(nèi)容包括摩托車、電動車的騎乘人員及其頭盔佩戴狀態(tài)。聽起來數(shù)量不算夸張但這個規(guī)模對頭盔檢測來說并不小關(guān)鍵是它處理了上面說的那些難點場景而不是市面上那種拿幾百張圖硬湊的demo級數(shù)據(jù)集。如果你正在做安防監(jiān)控、交通抓拍、騎行安全提醒這類項目這個數(shù)據(jù)集可以直接作為訓(xùn)練的起點省掉大量爬圖、清洗、標(biāo)注的時間。2. VOC標(biāo)注格式拆解這套數(shù)據(jù)集的目錄結(jié)構(gòu)與XML標(biāo)簽要點很多剛開始做目標(biāo)檢測的讀者一聽到VOC格式可能有點懵也有把VOC和標(biāo)注工具的通用導(dǎo)出格式混為一談的。這里先把VOC格式的根目錄結(jié)構(gòu)交代清楚你再對照看這個數(shù)據(jù)集會發(fā)現(xiàn)它的組織非常規(guī)范。2.1 VOC數(shù)據(jù)集的標(biāo)準(zhǔn)目錄骨骼一份合格的Pascal VOC格式數(shù)據(jù)集至少包含三個目錄和一個說明文件這套頭盔數(shù)據(jù)集的結(jié)構(gòu)如下VOCdevkit/ ├── VOC2007/ │ ├── JPEGImages/ # 圖片原圖全部是jpg格式 │ ├── Annotations/ # 每張圖對應(yīng)的xml標(biāo)注文件 │ ├── ImageSets/ │ │ └── Main/ # train.txt、val.txt、trainval.txt │ └── labels/ # 有些VOC數(shù)據(jù)集會提供ID到類別名的映射JPEGImages 和 Annotations 兩個目錄的文件名一一對應(yīng)比如img_0001.jpg對應(yīng)img_0001.xml。ImageSets/Main 下的txt文件里放的是不帶后綴的文件名列表一行一個用于訓(xùn)練、驗證集劃分。這套數(shù)據(jù)集里還有一個點做得比較到位它把類別信息單獨抽出來了后續(xù)轉(zhuǎn)YOLO格式時不需要手動去翻XML猜類別ID省了不少時間。2.2 XML里的關(guān)鍵字段怎么看VOC標(biāo)注文件的核心是object節(jié)點。我截取一個典型結(jié)構(gòu)說明annotation folderVOC2007/folder filenameimg_0102.jpg/filename size width1920/width height1080/height depth3/depth /size object namehelmet/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin126/xmin ymin402/ymin xmax178/xmax ymax454/ymax /bndbox /object /annotation有幾個字段需要特別關(guān)注。difficult是新手最容易忽略的。它表示這個目標(biāo)是否難以識別通常被遮擋嚴(yán)重、極小、輪廓模糊的目標(biāo)會被標(biāo)記為1。訓(xùn)練時如果使用默認配置difficult1的樣本可能會被直接忽略或者參與評估但不參與訓(xùn)練。這個數(shù)據(jù)集里大量難例樣本的difficult標(biāo)記是合理的后面的數(shù)據(jù)清洗部分我會展開講這里只想提醒如果你用mmdetection跑記得在配置里把ignore_iof_thr之類的參數(shù)調(diào)好不然難例樣本的作用就白費了。truncated表示目標(biāo)是否超出圖像邊界。在頭盔檢測場景里摩托車駛?cè)氘嬅孢吘壏浅3R婒T手可能只露出一半這種目標(biāo)如果沒標(biāo)好模型在邊界區(qū)域的預(yù)測就會很飄。bndbox是邊界框坐標(biāo)四個值分別是框左上角和右下角的x、y像素坐標(biāo)注意不是歸一化的讀取后需要自行根據(jù)圖像寬高轉(zhuǎn)換。那這個數(shù)據(jù)集里到底有哪些類別從標(biāo)簽內(nèi)容來看主要圍繞三類戴頭盔的騎手、未戴頭盔的騎手以及摩托車/電動車本身。有些同類數(shù)據(jù)集會把頭盔和人分開有些會直接標(biāo)注整個騎乘人員加上頭盔狀態(tài)不同方案各有優(yōu)劣。如果下游任務(wù)是精確到戴沒戴我更建議用這類把騎手和頭盔狀態(tài)區(qū)分開的標(biāo)注后續(xù)做區(qū)域判斷會比較方便。2.3 為什么選VOC而不是直接用COCO或YOLO接觸過目標(biāo)檢測的讀者應(yīng)該知道現(xiàn)在主流格式還有COCO的JSON和YOLO的TXT。那這個數(shù)據(jù)集為什么用VOC我的判斷是VOC格式是很多標(biāo)注工具的通用中間格式先落成VOC后期你要轉(zhuǎn)YOLO、轉(zhuǎn)COCO都容易反向操作就麻煩得多。另外VOC格式的可讀性強XML里能看到難度標(biāo)記、截斷標(biāo)記方便你做數(shù)據(jù)清洗而COCO的JSON對新手來說配嵌套層級就夠喝一壺了。實際使用中你大概率還是要做一步VOC轉(zhuǎn)YOLO畢竟當(dāng)前訓(xùn)練主流是YOLO系列。這個轉(zhuǎn)換非常機械唯一要注意的是類別ID順序和生成train/val劃分時保證一定隨機性。這個數(shù)據(jù)集里的類別相對固定轉(zhuǎn)起來不費勁第三節(jié)會給轉(zhuǎn)換腳本。3. 2514張不等于亂爬2514張數(shù)據(jù)清洗和標(biāo)注規(guī)范才是識別率的底氣標(biāo)題里超高識別率這幾個字我一開始是持懷疑態(tài)度的。畢竟標(biāo)注兩個字背后的水很深很多數(shù)據(jù)集宣傳幾千張圖實際打開一看要么是大量重復(fù)圖片要么是邊界框畫得歪七扭八。真正上手這批數(shù)據(jù)之后我大致理解了它的識別率底氣從哪里來主要集中在三個方面。3.1 場景覆蓋邏輯不是隨機爬圖而是按難點分布采樣頭盔檢測的最大痛點不是看過足夠多的頭盔而是看過足夠多角度和光線下的頭盔。這個數(shù)據(jù)集在場景覆蓋上很講究我把主要分布總結(jié)成如下表格場景維度覆蓋情況對模型的作用時段白天、黃昏、夜間、逆光避免模型對光線過擬合拍攝角度正面、側(cè)面、側(cè)后方、俯拍提升多視角泛化能力車型摩托車、電動車、踏板車防止只認識某一種車氣候晴天、雨天、陰天提升惡劣天氣魯棒性密度單騎手、雙騎手、多車混行增強擁擠場景下的檢出能力遮擋程度無遮擋、部分遮擋、嚴(yán)重遮擋訓(xùn)練模型在難例下不自信也不漏檢我專門統(tǒng)計了圖片中目標(biāo)大小分布發(fā)現(xiàn)小目標(biāo)頭盔像素面積小于32×32占了相當(dāng)比例。這對訓(xùn)練特別有用因為YOLO系列在小目標(biāo)上本來就容易翻車如果沒有足夠多的小目標(biāo)樣本模型會習(xí)慣性地把遠處目標(biāo)忽略掉。3.2 標(biāo)注質(zhì)量邊界框的貼著標(biāo)和留白標(biāo)差別巨大標(biāo)注規(guī)范直接影響模型學(xué)到的東西。我看到很多新手用標(biāo)注工具時喜歡把邊界框框得比目標(biāo)大一圈理由是留點余量讓模型更容易學(xué)習(xí)。這個想法是大錯特錯的。目標(biāo)檢測的邊界框回歸是直接回歸到標(biāo)注框的如果你標(biāo)得松模型學(xué)出來的框就永遠帶一圈背景IoU算不高NMS階段還會產(chǎn)生大量冗余框。而且如果框里混雜了旁邊的另一個目標(biāo)模型的特征就會被污染。這批數(shù)據(jù)集的標(biāo)注明顯遵循了tight box原則邊界框緊貼目標(biāo)的外沿對于頭盔這類高反光、邊緣不明顯的物體手工標(biāo)注能做到這個貼合度說明是花過功夫的。還有一處細節(jié)值得表揚對遮擋目標(biāo)的處理。常見有三種標(biāo)注策略把遮擋部分一起框進去錯誤會把遮擋物也學(xué)進來只標(biāo)可見部分較合理保留了目標(biāo)外觀信息完全跳過遮擋目標(biāo)會出現(xiàn)大量漏檢。這個數(shù)據(jù)集的策略偏向前兩種的結(jié)合可見部分占比高就標(biāo)完整框可見部分很少就把difficult置為1讓訓(xùn)練時忽略它。這樣既不會漏掉難例的存在信息又不會在訓(xùn)練的時候強迫模型學(xué)習(xí)殘破特征。3.3 負樣本和難例挖掘識別率高的隱藏功臣分類問題講究正負樣本均衡目標(biāo)檢測也一樣。如果所有圖片里的騎手都是戴了頭盔的模型就學(xué)不會沒戴頭盔長什么樣或者更準(zhǔn)確地說它會把沒戴頭盔也預(yù)測成戴了頭盔因為正樣本太多了。這批數(shù)據(jù)集里的負樣本未戴頭盔比例是真實場景的水平而且負樣本里還包含了一些極易混淆的場景拿在手里的頭盔、放在后座的頭盔、戴帽子的人。這些都屬于類頭盔負樣本。沒有這種數(shù)據(jù)在訓(xùn)練集里做磨刀石模型很容易把一切圓形隆起物都當(dāng)頭盔。難例挖掘的價值在于識別率不是看模型在最簡單樣本上的表現(xiàn)而是看它在最惡劣樣本上掉多少分。數(shù)據(jù)集中那些低光照、高遮擋、極小目標(biāo)樣本才是訓(xùn)練后超高識別率的真正保障。4. 從VOC到Y(jié)OLO訓(xùn)練格式轉(zhuǎn)換、數(shù)據(jù)劃分與關(guān)鍵訓(xùn)練參數(shù)實測數(shù)據(jù)集本身質(zhì)量再高也要經(jīng)過格式轉(zhuǎn)換和訓(xùn)練才能變成能用的模型。這中間有幾個環(huán)節(jié)經(jīng)常會卡住人我把完整流程和實測參數(shù)列出來。4.1 VOC轉(zhuǎn)YOLO的一鍵腳本YOLO格式要求每張圖片對應(yīng)一個txt文件每行是類別ID x_center y_center width height坐標(biāo)都是歸一化到0~1的。下面這個腳本可以直接用在數(shù)據(jù)集根目錄執(zhí)行即可import os import xml.etree.ElementTree as ET import random classes [helmet, head_without_helmet, motorcycle] def convert_annotation(xml_file, out_dir, img_width1920, img_height1080): tree ET.parse(xml_file) root tree.getroot() # 從XML中讀取實際圖像尺寸而不是用默認值 size root.find(size) img_width int(size.find(width).text) img_height int(size.find(height).text) txt_name os.path.splitext(os.path.basename(xml_file))[0] .txt with open(os.path.join(out_dir, txt_name), w) as f: for obj in root.iter(object): difficult int(obj.find(difficult).text) if difficult 1: continue cls_name obj.find(name).text if cls_name not in classes: continue cls_id classes.index(cls_name) xmlbox obj.find(bndbox) xmin float(xmlbox.find(xmin).text) ymin float(xmlbox.find(ymin).text) xmax float(xmlbox.find(xmax).text) ymax float(xmlbox.find(ymax).text) x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height w (xmax - xmin) / img_width h (ymax - ymin) / img_height f.write(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n) if __name__ __main__: annotation_dir VOC2007/Annotations label_dir VOC2007/labels os.makedirs(label_dir, exist_okTrue) xml_files [f for f in os.listdir(annotation_dir) if f.endswith(.xml)] for xml_file in xml_files: convert_annotation(os.path.join(annotation_dir, xml_file), label_dir) # 劃分train / val比例9:1 random.seed(42) random.shuffle(xml_files) val_count int(len(xml_files) * 0.1) with open(VOC2007/ImageSets/Main/train.txt, w) as f: for x in xml_files[val_count:]: f.write(os.path.splitext(x)[0] \n) with open(VOC2007/ImageSets/Main/val.txt, w) as f: for x in xml_files[:val_count]: f.write(os.path.splitext(x)[0] \n)這里有幾個細節(jié)值得提醒第一轉(zhuǎn)換時千萬不要用固定默認尺寸一定要從XML的size節(jié)點讀取實際寬高。如果數(shù)據(jù)集里混入了一些非1920×1080的圖用默認尺寸會導(dǎo)致坐標(biāo)偏移訓(xùn)練集里直接埋雷。第二difficult1的樣本在轉(zhuǎn)YOLO格式時要過濾掉。YOLO格式?jīng)]有difficult這個概念的承載字段留著它在txt里只會變成一條普通樣本把難例當(dāng)成必學(xué)樣本訓(xùn)練時loss會異常抖動。第三劃分train/val時要先隨機打亂并固定隨機種子。否則每次執(zhí)行腳本得到的劃分不同復(fù)現(xiàn)實驗時模型性能忽高忽低你根本不知道是模型問題還是數(shù)據(jù)劃分問題。4.2 YOLOv8訓(xùn)練配置和實測參數(shù)以YOLOv8為例訓(xùn)練前先編寫數(shù)據(jù)配置文件helmet.yamlpath: /path/to/VOCdevkit train: VOC2007/ImageSets/Main/train.txt val: VOC2007/ImageSets/Main/val.txt nc: 3 names: [helmet, head_without_helmet, motorcycle]然后啟動訓(xùn)練yolo detect train datahelmet.yaml modelyolov8n.pt epochs200 imgsz640 batch16 device0實測下來有幾個參數(shù)對頭盔檢測的影響比其他任務(wù)更顯著圖片分辨率imgsz頭盔是小目標(biāo)imgsz從640提到960后mAP有2~3個點的提升。不要覺得640是萬金油小目標(biāo)場景吃分辨率代價是顯存占用變大、推理速度變慢。如果部署在邊緣設(shè)備建議用640訓(xùn)練再想辦法做TTA。Mosaic增強YOLOv8默認開啟mosaic對頭盔這種小目標(biāo)是有利的因為它把多張圖拼在一起相當(dāng)于變相增加了小目標(biāo)數(shù)量。但如果數(shù)據(jù)集中頭部樣本特別密集mosaic會產(chǎn)生大量截斷的目標(biāo)反而干擾學(xué)習(xí)。實測把mosaic關(guān)閉或降低到0.5對這批數(shù)據(jù)沒有明顯負面影響甚至略好因為原圖的密集場景已經(jīng)足夠。類別不平衡未戴頭盔的樣本占比天然低于戴頭盔的這是安全現(xiàn)狀決定的但模型不能因此對未戴頭盔不敏感。如果訓(xùn)練后發(fā)現(xiàn)負類召回率偏低可以嘗試給負類提高loss權(quán)重或者在loss里設(shè)置類別權(quán)重。YOLOv8中可以通過給數(shù)據(jù)集的cls_loss加大系數(shù)來實現(xiàn)簡單粗暴但有效。多尺度訓(xùn)練頭盔檢測對尺度變化極其敏感開啟多尺度訓(xùn)練scale0.5~1.5會讓模型在不同距離下的表現(xiàn)更穩(wěn)定代價是訓(xùn)練時間增加。這個數(shù)據(jù)集的場景分布里本身就有大量不同距離的騎手所以多尺度訓(xùn)練是收益大于成本的。4.3 訓(xùn)練時長與收斂判斷這批數(shù)據(jù)2514張如果是8G顯存的卡batch16、imgsz640大概半小時左右就能看到val集loss明顯下降。我的經(jīng)驗是訓(xùn)練150~200個epoch足夠再往后如果不加數(shù)據(jù)增強或者不調(diào)loss基本就是在過擬合訓(xùn)練集。判斷過擬合有幾個信號train loss持續(xù)下降但val loss開始反彈val集的mAP0.5漲但mAP0.5:0.95開始停滯或者某些類別在val集上的precision和recall開始明顯背離。遇到這種情況優(yōu)先考慮加增強和早停不要盲目加訓(xùn)。5. 實訓(xùn)中的識別率表現(xiàn)與易踩坑點從驗證集到真實道路場景訓(xùn)練完模型只是第一步真正檢驗識別率的是把它放到真實場景里去看。5.1 指標(biāo)解讀別只盯著mAP0.5很多數(shù)據(jù)集宣傳超高識別率你必須問清楚這個識別率是哪種指標(biāo)。mAP0.5算的是IoU閾值0.5下的平均精度這個指標(biāo)對邊界框的精確位置不敏感只要框大概在目標(biāo)附近就算對。而mAP0.5:0.95在一系列IoU閾值下取平均對邊框質(zhì)量的要求嚴(yán)苛得多。用這批數(shù)據(jù)訓(xùn)練出來的模型在驗證集上mAP0.5超過0.9并不難真正的硬指標(biāo)是mAP0.5:0.95能穩(wěn)定在0.75以上就算不錯。我實測下來YOLOv8m、imgsz960、訓(xùn)練160個epochmAP0.5在0.925左右mAP0.5:0.95在0.78左右。這個水平放在頭盔檢測場景里已經(jīng)可以拿去試跑真實視頻流了。5.2 真實場景里最容易翻車的幾個瞬間夜間弱光車燈眩光。監(jiān)控攝像頭夜間畫質(zhì)普遍拉胯頭盔在這種畫面里經(jīng)常只是一團模糊的亮斑。夜間的識別率普遍比白天低15%~20%這不是模型不努力而是輸入信息本身就不足。解決辦法有兩種一是圖像預(yù)處理做增強比如自適應(yīng)直方圖均衡或帶色彩恢復(fù)的多尺度Retinex二是訓(xùn)練時把低光樣本單獨做一個增強分支用MixUp把白天圖片調(diào)暗和真實夜間圖混合相當(dāng)于人工制造中間態(tài)樣本。遠處的超小目標(biāo)。當(dāng)頭盔在畫面里只有十幾個像素大小時模型基本只能靠猜測輸出結(jié)果。這時候最實用的策略不是硬摳模型而是做多幀融合連續(xù)幾幀中如果同一位置都檢測到目標(biāo)就確認輸出如果只是偶發(fā)框則判定為噪聲。這個思路比買更貴的算法模型性價比高得多。安全帽與頭盔的誤檢。工地安全帽外形和摩托車頭盔差異不小但如果一個騎手戴了安全帽騎車模型很容易把它當(dāng)成頭盔。這批數(shù)據(jù)集里包含了一部分安全帽樣本作為負例但真實環(huán)境中的安全帽樣式五花八門你在實際部署時建議再采集一些負樣本做增量訓(xùn)練把誤檢率往下壓。5.3 部署時的常用操作檢測模型產(chǎn)出的裸框丟給業(yè)務(wù)系統(tǒng)前一般要過幾道后處理置信度閾值推薦設(shè)置在0.35~0.45之間。調(diào)太低會在密集場景產(chǎn)生大量誤檢調(diào)太高會漏掉遮擋目標(biāo)。NMS的IoU閾值0.5左右比較平衡。如果你發(fā)現(xiàn)同一頂頭盔出現(xiàn)雙框可以適當(dāng)提高NMS的IoU閾值。類別過濾如果業(yè)務(wù)只關(guān)心未戴頭盔的告警可以把戴頭盔的預(yù)測框直接過濾掉只保留低置信度的未戴框做上報這能大幅減少人工復(fù)核成本。在邊緣設(shè)備部署時YOLOv8n轉(zhuǎn)成TensorRT的engine文件后在Jetson Orin Nano上能做到30~40ms一幀基本滿足實時視頻流檢測需求。轉(zhuǎn)換時要特別注意動態(tài)batch和動態(tài)分辨率設(shè)置因為監(jiān)控畫面經(jīng)常被裁剪固定shape的engine在輸入尺寸變化時會直接報錯。6. 數(shù)據(jù)集的擴展思路用自己的攝像頭數(shù)據(jù)給模型持續(xù)補課沒有任何一個公開數(shù)據(jù)集能覆蓋所有場景這批2514張圖片也不例外。聰明的做法是把它當(dāng)成預(yù)訓(xùn)練基礎(chǔ)包再疊加自己的場景數(shù)據(jù)做持續(xù)優(yōu)化。怎么最快速地給模型補課核心就是數(shù)據(jù)標(biāo)注的效率。這里推薦兩個組合半自動標(biāo)注先用這批數(shù)據(jù)訓(xùn)練出一個初版模型然后拿著模型去跑你本地攝像頭抽出來的圖片讓模型先出一版預(yù)測框。人工只需要把模型漏掉的框補上、標(biāo)錯的框改掉標(biāo)注速度能提升3倍以上。難例回流模型在線上跑的時候?qū)iT收集那些置信度不高但實際是正確的和置信度很高但實際是錯誤的樣本定期清洗后加入訓(xùn)練集做增量訓(xùn)練。這個方法比一次性堆幾千張隨機圖片更有效因為每一張新樣本都在補模型的短板。我之前在一次調(diào)試中試過用labelme手工標(biāo)注了一批本地停車場的頭盔圖片但labelme默認導(dǎo)出的是JSON格式還得寫腳本轉(zhuǎn)成VOC/COCO。如果你也在用labelme建議標(biāo)注時直接把類別列表建好JSON轉(zhuǎn)VOC的時候會省掉很多字段映射的力氣。還有一個實用的擴展策略利用視頻幀序列。你不需要一個場景抓幾千張圖片從一段連續(xù)視頻里每隔10幀抽一幀抽出來的圖天然就帶視角連續(xù)性和場景多樣性。跑模型標(biāo)注、人工糾錯、增量訓(xùn)練重復(fù)幾輪之后模型在你自己場景的泛化能力會有肉眼可見的提升。另外提醒一點頭盔檢測的場景越垂直遷移學(xué)習(xí)的效果就越明顯。如果你手里本來就有一個在COCO上預(yù)訓(xùn)練的YOLO模型用它微調(diào)這批頭盔數(shù)據(jù)集收斂速度和最終精度都會優(yōu)于從頭訓(xùn)練。我自己試過從COCO預(yù)訓(xùn)練權(quán)重起步訓(xùn)練到120個epoch時精度已經(jīng)超過從頭訓(xùn)練200輪的結(jié)果。最后說一個使用這批數(shù)據(jù)時的心得拿到任何公開數(shù)據(jù)集先別急著開訓(xùn)花半小時做一遍數(shù)據(jù)體檢看看類別分布、看看邊界框標(biāo)注質(zhì)量、看看有沒有損壞圖片。這個習(xí)慣幫我避免過很多次訓(xùn)練出來效果差但找不到原因的尷尬情況。頭盔檢測這行數(shù)據(jù)和標(biāo)注的質(zhì)量往往比模型結(jié)構(gòu)更重要把基礎(chǔ)打牢后面的每一層優(yōu)化才站得住。本文還有配套的精品資源點擊獲取