據(jù)集實戰(zhàn):270張標(biāo)注圖與U-Net訓(xùn)練避坑指南)
簡介面向計算機視覺與無人機遙感應(yīng)用開發(fā)者這套高分辨率城市圖像語義分割數(shù)據(jù)集覆蓋建筑、公路、樹木等8個常見地物類別可緩解城市場景標(biāo)注數(shù)據(jù)不足的問題適合作為分割模型的訓(xùn)練與驗證基準(zhǔn)。壓縮包共543個文件以541張PNG原圖與對應(yīng)掩碼為主另含1個類別說明文件和1個Python可視化腳本整體約263.73MB該腳本可隨機抽取一張樣本將原始圖像、GT真值圖及GT疊加蒙版效果并排展示并保存到當(dāng)前目錄便于直觀核對標(biāo)注質(zhì)量。訓(xùn)練集約200張、驗證集約70張圖像與掩碼一一對應(yīng)目錄按訓(xùn)練集、驗證集劃分清晰PNG格式便于直接接入常見深度學(xué)習(xí)框架類別定義見classes文本可根據(jù)研究需要調(diào)整標(biāo)簽映射。數(shù)據(jù)既可直接用于U-Net、SwinUNet、TransUNet等分割網(wǎng)絡(luò)的訓(xùn)練與評估也適合開展數(shù)據(jù)增強、遷移學(xué)習(xí)、類別不平衡等方向的小規(guī)模驗證實驗。目前已有386人學(xué)習(xí)下載。1. 高分辨率無人機城市圖像語義分割270 張帶標(biāo)簽數(shù)據(jù)比模型更早決定你的上限說到高分辨率無人機城市圖像語義分割卡住大多數(shù)人的往往不是模型選型而是標(biāo)注對齊的數(shù)據(jù)集。這份資源就是沖這個來的約 270 張無人機城市航拍圖訓(xùn)練集約 200 張、驗證集約 70 張每張原圖配一張 8 類別的 GT mask覆蓋建筑、道路、樹木等典型地物完整類別清單以包內(nèi) classes 文件為準(zhǔn)。解壓后 train/images、train/masks、val/images、val/masks 目錄規(guī)整還帶一個可視化腳本隨機抽圖把原圖、GT、半透明蒙版拼成一張圖存盤。對正在調(diào) U-Net、SwinUNet 的開發(fā)者來說它省掉的是最痛苦的環(huán)節(jié)——一張張在標(biāo)注軟件里畫多邊形再轉(zhuǎn) mask對剛?cè)腴T語義分割、想完整走一遍數(shù)據(jù)到訓(xùn)練鏈路的新手來說它又是一份能直接跑通的基準(zhǔn)數(shù)據(jù)。在無人機視覺感知項目里我最大的體會是指標(biāo)虛高、換場景就崩十有八九不是模型問題而是數(shù)據(jù)切分和標(biāo)簽編碼有問題。下面拆目錄、拆腳本再把最容易翻車的幾個坑逐個排掉。2. 數(shù)據(jù)集結(jié)構(gòu)與標(biāo)簽編碼270 張圖、8 類 mask先驗數(shù)據(jù)再定方案2.1 目錄劃分與文件命名規(guī)則解壓之后先別急著預(yù)覽圖片第一件事是確認(rèn)目錄層級。所有訓(xùn)練腳本的路徑、數(shù)據(jù)加載器的遍歷邏輯都要圍繞這個結(jié)構(gòu)來寫結(jié)構(gòu)認(rèn)錯了后面每一步都跟著錯。這份數(shù)據(jù)集的目錄很規(guī)整常見做法是整理成下面這樣drone_city_seg/ ├── classes.txt # 8 類標(biāo)簽清單每行一個類名 ├── visualize.py # GT 可視化腳本隨機抽圖出體檢報告 ├── train/ │ ├── images/ # 訓(xùn)練原圖約 200 張 PNG │ │ ├── seq3_000200.png │ │ ├── seq2_000900.png │ │ └── ... │ └── masks/ # 與原圖同名的 GT一一對應(yīng) │ ├── seq3_000200.png │ └── ... └── val/ ├── images/ # 驗證原圖約 70 張 PNG └── masks/文件名本身就是信息。seq3_000200.png 這種命名里seq 是序列編號可以理解為一次航拍任務(wù)里的航帶號后面 6 位數(shù)字是幀號。不同 seq 大概率來自不同的拍攝時段或不同區(qū)域同一個 seq 內(nèi)部相鄰幀的視角、光照、地面景物高度相似。這個特點直接決定訓(xùn)練集和驗證集該怎么切如果隨機切分而不是按 seq 隔離驗證集里會出現(xiàn)和訓(xùn)練集幾乎同畫面的相鄰幀測出來的 mIOU 會虛高這個問題第 4 章會展開講。還要提醒一個細(xì)節(jié)網(wǎng)上的轉(zhuǎn)述說“約 270 張”“訓(xùn)練集 200 張左右、驗證集 70 張左右”解壓后建議用命令核對真實數(shù)量不要照搬轉(zhuǎn)述數(shù)字這類數(shù)據(jù)在二次分發(fā)時數(shù)量對不上是常事。ls train/images/*.png | wc -l ls val/images/*.png | wc -l從資源里給出的文件名樣例看seq3_000200、seq2_000900、seq14_000200、seq13_000600、seq36_000400 這些序列號跨度很大說明拍攝覆蓋了多條航帶和多個街塊不是單一路線的重復(fù)幀。這對訓(xùn)練泛化是有利的但也意味著如果驗證集只從某幾個 seq 抽評估結(jié)果會偏向那幾條航帶的地物風(fēng)格。2.2 8 類標(biāo)簽與 mask 編碼方式classes 文件是這份數(shù)據(jù)的“字典”格式一般是每行一個類名行號對應(yīng)類別索引。摘要里明確提到的類別有建筑、道路、樹其余幾類以包內(nèi) classes 文件為準(zhǔn)。特別提醒轉(zhuǎn)述文檔里出現(xiàn)過“樹”被寫成“書”的情況所以判斷類別永遠(yuǎn)以 classes.txt 原文為準(zhǔn)不要信二手轉(zhuǎn)述。類別清單對應(yīng)的語義大致如下類別索引類別名說明0背景不歸屬其他類的區(qū)域1建筑屋頂、墻體等建筑區(qū)域2道路車行道、路面區(qū)域3樹木樹冠、樹叢等植被4~7以 classes.txt 為準(zhǔn)其余類別打開文件即見這里值得多講一句語義分割和實例分割的區(qū)別。YOLO 系列里帶的是實例分割那種掩碼每個目標(biāo)一個 mask 實例而這份數(shù)據(jù)是像素級的語義分割標(biāo)簽全圖每個像素都屬于且只屬于一個類別同一類別的多個對象共享同一個索引。數(shù)據(jù)加載、評估指標(biāo)的計算方式都要按語義分割來不能拿實例分割的思路去套否則會出很多底層錯誤。mask 的編碼方式直接決定 DataLoader 怎么寫。常見做法有兩種一種是單通道索引圖像素值就是類別索引另一種是 RGB 調(diào)色板圖看起來是彩色的但本質(zhì)仍然是索引。打開任意一張 mask 用這段代碼確認(rèn)import numpy as np from PIL import Image # 檢查單張 GTshape 和類別取值決定后續(xù)預(yù)處理方式 mask np.array(Image.open(train/masks/seq3_000200.png)) print(shape:, mask.shape, dtype:, mask.dtype) print(unique values:, np.unique(mask))如果 shape 是 (H, W) 且 unique values 落在 0~7說明是單通道索引圖直接交給 CrossEntropyLoss 就行如果 shape 是 (H, W, 3)說明 GT 存成了三通道形式需要在預(yù)處理里先降維。這段判斷代碼建議寫進(jìn)數(shù)據(jù)加載模塊每次啟動訓(xùn)練自動檢查一次而不是靠人肉記憶。2.3 訓(xùn)練集驗證集劃分與適用場景270 張左右的總量訓(xùn)練集約 200 張、驗證集約 70 張比例大約是 74/26。對中小規(guī)模的無人機城市分割任務(wù)來說這個切分合理訓(xùn)練量足夠微調(diào)一個 U-Net 或 SwinUNet 的編碼器驗證集也能看出趨勢。但要清醒一點這個量級不適合從零訓(xùn)練大模型更適合做三類事情——遷移學(xué)習(xí)、改進(jìn)算法的橫向?qū)Ρ?、驗證你自己的數(shù)據(jù)管線是否可靠。落到實操上這份數(shù)據(jù)最常見的用法是加載預(yù)訓(xùn)練權(quán)重把最后的分割頭換成 8 類輸出凍結(jié)編碼器只訓(xùn)解碼器或者全量微調(diào)。270 張圖在小模型上單卡 2~4 小時能跑完一個完整訓(xùn)練周期非常適合做消融實驗。動手之前建議做一次重疊檢查統(tǒng)計 train 和 val 里各自出現(xiàn)了哪些 seq 編號確認(rèn)沒有同一個 seq 的幀同時出現(xiàn)在兩邊。把文件名解析成 (seq, frame) 元組再做集合求交一條腳本就能完成。如果真的有重疊說明當(dāng)前切分不干凈需要按第 4 章的方法重新劃一遍。這一步做不做直接影響后面所有實驗結(jié)論的可信度。3. 可視化腳本實戰(zhàn)隨機抽圖、GT 蒙版疊加、一次跑出十張體檢圖3.1 運行方式與輸出資源附帶的可視化腳本用途是隨機抽一張訓(xùn)練圖把原圖、GT、以及 GT 半透明疊加在原圖上的效果拼成一張三格圖保存到當(dāng)前目錄。這個動作看似簡單卻是數(shù)據(jù)體檢的第一步跑一遍你就能直觀看到標(biāo)簽貼得準(zhǔn)不準(zhǔn)、類別邊界干不干凈、有沒有明顯漏標(biāo)。運行方式# 在數(shù)據(jù)集根目錄執(zhí)行腳本默認(rèn)讀取 train/images 和 train/masks python visualize.py腳本沒有命令行參數(shù)路徑寫在源碼里。如果你的目錄結(jié)構(gòu)不是標(biāo)準(zhǔn)的 train/images、train/masks打開腳本改頭部幾個路徑常量就行通常兩三行。輸出文件名一般是 visual_check.png保存在當(dāng)前目錄。多跑幾次每次隨機抽到的圖都不同因為腳本內(nèi)部用的是 random.choice。3.2 核心邏輯拆解與參數(shù)含義腳本完整邏輯可以濃縮成下面這段等價代碼參數(shù)含義我逐個標(biāo)注import os import random import numpy as np import matplotlib matplotlib.use(Agg) # 無界面環(huán)境也能存圖 import matplotlib.pyplot as plt from PIL import Image image_dir train/images mask_dir train/masks files [f for f in os.listdir(image_dir) if f.endswith(.png)] # 隨機抽一張保證每次體檢看到的樣本不同 pick random.choice(files) image np.array(Image.open(os.path.join(image_dir, pick))) mask np.array(Image.open(os.path.join(mask_dir, pick))) # 半透明疊加GT 區(qū)域混入 50% 紅色 overlay image.copy() if mask.ndim 3: # 彩色 GT 先壓成單通道 mask mask[:, :, 0] # 示例降維嚴(yán)謹(jǐn)做法看 4.1 overlay[mask 0] (overlay[mask 0].astype(np.float32) * 0.5 np.array([255, 0, 0]) * 0.5).astype(np.uint8) fig, axes plt.subplots(1, 3, figsize(15, 5)) axes[0].imshow(image) # 第一格原圖 axes[1].imshow(mask, cmaptab20, vmin0, vmax7) # 第二格GT axes[2].imshow(overlay) # 第三格疊加 plt.tight_layout() plt.savefig(visual_check.png, dpi150)幾個參數(shù)說明overlay 里的 0.5 是原圖和紅色的混合權(quán)重想看得更透就把原圖權(quán)重壓到 0.3cmaptab20 把 8 個類別映射成不同顏色vmin 和 vmax 鎖死 0~7 的范圍避免類別沒打滿時 matplotlib 自動拉伸色標(biāo)導(dǎo)致相鄰類別顏色接近dpi150 保證保存圖放大后邊緣依然清楚方便檢查標(biāo)簽邊界是否對齊。這里有個容易忽略的點如果 mask 是彩色三通道直接 imshow 會得到一整片彩色而不是分塊分色。所以疊加前必須先判斷 ndim這也是腳本里最值得抄的防御性寫法。我見過不少人的可視化腳本栽在這一步GT 一顯示就是花花綠綠的噪點還以為是數(shù)據(jù)壞了。3.3 我一般怎么拿這個腳本做標(biāo)簽體檢推薦一個實用的習(xí)慣把腳本連續(xù)跑 10 遍每次隨機抽圖然后把 10 張 visual_check.png 拼到一張大圖上集中過目。重點看三類問題第一建筑輪廓的邊緣是否貼齊屋頂真實邊界。無人機視角下屋頂和地面的分界線錯位是最常見的標(biāo)注瑕疵尤其在斜頂建筑上蒙版會明顯偏移一眼就能看出來。第二道路是否連續(xù)。斷頭路通常意味著漏標(biāo)或者路段被樹冠遮擋后標(biāo)注員直接放棄。對后續(xù)做無人機路徑規(guī)劃類應(yīng)用來說不連續(xù)的道路標(biāo)簽會讓模型永遠(yuǎn)學(xué)不會完整路面。第三有沒有整片區(qū)域被標(biāo)成大類別、小目標(biāo)被吞掉的情況。車輛、路燈、井蓋這類像素占比極小的對象在人眼抽查時最容易暴露而在 mIOU 數(shù)字里幾乎看不出來。這輪體檢做完你對這份數(shù)據(jù)適合什么任務(wù)、邊界在哪心里基本有底了比直接丟進(jìn)模型訓(xùn)練省時間得多。順便說一句想自制語義分割數(shù)據(jù)集的話這套“隨機抽圖 半透明蒙版”的檢查流程可以直接用作質(zhì)檢工具標(biāo)注一批查一批效率很高。4. 避坑指南無人機城市分割數(shù)據(jù)集最常翻車的 5 個坑4.1 mask 讀出來是彩色圖loss 直接異?,F(xiàn)象訓(xùn)練時 CrossEntropyLoss 報錯或者 loss 從第一個 epoch 起就是 nan打印 GT 數(shù)組shape 是 (H, W, 3) 而不是 (H, W)。原因GT 保存成了 RGB 調(diào)色板 PNG不是單通道索引圖。這類數(shù)據(jù)集在搬運過程中讀圖腳本和保存腳本不一致很容易留下這種隱性炸彈。有些模型能跑通是因為數(shù)據(jù)加載代碼里無意間只取了第一通道但不同腳本各寫一套遲早出事。解決統(tǒng)一在讀圖環(huán)節(jié)做降維。如果顏色是逐類純色用顏色查找表映射如果帶調(diào)色板用 PIL 轉(zhuǎn)成 P 模式再取索引。建議封裝一個 to_index() 函數(shù)在 DataLoader 里強制走一遍并在每次啟動訓(xùn)練時自動打印 GT 的 shape 和 unique values 做校驗。這套校驗邏輯值得寫進(jìn)你自己的工具函數(shù)庫所有分割數(shù)據(jù)集通用。4.2 驗證集 mIOU 虛高換場景立刻崩現(xiàn)象在 val 上 mIOU 做到 0.8 以上自己拿無人機新拍一組城市畫面測試指標(biāo)掉到 0.5 以下模型像失憶了一樣。原因train 和 val 是隨機切幀的沒有按 seq 序列隔離。同一航帶相鄰幀的視角、光照、地物幾乎完全相同模型等于背下了畫面而不是學(xué)到了語義。這是航拍數(shù)據(jù)集最大的數(shù)據(jù)泄漏源比一般數(shù)據(jù)集里“同場景不同幀”的泄漏還要嚴(yán)重。解決按 seq 編號重新切分保證同一個 seq 的幀只落在 train 或 val 的一側(cè)。做法是先解析所有文件名為 (seq, frame) 元組按 seq 分組后再切分而不是一張一張隨機抽。切完之后再跑一遍第 2.3 節(jié)的集合求交確認(rèn)兩側(cè)沒有同 seq 幀。4.3 classes 文件被轉(zhuǎn)述錯類別名對不上現(xiàn)象文檔說 8 類但 classes 文件只有 7 行或者類別名里出現(xiàn)“書”這種明顯不屬于城市地物的詞。原因數(shù)據(jù)集在二次分發(fā)時說明文檔被反復(fù)改寫tree 被轉(zhuǎn)述成“書”也出現(xiàn)過整行類別在復(fù)制粘貼時丟失的情況。摘要只點到了建筑、公路、樹三個類別剩下的必須看包內(nèi)文件。解決永遠(yuǎn)以包內(nèi) classes 文件為準(zhǔn)而不是網(wǎng)上的轉(zhuǎn)述文字。解壓后第一件事就是打開 classes.txt 數(shù)行數(shù)。如果確實少了一類用第 3 章的可視化腳本逐張看 GT 的顏色分布確認(rèn)實際標(biāo)注了幾類再決定是補類別還是裁剪類別不要硬按 8 類訓(xùn)練。4.4 高分辨率原圖直接進(jìn)模型顯存爆掉現(xiàn)象單張原圖分辨率很高直接按原尺寸進(jìn) U-Netbatch 稍微大一顯存就 OOM強行 resize 到 256 又發(fā)現(xiàn)小目標(biāo)細(xì)節(jié)全丟。原因無人機影像分辨率普遍很高直接等比縮放損失小目標(biāo)細(xì)節(jié)直接原尺寸輸入顯存又扛不住。這是高分辨率分割的老矛盾不是這份數(shù)據(jù)獨有但在這類航拍數(shù)據(jù)上特別明顯。解決訓(xùn)練時先等比縮小到長邊 2048 以內(nèi)再隨機裁剪到 512 或 640驗證階段用滑窗推理再拼接??s放 mask 時必須用 INTER_NEAREST 最近鄰插值線性插值會在類別邊界生成不存在的中間值等于給標(biāo)簽摻了噪聲。具體參數(shù)和代碼在第 5.1 節(jié)。4.5 小目標(biāo)類別學(xué)不到逐類指標(biāo)暴露真相現(xiàn)象整體 mIOU 看著不錯但逐類看時車輛、路燈這類小目標(biāo)類別 IoU 接近 0實際應(yīng)用里漏檢嚴(yán)重。原因類別極不平衡。建筑和道路占據(jù)了大部分像素?fù)p失被高頻類別主導(dǎo)小目標(biāo)類別的梯度被淹沒模型直接擺爛不學(xué)。解決統(tǒng)計每類像素占比用中位數(shù)頻率平衡法給每個類別算權(quán)重傳給 CrossEntropyLoss 的 weight 參數(shù)或者對小目標(biāo)類別在采樣階段做針對性重采樣。權(quán)重計算代碼在第 5.2 節(jié)。另外評估時一定要逐類打印 IoU只看平均 mIOU 會掩蓋這個小目標(biāo)問題。5. 從數(shù)據(jù)集到模型U-Net/SwinUNet 訓(xùn)練前先完成三件事5.1 尺寸策略等比縮放 隨機裁剪別讓高分辨率拖垮訓(xùn)練270 張高分辨率無人機圖直接整圖訓(xùn)練不現(xiàn)實顯存占用有時候很玄學(xué)同樣的尺寸換個 batch 就爆。我常用的策略是先等比縮放再隨機裁剪兼顧全局上下文和顯存上限代碼import cv2 import numpy as np import random def load_and_crop(image_path, mask_path, crop_size(512, 512)): # 讀原圖和 GTGT 用 IMREAD_UNCHANGED 保留原始通道 image cv2.imread(image_path) image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) mask cv2.imread(mask_path, cv2.IMREAD_UNCHANGED) # 長邊縮到 2048 以內(nèi)保持寬高比 h, w image.shape[:2] scale min(1.0, 2048 / max(h, w)) if scale 1.0: image cv2.resize(image, (int(w * scale), int(h * scale))) mask cv2.resize(mask, (int(w * scale), int(h * scale)), interpolationcv2.INTER_NEAREST) # 隨機裁剪固定尺寸GT 不能做任何線性插值 h, w image.shape[:2] top random.randint(0, h - crop_size[0]) left random.randint(0, w - crop_size[1]) return (image[top:top crop_size[0], left:left crop_size[1]], mask[top:top crop_size[0], left:left crop_size[1]])兩個參數(shù)最關(guān)鍵scale 的 2048 是長邊上限顯卡 8G 以下建議降到 1536crop_size 的 512 要和模型下采樣倍數(shù)對齊U-Net 這類編碼器下采樣 4 次512 正好能被整除??s小時 mask 必須用 INTER_NEAREST否則邊界會出現(xiàn)不存在的插值類別。如果你的場景特別在意車輛這類小目標(biāo)可以把縮放上限提高、crop 尺寸調(diào)小用更多裁剪塊來彌補采樣覆蓋率。5.2 類別不均衡先算權(quán)重再選損失8 類數(shù)據(jù)里建筑和道路占大頭幾乎是一定的訓(xùn)練前先算一遍類別權(quán)重別等訓(xùn)練完再看逐類指標(biāo)后悔。用中位數(shù)頻率平衡from collections import Counter import numpy as np import os from PIL import Image def compute_class_weight(mask_dir, num_classes8): counter Counter() for name in os.listdir(mask_dir): mask np.array(Image.open(os.path.join(mask_dir, name))) if mask.ndim 3: mask mask[:, :, 0] # 彩色 GT 按需降維 counter.update(np.unique(mask).tolist()) total sum(counter.values()) freq np.array([counter.get(i, 0) / total for i in range(num_classes)]) median np.median(freq[freq 0]) # 只看有像素的類別 weights np.where(freq 0, median / freq, 0.0) return weights.astype(np.float32)用法是把 weights 數(shù)組直接傳給 CrossEntropyLoss 的 weight 參數(shù)。兩個細(xì)節(jié)統(tǒng)計時 mask 如果是三通道必須先降維否則 unique 會帶出 (R,G,B) 組合值Counter 全亂掉freq 為 0 的類別權(quán)重置 0避免給不存在的類別分配梯度。原資源說明里附帶了一份醫(yī)學(xué)圖像分割網(wǎng)絡(luò)介紹專欄和 U-Net/SwinUNet 改進(jìn)專欄的參考地址訓(xùn)練前翻一翻里面的改進(jìn)點挑個合適的解碼器結(jié)構(gòu)能少走不少彎路。5.3 驗證指標(biāo)逐類 mIOU 比 pixel accuracy 誠實得多語義分割里 pixel accuracy 極易被建筑、道路這類大面積類別刷高正確做法是逐類算 IoU 再取平均def per_class_iou(pred, gt, num_classes8): ious [] for c in range(num_classes): p (pred c) g (gt c) inter (p g).sum() union (p | g).sum() ious.append(inter / union if union 0 else 1.0) return np.array(ious)空類別記 1.0 是常見約定避免某個類別在驗證集里恰好沒出現(xiàn)時把平均分拉低。把 8 個類別的 IoU 全部打印出來哪個類別學(xué)不動一目了然。如果某個類別長期是 0優(yōu)先檢查是不是標(biāo)簽編碼錯了而不是急著調(diào)模型——很多“模型問題”最后都定位到數(shù)據(jù)加載上尤其是 4.1 那種三通道 GT 的坑。6. 一個容易被忽略的驗證動作訓(xùn)練完反查可視化比 mIOU 更早發(fā)現(xiàn)壞樣本模型訓(xùn)練完大家習(xí)慣只看 mIOU。我的習(xí)慣是額外做一次預(yù)測可視化反查從驗證集抽幾張圖把預(yù)測 mask 和 GT mask 各自疊加到原圖上并排保存人眼過一遍。這個動作成本極低驗證集 70 張抽 5 張就夠輸出 5 張對比圖但發(fā)現(xiàn)問題的速度比盯指標(biāo)快得多。import numpy as np import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt from PIL import Image # pred_mask 是模型 softmax 后 argmax 得到的索引圖 # gt_mask 是與原圖同名的 GT def overlay_compare(image, pred, gt, save_path): fig, axes plt.subplots(1, 3, figsize(15, 5)) axes[0].imshow(image) axes[1].imshow(image, alpha0.6) axes[1].imshow(pred, alpha0.4, cmaptab20) axes[2].imshow(image, alpha0.6) axes[2].imshow(gt, alpha0.4, cmaptab20) axes[0].set_title(original) axes[1].set_title(pred) axes[2].set_title(GT) plt.tight_layout() plt.savefig(save_path, dpi150)反查時重點看三類現(xiàn)象建筑邊緣是否出現(xiàn)鋸齒狀誤判陰影區(qū)域是否被整片吞成地面玻璃幕墻是否被標(biāo)成建筑以外的類別。這三類問題在 mIOU 數(shù)字上可能只差零點幾個點但人眼掃一遍馬上有結(jié)論。我還會順手統(tǒng)計每張圖里 pred 和 GT 的類別像素差哪些圖差異最大就優(yōu)先看哪些等于給可視化排序不用盲抽。這個習(xí)慣幫我省下過至少兩個“看起來成功”的版本——mIOU 都在 0.7 以上反查卻發(fā)現(xiàn)模型把陰影里的車輛全漏了而這恰恰是實際項目最在意的對象。從那以后我每次交付任何分割實驗都強制自己先跑一遍可視化反查再談 mIOU。希望幫到你。本文還有配套的精品資源點擊獲取