數(shù)據(jù)集解析:VOC/YOLO雙格式與訓(xùn)練避坑指南)
我今年接了好幾個(gè)車載視覺(jué)相關(guān)的項(xiàng)目每次聊到“道路拋灑物檢測(cè)”這個(gè)方向?qū)Ψ降谝痪湓捇径际菃?wèn)有沒(méi)有現(xiàn)成的數(shù)據(jù)集可以用來(lái)做預(yù)訓(xùn)練或者評(píng)測(cè)確實(shí)這個(gè)場(chǎng)景有點(diǎn)尷尬——通用目標(biāo)檢測(cè)數(shù)據(jù)集里幾乎沒(méi)有專門針對(duì)拋灑物的即便有類別和格式往往也是亂七八糟。所以當(dāng)我看到這份“道路拋灑物數(shù)據(jù)集4521張VOCYOLO格式”時(shí)第一反應(yīng)是終于有一份能直接用來(lái)干活的數(shù)據(jù)了。這篇文章不打算做那種“數(shù)據(jù)集說(shuō)明文檔”式的復(fù)讀我想從實(shí)際落地的角度把這份數(shù)據(jù)集從目錄結(jié)構(gòu)、標(biāo)注格式、轉(zhuǎn)換腳本到訓(xùn)練前的檢查清單完整拆一遍。順便把我在類似數(shù)據(jù)集上踩過(guò)的坑和驗(yàn)證方法也一并寫出來(lái)——當(dāng)你手里拿到一份標(biāo)注好的數(shù)據(jù)集真正的功課才剛剛開(kāi)始。1. 為什么道路拋灑物檢測(cè)是“看著簡(jiǎn)單做起來(lái)棘手”的視覺(jué)任務(wù)1.1 拋灑物檢測(cè)與通用目標(biāo)檢測(cè)的差距在哪路面上的拋灑物聽(tīng)起來(lái)就是“在圖像里框出物體”好像和行人檢測(cè)、車輛檢測(cè)沒(méi)什么本質(zhì)區(qū)別。但真正做進(jìn)去就會(huì)發(fā)現(xiàn)這個(gè)任務(wù)是典型的高難度垂直場(chǎng)景。第一個(gè)難點(diǎn)是目標(biāo)形態(tài)極度不固定。一輛貨車上掉下來(lái)的紙箱、輪胎皮、木板、塑料袋、散落的砂石它們?cè)谝曈X(jué)上沒(méi)有統(tǒng)一的外觀。你不可能像檢測(cè)行人那樣依靠“有頭有肩”的先驗(yàn)結(jié)構(gòu)拋灑物更多是“路面背景上的一塊異樣物體”。很多時(shí)候連人眼都要盯著看好一會(huì)才能確認(rèn)那是不是拋灑物更別說(shuō)模型了。第二個(gè)難點(diǎn)是目標(biāo)尺度普遍偏小。在高速或者快速路的視頻畫面里拋灑物真正占據(jù)的像素往往只有幾十個(gè)甚至十幾個(gè)像素。小目標(biāo)檢測(cè)本身是所有檢測(cè)任務(wù)里最難啃的骨頭之一而拋灑物恰好扎堆在小尺度區(qū)間。第三個(gè)難點(diǎn)是背景干擾。瀝青路面的裂縫、陰影、輪胎剎車印、水漬反光這些視覺(jué)特征和某些拋灑物在紋理、顏色上高度接近。模型很容易把路面的老化裂紋當(dāng)成物體框出來(lái)或者反過(guò)來(lái)把一塊黑色的輪胎皮當(dāng)成路面的一部分放過(guò)去。1.2 這種數(shù)據(jù)集能支撐什么方向的研究與應(yīng)用拋灑物檢測(cè)的落點(diǎn)其實(shí)很明確高速公路監(jiān)控、隧道內(nèi)的異物檢測(cè)、養(yǎng)護(hù)巡邏車的車載輔助識(shí)別。前兩年這個(gè)需求更多是“錦上添花”但現(xiàn)在已經(jīng)變成一種偏剛需的能力——畢竟拋灑物導(dǎo)致的事故率擺在那里無(wú)論是路政養(yǎng)護(hù)還是車路協(xié)同大家都在想辦法把發(fā)現(xiàn)時(shí)間從“人工巡查發(fā)現(xiàn)”壓縮到“攝像頭自動(dòng)識(shí)別”。從算法研究的角度這類數(shù)據(jù)也能支撐不少有意思的方向。比如小目標(biāo)檢測(cè)的評(píng)測(cè)或者在強(qiáng)光照、逆光、夜間條件下檢測(cè)魯棒性的研究。還有一些團(tuán)隊(duì)會(huì)用這類數(shù)據(jù)做“異常事件檢測(cè)”——不是識(shí)別某個(gè)具體類別而是檢測(cè)路面上“出現(xiàn)了不應(yīng)該出現(xiàn)的東西”。所以這份4521張的數(shù)據(jù)集放在通用檢測(cè)領(lǐng)域不算大但在拋灑物這種垂直場(chǎng)景里已經(jīng)是能支撐模型訓(xùn)練和評(píng)估的規(guī)模。關(guān)鍵在于拿到之后怎么用、怎么驗(yàn)證、怎么避開(kāi)格式轉(zhuǎn)換和標(biāo)注噪聲這些坑。2. 數(shù)據(jù)集結(jié)構(gòu)拆解VOC與YOLO兩套目錄其實(shí)是一份標(biāo)注的兩副面孔2.1 VOC風(fēng)格目錄長(zhǎng)什么樣拿到數(shù)據(jù)集的第一件事不是打開(kāi)圖片看而是先把目錄結(jié)構(gòu)摸清楚。VOC格式的目錄組織方式來(lái)自一個(gè)很經(jīng)典的公開(kāi)數(shù)據(jù)集結(jié)構(gòu)它的核心是圖片和標(biāo)注文件分離存放再由索引文件控制哪些圖片參與訓(xùn)練或驗(yàn)證。一個(gè)標(biāo)準(zhǔn)的VOC風(fēng)格目錄大致是這樣的dataset_root/ ├── JPEGImages/ │ ├── 000001.jpg │ ├── 000002.jpg │ └── ... ├── Annotations/ │ ├── 000001.xml │ ├── 000002.xml │ └── ... └── ImageSets/ └── Main/ ├── train.txt ├── val.txt └── test.txtJPEGImages放原始圖片Annotations放對(duì)應(yīng)的XML標(biāo)注文件ImageSets/Main下的txt文件記錄訓(xùn)練、驗(yàn)證、測(cè)試的文件名列表。文件名的對(duì)應(yīng)關(guān)系很直接000001.jpg對(duì)應(yīng)000001.xml如果這兩邊數(shù)量對(duì)不上或者名字對(duì)不上后面訓(xùn)練時(shí)就會(huì)報(bào)錯(cuò)。2.2 YOLO風(fēng)格目錄長(zhǎng)什么樣YOLO格式的數(shù)據(jù)集目錄則是另一套邏輯通常長(zhǎng)這樣dataset_root/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml注意這里的差異YOLO風(fēng)格不是用txt索引文件來(lái)劃分?jǐn)?shù)據(jù)而是直接把圖片和標(biāo)注分別扔進(jìn)train/val/test子目錄。images下放圖labels下放同名、同路徑的txt標(biāo)注文件。data.yaml是配置文件里面寫清楚訓(xùn)練集、驗(yàn)證集路徑以及類別名列表。“VOCYOLO格式”的含義就是同一批標(biāo)注內(nèi)容同時(shí)提供了XML和TXT兩套表示。有時(shí)候兩套標(biāo)注是獨(dú)立維護(hù)的有時(shí)候是轉(zhuǎn)換生成的這個(gè)不確定所以拿到手第一步就應(yīng)該做兩種格式的交叉驗(yàn)證。2.3 4521張圖片的規(guī)模與數(shù)據(jù)劃分從規(guī)模來(lái)推斷4521張對(duì)道路拋灑物任務(wù)來(lái)說(shuō)處于“實(shí)用級(jí)”。如果按常見(jiàn)的8:1:1比例劃分訓(xùn)練集大概3600張左右驗(yàn)證集和測(cè)試集各四五百?gòu)?。?yīng)對(duì)單類或者少量類別的檢測(cè)任務(wù)這個(gè)量是夠訓(xùn)練出可用模型的但如果類別很多、每類樣本極不均衡那訓(xùn)練時(shí)就要靠加權(quán)采樣之類的技巧來(lái)彌補(bǔ)。我一般拿到這種規(guī)模的數(shù)據(jù)集會(huì)做兩件事。第一把所有圖片和標(biāo)注按文件名排序做一個(gè)全量的對(duì)應(yīng)關(guān)系核對(duì)確保沒(méi)有孤兒圖片或者孤兒標(biāo)注。第二把劃分后的txt文件全部讀一遍確認(rèn)里面記錄的是文件名還是完整路徑——這兩種寫法在后續(xù)寫數(shù)據(jù)加載邏輯時(shí)完全不同。3. VOC標(biāo)注里最容易看走眼的幾個(gè)細(xì)節(jié)3.1 讀懂一個(gè)標(biāo)準(zhǔn)XML的全部字段VOC格式的XML標(biāo)注文件結(jié)構(gòu)清晰但字段瑣碎。隨手打開(kāi)一份大概是這樣的annotation folderJPEGImages/folder filename000001.jpg/filename source databaseUnknown/database /source size width1920/width height1080/height depth3/depth /size segmented0/segmented object nametire/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin1356/xmin ymin784/ymin xmax1512/xmax ymax902/ymax /bndbox /object /annotation有幾個(gè)字段必須重視。filename有時(shí)候會(huì)帶著子目錄前綴有時(shí)候只有文件名以它為基準(zhǔn)和圖片目錄配對(duì)時(shí)格式不一致就會(huì)出問(wèn)題。size里的寬高非常關(guān)鍵和圖片實(shí)際尺寸不符時(shí)會(huì)造成坐標(biāo)錯(cuò)亂。object這個(gè)節(jié)點(diǎn)是真正意義上的標(biāo)注本體。name是類別名bndbox里是目標(biāo)的邊界框四個(gè)數(shù)值都是像素坐標(biāo)左上角的(xmin, ymin)和右下角的(xmax, ymax)。這個(gè)坐標(biāo)系是圖片自身的像素坐標(biāo)系原點(diǎn)在左上角。3.2 哪些字段會(huì)影響訓(xùn)練結(jié)果truncated和difficult這兩個(gè)標(biāo)記很多人會(huì)忽略但它們?cè)诓煌?xùn)練框架里的處理邏輯完全不同。truncated表示目標(biāo)是否被圖像邊緣截?cái)?。路面上很大一部分拋灑物其?shí)是“半截”狀態(tài)比如一個(gè)大木板只有一部分出現(xiàn)在畫面里所以這類數(shù)據(jù)在真實(shí)場(chǎng)景中占比不低。difficult表示目標(biāo)是否難以辨認(rèn)。在部分VOC時(shí)代的檢測(cè)框架里difficult為1的樣本在計(jì)算mAP時(shí)會(huì)被排除。但在現(xiàn)代深度學(xué)習(xí)訓(xùn)練里很多框架根本不看這個(gè)字段而是把所有非背景的框全部拿來(lái)參與訓(xùn)練。問(wèn)題就出在這如果你用的框架會(huì)讀取difficult并做處理而另一套工具不讀同一個(gè)XML在兩套環(huán)境下就會(huì)產(chǎn)生完全不同的訓(xùn)練樣本集合。所以建議拿到VOC格式的數(shù)據(jù)后先寫個(gè)小腳本統(tǒng)計(jì)一下所有XML里truncated和difficult的取值分布確認(rèn)這批數(shù)據(jù)里困難樣本的占比。如果是像我之前遇到的那個(gè)項(xiàng)目訓(xùn)練過(guò)程loss波動(dòng)特別大回頭一查罪魁禍?zhǔn)拙褪且淮笈鷇ifficult1的樣本它們把小目標(biāo)檢測(cè)結(jié)果攪得亂七八糟。4. VOC轉(zhuǎn)YOLO的完整操作與反向驗(yàn)證4.1 轉(zhuǎn)換公式從像素坐標(biāo)到歸一化中心坐標(biāo)很多數(shù)據(jù)集的VOC和YOLO格式并不是同步生成的有的甚至不是同一批人標(biāo)的。所以拿到手最穩(wěn)妥的做法是自己把VOC轉(zhuǎn)成YOLO再和已有的YOLO標(biāo)注逐行比對(duì)確認(rèn)兩邊一致。轉(zhuǎn)換的數(shù)學(xué)公式很基礎(chǔ)但單位搞錯(cuò)就會(huì)全線崩盤。VOC的bndbox是像素坐標(biāo)YOLO的txt里需要的是歸一化后的中心點(diǎn)坐標(biāo)和寬高公式如下x_center (xmin xmax) / 2.0 / width y_center (ymin ymax) / 2.0 / height box_width (xmax - xmin) / width box_height (ymax - ymin) / height這里width和height必須來(lái)自XML里的size節(jié)點(diǎn)而不是代碼里猜測(cè)的圖片尺寸。雖然兩者應(yīng)該相等但為了防止XML和實(shí)際圖片尺寸不一致我最常用的是直接從XML讀取寬高——既然標(biāo)注是在那套尺寸坐標(biāo)系里畫的轉(zhuǎn)換時(shí)就用那套坐標(biāo)系。4.2 一個(gè)可以直接跑的轉(zhuǎn)換腳本下面這個(gè)腳本是我在幾個(gè)項(xiàng)目里改來(lái)改去留下來(lái)的版本夠用且不啰嗦。它遍歷指定目錄下所有XML文件為每個(gè)XML生成對(duì)應(yīng)的txt文件并自動(dòng)創(chuàng)建一個(gè)classes.txt用于記錄類別順序。import os import xml.etree.ElementTree as ET from glob import glob def voc_to_yolo(xml_file, output_dir, classes_map): tree ET.parse(xml_file) root tree.getroot() base os.path.basename(xml_file).replace(.xml, .txt) lines [] # size字段是轉(zhuǎn)換的關(guān)鍵基準(zhǔn)必須和圖片實(shí)際分辨率一致 size root.find(size) width float(size.find(width).text) height float(size.find(height).text) for obj in root.iter(object): name obj.find(name).text if name not in classes_map: classes_map[name] len(classes_map) class_id classes_map[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) # 做一次越界檢查坐標(biāo)不能超出圖片范圍 if xmin 0 or ymin 0 or xmax width or ymax height: print(fWarning: {xml_file} box out of range: {xmin},{ymin},{xmax},{ymax}) x_center (xmin xmax) / 2.0 / width y_center (ymin ymax) / 2.0 / height box_w (xmax - xmin) / width box_h (ymax - ymin) / height lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) with open(os.path.join(output_dir, base), w) as f: f.write(\n.join(lines) \n) xml_dir Annotations yolo_label_dir labels os.makedirs(yolo_label_dir, exist_okTrue) classes_map {} for xml_file in glob(os.path.join(xml_dir, *.xml)): voc_to_yolo(xml_file, yolo_label_dir, classes_map) with open(classes.txt, w) as f: f.write(\n.join(classes_map.keys()))有幾個(gè)坑我在代碼注釋里標(biāo)了但還想單獨(dú)強(qiáng)調(diào)一下。第一width和height必須用XML里的值不要用代碼猜。第二當(dāng)某個(gè)框的xmin出現(xiàn)負(fù)數(shù)或者xmax超過(guò)圖片寬度時(shí)這份標(biāo)注要么是注釋坐標(biāo)本身有錯(cuò)誤要么是這張圖片被resize過(guò)而沒(méi)有更新XML。無(wú)論哪種情況都需要單獨(dú)處理不能直接往下游用。4.3 驗(yàn)證是否轉(zhuǎn)換成功畫框和反向比對(duì)轉(zhuǎn)換完不是看一眼就說(shuō)“好了”。我每次都會(huì)做兩層驗(yàn)證。第一層是可視化驗(yàn)證。選十幾張圖用OpenCV把txt里的歸一化坐標(biāo)換算回像素坐標(biāo)畫框后和原圖疊加。這一步主要看人眼直覺(jué)框是不是貼合目標(biāo)、有沒(méi)有張冠李戴。第二層是數(shù)值比對(duì)。如果數(shù)據(jù)集里已經(jīng)自帶YOLO標(biāo)注就寫個(gè)簡(jiǎn)單腳本把轉(zhuǎn)換出的結(jié)果和原始TXT做逐行比較。因?yàn)楦↑c(diǎn)數(shù)精度問(wèn)題直接比較相等可能太嚴(yán)格我通常用“每個(gè)框的重疊度大于0.98”作為一致的標(biāo)準(zhǔn)。兩套標(biāo)注只有像素級(jí)差異的話基本可以接受。5. 訓(xùn)練前的檢查清單避免在啟動(dòng)訓(xùn)練后才發(fā)現(xiàn)問(wèn)題5.1 文件名對(duì)應(yīng)關(guān)系與空標(biāo)簽檢查很多人上來(lái)直接跑訓(xùn)練然后撞見(jiàn)“No labels found in xxx.jpg”這類報(bào)錯(cuò)再回頭排查幾個(gè)小時(shí)就沒(méi)了。所以我把訓(xùn)練前的檢查整理成了一張可以照著執(zhí)行的清單。第一項(xiàng)圖片與標(biāo)簽一一對(duì)應(yīng)。對(duì)VOC目錄來(lái)說(shuō)就是JPEGImages下的文件名集合與Annotations下的文件名集合完全一致對(duì)YOLO目錄來(lái)說(shuō)就是images子目錄下的文件名集合與labels子目錄下的文件名集合完全一致。有任何一個(gè)文件只有圖片沒(méi)有標(biāo)注或者只有標(biāo)注沒(méi)有圖片都要先處理掉。第二項(xiàng)空標(biāo)簽文件。YOLO訓(xùn)練里一個(gè)正常的目標(biāo)檢測(cè)項(xiàng)目中圖片里可能確實(shí)沒(méi)有任何目標(biāo)這時(shí)候txt文件為空。如果你的任務(wù)要求每張圖都至少有一個(gè)目標(biāo)那空標(biāo)簽就意味著漏標(biāo)。但拋灑物場(chǎng)景存在真實(shí)的負(fù)樣本圖片也就是路面上沒(méi)有拋灑物的正常畫面這些是有用的負(fù)樣本訓(xùn)練空標(biāo)簽是合理的要看數(shù)據(jù)集的初衷。第三項(xiàng)損壞圖片檢測(cè)。用PIL或者OpenCV批量讀取一遍所有圖片捕獲“不能解碼”的異常。出現(xiàn)損壞圖像時(shí)直接把該圖對(duì)應(yīng)的標(biāo)注一并移出數(shù)據(jù)集不要抱僥幸心理。5.2 類別統(tǒng)計(jì)與目標(biāo)數(shù)量統(tǒng)計(jì)接下來(lái)我要統(tǒng)計(jì)的目標(biāo)分布是我判斷這個(gè)數(shù)據(jù)集質(zhì)量的重要指標(biāo)。import os from collections import Counter label_dir labels counter Counter() empty_files [] total_boxes 0 for txt_file in os.listdir(label_dir): filepath os.path.join(label_dir, txt_file) with open(filepath, r) as f: lines f.readlines() if len(lines) 0: empty_files.append(txt_file) continue for line in lines: parts line.strip().split() if len(parts) 5: class_id parts[0] counter[class_id] 1 total_boxes 1 else: print(fBad line in {txt_file}: {line.strip()}) print(類別統(tǒng)計(jì):, dict(counter)) print(總目標(biāo)數(shù):, total_boxes) print(空標(biāo)簽數(shù)量:, len(empty_files))這里有幾個(gè)經(jīng)驗(yàn)判斷可以參考。如果總目標(biāo)數(shù)除以總圖片數(shù)遠(yuǎn)小于1比如平均每張圖連0.5個(gè)目標(biāo)都沒(méi)有那這些圖片大部分是純背景如果遠(yuǎn)大于3說(shuō)明場(chǎng)景里拋灑物密集程度很高。這兩種數(shù)據(jù)分布訓(xùn)練出來(lái)的模型行為完全不同。還需要檢查類別編號(hào)的連續(xù)性。YOLO格式里類別編號(hào)必須是從0開(kāi)始的連續(xù)整數(shù)如果有類別列表是[tire,board,stone]那編號(hào)就是0、1、2對(duì)應(yīng)txt每行開(kāi)頭的數(shù)字。如果classes.txt里寫了3個(gè)類別但txt里出現(xiàn)了編號(hào)5那轉(zhuǎn)換腳本一定有問(wèn)題。5.3 一次性檢查圖片尺寸和分辨率分布這個(gè)檢查容易被忽略。磚頭大小的拋灑物在1080p畫面里可能占50x50像素但在720p畫面里可能只剩30x30像素訓(xùn)練時(shí)模型看到的特征信息量完全不同。如果這批數(shù)據(jù)的圖片分辨率不統(tǒng)一標(biāo)注的絕對(duì)像素坐標(biāo)也缺少可比性。寫個(gè)腳本遍歷所有圖片統(tǒng)計(jì)寬高的分布。如果發(fā)現(xiàn)大部分是1920x1080少部分是1280x720甚至更低建議要么統(tǒng)一resize到一個(gè)固定的訓(xùn)練尺寸要么在訓(xùn)練配置里把輸入分辨率設(shè)到接近最小圖片的合理值避免代碼在resize時(shí)把標(biāo)注坐標(biāo)也改變了。6. 訓(xùn)練和實(shí)際部署時(shí)的經(jīng)驗(yàn)補(bǔ)充6.1 針對(duì)這種規(guī)模的訓(xùn)練配置思路關(guān)于訓(xùn)練參數(shù)我不直接給一組死數(shù)據(jù)因?yàn)轭悇e數(shù)、圖片分辨率不同最優(yōu)值也不同。但有幾個(gè)經(jīng)驗(yàn)原則是通用的。對(duì)于4521張這個(gè)規(guī)模訓(xùn)練時(shí)不需要像用百萬(wàn)級(jí)數(shù)據(jù)那樣開(kāi)很大的epoch。我常用的做法是初始設(shè)100到150個(gè)epoch配合早停。如果loss在20到30個(gè)epoch后不再下降就停掉不要硬跑。輸入尺寸方面如果數(shù)據(jù)集中存在大量小目標(biāo)就不要把訓(xùn)練尺寸壓得太低。把訓(xùn)練尺寸定在960甚至1280會(huì)顯著提高小目標(biāo)的召回率代價(jià)是顯存吃緊、訓(xùn)練變慢。我的建議是可以先用640跑通全流程確認(rèn)沒(méi)有bug之后再往上調(diào)尺寸。數(shù)據(jù)增強(qiáng)要克制。對(duì)拋灑物這個(gè)場(chǎng)景HSV色彩抖動(dòng)和輕微的尺度抖動(dòng)比較有用因?yàn)楣庹蘸团臄z距離對(duì)路面影響很大。但過(guò)度使用翻轉(zhuǎn)和旋轉(zhuǎn)要小心——當(dāng)然拋灑物的形態(tài)不像文字那樣有強(qiáng)方向性翻轉(zhuǎn)基本安全但旋轉(zhuǎn)超過(guò)30度之后目標(biāo)會(huì)變得很假模型在真實(shí)場(chǎng)景里反而吃虧。6.2 部署端的思考處理好“漏檢”與“誤報(bào)”的平衡訓(xùn)練完模型真正落地時(shí)還有一道坎。道路拋灑物檢測(cè)的部署位置大多是路側(cè)監(jiān)控或養(yǎng)護(hù)車車載攝像頭這兩種場(chǎng)景對(duì)誤報(bào)的容忍度差異很大。路側(cè)監(jiān)控視野固定算法誤報(bào)可以在時(shí)間維度上做平滑過(guò)濾比如連續(xù)多幀都出現(xiàn)同個(gè)位置的檢測(cè)框才觸發(fā)告警。車載場(chǎng)景畫面一直在動(dòng)上一幀和下一幀的空間關(guān)聯(lián)弱多幀確認(rèn)的閾值和策略要重新設(shè)計(jì)誤報(bào)閾值往往要調(diào)得更高一些寧可放過(guò)一些不確定的目標(biāo)也不能每過(guò)一輛車就響一次警報(bào)。另外部署模型時(shí)優(yōu)先考慮輕量版本。拋灑物檢測(cè)通常是輔助功能和車輛檢測(cè)、車牌識(shí)別等任務(wù)共用算力。如果主干網(wǎng)絡(luò)太重會(huì)擠占其他模塊的資源。我的經(jīng)驗(yàn)是主干能小則小主要通過(guò)提高輸入分辨率和合理的訓(xùn)練策略來(lái)保精度而不是靠模型體量硬扛。這也是這類檢索定位評(píng)測(cè)數(shù)據(jù)集的價(jià)值所在——可以作為權(quán)衡模型輕量化和精度的標(biāo)準(zhǔn)基準(zhǔn)。最后再分享一個(gè)個(gè)人習(xí)慣拿到任何一份VOC和YOLO雙格式的數(shù)據(jù)集我第一件事不是直接訓(xùn)練而是把兩套格式做交叉校驗(yàn)然后畫幾十張可視化圖出來(lái)把每一類拋灑物都人工掃一遍。雖然這步要花掉一兩個(gè)小時(shí)但它能幫你提前發(fā)現(xiàn)類別標(biāo)簽分配錯(cuò)誤、框偏移、漏標(biāo)、誤標(biāo)這些后續(xù)最難定位的問(wèn)題。這個(gè)習(xí)慣幫我省下的排錯(cuò)時(shí)間遠(yuǎn)比檢查本身多得多。