據(jù)集:7820張圖與20類缺陷的labelme格式解析)
簡(jiǎn)介面向建筑安全檢測(cè)與計(jì)算機(jī)視覺(jué)研究者的墻壁損傷缺陷分割數(shù)據(jù)集以labelme標(biāo)注格式提供可用于訓(xùn)練和評(píng)估圖像分割算法實(shí)現(xiàn)剝落、銹蝕、裂縫等損傷的自動(dòng)識(shí)別與分類。資源包共1個(gè)docx文件約2.1MB內(nèi)含數(shù)據(jù)集說(shuō)明與標(biāo)注規(guī)范7820張640×640像素jpg圖片均配有對(duì)應(yīng)json標(biāo)注文件采用多邊形框精細(xì)描繪損傷區(qū)域覆蓋涂鴉、支座、潮濕斑跡、銹蝕、剝落、泛堿、空洞區(qū)域、風(fēng)化、殘留模板、空腔、外露鋼筋、伸縮縫、裂縫、排水、活動(dòng)裂縫、接頭膠帶、巖窩、防護(hù)設(shè)備、水侵蝕混凝土及物體共20個(gè)類別其中銹蝕、剝落、空腔等類別標(biāo)注量較為豐富。已有103人學(xué)習(xí)關(guān)注。讀者可據(jù)此了解數(shù)據(jù)集結(jié)構(gòu)、類別分布與標(biāo)注規(guī)則并自行將json轉(zhuǎn)換為mask、yolo或coco格式用于語(yǔ)義分割或?qū)嵗指顚?shí)驗(yàn)為建筑墻壁健康監(jiān)測(cè)研究提供數(shù)據(jù)基礎(chǔ)。1. 建筑墻壁損傷缺陷分割數(shù)據(jù)集7820 張圖背后的“建筑病歷本”到底長(zhǎng)什么樣如果你第一次聽(tīng)到“建筑墻壁損傷缺陷分割數(shù)據(jù)集”這個(gè)詞大概率會(huì)以為它是一份檢測(cè)報(bào)告或者某個(gè)軟件的名字。其實(shí)都不是。它更像一本被拆成 7820 頁(yè)的“建筑病歷本”每一頁(yè)是一張 640×640 的墻壁照片旁邊配一份 JSON 文件用多邊形把墻上的裂縫、銹蝕、剝落、泛堿一塊塊圈出來(lái)并寫(xiě)上這屬于哪一類毛病。這本“病歷本”一共記錄了 20 種損傷類別從涂鴉、支座到外露鋼筋、水侵蝕混凝土覆蓋了建筑外墻和結(jié)構(gòu)表面常見(jiàn)的缺陷形態(tài)。搞懂它的價(jià)值在于過(guò)去判斷一面墻有沒(méi)有問(wèn)題靠的是老師傅拿手電筒一寸寸看經(jīng)驗(yàn)難復(fù)制、標(biāo)準(zhǔn)難統(tǒng)一。而有了這種帶像素級(jí)標(biāo)注的數(shù)據(jù)算法就能學(xué)著“看圖識(shí)病”把人工巡檢變成可批量、可復(fù)現(xiàn)的自動(dòng)識(shí)別。對(duì)做計(jì)算機(jī)視覺(jué)的人來(lái)說(shuō)它是一份現(xiàn)成的分割訓(xùn)練素材對(duì)建筑檢測(cè)領(lǐng)域的人來(lái)說(shuō)它是一份把“墻面病害”翻譯成機(jī)器能讀的語(yǔ)言的樣本集。下面就從它是什么、為什么這樣設(shè)計(jì)、容易和什么搞混一層層拆開(kāi)講。2. 為什么是 labelme 格式一份“只給原料不給成品”的數(shù)據(jù)集2.1 labelme 格式到底存了什么很多人下載完數(shù)據(jù)集解壓一看只有 jpg 和 json沒(méi)有常見(jiàn)的 mask 圖片第一反應(yīng)是“是不是缺文件”。其實(shí)這正是 labelme 格式的特點(diǎn)它不直接給你一張黑白掩膜圖而是把標(biāo)注信息寫(xiě)進(jìn) JSON 里。每份 JSON 記錄的是多邊形頂點(diǎn)坐標(biāo)、類別名稱、圖片路徑這些原始信息相當(dāng)于把“畫(huà)框的過(guò)程”保存了下來(lái)而不是只保存“畫(huà)完的結(jié)果”。打個(gè)比方mask 文件像是一張已經(jīng)烤好的蛋糕你只能看不能改配方labelme 的 JSON 則像一份帶步驟的食譜面粉多少、糖多少、烤箱幾分鐘都寫(xiě)著你隨時(shí)可以調(diào)整。數(shù)據(jù)集明確說(shuō)明“不包含 mask 文件僅僅包含 jpg 圖片和對(duì)應(yīng)的 json 文件”這不是偷工減料而是把轉(zhuǎn)換的自由度留給了使用者。你可以把它轉(zhuǎn)成語(yǔ)義分割用的 mask也可以轉(zhuǎn)成 YOLO 或 COCO 格式做實(shí)例分割路線自己選。從標(biāo)注工具看這批數(shù)據(jù)用的是 labelme 5.5.0標(biāo)注方式是 polygon 多邊形框而不是簡(jiǎn)單的矩形框。多邊形意味著標(biāo)注者沿著損傷區(qū)域的實(shí)際輪廓描邊裂縫的細(xì)長(zhǎng)走向、剝落的不規(guī)則邊緣都能被貼合這對(duì)分割任務(wù)比矩形框精細(xì)得多。圖片統(tǒng)一為 640×640 分辨率尺寸規(guī)整省去了大量預(yù)處理時(shí)縮放裁剪的麻煩。2.2 為什么類別設(shè)計(jì)得這么“細(xì)”20 個(gè)類別乍看有點(diǎn)多但拆開(kāi)看是有層次的。有的描述材料劣化比如 Rust銹蝕、Spalling剝落、Efflorescence泛堿、Weathering風(fēng)化有的描述結(jié)構(gòu)異常比如 Crack裂縫、ACrack活動(dòng)裂縫、Hollowareas空洞區(qū)域、Cavity空腔、Rockpocket巖窩還有的偏向附屬設(shè)施或施工遺留比如 Bearing支座、EJoint伸縮縫、Drainage排水、JTape接頭膠帶、Restformwork殘留模板、PEquipment防護(hù)設(shè)備。這種細(xì)分不是為了湊數(shù)而是因?yàn)椴煌毕莸某梢蚝吞幚矸绞讲顒e很大模型如果只能識(shí)別“墻壞了”實(shí)用價(jià)值有限能分清是銹脹引起的剝落還是泛堿引起的表面析出才談得上輔助判斷。類別數(shù)量分布也很能說(shuō)明問(wèn)題。Rust 的標(biāo)注數(shù)達(dá)到 14665Spalling 有 9849Cavity 有 9222這三類占了很大比重而 object 只有 13 個(gè)ACrack 只有 423 個(gè)JTape 1076 個(gè)。這種長(zhǎng)尾分布是真實(shí)場(chǎng)景的寫(xiě)照——銹蝕和剝落在老舊建筑上隨處可見(jiàn)活動(dòng)裂縫和雜物的出現(xiàn)頻率則低得多。使用時(shí)要意識(shí)到樣本少的類別訓(xùn)練難度天然更高不能指望模型對(duì)每個(gè)類別都一視同仁地準(zhǔn)。提示數(shù)據(jù)集本身不對(duì)訓(xùn)練出的模型精度或權(quán)重作任何保證它提供的是“準(zhǔn)確且合理的標(biāo)注”不是“開(kāi)箱即用的檢測(cè)器”。把它當(dāng)成原料而不是成品。2.3 7820 張圖意味著什么量級(jí)7820 張 jpg 配 7820 份 json數(shù)量上一一對(duì)應(yīng)沒(méi)有漏標(biāo)。這個(gè)規(guī)模在建筑缺陷分割里屬于中等偏上夠用來(lái)訓(xùn)練一個(gè)中等復(fù)雜度的分割網(wǎng)絡(luò)也夠做一次有說(shuō)服力的對(duì)比實(shí)驗(yàn)但還不至于大到需要分布式訓(xùn)練。640×640 的分辨率對(duì)分割任務(wù)是個(gè)務(wù)實(shí)的選擇——再高會(huì)顯著增加顯存和標(biāo)注成本再低則裂縫這類細(xì)長(zhǎng)目標(biāo)容易糊成一片。從使用角度看這個(gè)量級(jí)適合做幾件事訓(xùn)練一個(gè)基線分割模型、驗(yàn)證某種數(shù)據(jù)增強(qiáng)策略對(duì)缺陷識(shí)別的效果、或者拿其中一部分做微調(diào)。它不適合直接當(dāng)成“萬(wàn)能檢測(cè)器”的充分條件因?yàn)榻ㄖ?chǎng)景的光照、材質(zhì)、拍攝角度變化極大單一數(shù)據(jù)集很難覆蓋全部情況。理解這一點(diǎn)比記住 7820 這個(gè)數(shù)字更重要。3. 20 個(gè)類別怎么讀從“墻面病害”到“機(jī)器可讀標(biāo)簽”3.1 材料劣化類銹蝕、剝落、泛堿、風(fēng)化這幾類是墻面最直觀的“病”。Rust 指鋼筋或金屬件銹蝕后在表面留下的銹跡和銹脹標(biāo)注數(shù) 14665是全集最多的類別說(shuō)明它在樣本里出現(xiàn)得極其頻繁。Spalling 是剝落混凝土表層成片掉渣往往和銹脹、凍融有關(guān)標(biāo)注數(shù) 9849。Efflorescence 是泛堿墻面析出白色鹽霜看著像發(fā)霉但不是標(biāo)注數(shù) 3956。Weathering 是風(fēng)化表面被日曬雨淋磨得粗糙變色標(biāo)注數(shù) 4621。這四類容易在視覺(jué)上互相干擾銹跡偏紅褐泛堿偏白剝落有凹凸陰影風(fēng)化則是整體質(zhì)感變化。模型要分清它們靠的不是顏色單一特征而是紋理和邊界的組合。標(biāo)注時(shí)用多邊形沿實(shí)際區(qū)域描邊正好保留了這些邊界信息比矩形框更能體現(xiàn)“病斑”的形狀。3.2 結(jié)構(gòu)異常類裂縫、活動(dòng)裂縫、空腔、空洞區(qū)域、巖窩Crack 是普通裂縫標(biāo)注數(shù) 3612ACrack 是活動(dòng)裂縫標(biāo)注數(shù) 423數(shù)量少但含義特殊——活動(dòng)裂縫意味著它還在發(fā)展對(duì)結(jié)構(gòu)安全的提示更強(qiáng)。Hollowareas 是空洞區(qū)域標(biāo)注數(shù) 1538Cavity 是空腔標(biāo)注數(shù) 9222兩者名字接近但標(biāo)注量差很多使用時(shí)要按數(shù)據(jù)集給出的定義來(lái)理解不要自行合并。Rockpocket 是巖窩標(biāo)注數(shù) 616屬于混凝土澆筑或基層處理留下的凹坑。裂縫類目標(biāo)的特點(diǎn)是細(xì)長(zhǎng)、對(duì)比度低分割難度高。640×640 的分辨率下一條細(xì)裂縫可能只占幾個(gè)像素寬多邊形標(biāo)注能否貼合走向直接影響模型學(xué)到的邊界質(zhì)量。這也是為什么數(shù)據(jù)集強(qiáng)調(diào)“對(duì)類別進(jìn)行畫(huà)多邊形框 polygon”——矩形框會(huì)把大量背景裹進(jìn)去細(xì)裂縫就學(xué)不準(zhǔn)了。3.3 附屬與施工遺留類支座、伸縮縫、排水、接頭膠帶、殘留模板、防護(hù)設(shè)備Bearing支座標(biāo)注 1201EJoint伸縮縫506Drainage排水1649JTape接頭膠帶1076Restformwork殘留模板1019PEquipment防護(hù)設(shè)備1892。這些類別嚴(yán)格說(shuō)不是“損傷”而是墻面上的構(gòu)件或施工痕跡。它們被納入標(biāo)注是因?yàn)樵谡鎸?shí)巡檢畫(huà)面里這些元素經(jīng)常和缺陷混在一起模型如果分不清“這是伸縮縫”和“這是裂縫”就會(huì)誤報(bào)。舉個(gè)具體場(chǎng)景一條筆直的伸縮縫在照片里和一條直裂縫很像但前者是設(shè)計(jì)預(yù)留后者是病害。數(shù)據(jù)集把 EJoint 單獨(dú)列類就是讓模型有機(jī)會(huì)學(xué)會(huì)區(qū)分。同理接頭膠帶和殘留模板屬于施工遺留容易被當(dāng)成表面異物單獨(dú)成類能減少混淆。這類“非損傷類別”的存在恰恰說(shuō)明數(shù)據(jù)集的設(shè)計(jì)考慮了真實(shí)巡檢的干擾因素而不是只挑干凈的病害樣本。3.4 長(zhǎng)尾類別與 object 的定位object 只有 13 個(gè)標(biāo)注是全集最少的類別含義是“物體”大概率用于兜底標(biāo)注畫(huà)面里無(wú)法歸入其他類別的干擾物。ACrack 423、Rockpocket 616、EJoint 506 也屬于長(zhǎng)尾。長(zhǎng)尾類別在訓(xùn)練時(shí)容易被大類淹沒(méi)如果直接按整體精度評(píng)估模型可能對(duì)它們幾乎不響應(yīng)卻 still 拿到好看的分?jǐn)?shù)。使用這份數(shù)據(jù)時(shí)比較穩(wěn)妥的做法是分類別看指標(biāo)而不是只看一個(gè)總數(shù)。注意類別名稱里的英文拼寫(xiě)如 WConccor、Restformwork是數(shù)據(jù)集原始定義轉(zhuǎn)換格式時(shí)保持原樣不要自行“糾正”否則和 json 里的標(biāo)簽對(duì)不上。4. 易混概念辨析分割數(shù)據(jù)集不是檢測(cè)數(shù)據(jù)集labelme 不是 mask4.1 易混點(diǎn)一分割數(shù)據(jù)集和檢測(cè)數(shù)據(jù)集很多人把“缺陷分割數(shù)據(jù)集”和“缺陷檢測(cè)數(shù)據(jù)集”當(dāng)成一回事?;煜脑蚴莾蓚€(gè)任務(wù)都輸出“哪里有缺陷”看起來(lái)差不多。區(qū)別在于輸出粒度檢測(cè)任務(wù)給的是矩形框告訴你“這個(gè)區(qū)域有裂縫”分割任務(wù)給的是像素級(jí)掩膜告訴你“這幾個(gè)像素是裂縫旁邊那些不是”。這份數(shù)據(jù)集用 polygon 多邊形標(biāo)注走的是分割路線雖然也能降級(jí)轉(zhuǎn)成檢測(cè)框用但它的核心價(jià)值在像素級(jí)邊界。怎么區(qū)分看標(biāo)注文件里存的是什么。如果只有框的左上角坐標(biāo)和寬高那是檢測(cè)如果是多邊形頂點(diǎn)序列那是分割。這份數(shù)據(jù)的 json 里是多邊形點(diǎn)集所以它天然服務(wù)于語(yǔ)義分割或?qū)嵗指疃皇菃渭兊目驒z測(cè)。4.2 易混點(diǎn)二labelme 的 json 和 mask 圖片新手最容易卡在這里以為下載完就能直接喂給分割網(wǎng)絡(luò)結(jié)果發(fā)現(xiàn)沒(méi)有 mask 圖。json 是“標(biāo)注的源文件”mask 是“標(biāo)注的渲染結(jié)果”。json 里存的是類別和多邊形坐標(biāo)mask 是把這些多邊形按類別填成不同像素值的圖。兩者信息等價(jià)但格式不同。數(shù)據(jù)集只給 json意味著轉(zhuǎn)換這一步要自己做可以轉(zhuǎn) mask也可以轉(zhuǎn) YOLO 的 txt 或 COCO 的 json。為什么這樣設(shè)計(jì)因?yàn)椴煌蚣芤母袷讲灰粯咏y(tǒng)一給源文件反而最靈活。代價(jià)是使用者得會(huì)寫(xiě)轉(zhuǎn)換腳本或者找現(xiàn)成工具。這不是缺陷是取舍。4.3 易混點(diǎn)三語(yǔ)義分割和實(shí)例分割語(yǔ)義分割把同一類別的所有像素標(biāo)成同一個(gè)值不區(qū)分“這是第幾條裂縫”實(shí)例分割則要把每一條裂縫單獨(dú)區(qū)分開(kāi)。這份數(shù)據(jù)的 json 里每個(gè)多邊形是獨(dú)立對(duì)象理論上兩種任務(wù)都能支持但轉(zhuǎn)格式時(shí)要明確目標(biāo)轉(zhuǎn)成語(yǔ)義 mask 就把同類合并轉(zhuǎn)成實(shí)例標(biāo)注就保留每個(gè)多邊形的獨(dú)立性。搞混了會(huì)導(dǎo)致評(píng)估口徑不一致訓(xùn)練出來(lái)的模型用途也對(duì)不上。4.4 易混點(diǎn)四標(biāo)注數(shù)量多不等于類別重要Rust 有 14665 個(gè)標(biāo)注object 只有 13 個(gè)數(shù)量差距巨大。有人會(huì)直覺(jué)認(rèn)為“標(biāo)注多的類別更重要”其實(shí)數(shù)量多只說(shuō)明它在樣本里常見(jiàn)不代表它在業(yè)務(wù)上優(yōu)先級(jí)高?;顒?dòng)裂縫只有 423 個(gè)但它對(duì)結(jié)構(gòu)安全的警示意義可能遠(yuǎn)超大量普通銹跡。使用數(shù)據(jù)集時(shí)類別權(quán)重應(yīng)該按業(yè)務(wù)目標(biāo)來(lái)定而不是按標(biāo)注數(shù)量排序。4.5 易混點(diǎn)五數(shù)據(jù)集開(kāi)放不等于模型可用數(shù)據(jù)集說(shuō)明里寫(xiě)得很清楚只提供圖片和標(biāo)注不對(duì)訓(xùn)練出的模型或權(quán)重精度作保證。這和“下載即用”是兩回事。混淆點(diǎn)在于很多人把“數(shù)據(jù)質(zhì)量好”等同于“模型效果好”。實(shí)際上標(biāo)注準(zhǔn)確只是必要條件模型效果還取決于網(wǎng)絡(luò)結(jié)構(gòu)、訓(xùn)練策略、數(shù)據(jù)增強(qiáng)、場(chǎng)景匹配度。把這份數(shù)據(jù)當(dāng)成起點(diǎn)而不是終點(diǎn)心態(tài)就對(duì)了。5. 什么時(shí)候該用它、什么時(shí)候別硬上一份邊界判斷5.1 適合用的場(chǎng)景第一類做建筑缺陷分割的基線實(shí)驗(yàn)。7820 張 640×640 圖、20 類多邊形標(biāo)注規(guī)模適中、格式統(tǒng)一拿來(lái)跑一個(gè)分割網(wǎng)絡(luò)、驗(yàn)證某個(gè)改進(jìn)模塊有沒(méi)有效是很順手的起點(diǎn)。第二類做 labelme 到其他格式的轉(zhuǎn)換流程驗(yàn)證。json 轉(zhuǎn) mask、轉(zhuǎn) YOLO、轉(zhuǎn) COCO這套數(shù)據(jù)量足夠暴露轉(zhuǎn)換腳本里的邊界問(wèn)題比如多邊形自相交、類別名映射遺漏。第三類做長(zhǎng)尾分布下的類別不平衡研究。Rust 一萬(wàn)多、object 十幾個(gè)天然就是一個(gè)不平衡樣本適合測(cè)試重采樣、損失加權(quán)這些手段。具體到操作層面轉(zhuǎn)換時(shí)可以先用一小批數(shù)據(jù)驗(yàn)證流程比如先取 50 張跑通再全量。下面是一段把 labelme json 轉(zhuǎn)成二值 mask 的示意代碼只保留多邊形填充邏輯實(shí)際使用時(shí)按類別映射改顏色值import json import numpy as np from PIL import Image, ImageDraw # 讀取單份 labelme json把多邊形按類別填成不同像素值 with open(sample.json, r, encodingutf-8) as f: data json.load(f) h, w data[imageHeight], data[imageWidth] mask np.zeros((h, w), dtypenp.uint8) # 類別名到像素值的映射需與訓(xùn)練時(shí)的類別表一致 cls_map {Crack: 1, Rust: 2, Spalling: 3} draw ImageDraw.Draw(Image.fromarray(mask)) for shape in data[shapes]: label shape[label] if label not in cls_map: continue points [tuple(p) for p in shape[points]] # polygon 填充第三個(gè)參數(shù)是類別像素值 ImageDraw.Draw(Image.fromarray(mask)).polygon(points, fillcls_map[label])這段代碼的關(guān)鍵點(diǎn)有三個(gè)imageHeight和imageWidth決定 mask 尺寸必須和原圖一致shapes里每個(gè)元素的points是多邊形頂點(diǎn)順序不能亂cls_map是類別名到像素值的映射必須和后續(xù)訓(xùn)練配置對(duì)齊漏一個(gè)類別就會(huì)導(dǎo)致該類被當(dāng)成背景。實(shí)際轉(zhuǎn)換時(shí)還要處理多邊形點(diǎn)數(shù)為奇數(shù)、坐標(biāo)越界這些臟數(shù)據(jù)建議先統(tǒng)計(jì)一遍再批量跑。5.2 不適合硬上的場(chǎng)景如果目標(biāo)是直接上線一個(gè)“拍張照就知道墻壞沒(méi)壞”的產(chǎn)品這份數(shù)據(jù)單獨(dú)不夠。它覆蓋的是特定拍攝條件下的 640×640 畫(huà)面真實(shí)巡檢的光照、距離、遮擋變化更復(fù)雜模型泛化需要更多場(chǎng)景數(shù)據(jù)補(bǔ)充。如果目標(biāo)是檢測(cè)非墻面對(duì)象比如路面、橋梁底面類別體系對(duì)不上硬套只會(huì)得到一堆錯(cuò)標(biāo)。如果團(tuán)隊(duì)沒(méi)有格式轉(zhuǎn)換能力又不愿意寫(xiě)腳本那 labelme 的 json 會(huì)成為第一道坎這時(shí)候要么先補(bǔ)轉(zhuǎn)換工具鏈要么換現(xiàn)成的 mask 格式數(shù)據(jù)集。還有一個(gè)容易被忽略的邊界這份數(shù)據(jù)不包含模型評(píng)估結(jié)果也沒(méi)有劃分訓(xùn)練集和驗(yàn)證集。拿到手需要自己切分切分時(shí)要注意同一面墻的多個(gè)角度圖片不要跨集泄漏否則驗(yàn)證分?jǐn)?shù)會(huì)虛高。這個(gè)坑我踩過(guò)——早些年拿類似數(shù)據(jù)直接隨機(jī)切分驗(yàn)證集里混進(jìn)了訓(xùn)練集同場(chǎng)景的圖指標(biāo)好看得離譜換真實(shí)場(chǎng)景就翻車。從那以后我每次切分前都先按拍攝來(lái)源分組再在組內(nèi)隨機(jī)寧可訓(xùn)練集小一點(diǎn)也不讓驗(yàn)證集“見(jiàn)過(guò)答案”。希望這份拆解能幫你在打開(kāi)那 7820 份 json 之前先想清楚自己要拿它做什么、缺哪一步、邊界在哪。本文還有配套的精品資源點(diǎn)擊獲取