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