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