一、語義分割簡介
1. 定義
語義分割(Semantic Segmentation)是計算機視覺中的一項任務,其目標是對圖像中的每一個像素賦予一個類別標簽。與目標檢測只給出目標的邊界框不同,語義分割能夠在像素級別上區分不同類別,從而實現對圖像內容更精細的理解。
2. 原理
- 像素級分類: 網絡將輸入圖像逐像素進行分類,每個像素根據其所在區域被賦予一個類別標簽。
- 深度卷積神經網絡: 常用網絡結構包括全卷積網絡(FCN)、U-Net、DeepLab等,這些結構通常由一個特征提取的backbone(例如ResNet、EfficientNet)和一個上采樣(或解碼)部分構成,用以恢復空間分辨率。
- 損失函數: 常用交叉熵損失、Dice Loss等來平衡各類樣本(尤其當類別分布不均衡時)。
3. 作用與應用
- 自動駕駛: 對道路、行人、車輛等目標進行像素級分割,輔助場景理解。
- 醫療影像: 分割器官、病灶區域,輔助臨床診斷。
- 遙感圖像: 提取地物信息,如建筑、道路、水域等。
- 場景解析: 用于機器人導航、視頻監控等需要環境理解的場景。
二、基于YOLO進行語義分割訓練
雖然原始的YOLO系列模型主要用于目標檢測,但最新版本(例如YOLOv8)已經擴展了分割能力,實現了檢測與分割任務的聯合訓練。下面介紹具體流程。
1. 數據集標注
-
標注方式:
- 對于語義分割,需要為每個圖像提供與之對應的分割掩碼(mask),每個像素的值表示其所屬類別。
- 常見的標注格式有VOC格式(以PNG圖片保存mask)或COCO格式(包含多邊形或RLE編碼)。
- 如果是基于YOLOv8的分割任務,則一般需要兩個文件:圖像文件以及對應的mask文件,mask中的不同灰度值代表不同類別。
-
注意事項:
- 標注時要確保邊界清晰,避免模糊區域。
- 類別不平衡問題需提前處理,如進行數據增強或采樣調整。
-
標注信息
class_id x1 y1 x2 y2 ... xn yn
各位置的含義說明如下:
- 第一個數(class_id):
表示該目標的類別編號(從 0 開始),用于區分不同的語義類別。 - 后續的數值(x1, y1, x2, y2, …, xn, yn):
這些數字成對出現,每一對代表多邊形邊界上一個頂點的坐標。- x 坐標與 y 坐標:通常是歸一化后的值(相對于圖像寬度和高度),數值范圍通常在 0 到 1 之間。
- 頂點順序:須按照目標邊緣的順序排列(順時針或逆時針均可,但應保持一致),以確保能夠正確構成目標的閉合區域。
- 第一個數(class_id):
2. 訓練方式與代碼示例
YOLOv8的分割模型在訓練時通常采用端到端方式,同時學習檢測和分割任務。下面提供一個偽代碼/代碼示例,展示如何進行訓練:
# data.yaml —— YOLOv8 語義分割任務數據集配置文件# 數據集根目錄,可以是絕對路徑或相對于當前工作目錄的相對路徑
path: ../datasets/pothole_seg# 訓練、驗證和測試圖像的路徑(相對于 path)
train: images/train # 存放訓練圖像的文件夾
val: images/val # 存放驗證圖像的文件夾
test: images/test # 測試圖像(可選,訓練時可以不配置)# 類別數量
nc: 1# 類別名稱列表,順序要與標注數據中每行第一個數字(類別索引)保持一致
names: ['pothole']
在上述代碼中,YOLOv8的訓練腳本會自動加載數據、應用數據增強、計算目標檢測與分割的聯合損失,最終輸出訓練好的模型。
3. 模型評估
在訓練過程中,YOLOv8 會實時輸出多個指標來幫助您評估模型的性能,主要包括:
- 訓練損失:記錄總損失以及各個組成部分,如目標框(box)損失、目標置信度(obj)損失、分類(cls)損失以及分割任務中特有的掩碼損失(mask loss 或 segmentation loss)。
- 驗證指標:在驗證階段,會自動計算并輸出常見指標,如精度(Precision,P)、召回率(Recall,R)、以及平均精度均值(mAP),通常包括 mAP@0.5(即 IoU 閾值為 0.5 時的 mAP)和 mAP@0.5:0.95(不同 IoU 閾值下的綜合 mAP)。
- 速度指標:訓練日志中還會顯示每個 epoch 的時間消耗、每張圖像的處理速度等,這有助于評估訓練效率。
4. 模型使用
from ultralytics import YOLO# 加載訓練好的語義分割模型權重
model = YOLO("runs/segment/train/weights/best.pt")# 對單張圖像進行推理
results = model.predict(source="path/to/image.jpg", imgsz=640)# 查看并保存推理結果(通常在runs/segment/predict目錄中保存預測圖片和對應的txt文件)
results.show() # 彈窗顯示預測結果
results.save() # 將預測結果保存到磁盤
- 分割掩碼:每個檢測到的對象會輸出一個精確的分割掩碼,可用于后續的目標區域分析。
- 置信度:顯示每個預測的置信度分數,幫助您判斷模型輸出的可靠性。
- 后處理:根據需要,您可以對輸出的結果進行進一步的后處理,例如與原圖疊加顯示、導出為JSON格式等。
三、語義分割訓練技巧與注意點
數據與標注
- 標注質量:語義分割要求精細的多邊形標注,每個目標區域的頂點必須準確無誤。確保標注數據的一致性和準確性,否則容易影響模型分割效果。
- 數據預處理:圖像和標注文件需要歸一化處理,保證坐標值在 [0, 1] 范圍內。同時建議對數據進行合理劃分(訓練/驗證/測試),保證數據分布均衡。
數據增強
- 多樣化增強:使用隨機翻轉、旋轉、縮放、透視變換以及馬賽克(Mosaic)等數據增強策略,可以顯著提升模型對各種場景的泛化能力。
- 注意增強策略與任務匹配:對于語義分割任務,增強方法需要同時作用于圖像和對應的掩碼。確保增強過程中保持目標區域的連貫性。
模型與超參數設置
- 預訓練權重:使用預訓練模型(如 yolov8n-seg.pt)作為初始化,可以加速收斂并提高精度,尤其在數據量較小時效果更明顯。
- 訓練損失監控:關注總損失及各部分損失(如 box、obj、cls、mask 損失),根據損失變化及時調整學習率和其他超參。
- 超參數調節:調節 batch size、學習率(lr0 與 lrf)、動量、權重衰減等,特別注意 mask_ratio 和 overlap_mask 參數,這兩個參數對語義分割模型中掩碼預測的效果有較大影響。
- 多尺度訓練:可嘗試使用多尺度訓練以適應不同尺寸目標,提高模型的魯棒性。
訓練過程監控與調試
- 實時監控:利用 TensorBoard 或 Ultralytics 提供的日志工具實時查看訓練過程中的損失曲線、驗證指標(如 mAP@0.5 和 mAP@0.5:0.95)、精度和召回率等。
- 早停機制:使用早停(early stopping)策略,在驗證指標長時間不提升時停止訓練,避免過擬合。
- 硬件與內存:根據 GPU 內存適當設置 batch size,同時注意使用 AMP(自動混合精度)訓練,既能提高訓練速度也能降低內存占用。
后處理與結果可視化
- 分割掩碼處理:訓練完成后,通過可視化工具檢查預測的分割掩碼效果,驗證模型是否能準確還原目標區域。
- 定制后處理:根據任務需求可以對分割結果進行后處理,例如平滑邊界、提取 ROI 區域等。