:從NEU-DET數(shù)據到工業(yè)部署全流程)
簡介本資源是一套面向工業(yè)質檢場景的YOLOv5鋼材表面缺陷檢測系統(tǒng)完整實現(xiàn)適用于深度學習初學者、計算機視覺工程師及智能制造領域研究者解決鋼鐵生產中常見劃痕、凹坑、裂紋等表面缺陷的自動化識別問題。壓縮包共5528個文件涵蓋1800張標注清晰的JPG工業(yè)圖像、1800份對應XML標注文件含PASCAL VOC格式邊界框、1806個YOLOv5適配的TXT標簽文件以及33個核心Python訓練/推理腳本、26個配置用YAML模型參數(shù)文件并包含CMake構建腳本、Docker環(huán)境配置、日志與緩存管理等工程化支持組件整體大小為28.28MB。已有2506人下載學習資源結構完整、開箱即用提供從數(shù)據預處理、模型訓練、權重導出到實時檢測的全流程代碼特別適合快速復現(xiàn)工業(yè)缺陷檢測方案并開展遷移學習與部署優(yōu)化。 做鋼材表面缺陷檢測或者說拿到一個類似“YOLOv5鋼材表面缺陷數(shù)據集檢測系統(tǒng)源碼”這樣的項目資源包時我建議你先別急著解壓跑訓練。先想清楚一個問題你手上的數(shù)據長什么樣、標簽靠不靠譜、類別是怎么定義的。這個項目的外殼是YOLOv5但靈魂其實是“鋼材缺陷”這四個字——鋼鐵表面的裂紋、麻點、氧化鐵皮、劃痕這些東西和通用目標檢測里的貓貓狗狗完全不是一個套路。我在實際做這個方向時最大的體會是算力和模型反而不是門檻數(shù)據集的質量和缺陷本身的形態(tài)差異才是決定系統(tǒng)能不能用的關鍵。這套東西適合誰如果你正在做工業(yè)質檢相關的課題或者剛接觸YOLO系列想找一個有實際工業(yè)背景的練手項目又或者你已經跑通了COCO數(shù)據集想看看模型在“小目標、低對比度、灰度圖像”上表現(xiàn)如何那這篇文章對你是有參考價值的。我會從項目要解決的實際問題說起把數(shù)據集處理、環(huán)境配置、訓練調參、部署推理以及從Demo到產線之間那些沒人明說但一定會遇到的坑按我自己的實操順序鋪開講。1. 為什么是YOLOv5鋼材缺陷檢測的選型邏輯其實很老實1.1 先搞清楚鋼材表面缺陷檢測到底在檢測什么熱軋鋼帶、冷軋鋼卷在生產線上高速通過時表面會出現(xiàn)各種類型的缺陷。常見的包括裂紋、夾雜物、斑塊、麻點、氧化鐵皮壓入、劃痕等等。這些缺陷面積小、對比度低而且鋼材本身表面就有一層紋理和反光人眼盯著屏幕看久了必然疲勞漏檢率會隨時間直線上升。傳統(tǒng)機器視覺的做法是固定光源下用閾值分割、邊緣檢測、紋理特征提取來識別但這種方案對光照變化和缺陷形態(tài)變化極度敏感換個鋼種、換個產線速度算法基本就要重新調。深度學習目標檢測的思路就不一樣它不依賴人工設計特征而是讓網絡從大量標注樣本里自己學習“缺陷長什么樣”。YOLOv5作為一階段檢測器在速度和精度的平衡上做得比較穩(wěn)訓練和部署的資料也多社區(qū)活躍度高遇到問題基本都能搜到答案。對于鋼材缺陷這類工業(yè)檢測場景YOLOv5不是理論上最前沿的選擇但它是工程上最省心的選擇。1.2 YOLOv5在工業(yè)小目標上的優(yōu)勢到底在哪鋼材表面缺陷有一個很麻煩的特點在整幅圖像里占比很小。比如一條細微裂紋可能只有幾十個像素寬長度倒是有幾百像素但相對于640x640的輸入尺寸來說依然屬于典型的小目標。YOLOv5在三個尺度上做預測分別對應大、中、小目標小目標的檢測頭對這類缺陷是比較友好的。再加上PANet結構做特征融合淺層的細粒度紋理信息和深層的語義信息能更好地結合在一起這對“細微但長條形”的缺陷來說非常關鍵。而且YOLOv5的工程化做得相當完整。數(shù)據增強策略是內置好的模型剪枝、量化、ONNX導出、TensorRT部署這些工具鏈都有現(xiàn)成腳本不用自己從頭寫。我當時選擇YOLOv5而不是其他檢測框架一個很現(xiàn)實的原因就是它能讓我把精力放在數(shù)據和業(yè)務上而不是花兩周時間去調一個訓練腳本。1.3 模型版本怎么選s、m、l還是nYOLOv5官方提供了n、s、m、l、x幾個版本網絡深度和寬度逐級增加。鋼材缺陷數(shù)據集通常規(guī)模不大公開的NEU-DET也只有1800張圖六類缺陷這個數(shù)據量撐不起太深的模型。我用下來最推薦的是YOLOv5s和YOLOv5m。s版本推理快顯存占用低適合快速驗證和邊緣部署m版本精度會稍高一些如果算力允許可以用它做最終模型。很多初學者一上來就選l或者x覺得模型越大越準。但實際上在工業(yè)缺陷這類“樣本少、類內差異大、背景復雜”的任務里大模型非常容易過擬合——訓練集上mAP接近1.0一測試就露餡。我的建議是先用s版本把整個流程跑通確定數(shù)據、標簽、訓練策略都沒問題了再考慮升級到m或者用集成測試來壓榨精度。2. 數(shù)據集才是這套系統(tǒng)的命根子NEU-DET解析與預處理2.1 NEU-DET數(shù)據集里到底有什么很多做這個系統(tǒng)的同學用的都是東北大學發(fā)布的NEU-DET熱軋帶鋼表面缺陷數(shù)據集。它包含1800張灰度圖像每張分辨率是200x200像素共六類缺陷crazing裂紋、inclusion夾雜物、patches斑塊、pitted_surface麻點、rolled-in_scale氧化鐵皮、scratches劃痕每類300張。標注格式有XML格式的Pascal VOC標注也有TXT格式的YOLO標注下載后可以根據自己需要選擇。這個數(shù)據集最大的好處是干凈——每張圖只有一個缺陷實例或者少數(shù)幾個同類缺陷類別平衡標注質量也過關。但這也是它和真實產線差距最大的地方。真實場景里一張圖可能同時出現(xiàn)多類缺陷光照不均、運動模糊、表面油污都會嚴重影響檢測效果。所以我建議你把NEU-DET當作驗證平臺的“標準測試集”用來驗證YOLOv5的檢測流程但千萬別以為模型在這個數(shù)據集上效果好就能直接上產線。2.2 目錄結構、標注格式與數(shù)據集劃分拿到原始數(shù)據之后第一步是把它整理成YOLOv5需要的目錄結構。YOLOv5的數(shù)據目錄通常長這樣dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/標注文件是和圖片同名的TXT文件每一行代表一個目標框格式是class_id x_center y_center width height注意這里的x_center、y_center、width、height都是相對于圖片寬高的歸一化坐標取值范圍0到1。如果你拿到的是Pascal VOC格式的XML標注需要先轉換一下。YOLOv5的倉庫里沒有直接提供這個轉換腳本但網上有很多現(xiàn)成工具或者你可以自己寫一個簡單的XML轉TXT腳本。我在第一次做這事兒的時候踩過一個坑XML里坐標是整數(shù)像素值轉成相對坐標時要除以圖片的寬和高而不是除以224或640這是很多教程里沒寫明白但特別容易錯的地方。數(shù)據集劃分我一般按8:1:1或者8:2來做訓練集和驗證集。由于NEU-DET每類數(shù)量均衡直接隨機劃分問題不大但要保證訓練集里每類缺陷都有一定數(shù)量別把某一類大部分樣本都分到驗證集里去了。如果后面加了真實場景數(shù)據類別不平衡嚴重的話可以考慮按類別分層采樣來劃分。2.3 針對鋼材場景的數(shù)據增強不是越多越好YOLOv5默認會啟用Mosaic、MixUp、HSV擾動、隨機翻轉等數(shù)據增強這些增強策略在COCO這種自然圖像數(shù)據集上效果很好但搬到鋼材表面缺陷上要小心。比如HSV色相和飽和度擾動NEU-DET本身是灰度圖YOLOv5加載時雖然會轉成三通道但三個通道值是一樣的大幅度的色相擾動反而會讓模型學到不存在的顏色信息。還有Mosaic拼接把四張圖拼在一起對“缺陷尺度變化”是有幫助的但拼接邊界上可能出現(xiàn)偽輪廓如果缺陷正好跨在拼接線上反而會被模型學歪。我的做法是在鋼材缺陷場景里增強策略用默認配置的70%強度左右然后關閉或者調低HSV中的H和S擾動保留V值亮度擾動。另外可以打開隨機旋轉和水平垂直翻轉但要控制旋轉角度范圍鋼材缺陷大多是長條形的旋轉90度還說得通無限旋轉會產生大量實際不可能出現(xiàn)的角度形態(tài)對訓練沒有幫助。2.4 從散圖到YOLO格式自制數(shù)據集的轉化思路如果你打算在NEU-DET之外加入自己采集的產線數(shù)據那要面對的第一個問題就是怎么把采集到的圖像變成YOLO能用的訓練樣本。我建議用一個標注工具比如LabelImg先在圖像上畫矩形框直接導出YOLO格式的標注文件這個流程最簡單。要提醒的是標注的邊界框盡量貼著缺陷邊緣不要留太多背景否則模型學到的就會是“背景里的那個區(qū)域”而不是缺陷本身。標注時還有一個細節(jié)容易忽略對于同一張圖里多個間距很近的缺陷是標注成兩個框還是一個框我的經驗是如果兩個缺陷中間有明顯間隔就分開標如果它們已經連成一片、沒有清晰邊界就當一個缺陷框標不要強行切開。讓模型去學一個不確定的邊界只會增加訓練噪音。3. 環(huán)境搭建與第一次訓練YOLOv5安裝里的坑我一次給你排完3.1 Python、PyTorch、CUDA的版本三角關系YOLOv5對PyTorch版本的要求不算苛刻但如果你配的環(huán)境不對光安裝這一步就能卡你一天。我的建議是先確定自己的顯卡驅動版本再根據驅動版本選擇CUDA版本最后根據CUDA版本安裝對應版本的PyTorch。別直接裝最新版PyTorch——最新版往往需要最新CUDA而你的顯卡驅動未必支持。比如用NVIDIA GTX 30系或40系顯卡驅動比較新直接裝CUDA 11.8或12.1的PyTorch通常沒問題。如果你還在用老顯卡那就得先查驅動支持的最高CUDA版本別盲目升級。可以用下面這個命令快速查看驅動信息nvidia-smi輸出右上角會顯示“CUDA Version: xx.x”這就是你的驅動最高能支持的CUDA版本PyTorch的CUDA版本不能比這個高。3.2 YOLOv5依賴安裝的坑YOLOv5的requirements.txt寫得很全但直接pip install -r requirements.txt在Windows上經常會在pycocotools這兒卡住。這個包是用來做COCO評估的在Windows上編譯需要Visual C Build Tools。說實話如果你只是訓練和檢測不一定要跑COCO評估可以先把pycocotools注釋掉其他依賴裝好再說。我當時的做法是git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt如果報錯就逐個排查核心依賴其實就幾個torch、torchvision、opencv-python、numpy、matplotlib、pyyaml、tqdm。只要這些裝好了訓練就能跑起來。還要注意Python版本Python 3.8到3.11都行太老或者太新都可能遇到兼容性問題。3.3 訓練參數(shù)怎么定imgsz、batch、epochs和顯存的賬訓練前要寫一個數(shù)據配置文件指向你的數(shù)據目錄和類別列表。類似這樣train: dataset/images/train val: dataset/images/val nc: 6 names: [crazing, inclusion, patches, pitted_surface, rolled-in_scale, scratches]然后啟動訓練python train.py --data neudet.yaml --weights yolov5s.pt --batch-size 16 --epochs 200 --img 640參數(shù)選擇上--img我推薦640。NEU-DET原始圖片只有200x200直接縮放到640其實是在做上采樣對小缺陷的細節(jié)保留有幫助。但要注意上采樣并不會增加真實信息只是讓模型輸入尺寸統(tǒng)一。如果你的顯卡顯存只有8G--batch-size設置16配yolov5s基本是極限了顯存不夠就降到8或者4。--epochs我建議從100到200之間開始試NEU-DET數(shù)據量小訓練到150個epoch左右基本就收斂了多了容易過擬合。3.4 第一次訓練跑起來之后要看什么訓練一旦啟動終端會實時輸出loss、mAP這些指標。很多新手盯著loss曲線看半天也不知道好壞。我的經驗是重點關注val/box_loss、val/cls_loss和mAP0.5這幾個值。如果訓練集loss持續(xù)下降但驗證集loss不降反升說明過擬合了提前停止就好如果mAP0.5能從0.8往上走說明模型已經學到東西了。第一次訓練沒必要追求完美精度更重要的把整個流程跑通。你會發(fā)現(xiàn)在數(shù)據集規(guī)模小的時候訓練一輪用不了幾分鐘整個200個epoch可能就半小時。這時候多試幾組參數(shù)看看不同配置對結果的影響比你悶頭調一天代碼更有價值。4. 訓練結果解讀與模型優(yōu)化mAP、PR曲線、誤檢漏檢4.1 訓練日志里的指標到底意味著什么訓練結束后YOLOv5會生成results.png、混淆矩陣、PR曲線等結果文件。我建議重點看混淆矩陣和PR曲線?;煜仃嚹芨嬖V你哪兩類缺陷容易被搞混這個信息比整體mAP重要得多。比如在NEU-DET上patches和rolled-in_scale這兩類很容易互相誤判因為它們都表現(xiàn)為大面積的灰度斑塊邊界模糊。PR曲線則是檢測置信度閾值從高到低變化時精確率和召回率的動態(tài)關系。曲線往右上角凸得越厲害說明模型在各個閾值下表現(xiàn)越好。如果PR曲線整體偏低說明你模型的置信度普遍不高那么在實際部署時你就得把置信度閾值設低一點才能保證召回但這樣也會帶來更多誤檢。4.2 兩類常見的“虛假成功”過擬合和類別混淆有一種情況特別迷惑人訓練集mAP能達到0.99val集也有0.95但你拿產線實拍的圖一測框出來的全是錯的。這就是典型的過擬合。NEU-DET只有1800張圖而且每張圖背景相對單一模型很容易記住訓練集里的背景紋理特征而不是真正的缺陷特征。碰到這種情況最有效的辦法不是調模型而是擴充數(shù)據——加入真實場景的負樣本和難例。另一個問題是類別混淆。鋼材缺陷里有些類別形態(tài)確實很像比如crazing裂紋和scratches劃痕兩者都是細長條區(qū)別在于裂紋更彎曲、更隨機劃痕更平直。如果混淆矩陣顯示這兩類互相誤判嚴重可以考慮把這兩類合并成一個“線狀缺陷”類或者增加細粒度分類的監(jiān)督信號。業(yè)務上如果只需要判“有沒有缺陷”而不需要細分缺陷類型那直接合并類別是最省事也最穩(wěn)的方案。4.3 更貼近場景的調優(yōu)方向如果你已經把NEU-DET跑到了mAP很高的水平但總覺得系統(tǒng)“不夠實用”那接下來該做的不是繼續(xù)壓榨mAP而是在更接近實際場景的測試集上評估。我遇到過的情況模型在NEU-DET上mAP0.5到了0.95但在我自己標注的一小批現(xiàn)場圖上mAP只有0.6。問題出在圖像分辨率、光照條件和缺陷形態(tài)分布不一樣。所以調優(yōu)的方向應該是小批量地把你現(xiàn)場的真實缺陷圖片加進訓練集一開始可能只加幾十張然后重新訓練看val集變化。這種“用小數(shù)據牽引大模型”的方式在工業(yè)質檢里特別管用。你會發(fā)現(xiàn)有時候只加50張真實場景圖效果比換一個更大的模型更明顯。5. 從權重到系統(tǒng)推理部署與檢測界面5.1 導出ONNX跨平臺部署的第一步訓練得到best.pt之后不能直接拿來給所有環(huán)境用尤其是邊緣設備上跑推理ONNX或者TensorRT引擎才更常見。YOLOv5的導出腳本很成熟python export.py --weights best.pt --include onnx導出之后可以用ONNX Runtime來推理也可以繼續(xù)轉成TensorRT的engine文件在NVIDIA設備上部署。做這一步時要注意導出的ONNX模型的輸入輸出尺寸是固定的通常輸入是1x3x640x640輸出是1x25200x7其中最后7維是x_center, y_center, width, height, objectness, class_0, class_1, ..., class_5。寫推理代碼時要對這25200個預測框做NMS去重不能直接把所有的框都畫上去。5.2 用Web界面跑一個檢測服務把模型部署成Web服務用Flask框架搭建就非??炻窂?。用戶上傳一張圖片服務端調用模型推理把檢測結果圖畫好返回給前端。核心代碼不長大致是這個套路from flask import Flask, request, jsonify from PIL import Image import io import torch app Flask(__name__) model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, force_reloadTrue) app.route(/detect, methods[POST]) def detect(): img_bytes request.files[image].read() img Image.open(io.BytesIO(img_bytes)) results model(img, size640) # 返回檢測框、類別、置信度 data results.pandas().xyxy[0].to_dict(orientrecords) return jsonify(data) if __name__ __main__: app.run(host0.0.0.0, port5000)這個接口雖然簡單但已經夠內部驗證用了。如果是給車間現(xiàn)場用建議加一個簡單的上傳界面讓質檢員能直接拖拽圖片檢測把結果保存到本地。我當時是寫了一個簡單的HTML頁面配了一個Flask后端半天就能全部搞定。5.3 邊緣設備部署的注意事項很多實際項目不是部署在GPU服務器上而是用Jetson Nano、RK3588這類邊緣設備。如果你用的是NVIDIA邊緣設備把ONNX進一步轉成TensorRT的engine文件推理速度能大幅提升。但要注意TensorRT的engine文件是針對特定顯卡型號和TensorRT版本生成的換個設備或者升級TensorRT版本就要重新導出。在低算力設備上我會把輸入尺寸從640降到416甚至320雖然精度會掉一些但推理延遲明顯下降。還有一個技巧是開啟半精度推理在不明顯掉點的情況下進一步加速。邊緣設備上另一個常見問題就是內存限制做推理時要做好圖片的批量控制別一次塞幾十張圖進去。6. 從Demo到產線那些文檔不會告訴你的現(xiàn)實問題6.1 光照、運動模糊與缺陷易混淆性Demo做得再漂亮到了產線上都會遇到一個共同敵人圖像質量和訓練集不一致。鋼帶在高速運動時相機如果曝光時間過長缺陷就成了一條拖影。這種運動模糊在訓練集里幾乎沒有模型見到它就懵了。解決思路不是在模型層面死磕而是在成像端控制——調短曝光時間、上頻閃光源、選幀率更高的相機這些壞圖從源頭就少了。光照問題也一樣。熱軋產線上有大量水汽和紅外輻射光照條件非常惡劣同一個缺陷在早晨和下午拍出來的灰度值能差出幾十個LEVEL。這時候我會考慮做灰度歸一化、直方圖均衡化這類預處理讓模型輸入更穩(wěn)定。如果條件允許收集不同光照條件下的樣本加入訓練集也是最樸實的辦法。6.2 小樣本場景下的持續(xù)迭代策略產線數(shù)據不可能一次性收集齊全更現(xiàn)實的做法是“小步快跑”地迭代。我的經驗是首批用NEU-DET訓練出一個能跑的版本上線后收集一周的現(xiàn)場圖片人工篩選出幾百張有代表性的缺陷樣本難例負樣本補充進訓練集每周做一次增量訓練用上一周的模型作為預訓練權重用全部新老數(shù)據做微調。這里有個坑要提醒增量訓練時學習率一定要調低比如設成0.0001否則模型很容易把已經學到的特征忘掉。我用過最穩(wěn)的配置是加載上一輪訓練的best.pt訓練集用所有收集到的數(shù)據epochs設50到80學習率降一個量級這樣每次迭代精度都不會掉。6.3 輸出交付檢測記錄、日志與缺陷統(tǒng)計一個真正能用的檢測系統(tǒng)不只是“能畫框”而已。實際的質檢系統(tǒng)需要保存每一次檢測的圖像、檢測框坐標、類別、置信度、時間戳方便追溯。我建議在后端接口里直接把這些信息寫入數(shù)據庫同時把帶檢測框的結果圖保存到本地目錄這樣日后模型出了問題能回溯查找是哪一批數(shù)據導致的。這在產線上是硬需求但很多教程和Demo都忽略了。你寫代碼時哪怕只是把一個CSV日志寫全后續(xù)做數(shù)據分析、誤檢復盤時都會省很多力氣。還有一個經驗不要把置信度閾值設得太死。產線實際使用中應該提供一個置信度參數(shù)面板讓工藝人員根據當天的場景微調而不是把閾值寫死在代碼里。我在部署時會在界面里加兩個滑動條一個調置信度閾值一個調NMS的IoU閾值這倆參數(shù)直接決定漏檢和誤檢的平衡點。對工業(yè)質檢來說漏檢的代價往往比誤檢高得多所以默認閾值我會設得低一些。從YOLOv5選型、NEU-DET數(shù)據集處理到訓練調參、部署上線這套流程本身沒有什么魔法每一步都是工程權衡。我見過不少人拿著源碼跑通一個Demo就覺得大功告成但真正讓你在產線上站穩(wěn)腳跟的是后面那一輪輪的數(shù)據迭代和參數(shù)微調。說到底鋼板的表面缺陷不會因為你的模型名稱好聽就變少它只會被那些把數(shù)據吃透、把場景想清楚的人一點一點揪出來。如果你也正在和鋼材表面的裂紋、麻點較勁希望這篇實操記錄能幫你少走幾段彎路。本文還有配套的精品資源點擊獲取