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