據(jù)集與YOLO實戰(zhàn):從標注到訓練全攻略)
簡介面向土木工程與計算機視覺交叉領(lǐng)域研究者的混凝土裂縫數(shù)據(jù)集合集覆蓋分類與目標檢測兩類任務包含SDNET2018、ConcreteCrackImagesforClassification、crack-detection-master等公開數(shù)據(jù)集并附帶作者自制的3100張VOC格式裂縫檢測圖片及可運行源碼適合用于深度學習模型訓練、算法驗證和工程安全檢測研究。資源包共3個文件以inscode工程入口、html說明頁面和gitignore配置為主整體僅6KB輕量便于快速部署源碼結(jié)構(gòu)簡潔可直接在云端或本地環(huán)境中運行。已有129人學習使用適合具備Python與深度學習基礎(chǔ)、希望快速獲取標準化裂縫數(shù)據(jù)的入門及進階開發(fā)者。壓縮包內(nèi)索引清晰幫助讀者在無需自行搜集數(shù)據(jù)的情況下直接進入模型搭建與實驗階段有效降低復現(xiàn)門檻。 混凝土裂縫檢測這幾年在工程圈和CV圈都挺火一方面是基建存量越來越大橋梁、隧道、路面、大壩的巡檢需求擺在那里另一方面是目標檢測和分割模型越來越成熟落地門檻比前幾年低了不少。但真上手做這個方向的人八成時間都耗在找數(shù)據(jù)、洗數(shù)據(jù)、標數(shù)據(jù)上真正跑模型的時間其實沒多少。這篇就把我整理過的混凝土裂縫數(shù)據(jù)集和配套可運行源碼一次性匯總清楚幫你把前期準備的時間省下來。1. 裂縫檢測任務的核心形態(tài)與數(shù)據(jù)集選型1.1 三類主流任務形態(tài)做混凝土裂縫檢測首先得搞清楚你要解決的是哪一類問題。這個方向表面上看就是一個找裂縫的活但在技術(shù)實現(xiàn)上分成了三條完全不同的技術(shù)路線選錯路線會浪費大量時間和算力。分類任務是最基礎(chǔ)也最簡單的形態(tài)。輸入一張裂縫圖像模型判斷有沒有裂縫。這種任務適合做簡單的巡檢預警或者作為更復雜系統(tǒng)的前置篩選模塊。典型實現(xiàn)是ImageNet預訓練的ResNet、EfficientNet做二分類或三分類無裂縫、橫向裂縫、縱向裂縫。優(yōu)點是不需要標注框或像素級標簽只需要圖像級別的類別標注數(shù)據(jù)準備成本最低。目標檢測任務是目前工程落地最常見的形態(tài)。模型輸出裂縫的位置邊界框和類別比如YOLOv5、YOLOv8、Faster R-CNN這類模型。這類任務適合用在無人機巡檢、車載道路檢測等場景因為裂縫在整張圖中往往只占一小塊區(qū)域檢測框能告訴巡檢人員具體在哪個位置有裂縫。數(shù)據(jù)標注量適中用LabelImg或者Roboflow畫框就行。語義分割任務是精度最高但也最重的一種形態(tài)。模型對每個像素做分類輸出裂縫的精確輪廓。U-Net、DeepLabV2、SegNet是經(jīng)典選擇。這類任務適合需要精確測量裂縫寬度、長度、走向的場景比如橋梁結(jié)構(gòu)安全評估、隧道襯砌檢測。難點在于標注成本高需要逐像素標注裂縫區(qū)域而且裂縫這類細長目標在標注時很容易漏標或標粗非??简災托?。拋開具體模型不談數(shù)據(jù)集的選擇才是決定上限的關(guān)鍵。不同任務形態(tài)需要不同粒度的標注而市面上公開的裂縫數(shù)據(jù)集質(zhì)量參差不齊有些數(shù)據(jù)集的標注本身就存在明顯錯誤直接用會導致模型學歪。1.2 我整理數(shù)據(jù)集時的選型標準先說結(jié)論一個好的裂縫數(shù)據(jù)集至少要滿足以下四條標準缺一條都會在訓練時出問題。第一是圖像分辨率要足夠高。裂縫是典型的細長目標寬度可能只有幾個像素。如果圖像本身只有300×300那裂縫在圖中可能只有2-3個像素寬別說分割了檢測都費勁。我一般優(yōu)先選分辨率在512×512以上的數(shù)據(jù)集最好是原始圖像能達到1000×1000以上訓練時再降采樣。第二是背景多樣性要夠。很多數(shù)據(jù)集是在實驗室環(huán)境下拍的背景單一、光照均勻、紋理簡單模型在這種數(shù)據(jù)上跑出98%的準確率根本不代表什么。真正有挑戰(zhàn)的是現(xiàn)場真實場景——路面有陰影、有油漬、有修補痕跡橋墩表面有水漬、有苔蘚、有模板縫這些干擾在公開數(shù)據(jù)集里不夠豐富的話模型泛化性會很差。第三是標注方式要和任務匹配。同樣是裂縫數(shù)據(jù)有的數(shù)據(jù)集給的是圖像級別標簽只能用來做分類有的給的是Pascal VOC格式的xml框適合做檢測有的給的是像素級maskpng格式適合做分割。選數(shù)據(jù)集之前先想好自己的任務別拿mask數(shù)據(jù)硬跑檢測也別拿檢測框數(shù)據(jù)硬跑分割。第四是負樣本要充足。裂縫數(shù)據(jù)集最容易踩的坑是負樣本太少。很多公開數(shù)據(jù)集把裂縫圖片和正常圖片混在一起但實際場景中90%以上的巡檢圖像都是沒有裂縫的。模型如果沒見過足夠多的負樣本推理時會把所有紋理復雜的地方都當裂縫誤檢率會高到不可用。2. 主流的公開混凝土裂縫數(shù)據(jù)集盤點我按任務形態(tài)把適合做裂縫檢測的數(shù)據(jù)集分成四類分別列出關(guān)鍵信息和適合的使用方式。下面這些數(shù)據(jù)集我都實際跑過不是湊數(shù)的。2.1 經(jīng)典分類數(shù)據(jù)集CFD與CrackForestCFDCrack Forest Dataset是張量T. L. Zhang等人做的路面裂縫數(shù)據(jù)集收錄了118張分辨率約480×320的彩色路面圖像包含不同光照條件和路面紋理下的裂縫。這個數(shù)據(jù)集在論文里出現(xiàn)頻率很高很多早期的CNN裂縫分類模型都用它做驗證。它的問題是樣本量小、分辨率低現(xiàn)在一般只用來做模型對比測試或預訓練驗證不適合做主力訓練集。CrackForest是另一個經(jīng)常被引用的路面裂縫數(shù)據(jù)集也是100多張圖帶像素級標注。它的標注相對粗糙邊緣不夠精細我做分割實驗時發(fā)現(xiàn)用它訓出來的模型邊界會偏粗。這兩個數(shù)據(jù)集現(xiàn)在的主要價值是行業(yè)基準你可以在上面跑通baseline但要訓練生產(chǎn)級模型還得靠后面幾個大規(guī)模數(shù)據(jù)集。2.2 大規(guī)模路面裂縫檢測數(shù)據(jù)集Crack500是 Temple University 團隊做的路面裂縫數(shù)據(jù)集一共500張原始圖像每張尺寸約4032×3024覆蓋了不同嚴重程度的裂縫。作者把每張大圖切成若干個小塊最終得到3500多張子圖并提供像素級標注。我最常用的切塊方式是512×512這樣既保留了裂縫紋理細節(jié)又不會讓模型在大圖上丟失小目標信息。Crack500的子圖里有大量不含裂縫的背景塊做訓練時要自己控制負樣本比例我一般控制在正負樣本3比1。**GAPsGerman Asphalt Pavement Distress**是一個德國團隊發(fā)布的瀝青路面病害數(shù)據(jù)集包含509張標注圖像標注目標有裂縫、坑槽、修補等格式是Pascal VOC。這個數(shù)據(jù)集的特點是病害類型多樣裂縫形態(tài)偏真實適合做多類別檢測。它的問題在于圖像數(shù)量少直接訓練容易過擬合我一般用來做遷移學習的驗證集。**RDD2020Road Damage Detection**是一個比較新的道路病害檢測數(shù)據(jù)集來自IEEE的反向道路損壞檢測挑戰(zhàn)賽圖像來自日本、印度、捷克等國家的真實道路巡檢包含超過26000張圖像標注了縱向裂縫、橫向裂縫、鱷魚裂紋、坑洼四種類型。格式是Pascal VOC和COCO雙版本幾千張帶裂縫的圖直接可以用來訓練YOLOv8。這個數(shù)據(jù)集對多國路況都有覆蓋負樣本也比較充分是我目前做路面裂縫檢測的首選預訓練數(shù)據(jù)。2.3 混凝土結(jié)構(gòu)物表面裂縫數(shù)據(jù)集SDNET2018是猶他州立大學發(fā)布的混凝土橋梁、路面、墻體裂縫數(shù)據(jù)集包含超過230個混凝土構(gòu)件圖像切片約56000張子圖。它特別適合做橋梁和建筑結(jié)構(gòu)表面的裂縫檢測因為圖中包含大量真實混凝土表面紋理如蜂窩麻面、模板縫、氣孔等干擾對模型魯棒性要求更高。需要說明的是它提供的標簽是圖像級別有裂縫/無裂縫要用來做檢測或分割得自己標注但在分類任務里是很有價值的訓練集。DeepCrack是早期專門做混凝土裂縫分割的數(shù)據(jù)集包含537張圖像都帶像素級標注。它的圖像來自建筑物、路面、橋梁等多種混凝土結(jié)構(gòu)分辨率不統(tǒng)一背景復雜度中等。分割效果上限不錯但數(shù)量少訓練時容易過擬合建議用U-Net配合強數(shù)據(jù)增強使用。SUIM自建補充如果你要檢測水下結(jié)構(gòu)物裂縫可以關(guān)注水下成像數(shù)據(jù)集SUIM等它們主要面向海洋結(jié)構(gòu)物的語義分割包含部分裂縫、海洋生物附著等目標。這類數(shù)據(jù)做水下壩體、橋墩檢測時很有參考價值但需自行篩選裂縫類標簽。2.4 其他特種場景裂縫數(shù)據(jù)除了上面幾個還有一些針對特定場景的裂縫數(shù)據(jù)。比如無人機橋梁巡檢數(shù)據(jù)集公開的不多很多是論文附帶的數(shù)據(jù)隧道襯砌裂縫數(shù)據(jù)集相關(guān)數(shù)據(jù)在Crack360等文獻中有涉及但開放程度有限。如果你的應用場景是這些特殊方向我建議放棄找現(xiàn)成數(shù)據(jù)集的思路轉(zhuǎn)而做自動標注人工修正的半自動方案用預訓練模型生成候選區(qū)域然后人工審查修正標注效率比從頭標注高很多。為了讓你快速比較我把常用的裂縫數(shù)據(jù)集整理成了一張表數(shù)據(jù)集圖像數(shù)量標注粒度適用任務特點與坑點CFD118像素級分類/分割驗證分辨率低不適合生產(chǎn)訓練CrackForest118像素級分割基準標注偏粗邊界不精細Crack500500原始/3500子圖像素級分割/檢測子圖負樣本多需控制比例GAPs509檢測框(Pascal VOC)檢測病害類型多數(shù)量少RDD202026000檢測框(VOC/COCO)檢測國家路況多樣首選大規(guī)模數(shù)據(jù)SDNET201856000切片圖像級分類含大量混凝土紋理干擾訓練魯棒性好DeepCrack537像素級分割數(shù)據(jù)少需加強數(shù)據(jù)增強提示網(wǎng)絡上熱詞里提到的水下管道裂縫數(shù)據(jù)集道路裂縫yolo數(shù)據(jù)集免費很多都來自上述數(shù)據(jù)集的不同裁剪版本或分塊。下載時先看原始標注格式再看是否有版權(quán)限制別直接拿別人的再發(fā)布版本用于商業(yè)項目。3. 可運行源碼項目與環(huán)境配置3.1 源碼項目應該具備的完整鏈路現(xiàn)在GitHub和Gitee上打著混凝土裂縫檢測標簽的項目不少但很多只是把模型代碼貼上數(shù)據(jù)下載鏈接還是失效的更別提開箱即用。真正可以復現(xiàn)的裂縫檢測源碼項目至少需要包含以下幾條完整鏈路數(shù)據(jù)準備鏈路提供數(shù)據(jù)下載腳本或直接包含數(shù)據(jù)劃分腳本train/val/test能一條命令把數(shù)據(jù)集處理成模型需要的目錄格式。更規(guī)范的項目會附帶數(shù)據(jù)增強代碼比如隨機旋轉(zhuǎn)、亮度擾動、Mosaic增強等。模型訓練鏈路包含完整的訓練腳本支持修改模型結(jié)構(gòu)、batch size、學習率等超參數(shù)并且在訓練過程中會保存checkpoint、輸出loss曲線。我用YOLOv5時一般在訓練前額外用預訓練模型跑一遍COCO上的表現(xiàn)確認權(quán)重文件沒損壞。模型推理和評估鏈路能加載訓練好的權(quán)重對單張圖片或整個文件夾進行推理輸出可視化標注結(jié)果并計算mAP、F1-score等指標。這個環(huán)節(jié)最容易出問題的是推理腳本和訓練腳本間存在類名順序不一致、圖像預處理不一致等問題導致線下指標很好但線上效果崩。3.2 環(huán)境配置與依賴詳解裂縫檢測最常見的實現(xiàn)組合是PyTorch YOLOv5/YOLOv8 配套標注工具。以下是我的環(huán)境參考配置兼容性和穩(wěn)定性實測都不錯適合作為基線Python3.8-3.10不建議用3.11以上直接跑網(wǎng)上老項目很多依賴會編譯失敗PyTorch1.10-2.0如果顯卡是RTX 30/40系注意選對應CUDA版本CUDA11.3或11.8cuDNN 8.2以上OpenCV4.5以上圖像讀入、預處理必須numpy1.21以上pandas、matplotlib、seaborn等輔助庫標注工具LabelImg畫檢測框、Labelme畫多邊形做分割、Roboflow在線標注格式轉(zhuǎn)換數(shù)據(jù)增強庫albumentations對裂縫這種細長目標做增強時比torchvision.transform好用得多網(wǎng)上很多項目用的是老版本的ultralytics直接pip install ultralytics會裝到新版本API變化很大跑通舊代碼會出問題。我的習慣是把項目需要的依賴版本寫進requirements.txt然后在虛擬環(huán)境里安裝比如conda create -n crack_det python3.9 conda activate crack_det pip install torch1.13.0 torchvision0.14.0 --index-url https://download.pytorch.org/whl/cu117 pip install -r requirements.txt千萬別圖省事在base環(huán)境里裝裂縫檢測項目經(jīng)常需要嘗試不同模型結(jié)構(gòu)依賴沖突概率很高虛擬環(huán)境隔離能省很多不必要的麻煩。3.3 標注數(shù)據(jù)目錄結(jié)構(gòu)規(guī)范不管選哪個模型數(shù)據(jù)目錄結(jié)構(gòu)都強烈建議統(tǒng)一成下面的格式方便后面切換模型時不用重構(gòu)代碼datasets/ crack_data/ images/ train/ val/ labels/ train/ val/ data.yaml如果做分割任務則把labels換成masks目錄存放png格式的mask圖做分類任務則把images改成crack/normal兩個子目錄即可。這里有個容易踩的坑YOLO系列的標簽文件是txt格式每行對應一個目標內(nèi)容是class_id x_center y_center width height這些坐標都是相對于圖像寬高的歸一化值。用LabelImg標注時默認導出的是Pascal VOC的xml格式需要額外轉(zhuǎn)換成YOLO的txt格式Roboflow可以自動完成這個轉(zhuǎn)換。data.yaml是模型訓練時的配置文件內(nèi)容包括數(shù)據(jù)集根路徑、train/val路徑、類別數(shù)、類別名。我見過很多人卡在路徑問題上YAML里寫的路徑不對或目錄層級不對訓練直接報錯。推薦用相對路徑放在datasets目錄下方便項目遷移。4. 基于YOLOv5的裂縫檢測訓練實操4.1 數(shù)據(jù)準備與劃分假設你選定RDD2020或Crack500作為訓練數(shù)據(jù)第一步是把它整理成上面說的格式。我一般會用腳本做數(shù)據(jù)劃分按8:1:1切分成訓練集、驗證集、測試集。劃分時有一個細節(jié)同一個場景的圖像不能既出現(xiàn)在訓練集又出現(xiàn)在驗證集中。很多無人機巡檢數(shù)據(jù)集中同一裂縫的連續(xù)幀非常相似如果不做場景級劃分驗證集會泄漏訓練信息導致指標虛高。我的做法是先從文件名中提取場景ID按場景劃分而不是單純隨機抽樣。import os import random from shutil import copy2 data_root datasets/raw img_files [f for f in os.listdir(os.path.join(data_root, images)) if f.endswith(.jpg)] # 按場景ID分組確保同場景數(shù)據(jù)不跨集 scenes {} for f in img_files: scene_id f.split(_)[0] scenes.setdefault(scene_id, []).append(f) scene_list list(scenes.keys()) random.seed(42) random.shuffle(scene_list) train_scenes scene_list[:int(len(scene_list)*0.8)] val_scenes scene_list[int(len(scene_list)*0.8):int(len(scene_list)*0.9)] test_scenes scene_list[int(len(scene_list)*0.9):] # 復制到目標目錄 for split, scene_ids in [(train, train_scenes), (val, val_scenes), (test, test_scenes)]: for sid in scene_ids: for f in scenes[sid]: src_img os.path.join(data_root, images, f) src_lab os.path.join(data_root, labels, f.replace(.jpg, .txt)) dst_img os.path.join(fdatasets/crack_data/images/{split}, f) dst_lab os.path.join(fdatasets/crack_data/labels/{split}, f.replace(.jpg, .txt)) copy2(src_img, dst_img) copy2(src_lab, dst_lab)負樣本比例的坑也在這里暴露了。如果原始數(shù)據(jù)里不含裂縫的圖片太多直接訓練會讓模型傾向于全部預測為負類。我在準備數(shù)據(jù)時會把訓練集正負樣本比例控制在3:1到5:1之間負樣本太多就下采樣正樣本太多就適當做增強。4.2 模型訓練關(guān)鍵參數(shù)選用YOLOv5ssmall版本作為基線模型兼顧速度和精度。如果對精度有更高要求可以換YOLOv5m或YOLOv8m。以下是訓練命令的參考參數(shù)python train.py --img 640 --batch 16 --epochs 100 \ --data datasets/crack_data/data.yaml \ --weights yolov5s.pt \ --hyp data/hyps/hyp.scratch-low.yaml \ --project runs/crack_train幾個值得細說的參數(shù)--img 640輸入圖像分辨率。裂縫是細長目標分辨率太低會丟失細裂縫信息太高則顯存占用大。640是平衡點。如果你的顯存足夠比如24G可以試896或1024部分場景能提升幾個點的mAP。--batch 16batch size越小BN層統(tǒng)計越不穩(wěn)定訓練波動越大。如果顯存不夠?qū)幙山档洼斎敕直媛室膊灰獜娦邪裝atch降到4以下。--hyp hyp.scratch-low.yaml這個文件控制數(shù)據(jù)增強的強度。裂縫檢測場景建議把mosaic和mixup的開關(guān)打開但把hsv_h、hsv_s的參數(shù)調(diào)低一點因為顏色失真太嚴重會讓模型學到錯誤的顏色特征。--weights yolov5s.pt直接從COCO預訓練權(quán)重開始訓練收斂速度快很多。不建議從隨機初始化開始訓練裂縫數(shù)據(jù)集相對較小從零訓練容易過擬合。訓練過程中我會特別關(guān)注兩個指標train/box_loss的下降曲線是否平滑val/mAP_0.5是否持續(xù)上升。如果val loss在20個epoch后開始反彈而上不去就是過擬合的跡象這時要加大數(shù)據(jù)增強強度或引入早停機制。4.3 增強策略與樣本均衡處理裂縫目標有很強的方向性和連續(xù)性通用目標檢測的隨機翻轉(zhuǎn)增強其實有一定風險。比如路面縱向裂縫翻轉(zhuǎn)后仍然是縱向裂縫但如果是橋梁上的橫向裂縫垂直翻轉(zhuǎn)后類別語義也會變化模型可能會混淆裂縫方向。我的做法是隨機水平翻轉(zhuǎn)開啟路面和結(jié)構(gòu)物裂縫不區(qū)分方向場景下安全隨機垂直翻轉(zhuǎn)關(guān)掉垂直翻轉(zhuǎn)后龜裂和橫向裂縫的紋理特征會產(chǎn)生歧義隨機旋轉(zhuǎn)設到5-10度的小角度旋轉(zhuǎn)過大邊緣裁切會丟失裂縫Mosaic增強保持開啟能大幅增加每張圖的上下文信息隨機亮度、對比度調(diào)整開啟真實場景光照變化很大如果你用的是albumentations做分割任務增強推薦這個組合import albumentations as A train_transform A.Compose([ A.RandomRotate90(p0.5), A.HorizontalFlip(p0.5), A.RandomBrightnessContrast(p0.3, brightness_limit0.15, contrast_limit0.15), A.ShiftScaleRotate(shift_limit0.05, scale_limit0.1, rotate_limit10, p0.5), A.OneOf([ A.GaussNoise(p1), A.MotionBlur(p1, blur_limit5), ], p0.2), A.Resize(512, 512), ])4.4 評估指標解讀與改善方向訓練完成后不要只看mAP還要看PR曲線、混淆矩陣和檢測結(jié)果可視化。裂縫檢測里最容易出現(xiàn)的問題有兩種一是裂縫細長IOU計算偶爾偏低但視覺上檢測沒問題二是陰影、油漬、水漬被誤檢為裂縫。針對誤檢我常用的改善方法有三種加入更豐富的負樣本。把巡檢視頻中沒有裂縫的幀抽出來加入訓練集讓模型學會這些不是裂縫。這往往比調(diào)模型結(jié)構(gòu)有效得多。改進NMS策略。裂縫檢測框通常長寬比極大如果默認的NMS參數(shù)抑制了相鄰的多個小框會導致一條裂縫被檢測成幾段??梢赃m當調(diào)低NMS置信度閾值讓模型輸出更多的候選框后續(xù)用形態(tài)學算子做合并。改用分割模型。如果檢測框始終無法精確貼合裂縫輪廓說明你的應用需要的是精確的位置信息而不是大概在這個區(qū)域。這種場景下直接用U-Net或DeepLabV2做分割效果提升是質(zhì)的飛躍。5. 常見問題與排查技巧實錄5.1 訓練loss不下降的排查思路遇到訓練loss不下降時90%的情況不是模型結(jié)構(gòu)問題而是數(shù)據(jù)問題。我踩過好幾次的坑包括標注框全為0。YOLO的標注txt文件里如果坐標數(shù)據(jù)為0或有負值訓練會直接崩掉或loss震蕩。我寫過一個檢查腳本遍歷所有txt文件檢查坐標是否在(0,1)區(qū)間內(nèi)如果越界就直接報出文件名做數(shù)據(jù)清洗時非常有用。圖像通道問題。有些數(shù)據(jù)集圖像是4通道RGBA或灰度圖模型讀取時統(tǒng)一三通道后會出奇奇怪怪的bug。建議做一個遍歷檢查和預處理把圖片統(tǒng)一轉(zhuǎn)成RGB三通道并保存。這個步驟雖然基礎(chǔ)但能避免很多后期排查時間。類別標號不對齊。轉(zhuǎn)換數(shù)據(jù)格式時最容易出錯就是類別編號從0開始還是從1開始。VOC數(shù)據(jù)集的類別名是從1開始的YOLO的txt是從0開始的兩個差1會讓所有標簽錯位。標簽錯位尤其隱蔽loss照常下降但模型預測結(jié)果完全不對??梢栽谟柧毻暌粋€epoch后用模型預測一張訓練圖片如果預測類別和目標明顯不匹配基本就是這個問題。5.2 推理速度慢與顯存不足的優(yōu)化模型訓練好了部署到邊緣設備或無人機上時推理效率就成了大問題。裂縫檢測往往需要在移動端或嵌入式設備上實時運行我常用的優(yōu)化手段包括輕量化模型替換用YOLOv5n或YOLOv8n替換s版本速度提升明顯mAP可能下降2-3個點但工程上完全可接受。如果再進一步可以用NCNN或TensorRT進行推理加速實測能再快40%左右。輸入尺寸控制在416或320裂縫在大多數(shù)場景并不是極小的目標降低輸入分辨率不會讓精度掉太多但推理速度能提升一倍。圖像預處理優(yōu)化用OpenCV做resize和歸一化時用cv2.dnn.blobFromImage替代逐像素操作可以減少大量開銷。5.3 相似背景誤檢的針對性處理路面上的陰影邊緣、橋墩上的水痕、混凝土表面的模板縫這些背景特征在圖像中都呈現(xiàn)暗色線條狀很容易被裂縫模型誤判。處理這個問題我有幾條實戰(zhàn)經(jīng)驗第一是多尺度訓練和推理。模板縫和水痕往往具有明顯的寬度一致性而真實裂縫在寬度上變化更連續(xù)。多尺度訓練可以讓模型學到更豐富的尺度特征一定程度上區(qū)分兩者。第二是顏色空間增強。很多誤檢是因為灰度特征相似但顏色通道有差異。把訓練數(shù)據(jù)轉(zhuǎn)到HSV色彩空間對S和V通道做隨機擾動可以逼迫模型學習更魯棒的特征。第三是人工收集誤檢樣本做負樣本學習。把模型在真實巡檢數(shù)據(jù)上的誤檢圖像收集起來和正樣本混合后重新訓練一個版本。我做過一次誤檢率能從15%直接降到3%以下這是性價比最高的調(diào)優(yōu)手段。5.4 標注不一致問題多人協(xié)作標注時經(jīng)常出現(xiàn)同一個裂縫不同人標得粗細、長短不一致的情況這會嚴重影響分割質(zhì)量。我的建議是標注規(guī)范里明確要求標注區(qū)域只覆蓋裂縫的核心區(qū)域不包括周圍模糊過渡帶同時定期抽查標注質(zhì)量發(fā)現(xiàn)問題盡早返工。標注一致性對最終模型的影響比很多人想象的大得多。6. 數(shù)據(jù)集的擴展與自建思路公開數(shù)據(jù)集能覆蓋的只是通用場景如果你的裂縫檢測對象比較特殊比如水壩泄洪道、核電站冷卻塔、地鐵盾構(gòu)管片公開數(shù)據(jù)集基本都不夠用必須自建數(shù)據(jù)集。以下是我常用的自建數(shù)據(jù)路徑圖像采集無人機按固定航線巡檢或者手持工業(yè)相機按固定高度拍攝。關(guān)鍵要求是盡量覆蓋不同光照條件、不同拍攝角度、不同表面處理工藝。采集時注意保存GPS坐標和拍攝時間方便后續(xù)做缺陷定位。半自動標注流水線用訓練好的通用裂縫檢測模型對采集圖像進行預標注生成粗標簽。然后導入LabelImg或Roboflow人工修正檢測框和邊緣。實測下來這種方式比純?nèi)斯俗⒖?-5倍。數(shù)據(jù)增強擴充對標注完成的數(shù)據(jù)做離線增強旋轉(zhuǎn)、縮放、色彩擾動、噪聲疊加可以將有效訓練樣本量擴大5-10倍。增強時注意保持裂縫形態(tài)的合理性過度扭曲的裂縫反而會誤導模型。主動學習閉環(huán)模型訓練好后用它對新增數(shù)據(jù)做預測把置信度低或預測結(jié)果分散的樣本提取出來交給標注員優(yōu)先處理。這個閉環(huán)跑起來之后數(shù)據(jù)集的迭代效率會非常高效?;炷亮芽p檢測不是單一模型的問題而是一個數(shù)據(jù)-標注-訓練-迭代的系統(tǒng)工程。我把整理過的數(shù)據(jù)集合源碼項目分享出來是希望正在做這個方向的朋友少走彎路。至少在你規(guī)劃訓練集和選模型的時候這張表和這份實操路線能幫你省下一個禮拜的時間。本文還有配套的精品資源點擊獲取