數(shù)據(jù)集實(shí)戰(zhàn):YOLOv8從標(biāo)注到調(diào)參全流程)
簡(jiǎn)介NEU-DET鋼材表面缺陷數(shù)據(jù)集是一份面向計(jì)算機(jī)視覺(jué)與機(jī)器學(xué)習(xí)研究者的專業(yè)資源聚焦鋼材表面缺陷的自動(dòng)識(shí)別問(wèn)題覆蓋裂紋、腐蝕、氧化皮、凹坑、劃痕等多種典型損傷類型圖像采自真實(shí)生產(chǎn)場(chǎng)景具有較高的實(shí)際應(yīng)用價(jià)值。數(shù)據(jù)包內(nèi)含2000個(gè)文件包括1800張產(chǎn)線圖像、1800個(gè)XML邊界框標(biāo)注和1800個(gè)TXT標(biāo)簽文件同時(shí)附帶Python格式轉(zhuǎn)換腳本與YOLO配置文件方便直接開(kāi)展目標(biāo)檢測(cè)實(shí)驗(yàn)整體壓縮包僅26.68MB輕量易下載。該數(shù)據(jù)集標(biāo)注規(guī)范可直接劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集配合深度學(xué)習(xí)模型可系統(tǒng)學(xué)習(xí)各類缺陷特征并評(píng)估泛化能力已有4933人學(xué)習(xí)使用。無(wú)論是學(xué)術(shù)研究還是工業(yè)質(zhì)檢應(yīng)用它都能提供高質(zhì)量訓(xùn)練樣本顯著降低數(shù)據(jù)準(zhǔn)備門檻幫助研究者快速驗(yàn)證算法效果是推動(dòng)智能質(zhì)檢落地的高性價(jià)比資源。 做工業(yè)視覺(jué)這幾年我最大的感受是算法本身不缺模型缺的是能一口氣把流程跑通的數(shù)據(jù)集。NEU-DET——東北大學(xué)發(fā)布的鋼材表面缺陷檢測(cè)數(shù)據(jù)集——是圈子里公認(rèn)的“起步數(shù)據(jù)集”包含1800張熱軋帶鋼表面灰度圖覆蓋氧化鐵皮壓入、斑塊、裂紋、麻點(diǎn)、夾雜、劃傷六類典型缺陷。我自己做鋼材表面缺陷檢測(cè)項(xiàng)目時(shí)從模型選型、標(biāo)注格式處理到訓(xùn)練調(diào)參都用它先跑了一遍流程才敢接真實(shí)產(chǎn)線數(shù)據(jù)。如果你想做工業(yè)缺陷檢測(cè)、目標(biāo)檢測(cè)算法驗(yàn)證或者論文baseline這篇內(nèi)容應(yīng)該能幫你省掉不少摸索時(shí)間。1. NEU-DET 數(shù)據(jù)集全解析1800張圖、6類缺陷的工業(yè)質(zhì)檢樣本1.1 數(shù)據(jù)集基本信息與文件組織方式NEU-DET 的完整名稱是 Northeastern University Detection Dataset由東北大學(xué)發(fā)布主要面向熱軋帶鋼表面的缺陷檢測(cè)任務(wù)。數(shù)據(jù)集的規(guī)模不大但結(jié)構(gòu)干凈1800張灰度圖像統(tǒng)一為200×200像素按缺陷類別分成6類每類恰好300張。官網(wǎng)最初提供的是分類格式的數(shù)據(jù)后來(lái)在目標(biāo)檢測(cè)社區(qū)里被轉(zhuǎn)成了帶邊界框標(biāo)注的VOC格式也就是我們平時(shí)看到的“JPEGImages Annotations”結(jié)構(gòu)。這里要特別說(shuō)一句很多入門者容易把 NEU-DET 和另一個(gè)數(shù)據(jù)集 NEU-CLS 混在一起。前者是檢測(cè)任務(wù)帶的是邊界框坐標(biāo)后者是分類任務(wù)只有整張圖像的類別標(biāo)簽。實(shí)際使用時(shí)先確認(rèn)好自己的任務(wù)類型不要下載錯(cuò)。從文件組織看官方VOC版本通常包含以下內(nèi)容JPEGImages存放1800張?jiān)蓟叶葓D像文件名類似NEU-DET-001.jpgAnnotations存放與圖像同名的XML文件記錄目標(biāo)框坐標(biāo)和類別ImageSets/Main存放train.txt、val.txt、trainval.txt等劃分文件不過(guò)社區(qū)版本里常見(jiàn)的是自定義劃分這類組織方式和Pascal VOC數(shù)據(jù)集保持一致好處是直接用現(xiàn)成腳本就能讀取方便接進(jìn)Faster R-CNN、SSD、YOLO等主流檢測(cè)框架。1.2 六類缺陷的視覺(jué)差異與典型成因理解缺陷類型是后續(xù)做數(shù)據(jù)分析和模型調(diào)優(yōu)的前提。六類缺陷分別是缺陷名稱視覺(jué)特征典型成因檢測(cè)難點(diǎn)Rolled-in Scale氧化鐵皮壓入塊狀深色區(qū)域邊界不規(guī)則熱軋過(guò)程中氧化鐵皮被壓入鋼板表面與背景灰度差異有時(shí)很小Patches斑塊片狀灰暗區(qū)域面積偏大冷卻不均或表面氧化不均邊界模糊容易漏檢Crazing裂紋密集細(xì)線狀紋理呈網(wǎng)狀熱應(yīng)力或材料疲勞目標(biāo)細(xì)長(zhǎng)小目標(biāo)難檢測(cè)Pitted Surface麻點(diǎn)表面散布點(diǎn)狀凹坑軋輥磨損或異物壓入單個(gè)目標(biāo)小需大圖上下文Inclusion夾雜條狀或塊狀異物灰度不均冶煉過(guò)程中非金屬夾雜物殘留形狀多變?nèi)菀缀推渌愋突煜齋cratches劃傷連續(xù)長(zhǎng)條線狀亮痕產(chǎn)線設(shè)備與鋼板摩擦長(zhǎng)條形目標(biāo)寬高比極端從視覺(jué)上看Scratches 和 Crazing 都屬于線性缺陷但前者更規(guī)則、更連續(xù)后者更細(xì)碎、更網(wǎng)狀。Inclusion 和 Rolled-in Scale 在灰度特征上有些接近實(shí)際訓(xùn)練時(shí)這兩類也最容易產(chǎn)生誤檢。2. 為什么工業(yè)缺陷檢測(cè)項(xiàng)目繞不開(kāi) NEU-DET從選型角度聊聊2.1 工業(yè)場(chǎng)景里的數(shù)據(jù)稀缺問(wèn)題做工業(yè)視覺(jué)的人都知道真實(shí)產(chǎn)線數(shù)據(jù)比模型參數(shù)值錢得多。缺陷樣本在產(chǎn)線里是小概率事件“正樣本”滿天飛“負(fù)樣本”卻難湊齊??蛻艚o到算法團(tuán)隊(duì)的數(shù)據(jù)往往只有幾百?gòu)埧蓸?biāo)注圖像其中有一半還是重復(fù)場(chǎng)景。這種情況下團(tuán)隊(duì)很難在項(xiàng)目早期驗(yàn)證“這個(gè)模型到底能不能用”。NEU-DET 在項(xiàng)目選型階段的價(jià)值就在這里它是一個(gè)類別均衡、標(biāo)注規(guī)范的公開(kāi)基準(zhǔn)數(shù)據(jù)量不大但覆蓋了鋼材表面缺陷里最常見(jiàn)、最具代表性的形態(tài)。拿它來(lái)跑通數(shù)據(jù)管線、確定檢測(cè)框架、做模型間的橫向?qū)Ρ炔粫?huì)因?yàn)閿?shù)據(jù)亂七八糟而讓變量失控。2.2 優(yōu)點(diǎn)與局限都要心里有數(shù)說(shuō)句公道話NEU-DET 最大的優(yōu)點(diǎn)是“干凈”圖像尺寸統(tǒng)一、缺陷類別清晰、每類樣本均衡。這對(duì)做算法對(duì)比特別友好。但同時(shí)它的局限也很明顯只有灰度圖沒(méi)有彩色紋理信息圖像分辨率低200×200像素在真實(shí)產(chǎn)線里算小圖缺陷形態(tài)比真實(shí)場(chǎng)景簡(jiǎn)單真實(shí)鋼板表面還有水漬、光照不均、氧化色等干擾只覆蓋熱軋帶鋼冷軋、鍍鋅等工藝的缺陷形態(tài)差異很大所以我一般建議NEU-DET 適合作為“能力驗(yàn)證集”不適合作為“效果承諾集”。如果你在 NEU-DET 上跑 YOLOv8n 能到 mAP50 0.9 以上說(shuō)明你的數(shù)據(jù)管線、訓(xùn)練配置、評(píng)估流程是通的但直接拿著這個(gè)精度去跟客戶承諾產(chǎn)線效果那是要翻車的。3. 標(biāo)注格式、YOLO轉(zhuǎn)換與數(shù)據(jù)劃分動(dòng)手前的準(zhǔn)備工作3.1 讀懂VOC格式的XML標(biāo)注拿到NEU-DET數(shù)據(jù)集后第一步是打開(kāi)一個(gè)XML文件搞清楚標(biāo)注信息在哪。一個(gè)典型的標(biāo)注文件長(zhǎng)這樣annotation folderJPEGImages/folder filenameNEU-DET-001.jpg/filename size width200/width height200/height depth1/depth /size object namescratches/name bndbox xmin23/xmin ymin45/ymin xmax156/xmax ymax172/ymax /bndbox /object /annotation里面最重要的字段是object下的name和bndbox分別代表缺陷類型和邊界框。多個(gè)object表示圖像里有多個(gè)缺陷。讀數(shù)據(jù)時(shí)用Python的xml.etree.ElementTree解析即可代碼不復(fù)雜但要注意坐標(biāo)全是整數(shù)對(duì)應(yīng)原始200×200圖像不需要額外縮放。3.2 轉(zhuǎn)成YOLO格式的完整腳本現(xiàn)在大部分人用的是YOLO系列框架YOLO輸入的是txt格式標(biāo)簽每行表示一個(gè)目標(biāo)格式為class x_center y_center width height坐標(biāo)為標(biāo)準(zhǔn)化的比例值。我提供一版自己常用的轉(zhuǎn)換腳本import xml.etree.ElementTree as ET import os def convert_xml_to_yolo(xml_path, out_dir, class_names): 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.iter(object): name obj.find(name).text if name not in class_names: continue cls_id class_names.index(name) box obj.find(bndbox) xmin int(box.find(xmin).text) ymin int(box.find(ymin).text) xmax int(box.find(xmax).text) ymax int(box.find(ymax).text) x_center (xmin xmax) / 2 / img_w y_center (ymin ymax) / 2 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) if not lines: return out_name os.path.splitext(os.path.basename(xml_path))[0] .txt with open(os.path.join(out_dir, out_name), w) as f: f.write(\n.join(lines)) class_names [crazing, inclusion, patches, pitted_surface, rolled-in_scale, scratches] xml_dir Annotations out_dir labels os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if xml_file.endswith(.xml): convert_xml_to_yolo(os.path.join(xml_dir, xml_file), out_dir, class_names)注意類別順序要固定不要一會(huì)兒一個(gè)順序不然后續(xù)訓(xùn)練時(shí)類別對(duì)不上。3.3 數(shù)據(jù)劃分的坑隨機(jī)劃分可能讓你驗(yàn)證集失效有人圖省事直接random.shuffle之后按8:1:1切分結(jié)果驗(yàn)證集里某種缺陷一張都沒(méi)有或者有的類別全在訓(xùn)練集里。NEU-DET每類300張看起來(lái)均衡但每張圖的缺陷實(shí)例數(shù)和目標(biāo)大小差異很大如果隨機(jī)切分某些“難分”的樣本可能全部落到驗(yàn)證集導(dǎo)致mAP虛低。正確的做法是按類別做分層采樣先把所有圖像按類別分組再?gòu)拿總€(gè)類別里各取20%作為驗(yàn)證集和測(cè)試集。這樣能保證每個(gè)集合都覆蓋6類缺陷。我一般還會(huì)多做一步——檢查驗(yàn)證集和訓(xùn)練集的圖像是否存在同源場(chǎng)景如果同一張鋼板的相鄰區(qū)域圖片出現(xiàn)在兩邊評(píng)估結(jié)果會(huì)偏樂(lè)觀這一點(diǎn)在真實(shí)項(xiàng)目中更要謹(jǐn)慎。4. 用 YOLOv8 在 NEU-DET 上實(shí)測(cè)參數(shù)配置與結(jié)果分析4.1 訓(xùn)練方案與輸入尺寸選擇NEU-DET本身是200×200的小圖輸入尺寸設(shè)置多少比較合適我實(shí)測(cè)下來(lái)imgsz416或640差別不大但imgsz640訓(xùn)練時(shí)間更長(zhǎng)。原因在于原圖分辨率低強(qiáng)行放大并不會(huì)增加新的細(xì)節(jié)反而讓細(xì)小的線性缺陷在縮放時(shí)產(chǎn)生鋸齒。不過(guò)YOLO的resize邏輯是letterbox填充不是直接拉伸所以長(zhǎng)寬比不會(huì)變形。模型方面如果你想快速驗(yàn)證用YOLOv8n就足夠參數(shù)量小單卡訓(xùn)練幾十分鐘就能跑完一輪實(shí)驗(yàn)。如果追求更高精度可以換YOLOv8m但對(duì)這個(gè)數(shù)據(jù)集來(lái)說(shuō)收益有限。說(shuō)到底數(shù)據(jù)集的挑戰(zhàn)不在于模型容量不夠而在于小目標(biāo)和類間相似性。訓(xùn)練配置可以參考path: /your/path/NEU-DET train: train/images val: val/images nc: 6 names: [crazing, inclusion, patches, pitted_surface, rolled-in_scale, scratches]命令行yolo detect train dataneu_det.yaml modelyolov8n.pt epochs100 imgsz416 batch16 lr00.014.2 評(píng)估指標(biāo)怎么讀才不會(huì)被數(shù)據(jù)騙了訓(xùn)練完看什么首先看mAP50和mAP50-95。在這類小數(shù)據(jù)集上mAP50通常會(huì)很好看很多模型都能到0.9以上但mAP50-95更能反映定位精度。因?yàn)镮oU閾值提高后邊界框偏移一點(diǎn)都會(huì)導(dǎo)致檢測(cè)失敗而NEU-DET里細(xì)長(zhǎng)缺陷的框本身很難標(biāo)得特別準(zhǔn)。除了平均精度我還會(huì)單獨(dú)看每一類缺陷的AP值。實(shí)操下來(lái)的典型現(xiàn)象是Scratches的AP通常很高因?yàn)樗螒B(tài)規(guī)則、和背景差異大Crazing的AP往往最低因?yàn)榧?xì)線紋理在200×200的分辨率下很容易被模型當(dāng)成背景噪聲。如果你發(fā)現(xiàn)某類AP特別低不要急著調(diào)模型先去看badcase是自己標(biāo)注框偏了還是缺陷形態(tài)和訓(xùn)練集差異大。4.3 可視化檢測(cè)結(jié)果與Badcase分析訓(xùn)練結(jié)束后用yolo predict跑一批驗(yàn)證集圖片把檢測(cè)結(jié)果畫出來(lái)看。我習(xí)慣把“漏檢”和“誤檢”分開(kāi)統(tǒng)計(jì)漏檢多半是目標(biāo)太小、對(duì)比度低誤檢多半是Inclusion和Rolled-in Scale這類灰度特征相近的缺陷??碽adcase時(shí)要結(jié)合原圖對(duì)比不要只看檢測(cè)框。5. NEU-DET 實(shí)戰(zhàn)避坑小圖放大、類別分布與遷移表現(xiàn)5.1 小圖resize后細(xì)節(jié)丟失這是新手最容易忽略的點(diǎn)。200×200的圖像直接resize到640×640雖然YOLO用letterbox填充了背景但缺陷本身的像素信息并沒(méi)有增加。對(duì)于那些畫了幾個(gè)像素寬的Crazing或Scratches經(jīng)過(guò)下采樣和上采樣后細(xì)節(jié)會(huì)被平滑掉。我的處理方式一是訓(xùn)練時(shí)用imgsz416或320減少無(wú)效縮放二是在推理階段用SAHI切片策略把大圖切成小圖分別檢測(cè)再合并結(jié)果。這個(gè)方法在真實(shí)產(chǎn)線大分辨率圖像上尤其好用NEU-DET里的小目標(biāo)問(wèn)題也能借此緩解。5.2 目標(biāo)大小分布不均衡的影響NEU-DET雖然是每類300張圖但邊界框的尺寸分布并不均衡。部分圖像的缺陷框幾乎占滿整張圖另一部分只有幾十個(gè)像素。如果訓(xùn)練時(shí)不做任何處理模型很容易偏向?qū)W習(xí)“大目標(biāo)”小目標(biāo)漏檢率偏高。實(shí)操中可以先統(tǒng)計(jì)所有標(biāo)注框的寬高分布import os for label_file in os.listdir(labels): with open(os.path.join(labels, label_file)) as f: for line in f: parts line.split() w float(parts[3]) h float(parts[4]) # 收集w、h畫散點(diǎn)圖如果發(fā)現(xiàn)小目標(biāo)占比明顯偏低可以加大Mosaic增強(qiáng)概率或者用簡(jiǎn)單復(fù)制粘貼的方式把小目標(biāo)缺陷復(fù)制到不同背景上增加小目標(biāo)的訓(xùn)練樣本權(quán)重。5.3 換到真實(shí)產(chǎn)線數(shù)據(jù)后掉點(diǎn)的應(yīng)對(duì)思路從NEU-DET訓(xùn)練出來(lái)的模型直接用到真實(shí)產(chǎn)線mAP大概率會(huì)掉這是domain gap問(wèn)題。真實(shí)鋼板的光照、角度、分辨率、表面反光程度都和數(shù)據(jù)集差距明顯。我常用的做法是先把NEU-DET作為預(yù)訓(xùn)練來(lái)源在真實(shí)標(biāo)注數(shù)據(jù)上做遷移微調(diào)而不是從零訓(xùn)練同時(shí)在數(shù)據(jù)增強(qiáng)里加入亮度擾動(dòng)、模糊、噪聲模擬產(chǎn)線環(huán)境。還有一個(gè)辦法是做兩階段檢測(cè)先用傳統(tǒng)圖像處理定位疑似區(qū)域再用深度模型做細(xì)分類。對(duì)某些表面反光強(qiáng)烈的場(chǎng)景這種組合的穩(wěn)定性比純端到端檢測(cè)更好。5.4 訓(xùn)練不收斂或loss振蕩小數(shù)據(jù)集上最常見(jiàn)的訓(xùn)練問(wèn)題是過(guò)擬合和loss振蕩。如果你發(fā)現(xiàn)驗(yàn)證集mAP在訓(xùn)練后期不升反降而訓(xùn)練集loss還在下降基本可以判斷過(guò)擬合了。這時(shí)候優(yōu)先減小模型容量或加大數(shù)據(jù)增強(qiáng)而不是繼續(xù)加epochs。另外學(xué)習(xí)率、batch size、warmup步數(shù)都會(huì)影響收斂穩(wěn)定性建議先用YOLOv8默認(rèn)參數(shù)跑一遍baseline再逐項(xiàng)調(diào)整不要一上來(lái)就同時(shí)改多個(gè)參數(shù)不然出了問(wèn)題都找不到原因。NEU-DET這塊“磨刀石”讓我把目標(biāo)檢測(cè)從“會(huì)跑通”變成了“會(huì)診斷”。它不完美但正因?yàn)闃颖疽?guī)模小、標(biāo)注清晰才逼著我在數(shù)據(jù)管線、評(píng)估分析、遷移調(diào)優(yōu)這些容易被忽略的環(huán)節(jié)里把功夫做扎實(shí)。如果你正在做工業(yè)缺陷檢測(cè)方向建議先別急著上復(fù)雜模型拿它在YOLO或Faster R-CNN上完整跑一遍流程把數(shù)據(jù)劃分、指標(biāo)解讀、badcase分析這些基本功練熟再回頭處理真實(shí)產(chǎn)線的復(fù)雜場(chǎng)景你會(huì)發(fā)現(xiàn)自己少走很多彎路。本文還有配套的精品資源點(diǎn)擊獲取