使用自定義數據集微調 SegFormer 以進行語義分割

Hugging Face 詳細介紹了一套工作流程,用於微調 SegFormer(一種最先進的語義分割模型),以處理自定義圖像數據集。透過利用預訓練權重和 Hugging Face 生態系統,此過程可以創建專門的模型——例如為披薩外送機器人設計的模型,用於識別人行道和障礙物。

理解 SegFormer 與語義分割

語義分割是將圖像中的每個單獨像素進行分類的過程,提供了比標準圖像分類更細粒度的細節。這種能力對於醫療影像和自動駕駛等應用至關重要,在這些應用中需要精確的邊界檢測(例如,識別人行道的確切邊緣)。

SegFormer 由 Xie et al. 在 2021 年推出,改進了之前的卷積神經網絡 (CNN) 和 Vision Transformer (ViT) 方法。其架構由以下部分組成:

  • 分層 Transformer 編碼器:與 ViT 不同,SegFormer 不使用位置編碼。
  • 簡單的 MLP 解碼器:一個處理編碼器輸出的多層感知器解碼器。

數據準備與增強

有效的語義分割需要具有精確分割圖的數據集。雖然存在 ADE20k、CityScapes 或 BDD100K 等通用數據集,但通常需要特定領域的數據以避免分佈不匹配。例如,在人行道上運行的機器人需要從人行道的視角捕捉的數據,而不是從汽車的視角。

數據集加載與處理

使用 datasets 庫,可以加載自定義數據集(例如 segments/sidewalk-semantic)並將其拆分為訓練集和測試集。為了確保模型接收到正確格式的數據,使用了 SegFormerImageProcessor

即時轉換 (On-the-Fly Transforms)

為了優化磁碟空間和訓練速度,Hugging Face 建議使用透過 set_transform 進行的轉換。這是在訓練期間即時準備數據批次,而不是預先處理整個數據集。為了增加模型對不同光照條件的韌性,torchvision.transforms.ColorJitter 被集成到訓練流程中,以隨機調整亮度、對比度、飽和度和色調。

微調工作流程

模型選擇

SegFormer 提供五種模型大小(B0 到 B5)。對於邊緣部署——例如在送餐機器人上——由於其佔用空間小(約 14MB)且效率高,建議使用 B0 模型。微調過程通常從在 ImageNet-1k 上預訓練的模型 (nvidia/mit-b0) 開始。

訓練配置

微調透過 Hugging Face 的 Trainer API 進行管理。關鍵配置參數包括:

  • 超參數:學習率(例如 0.00006)和 epoch 數量(例如 50)。
  • 評估指標:使用平均交集與聯集 (mIoU) 來衡量預測的分割掩碼與地面真值 (ground truth) 之間的重疊程度。
  • Logit 放大:由於 SegFormer 輸出的 logits 在原始圖像解析度 (高度/4, 寬度/4) 的 1/4 處,因此在計算 mIoU 之前,必須使用雙線性插值將其放大以匹配標籤大小。

推理與部署

一旦完成微調,模型及其圖像處理器可以推送到 Hugging Face Hub。這允許輕鬆共享並為透過託管推理 API 進行實時測試創建推理組件 (inference widget)。

執行推理

要對新圖像進行推理,需要執行以下步驟:

  1. 預處理:使用 SegformerImageProcessor 處理圖像。
  2. 前向傳播:將處理後的圖像通過模型以獲得 logits。
  3. 重新縮放:使用 nn.functional.interpolate 將 logits 放大到原始圖像維度。
  4. 預預測:在類別維度上應用 argmax 操作,以確定最終的像素級別類別預測。

Sources

相關