檢測數(shù)據(jù)集:VOC+YOLO雙格式實戰(zhàn)解析)
礦下調(diào)度室里幾十路監(jiān)控畫面掛在墻上真正能同時盯住兩路的人都沒有。重點巷道里有人跌倒如果幾十秒內(nèi)沒被發(fā)現(xiàn)后果可以想見。所以現(xiàn)在很多智慧礦井項目都在做人員行為狀態(tài)檢測——用視覺模型實時判別人員的爬、走、靠、站、跌倒等狀態(tài)而這件事的根基就是一份標注可靠的數(shù)據(jù)集。這篇就聊一套典型的配置智慧礦井人員行為狀態(tài)檢測數(shù)據(jù)集VOCYOLO雙格式4847張圖、8個類別。我接觸過不少做礦山安監(jiān)視覺的團隊大家前期最頭疼的往往不是模型選型而是數(shù)據(jù)從哪來、標注怎么用、訓(xùn)練怎么排。這套數(shù)據(jù)集的標題信息很有代表性值得掰開揉碎講清楚。文章后面會拆解礦井場景的難點、八類標簽的邊界定義、雙格式的轉(zhuǎn)換邏輯、訓(xùn)練策略以及從檢測框到現(xiàn)場報警之間的工程問題。如果你正準備拿這類數(shù)據(jù)集跑實驗或者想評估數(shù)據(jù)質(zhì)量這篇應(yīng)該能幫你省不少時間。1. 礦井環(huán)境下的行為檢測難點遠比想象中多1.1 光照、粉塵、遮擋礦井圖像的三座山先說一個容易被低估的事實礦井監(jiān)控畫面和普通園區(qū)監(jiān)控完全不是一個難度等級。井下照明通常是礦燈和巷道頂燈混著來畫面里經(jīng)常出現(xiàn)一個強光點加一圈深陰影的極端動態(tài)范圍。礦工頭頂那盞礦燈一旦正對攝像頭整個人臉和上半身直接過曝成一片亮斑算法拿到這個區(qū)域時基本都是廢信息。再加上井下粉塵鏡頭前會有一層持續(xù)的霧感圖像對比度整體被壓低邊緣變糊。很多通用數(shù)據(jù)集上表現(xiàn)良好的檢測器到了這種畫面上mAP掉十幾個點是常有的事。遮擋問題也很突出。井下人員習(xí)慣穿寬松工作服輪廓本來就不緊湊。安全帽、自救器、礦燈、工具包這些東西把人體各個部位蓋得嚴嚴實實。人與人之間還會互相遮擋遇到搶險或交接班場景幾個人湊在一起互相重疊的框很難分清邊界。攝像頭安裝角度也不統(tǒng)一有些是巷道頂部俯視有些是側(cè)壁平視同一個“走”的動作在兩個視角下形態(tài)完全不同。這套數(shù)據(jù)集如果采集自真實井下或模擬巷道環(huán)境那標注難度就天然比普通行人檢測高一個量級。標框的人不但要看清人還要判斷“靠墻算不算靠”“蹲下和跌倒怎么劃界”。我見過不少標注了上萬張的數(shù)據(jù)集真正能直接拿去訓(xùn)模型的比例并不高問題大多出在邊界定義模糊。1.2 八類狀態(tài)各自綁定的業(yè)務(wù)價值行為狀態(tài)檢測不是單純?yōu)榱税选叭恕笨虺鰜矶且选叭嗽诟墒裁础弊兂煽蓤缶⒖山y(tǒng)計的語義信息。我們看這8個類別每一個背后都有對應(yīng)的管理訴求。跌倒是價值最高的類別直接關(guān)聯(lián)安全應(yīng)急。井下濕滑、臺階多跌倒可能意味著摔傷、暈厥早發(fā)現(xiàn)幾秒鐘差別很大。爬這個動作也很特殊正常人在井下巷道里趴著移動多半是發(fā)生事故后的自救或設(shè)備檢修屬于需要關(guān)注的非正常狀態(tài)??亢驼酒o態(tài)更多用來判斷人員是否在指定區(qū)域停留、是否疲勞蹭墻休息。走和跑是動態(tài)通行的基本狀態(tài)跑動往往關(guān)聯(lián)到緊急撤離或違規(guī)追趕。蹲和坐則通常對應(yīng)作業(yè)或休息場景既能用來統(tǒng)計工時也能輔助判斷人員是否長時間滯留某處。所以這8類如果標注準確下游能干的事非常多跌倒即時報警、區(qū)域人員密度統(tǒng)計、違規(guī)滯留提醒、巡檢路徑分析。這也是為什么智慧礦井項目愿意花成本去做行為識別而不是只做普通的人體檢測。1.3 單幀檢測能做多少不能做多少有一點必須提前說清楚這類數(shù)據(jù)集給到你的通常是單幀標注也就是每張圖片里每個人的類別標簽和包圍框。單幀模型能告訴你“這一幀里這個人大概率在蹲著”但它不知道“這個人是剛剛從站立狀態(tài)突然倒下去的”。真正的行為識別分成兩層。第一層是空間層用目標檢測模型對每一幀做類別預(yù)測輸出8個狀態(tài)的置信度。第二層是時間層把連續(xù)幀的預(yù)測結(jié)果串起來判斷狀態(tài)變化是否符合某種模式。比如跌倒的典型特征是短時間內(nèi)人體框的中心點快速下移、寬高比劇烈變化、隨后低置信度地躺倒或蹲坐。這些信息在單幀數(shù)據(jù)里是不完整的。所以拿到這套數(shù)據(jù)時心態(tài)擺正它的核心價值是幫你訓(xùn)練好第一層空間檢測器。“跌倒”能不能從檢測框上升到報警還要靠工程側(cè)的時序邏輯去補。這個問題我在第5章展開聊。2. 八類標簽拆解類別邊界比模型結(jié)構(gòu)更能決定效果2.1 類別清單與ID映射標題里明確提到的狀態(tài)詞有5個爬、走、靠、站、跌。8個類別里還剩3個從礦井行為檢測數(shù)據(jù)集的常見配置推測多半是蹲、坐、跑這類高頻姿態(tài)。注意這只是一種合理推測真正以數(shù)據(jù)包里的標注類別清單為準。如果你拿到的是YOLO格式直接看類別配置文件如果是VOC格式把全部XML里的name字段去重看一眼就清楚了。下面給一張常見的類別映射參考表實際順序可能不同但結(jié)構(gòu)類似ID英文標簽中文含義說明0crawl爬低姿移動常見于事故自救或設(shè)備檢修1walk走正常步行礦下通行主狀態(tài)2lean靠身體倚靠墻體或設(shè)備重心有支撐3stand站直立且不依賴外部支撐4fall跌突發(fā)的倒地或即將倒地的狀態(tài)5squat蹲小腿承重、臀部不上座面的低姿狀態(tài)6sit坐臀部接觸地面、臺階或設(shè)備上的狀態(tài)7run跑步頻明顯高于走、前傾明顯的快速移動這個ID順序在訓(xùn)練時就是YOLO標簽txt文件里每一行開頭的那個數(shù)字。你在自己的data.yaml里寫類別名順序必須和數(shù)據(jù)包里的txt標注順序完全一致差一位整個模型就廢了。我見過最典型的翻車現(xiàn)場就是訓(xùn)練數(shù)據(jù)里ID 2是lean配置文件里ID 2卻寫成了stand模型訓(xùn)完所有的站都被判成靠墻。這種錯不會報任何異常最后看混淆矩陣才反應(yīng)過來。2.2 相鄰類別怎么定義邊界8個類別里最難的是那些視覺上互相靠近的“鄰居”站和靠的區(qū)分點在于“重心是否依賴外部支撐”。站立時人體重心垂直落在雙腳上軀干基本直立靠墻時后背或肩膀明顯貼住墻面身體有傾斜角度腳和墻之間常呈三角支撐。但在俯視攝像頭下這個角度看不太清楚。標注規(guī)范里通常要求只有明顯接觸墻面且軀干傾斜超過某個角度才算靠否則一律標站。寧可少標靠不要用模棱兩可的框污染模型。蹲和坐經(jīng)常被搞混。區(qū)分點有兩個一是臀部有沒有接觸面蹲的臀部懸空坐的臀部壓在臺階或坐面上二是重心高度蹲的重心在小腿以上比較高坐的重心直接落在支撐面。側(cè)面視角好判斷俯視視角就得靠腿部折疊程度去猜。這部分是最消耗標注時間的。蹲和跌倒也有交疊。一個人跌倒后如果本能地蜷縮起來視覺上和蹲姿非常接近。這種情況標注規(guī)范里通常規(guī)定前一幀還有劇烈位移、當(dāng)前幀呈低姿蜷縮的連續(xù)多幀都應(yīng)標fall如果一開始就是靜態(tài)低姿則標squat。沒有這個規(guī)則標注員會按自己的主觀感覺來同類樣本內(nèi)部都會打架。走和跑相對好分看步幅和步頻。但低幀率攝像頭下運動模糊嚴重跑動的人腿部拖影框容易畫大畫歪。建議標注時不要只看單幀有條件就看著相鄰幾幀一起標。你會發(fā)現(xiàn)類別邊界定義這件事直接決定了模型訓(xùn)練時的“標準答案”質(zhì)量。邊界定義清楚了哪怕?lián)Q個基礎(chǔ)模型效果也穩(wěn)邊界一塌糊涂結(jié)構(gòu)再新的網(wǎng)絡(luò)也救不回來。2.3 從4847張圖推算類別分布與長尾風(fēng)險4847張圖聽起來不算少但要除以8個類別。如果類別分布均衡每個類別約600張但真實情況下走的樣本可能占了大頭爬和跌倒這種非常規(guī)狀態(tài)可能只有兩三百張甚至更少。這屬于典型的長尾分布。類別不均衡帶來的直接問題是頭部類別把損失函數(shù)主導(dǎo)了尾部類別的召回率上不去。尤其是跌倒這種安全關(guān)鍵類別漏報后果嚴重寧可誤報也不能漏報所以訓(xùn)練時要額外給它權(quán)重。拿到數(shù)據(jù)先做一次類別統(tǒng)計。YOLO格式的話遍歷所有txt文件統(tǒng)計每行第一個數(shù)字的頻次順帶檢查有沒有出現(xiàn)超出0-7的編號。這一步拋出一個簡單的統(tǒng)計腳本后面可以直接用import os from collections import Counter label_dir path/to/labels counter Counter() for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f), r) as fh: for line in fh: parts line.split() if parts: counter[int(parts[0])] 1 for cls_id, count in sorted(counter.items()): print(fclass {cls_id}: {count})這個腳本輸出的分布基本決定了你后面要不要做采樣均衡或損失加權(quán)。如果發(fā)現(xiàn)爬、坐、跑各自只有200張上下那訓(xùn)練時就得格外小心過擬合增強策略也要往這些類別傾斜。3. VOC與YOLO雙格式轉(zhuǎn)換邏輯、校驗?zāi)_本與常見坑3.1 為什么經(jīng)常同時給VOC和YOLO兩套格式VOC格式的XML可讀性好一個框就是一組嵌套標簽人能直接打開看標注工具大多原生支持。YOLO格式則更像為訓(xùn)練準備的“極簡指令”每個目標就是一行數(shù)字模型讀取效率高、不依賴額外解析庫。兩塊場景其實不一樣VOC適合人看、適合轉(zhuǎn)成其他格式Y(jié)OLO適合直接喂給訓(xùn)練腳本。所以你會發(fā)現(xiàn)很多數(shù)據(jù)集順手給了兩套本質(zhì)上是同一份標注的兩種表達。XML里寫的是類別名和絕對坐標xmin、ymin、xmax、ymaxtxt里寫的是類別ID和歸一化后的中心點坐標加寬高。兩邊信息一致只是換算方式不同。3.2 從xml到txt的坐標轉(zhuǎn)換與腳本如果只有VOC格式或者想自己驗證雙格式是否一致轉(zhuǎn)換公式很簡單cx (xmin xmax) / 2 / 圖片寬度cy (ymin ymax) / 2 / 圖片高度w (xmax - xmin) / 圖片寬度h (ymax - ymin) / 圖片高度注意所有數(shù)值最后都要除以圖片真實寬高不要用XML里記錄的size字段以外的任何猜測值。寫個通用腳本如下import xml.etree.ElementTree as ET import os CLASS_MAP {crawl: 0, walk: 1, lean: 2, stand: 3, fall: 4, squat: 5, sit: 6, run: 7} def convert_voc_to_yolo(xml_path, txt_path): tree ET.parse(xml_path) 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_MAP: print(funknown class: {name} in {xml_path}) continue box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) cx ((xmin xmax) / 2) / img_w cy ((ymin ymax) / 2) / img_h bw (xmax - xmin) / img_w bh (ymax - ymin) / img_h lines.append(f{CLASS_MAP[name]} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) with open(txt_path, w) as f: f.write(\n.join(lines))這段代碼足夠應(yīng)對絕大多數(shù)情況。如果你的數(shù)據(jù)集里出現(xiàn)某個類別名不在映射表里腳本會打印出來這就是你發(fā)現(xiàn)標注問題的第一道關(guān)口。3.3 拿到數(shù)據(jù)先做三件事對應(yīng)、越界、可視化第一件事是確認圖片和標注文件一一對應(yīng)。常見錯誤是XML或TXT比圖片多幾個、少幾個訓(xùn)練時圖片找不到標簽會跳過但標簽找不到圖片會導(dǎo)致你誤以為某些類別根本不存在。先做一次文件名差集檢查image_names {os.path.splitext(f)[0] for f in os.listdir(img_dir)} label_names {os.path.splitext(f)[0] for f in os.listdir(label_dir)} print(labels without images:, label_names - image_names) print(images without labels:, image_names - label_names)第二件事是檢查坐標越界。YOLO格式的cx、cy、w、h理論上應(yīng)該在0到1之間偶爾會有小數(shù)點誤差但不會大于1.01。一旦出現(xiàn)負數(shù)或者明顯的1.2、1.5這種值要么是轉(zhuǎn)換腳本寫錯要么是原始標注框出界。跑一個遍歷腳本把越界的文件名和坐標打出來def check_labels(label_dir): bad [] for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f), r) as fh: for line in fh: parts line.strip().split() if len(parts) ! 5: bad.append((f, len, parts)) continue cls_id, cx, cy, bw, bh int(parts[0]), *map(float, parts[1:]) if not (0 cls_id 8): bad.append((f, class, cls_id)) if not (0 cx 1 and 0 cy 1): bad.append((f, center, cx, cy)) if not (0 bw 1 and 0 bh 1): bad.append((f, size, bw, bh)) return bad第三件事是可視化抽檢。寫個腳本把框畫回原圖隨機抽100張人工過一遍。這一步看起來土但比任何自動化檢查都耐磨。自動化只能抓格式錯誤畫框能看出人的類型標沒標對、框有沒有緊貼人體、跌倒樣本的框是否包含了完全躺平的肢體。我自己的經(jīng)驗是這個抽檢至少做兩遍第一遍掃全量格式第二遍專門盯著跌倒、爬、蹲、坐這些難類看邊界。還有人會問VOC和YOLO兩份標注會不會內(nèi)容不一致存在這種可能。有些數(shù)據(jù)集是分頭生成的XML和TXT版本沒有同步。校驗方式很簡單用上面的轉(zhuǎn)換腳本把XML重新轉(zhuǎn)成txt再和自帶的txt比對內(nèi)容任何不一致都能自動發(fā)現(xiàn)。這個環(huán)節(jié)別省轉(zhuǎn)換腳本算坐標時浮點精度足夠兩個文件本不該有差異。4. 4847張圖的訓(xùn)練安排數(shù)據(jù)劃分、參數(shù)設(shè)置與評估視角4.1 驗證集劃分別用純隨機按場景分4847張圖像如果來自連續(xù)監(jiān)控視頻那相鄰幀之間的畫面高度相似。直接全局隨機劃分train和val同一段視頻的相近畫面會同時出現(xiàn)在兩邊驗證集指標會虛高得離譜——模型其實是“記住了”訓(xùn)練集里出現(xiàn)過的畫面而不是泛化到了新場景。正確做法是按場景切片劃分。如果數(shù)據(jù)包含不同拍攝點位的圖片按點位分如果數(shù)據(jù)記錄了時間段按時間片分如果連這個都沒有就按文件名前綴的統(tǒng)計特征去分。原則是同一段連續(xù)畫面里的幀必須全部進訓(xùn)練集或全部進驗證集不能拆開。我見過有些人8:2隨機分完訓(xùn)練集里某條巷子的人站著驗證集里同樣的巷子幾乎同樣的站位也站著模型啥都沒學(xué)到驗證mAP已經(jīng)0.9了一到現(xiàn)場立刻現(xiàn)原形。建議訓(xùn)練集和驗證集按8:2或9:1劃分。數(shù)據(jù)量只有4847張的話我傾向9:1因為驗證集只是評估模型效果最終還要靠現(xiàn)場的獨立測試來驗證。如果覺得9:1驗證集的指標波動大可以多做幾次不同隨機種子劃分看穩(wěn)定性而不是盲目犧牲訓(xùn)練數(shù)據(jù)量。4.2 一套穩(wěn)妥的初始訓(xùn)練配置模型選型上先跑一個輕量的YOLOv8n把數(shù)據(jù)質(zhì)量測出來再升級到Y(jié)OLOv8m或YOLOv8l沖精度。用5000張量級的數(shù)據(jù)直接上大模型不是不行但出了問題你分不清是數(shù)據(jù)問題還是模型問題調(diào)試成本很高。初始訓(xùn)練參數(shù)給一個可以直接抄的表參數(shù)建議值說明modelyolov8n第一輪跑通驗證數(shù)據(jù)可用性imgsz640通用穩(wěn)妥礦下小人目標多可調(diào)832epochs150配合早停別一上來300輪batch16或32按顯存調(diào)訓(xùn)練不穩(wěn)定就先降batchearly_stoppatience 20驗證集連續(xù)20輪不漲就停optimizerAdamW或SGD數(shù)據(jù)量小AdamW收斂更快訓(xùn)練數(shù)據(jù)增強方面YOLO自帶的Mosaic、隨機翻轉(zhuǎn)和色彩抖動已經(jīng)夠用。礦下場景建議額外加兩類一是隨機亮度對比度擾動模擬礦燈過曝和陰影二是輕微高斯模糊或運動模糊模擬粉塵和攝像頭抖動。這些增強對跌倒、跑這類動作的魯棒性幫助很大。到了第二輪可以換YOLOv8m輸入尺寸提到768或832epochs加到200把mAP50-95往上推。你會發(fā)現(xiàn)大輸入尺寸對礦下密集小目標的作用比換大模型更明顯因為人員框在整個畫面里占比普遍偏小。4.3 評估別只盯整體mAP跑完訓(xùn)練第一件事不是看那張漂亮的PR曲線而是拆到每個類別去看指標。統(tǒng)一叫mAP的數(shù)值會騙人如果walk和stand樣本多整體mAP被它們拉高fall和crawl即便做得稀爛整體數(shù)字依然能看。要看的關(guān)鍵指標是三個每類的AP、混淆矩陣、以及F1曲線下的最佳閾值。混淆矩陣最有用它直接告訴你哪兩個類別互相打架。前面聊過站和靠最容易混蹲和跌也常有交疊。如果混淆矩陣里fall被大量預(yù)測成squat你在推理階段加時序邏輯時就得格外注意降低誤報和漏報的策略也要據(jù)此設(shè)計。閾值選擇也很講究。默認置信度閾值0.25或0.5不是為礦井場景調(diào)的。跌倒類可以單獨把置信度閾值調(diào)低換取更高召回率靠和站這種非關(guān)鍵類則可以把閾值調(diào)高減少無意義的報警噪音。多類別檢測的好處就是可以對不同類別設(shè)置不同閾值很多框架支持別浪費這個自由度。5. 從檢測框到現(xiàn)場可用時序判定、部署約束和增強建議5.1 單幀檢測會誤報跌倒報警要加時序邏輯模型訓(xùn)完在礦下現(xiàn)場最容易翻車的不是精度數(shù)字而是“動不動亂報”。沒有時序邏輯時彎腰撿扳手、蹲下系鞋帶、快速鉆進矮巷道都可能被單幀模型給出fall的高置信度。然后調(diào)度室里的報警器隔幾秒響一次用不了半小時現(xiàn)場負責(zé)人就會把整個系統(tǒng)關(guān)掉。解決方案很簡單把單幀預(yù)測串成狀態(tài)序列只有滿足時序條件才觸發(fā)報警。偽邏輯大致是這樣對每個跟蹤目標維護最近T幀的類別序列 如果連續(xù)T幀類別為fall且目標中心點在最近T幀內(nèi)發(fā)生明顯下移 則觸發(fā)跌倒報警 否則不觸發(fā)只記錄狀態(tài)T取3到5幀比較合適幀率25fps的情況下對應(yīng)約0.2秒確認窗口既有實時性又能濾掉大部分抖動。中心點位移閾值要根據(jù)攝像頭高度和視場角調(diào)俯視攝像頭下跌倒的位移幅度和平視差異很大沒有通用值只能標定的時候在真實現(xiàn)場測幾組數(shù)據(jù)。如果數(shù)據(jù)集中fall樣本本身就不多模型對跌倒的置信度普遍偏低時序邏輯里還要加入“類別概率平滑”。就是把單幀置信度做指數(shù)平均而不是直接用每一幀的原始置信度能大幅減少單幀誤判。5.2 邊緣端部署量化、幀率和視角差異礦井現(xiàn)場部署通常不是一臺大GPU服務(wù)器懟在調(diào)度室那么簡單。攝像頭到調(diào)度室之間的帶寬和穩(wěn)定性不確定很多方案要求在礦下邊緣盒子或防爆計算機上跑推理算力有限。YOLOv8n用TensorRT量化到FP16甚至INT8推理延遲能壓到每幀10毫秒左右基本滿足多路視頻并發(fā)。代價是量化后mAP會掉一點尤其對跌倒這類尾部類別掉得更明顯。所以量化策略上不要無腦全INT8。先把模型部署到目標設(shè)備實測各類別AP下降幅度如果fall的召回率掉得太多就保留FP16或者針對跌倒場景單獨用一個輕量分類器做二次初篩。工程上常常不是優(yōu)雅解決而是這種“笨但有效”的層層兜底。視角差異是另一個現(xiàn)場問題。訓(xùn)練數(shù)據(jù)大多是側(cè)視或斜俯視現(xiàn)場有些攝像頭裝在正上方看到的主要是安全帽和肩膀人體寬高比完全不同。遇到這種情況最好的辦法是收集一點目標點位的歷史畫面做增量微調(diào)哪怕只標幾百張也比純靠原數(shù)據(jù)集硬扛效果好得多。5.3 數(shù)據(jù)增強和邊界情況處理回到數(shù)據(jù)本身4847張圖用完一遍就沒了為了讓模型更耐打增強策略要針對礦下特征來亮度對比度隨機擾動覆蓋礦燈過曝和暗光陰影高斯模糊和運動模糊模擬粉塵、低幀率拖影隨機遮擋模擬人為加一些黑色塊模擬礦車或管道遮擋多尺度訓(xùn)練輸入尺寸在一定范圍內(nèi)隨機縮放適配不同安裝高度下的目標尺度差異別忽略一個反直覺的增強水平翻轉(zhuǎn)。礦下巷道是雙向通行的人在畫面里從左往右和從右往左的行為完全對稱翻轉(zhuǎn)幾乎是純收益。除非你的俯視數(shù)據(jù)里有明顯的方向性標注比如礦車方向否則這類增強放心加。邊界情況里最麻煩的是多人高度重疊。檢測器輸出的人體框互相交疊、類別各自不同跟蹤算法又沒接數(shù)據(jù)包里的跨幀關(guān)聯(lián)信息這個數(shù)據(jù)集標注的是單幀框和類別不具備按目標ID追蹤的條件所以多目標重疊時行為識別容易亂。工程上通常加一個規(guī)則當(dāng)多個頭部框交疊嚴重且類別沖突時優(yōu)先采納更高置信度的狀態(tài)其他框進入待定下一幀再確認。這個規(guī)則雖然糙但在現(xiàn)場實測里比純模型輸出穩(wěn)很多。如果讓我給這套數(shù)據(jù)的使用排一個優(yōu)先級我會把類別邊界定義放在第一位先用我上面說的腳本和可視化方式把數(shù)據(jù)篩干凈再談訓(xùn)練。數(shù)據(jù)沒問題后面所有事都順數(shù)據(jù)有暗病模型再調(diào)也白搭。最后再分享一個我吃過虧后的習(xí)慣拿到VOCYOLO雙格式數(shù)據(jù)集永遠先用轉(zhuǎn)換腳本把XML重新轉(zhuǎn)出一份txt和自帶的txt逐行比對確認完全一致后再劃分數(shù)據(jù)集。這一遍15分鐘能搞定卻能從源頭排除“兩邊標注不同步”這種最難排查的暗坑。希望這篇能讓你少走幾步彎路。