數(shù)據(jù)集實(shí)戰(zhàn):從1738張YOLOv9標(biāo)注到70.9%識(shí)別率提升)
簡(jiǎn)介這份成人與小孩圖像數(shù)據(jù)集面向計(jì)算機(jī)視覺(jué)入門與目標(biāo)檢測(cè)實(shí)踐者尤其適合正在做YOLO系列模型訓(xùn)練、需要二分類人物屬性識(shí)別素材的開發(fā)者與學(xué)習(xí)者。數(shù)據(jù)集共1738張?jiān)紙D片全部按yolov9格式完成標(biāo)注可直接接入YOLOv9訓(xùn)練流程省去自行標(biāo)注與格式轉(zhuǎn)換的時(shí)間成本。壓縮包內(nèi)共2000個(gè)文件以1738個(gè)txt標(biāo)注文件、261個(gè)jpg圖像文件及1個(gè)yaml配置文件為主yaml用于定義數(shù)據(jù)集路徑與類別信息txt與jpg一一對(duì)應(yīng)便于快速劃分訓(xùn)練集與驗(yàn)證集。資源包整體約91.41MB體積適中下載與本地訓(xùn)練負(fù)擔(dān)較小。據(jù)描述該數(shù)據(jù)集在成人與小孩識(shí)別任務(wù)上的識(shí)別率約為70.9%可作為基線參考幫助讀者評(píng)估模型效果并針對(duì)性調(diào)參。目前已有167人學(xué)習(xí)下載適合想快速驗(yàn)證YOLOv9訓(xùn)練流程、積累人物屬性識(shí)別經(jīng)驗(yàn)的中初級(jí)用戶參考使用。1. 1738 張?jiān)紙D片、70.9% 識(shí)別率成人和小孩檢測(cè)數(shù)據(jù)集到底能不能直接上項(xiàng)目拿到一個(gè)標(biāo)注好的成人和小孩數(shù)據(jù)集1738 張?jiān)紙D片yolov9 格式標(biāo)注標(biāo)稱識(shí)別率 70.9%第一反應(yīng)通常不是興奮而是先算一筆賬這個(gè)量級(jí)夠不夠訓(xùn)一個(gè)能用的模型70.9% 是在什么條件下測(cè)出來(lái)的yolov9 格式的標(biāo)注能不能直接喂給 yolov8 或者別的檢測(cè)器。我見(jiàn)過(guò)太多人拿到數(shù)據(jù)集直接開訓(xùn)跑完發(fā)現(xiàn)驗(yàn)證集 mAP 只有 0.4 出頭回頭查才發(fā)現(xiàn)標(biāo)注框大量漏標(biāo)、類別定義混亂、訓(xùn)練集和驗(yàn)證集里同一個(gè)人出現(xiàn)在兩邊。成人和小孩的檢測(cè)本身不算難難的是小孩這個(gè)類別——身高矮、遮擋多、姿態(tài)變化大、經(jīng)常被大人抱著或者只露出半個(gè)身子這些都會(huì)把識(shí)別率往下拽。這篇文章不講空泛的數(shù)據(jù)集介紹而是把 1738 張 yolov9 格式標(biāo)注的成人和小孩數(shù)據(jù)集從檢查、清洗、轉(zhuǎn)換到訓(xùn)練、調(diào)參、評(píng)估的完整路徑拆開告訴你 70.9% 這個(gè)數(shù)字背后可能是什么以及怎么把它往上推。適合手里已經(jīng)拿到類似數(shù)據(jù)集、準(zhǔn)備做家庭場(chǎng)景監(jiān)控、兒童看護(hù)輔助、公共場(chǎng)所人流分析這類應(yīng)用的工程師也適合剛接觸目標(biāo)檢測(cè)、想拿一個(gè)真實(shí)數(shù)據(jù)集練手的新手。2. 先搞清楚 1738 張圖片和 yolov9 標(biāo)注到底給了你什么2.1 成人和小孩兩類目標(biāo)的標(biāo)注特點(diǎn)成人和小孩在檢測(cè)任務(wù)里通常被定義為兩個(gè)類別但這兩個(gè)類別的視覺(jué)邊界并不像貓和狗那么清晰。一個(gè) 16 歲的少年算成人還是小孩一個(gè)蹲著的大人會(huì)不會(huì)被標(biāo)成小孩這些在標(biāo)注階段如果沒(méi)有明確的規(guī)則就會(huì)變成模型訓(xùn)練時(shí)的噪聲。1738 張圖片里如果小孩樣本只占 20% 到 30%那實(shí)際可用于學(xué)習(xí)小孩特征的正樣本可能只有三四百?gòu)堖@對(duì)一個(gè)需要區(qū)分姿態(tài)和比例的類別來(lái)說(shuō)偏少。常見(jiàn)做法是先把標(biāo)注文件全部解析一遍統(tǒng)計(jì)每個(gè)類別的實(shí)例數(shù)量和每張圖的平均目標(biāo)數(shù)心里先有個(gè)底。yolov9 格式的標(biāo)注本質(zhì)上是每張圖片對(duì)應(yīng)一個(gè) txt 文件每行五個(gè)值類別索引、歸一化中心點(diǎn) x、歸一化中心點(diǎn) y、歸一化寬度、歸一化高度。這個(gè)格式和 yolov5、yolov8 是兼容的所以拿到 yolov9 標(biāo)注不等于只能訓(xùn) yolov9你可以直接用來(lái)訓(xùn) yolov8甚至轉(zhuǎn)成 COCO 格式給別的框架用。但要注意類別索引的映射關(guān)系有些數(shù)據(jù)集把 adult 設(shè)為 0、child 設(shè)為 1有些反過(guò)來(lái)如果配置文件里的 names 順序和標(biāo)注文件不一致訓(xùn)練出來(lái)的模型會(huì)把兩個(gè)類別完全搞反。2.2 用腳本統(tǒng)計(jì)類別分布和標(biāo)注質(zhì)量在訓(xùn)練之前我一般會(huì)寫一個(gè)檢查腳本把標(biāo)注文件全部讀一遍輸出類別分布、每類目標(biāo)數(shù)、寬高比分布以及有沒(méi)有越界框或者零面積框。下面這段代碼可以直接跑只需要把路徑換成你自己的。import os import glob from collections import Counter # 標(biāo)注文件夾路徑假設(shè)圖片和 txt 在同一目錄下按同名對(duì)應(yīng) label_dir ./labels image_dir ./images class_names {0: adult, 1: child} # 根據(jù)你的 data.yaml 修改 counter Counter() bad_boxes [] zero_area [] aspect_ratios [] for txt_path in glob.glob(os.path.join(label_dir, *.txt)): with open(txt_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: bad_boxes.append((txt_path, line.strip())) continue cls_id int(parts[0]) x, y, w, h map(float, parts[1:]) counter[class_names.get(cls_id, funknown_{cls_id})] 1 if w 0 or h 0: zero_area.append((txt_path, line.strip())) if x - w/2 0 or x w/2 1 or y - h/2 0 or y h/2 1: bad_boxes.append((txt_path, line.strip())) if h 0: aspect_ratios.append(w / h) print(類別分布:, dict(counter)) print(異??驍?shù)量:, len(bad_boxes)) print(零面積框數(shù)量:, len(zero_area)) print(寬高比范圍: {:.2f} ~ {:.2f}.format(min(aspect_ratios), max(aspect_ratios)))這段腳本做了四件事統(tǒng)計(jì)每個(gè)類別的實(shí)例總數(shù)、找出格式不對(duì)的行、找出寬高為零的框、找出超出圖像邊界的框。類別分布能告訴你小孩樣本是不是太少異常框數(shù)量能告訴你標(biāo)注質(zhì)量的下限。如果異??虺^(guò)總框數(shù)的 2%建議先清洗再訓(xùn)練否則模型會(huì)學(xué)到一些莫名其妙的定位模式。寬高比范圍可以幫你判斷先驗(yàn)框anchor需不需要重新聚類如果大部分框的寬高比集中在 0.3 到 0.6 之間而默認(rèn) anchor 覆蓋的是 0.5 到 2.0那檢測(cè)效果會(huì)明顯打折。2.3 劃分訓(xùn)練集和驗(yàn)證集時(shí)最容易忽略的坑1738 張圖片如果隨機(jī)劃分很容易出現(xiàn)同一個(gè)人同時(shí)出現(xiàn)在訓(xùn)練集和驗(yàn)證集的情況尤其是從視頻里抽幀得到的數(shù)據(jù)集。這種泄漏會(huì)讓驗(yàn)證集指標(biāo)虛高你以為模型學(xué)到了特征其實(shí)它只是記住了那個(gè)人。我一般會(huì)按場(chǎng)景或者按視頻來(lái)源劃分同一段視頻的幀只放在一個(gè)集合里。如果數(shù)據(jù)集沒(méi)有提供來(lái)源信息至少要用圖片哈?;蛘吒兄W鲆淮稳ブ匕呀浦貜?fù)的圖片歸到同一側(cè)。import hashlib from PIL import Image import imagehash def file_hash(path): return hashlib.md5(open(path, rb).read()).hexdigest() def phash(path): return str(imagehash.phash(Image.open(path))) # 先按精確哈希去重再用感知哈希找近似重復(fù) hashes {} for img in glob.glob(os.path.join(image_dir, *.jpg)): h phash(img) hashes.setdefault(h, []).append(img) duplicates {k: v for k, v in hashes.items() if len(v) 1} print(近似重復(fù)組數(shù):, len(duplicates))感知哈希能把視覺(jué)上幾乎一樣的圖片歸到一組比如同一個(gè)人連續(xù)幾幀的截圖。把這些組整體分到訓(xùn)練集或者驗(yàn)證集才能得到真實(shí)的泛化指標(biāo)。這一步做完你可能會(huì)發(fā)現(xiàn) 1738 張里實(shí)際獨(dú)立場(chǎng)景只有一千出頭那 70.9% 的識(shí)別率是在什么劃分下測(cè)出來(lái)的就值得追問(wèn)了。3. 把 yolov9 標(biāo)注轉(zhuǎn)成可訓(xùn)練配置并跑通第一輪3.1 data.yaml 的寫法和類別順序?qū)Ryolov9 官方倉(cāng)庫(kù)的訓(xùn)練配置和 yolov5、yolov8 基本一致核心是一個(gè) data.yaml 文件里面指定訓(xùn)練、驗(yàn)證、測(cè)試圖片的路徑類別數(shù)量以及類別名稱列表。類別名稱的順序必須和標(biāo)注文件里的類別索引嚴(yán)格對(duì)應(yīng)否則訓(xùn)練出來(lái)的模型會(huì)把 adult 和 child 完全顛倒。# data.yaml train: ./images/train val: ./images/val test: ./images/test nc: 2 names: 0: adult 1: child這里 nc 是類別數(shù)names 下面的數(shù)字是索引。如果你在 2.2 節(jié)的統(tǒng)計(jì)腳本里發(fā)現(xiàn) unknown 類別說(shuō)明標(biāo)注文件里出現(xiàn)了 0 和 1 以外的索引需要先修正。常見(jiàn)情況是有些標(biāo)注工具默認(rèn)從 1 開始編號(hào)或者把背景類也寫進(jìn)去了。修正方法很簡(jiǎn)單把超出范圍的索引統(tǒng)一映射到正確的類別或者直接刪除這些行。3.2 用 yolov9 訓(xùn)練的最小命令和關(guān)鍵參數(shù)假設(shè)你已經(jīng)把圖片和標(biāo)注按 train、val、test 分好目錄結(jié)構(gòu)是 images/train、labels/train 這樣對(duì)應(yīng)。yolov9 的訓(xùn)練入口通常是 train.py 或者通過(guò) ultralytics 風(fēng)格的接口調(diào)用。下面給出一個(gè)最小可跑的命令行示例。python train.py \ --data data.yaml \ --weights yolov9-c.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --workers 4 \ --name adult_child_exp1參數(shù)逐個(gè)說(shuō)--img 640 是輸入分辨率1738 張圖片如果原圖分辨率很高可以先縮到 640 訓(xùn)練速度快且對(duì)小目標(biāo)檢測(cè)夠用--batch 16 在單卡 8G 顯存下比較穩(wěn)如果顯存不夠降到 8--epochs 100 對(duì)一千多張圖片來(lái)說(shuō)通常夠收斂但要注意觀察驗(yàn)證集指標(biāo)有沒(méi)有過(guò)擬合--workers 4 是數(shù)據(jù)加載線程數(shù)根據(jù) CPU 核心數(shù)調(diào)整。第一次跑建議先用小分辨率和小 epoch 驗(yàn)證流程通不通比如 --img 320 --epochs 10確認(rèn)沒(méi)有報(bào)錯(cuò)再上完整訓(xùn)練。如果用的是 ultralytics 風(fēng)格的接口命令會(huì)更簡(jiǎn)潔yolo detect train datadata.yaml modelyolov9c.pt epochs100 imgsz640 batch16兩種方式本質(zhì)一樣選你環(huán)境里已經(jīng)裝好的那個(gè)。訓(xùn)練開始后重點(diǎn)看三個(gè)輸出box_loss、cls_loss 和驗(yàn)證集的 mAP50。如果 box_loss 下降但 cls_loss 不降說(shuō)明定位在學(xué)但分類分不開可能是小孩和成人的特征太接近需要檢查標(biāo)注里有沒(méi)有把大人標(biāo)成小孩的情況。3.3 第一輪訓(xùn)練后怎么讀指標(biāo)訓(xùn)練結(jié)束后會(huì)在 runs 目錄下生成結(jié)果重點(diǎn)看 confusion_matrix.png 和 results.csv?;煜仃嚹苤苯痈嬖V你 adult 和 child 之間有沒(méi)有大量互錯(cuò)。如果 child 被大量預(yù)測(cè)成 adult而 adult 的召回很高說(shuō)明模型傾向于把矮個(gè)子也當(dāng)成大人這時(shí)候要么增加小孩樣本要么在損失函數(shù)里給 child 類別更高的權(quán)重。70.9% 這個(gè)識(shí)別率如果指的是 mAP50那在兩類目標(biāo)檢測(cè)里屬于中等偏下還有不少提升空間。如果指的是準(zhǔn)確率accuracy那定義就不太一樣了目標(biāo)檢測(cè)里很少用單純的 accuracy更常見(jiàn)的是 mAP50 或者 mAP50-95。拿到數(shù)據(jù)集時(shí)最好先確認(rèn)這個(gè) 70.9% 的評(píng)估協(xié)議是什么是在多少?gòu)垐D上測(cè)的閾值取了多少否則這個(gè)數(shù)字沒(méi)法直接比較。4. 把 70.9% 往上推數(shù)據(jù)增強(qiáng)、類別平衡和推理調(diào)參4.1 針對(duì)小孩樣本的增強(qiáng)策略小孩樣本少、姿態(tài)多、遮擋嚴(yán)重通用的隨機(jī)翻轉(zhuǎn)和縮放不夠用。我一般會(huì)針對(duì) child 類別做幾件事第一用 mosaic 增強(qiáng)把四張圖拼成一張?jiān)黾有『⒊霈F(xiàn)在不同上下文里的概率第二用 copy-paste 增強(qiáng)把小孩實(shí)例復(fù)制到其他背景上但要注意粘貼的位置要合理不能把小孩貼到天花板上第三調(diào)整尺度增強(qiáng)的范圍讓模型多看到小尺寸的小孩。yolov9 的增強(qiáng)參數(shù)通常在 hyp 文件里配置關(guān)鍵幾個(gè)是 mosaic、mixup、copy_paste、scale。下面是一個(gè)針對(duì)小目標(biāo)偏多的配置片段。# hyp_adult_child.yaml mosaic: 1.0 mixup: 0.1 copy_paste: 0.3 scale: 0.6 degrees: 5.0 translate: 0.1 fliplr: 0.5 flipud: 0.0 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4mosaic 設(shè)為 1.0 表示每張圖都做拼接mixup 0.1 是輕微混合copy_paste 0.3 表示 30% 的概率做實(shí)例復(fù)制粘貼。scale 0.6 表示隨機(jī)縮放范圍是 0.4 到 1.6 倍比默認(rèn)的 0.5 更寬能讓模型看到更多尺寸變化。degrees 5.0 是輕微旋轉(zhuǎn)小孩的姿態(tài)變化通常不需要大角度旋轉(zhuǎn)太大的旋轉(zhuǎn)反而會(huì)引入不自然的樣本。flipud 設(shè)為 0 是因?yàn)樯舷路D(zhuǎn)在真實(shí)場(chǎng)景里很少出現(xiàn)開了反而增加噪聲。4.2 類別不平衡的損失加權(quán)如果統(tǒng)計(jì)發(fā)現(xiàn) child 實(shí)例只有 adult 的三分之一可以在損失函數(shù)里給 child 更高的分類權(quán)重。yolov9 默認(rèn)的分類損失是 BCE可以通過(guò)修改數(shù)據(jù)集配置或者訓(xùn)練腳本里的類別權(quán)重參數(shù)來(lái)實(shí)現(xiàn)。一種簡(jiǎn)單做法是在 data.yaml 里加一行 class_weights但不同版本的 yolov9 支持程度不一樣更穩(wěn)妥的方式是在訓(xùn)練腳本里手動(dòng)調(diào)整。# 在損失計(jì)算前給不同類別賦權(quán)重 class_weights torch.tensor([1.0, 2.5]).to(device) # adult 權(quán)重 1.0child 權(quán)重 2.5 # 在 BCE 損失里傳入 weight 參數(shù) criterion nn.BCEWithLogitsLoss(pos_weightclass_weights)這里的 pos_weight 是正樣本權(quán)重child 設(shè)為 2.5 意味著模型對(duì) child 的分類錯(cuò)誤懲罰更重。這個(gè)值不要設(shè)太大超過(guò) 5 容易導(dǎo)致訓(xùn)練不穩(wěn)定出現(xiàn)大量誤檢。可以先從 2.0 開始試觀察驗(yàn)證集上 child 的召回有沒(méi)有提升同時(shí)看 adult 的精度有沒(méi)有明顯下降。4.3 推理階段的置信度和 NMS 調(diào)參訓(xùn)練完模型推理時(shí)的置信度閾值和 NMS 的 IoU 閾值對(duì)最終識(shí)別率影響很大。默認(rèn) conf 0.25、iou 0.45 在成人和小孩檢測(cè)里不一定最優(yōu)。如果小孩漏檢多可以把 conf 降到 0.15 到 0.2讓更多候選框進(jìn)入 NMS如果誤檢多就提高 conf。NMS 的 iou 閾值如果設(shè)得太低兩個(gè)挨著的人會(huì)被合并成一個(gè)框尤其是大人抱著小孩的場(chǎng)景iou 設(shè)到 0.5 到 0.6 更合適。yolo detect predict modelruns/train/adult_child_exp1/weights/best.pt \ source./test_images \ conf0.2 \ iou0.55 \ saveTrue這段命令用訓(xùn)練好的 best.pt 對(duì)測(cè)試圖片做推理conf 0.2 比默認(rèn)低iou 0.55 比默認(rèn)高。跑完之后人工看一批結(jié)果重點(diǎn)看小孩被漏檢的情況和大人小孩挨在一起時(shí)框有沒(méi)有合并。如果發(fā)現(xiàn)某個(gè)場(chǎng)景下識(shí)別率明顯低比如夜間或者逆光那說(shuō)明數(shù)據(jù)集里這類樣本太少需要針對(duì)性補(bǔ)充。5. 避坑成人和小孩檢測(cè)里最容易翻車的五個(gè)地方5.1 標(biāo)注里把青少年標(biāo)成小孩導(dǎo)致類別邊界模糊現(xiàn)象是模型在驗(yàn)證集上 adult 和 child 的混淆矩陣?yán)锘ュe(cuò)比例很高尤其是身高在 1.4 到 1.6 米之間的目標(biāo)。原因是標(biāo)注階段沒(méi)有明確的年齡或身高規(guī)則不同標(biāo)注員對(duì)小孩的定義不一致。解決方法是回看標(biāo)注規(guī)范如果數(shù)據(jù)集沒(méi)有提供就自己定一個(gè)可操作的規(guī)則比如以頭部占全身比例或者以參考物高度來(lái)判斷然后重新檢查邊界樣本。如果無(wú)法重新標(biāo)注至少在訓(xùn)練時(shí)把這類模糊樣本的損失權(quán)重降低。5.2 從視頻抽幀導(dǎo)致訓(xùn)練集和驗(yàn)證集泄漏現(xiàn)象是驗(yàn)證集 mAP 很高但拿真實(shí)新視頻一測(cè)就崩。原因是同一段視頻的相鄰幀被隨機(jī)分到了訓(xùn)練集和驗(yàn)證集模型記住了背景和人物外觀。解決方法是用 2.3 節(jié)的感知哈希做去重按視頻來(lái)源劃分?jǐn)?shù)據(jù)集。如果數(shù)據(jù)集已經(jīng)混在一起至少把驗(yàn)證集里的圖片在訓(xùn)練集里做一次近似搜索把重復(fù)的刪掉。5.3 圖片分辨率不一致導(dǎo)致訓(xùn)練時(shí)大量黑邊現(xiàn)象是訓(xùn)練時(shí) loss 震蕩驗(yàn)證集指標(biāo)上不去。原因是 1738 張圖片里分辨率差異很大有的 1920x1080有的 640x480直接 resize 到 640x640 會(huì)引入大量黑邊或者拉伸變形。解決方法是先統(tǒng)計(jì)圖片尺寸分布如果長(zhǎng)寬比差異大用 letterbox 填充而不是直接拉伸。yolov9 默認(rèn)會(huì)做 letterbox但如果你自己預(yù)處理過(guò)圖片要確認(rèn)沒(méi)有破壞這個(gè)機(jī)制。5.4 小孩被遮擋時(shí)標(biāo)注框只標(biāo)了可見(jiàn)部分現(xiàn)象是模型對(duì)遮擋小孩的召回很低經(jīng)常漏檢。原因是標(biāo)注時(shí)只標(biāo)了可見(jiàn)的身體部分導(dǎo)致模型學(xué)到的 child 特征偏向于完整身體。解決方法是檢查標(biāo)注規(guī)范遮擋超過(guò) 50% 的目標(biāo)是否應(yīng)該標(biāo)、怎么標(biāo)。如果數(shù)據(jù)集里大量遮擋樣本只標(biāo)了局部可以在訓(xùn)練時(shí)用 cutout 或者 random erasing 增強(qiáng)讓模型適應(yīng)不完整目標(biāo)。5.5 70.9% 的評(píng)估協(xié)議不明確導(dǎo)致優(yōu)化方向錯(cuò)誤現(xiàn)象是花了很多時(shí)間調(diào)參指標(biāo)提升不明顯。原因是不知道 70.9% 是在什么條件下測(cè)的可能是在訓(xùn)練集上測(cè)的也可能是 mAP50 但 IoU 閾值設(shè)得很低。解決方法是自己重新跑一遍基線評(píng)估固定驗(yàn)證集、固定 conf 和 iou得到自己的基線數(shù)字然后所有優(yōu)化都跟這個(gè)基線比。不要拿別人的 70.9% 當(dāng)目標(biāo)要拿你自己的基線當(dāng)目標(biāo)。6. 用混淆矩陣和誤檢樣本反推數(shù)據(jù)集該怎么補(bǔ)訓(xùn)練完一輪之后最有價(jià)值的不是 mAP 數(shù)字而是混淆矩陣和誤檢樣本的可視化。我一般會(huì)把驗(yàn)證集里所有 child 被預(yù)測(cè)成 adult 的圖片挑出來(lái)按置信度從高到低排看前 20 張。如果這些圖片里小孩的身高確實(shí)接近成人那說(shuō)明類別定義本身有問(wèn)題補(bǔ)數(shù)據(jù)也沒(méi)用得改標(biāo)注規(guī)則。如果這些圖片里小孩明顯矮小但被誤判那說(shuō)明模型對(duì)尺度不敏感需要增加小目標(biāo)增強(qiáng)或者調(diào)整 anchor。另一個(gè)技巧是把誤檢樣本按場(chǎng)景分組比如室內(nèi)、室外、白天、夜間、單人、多人。如果某個(gè)場(chǎng)景下誤檢率明顯高就針對(duì)這個(gè)場(chǎng)景補(bǔ) 50 到 100 張圖重新標(biāo)注后加入訓(xùn)練集。1738 張的基數(shù)下補(bǔ) 100 張針對(duì)性樣本通常能帶來(lái) 2 到 5 個(gè)點(diǎn)的 mAP 提升比盲目加數(shù)據(jù)有效得多。# 按場(chǎng)景分組統(tǒng)計(jì)誤檢率 import pandas as pd # 假設(shè)你有一個(gè) csv 記錄了每張圖的場(chǎng)景標(biāo)簽和預(yù)測(cè)結(jié)果 df pd.read_csv(val_results.csv) grouped df.groupby(scene).agg( total(image_id, count), false_positive(is_fp, sum), false_negative(is_fn, sum) ) grouped[fp_rate] grouped[false_positive] / grouped[total] grouped[fn_rate] grouped[false_negative] / grouped[total] print(grouped.sort_values(fn_rate, ascendingFalse))這段代碼按場(chǎng)景統(tǒng)計(jì)誤檢率和漏檢率輸出排序后你能直接看到哪個(gè)場(chǎng)景最差。優(yōu)先補(bǔ)漏檢率高的場(chǎng)景因?yàn)槁z通常比誤檢更影響實(shí)際使用。補(bǔ)數(shù)據(jù)的時(shí)候注意新樣本的標(biāo)注質(zhì)量和原有數(shù)據(jù)集保持一致否則引入新的噪聲反而會(huì)拉低指標(biāo)。最后說(shuō)一個(gè)我自己的習(xí)慣每次拿到新數(shù)據(jù)集先花半天做統(tǒng)計(jì)和可視化不要急著開訓(xùn)。這半天能幫你避開后面幾天的無(wú)效調(diào)參。成人和小孩檢測(cè)這個(gè)方向數(shù)據(jù)質(zhì)量比模型結(jié)構(gòu)重要得多1738 張如果標(biāo)注干凈、類別平衡70.9% 只是起點(diǎn)如果標(biāo)注混亂再大的模型也救不回來(lái)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取