圖像分割的「奇技淫巧」


本文轉載自機器之心。

一個經歷了 39 場 Kaggle 比賽的團隊在 reddit 上發帖表示,他們整理了一份結構化的圖像分割技巧列表,

涵蓋數據增強、建模、損失函數、訓練技巧等多個方面,不失為一份可以參考的圖像分割技巧資料。

圖像分割是圖像處理和計算機視覺的熱點之一,是根據圖像內容對指定區域進行標記的計算機視覺任務。它基於某些標准將輸入圖像划分為多個相同的類別,

簡言之就是「這張圖片里有什么,其在圖片中的位置是什么?」以便提取人們感興趣的區域。圖像分割是圖像分析和圖像特征提取及識別的基礎。

 

        圖像分割也是 Kaggle 中的一類常見賽題,比如衛星圖像分割與識別、氣胸疾病圖像分割等。除了密切的團隊配合、給力的 GPU 配置等條件,技巧在這類比賽中也發揮了很大的作用。但這些技巧去哪里找呢?Medium、大牛博客、參賽經驗帖中都散落着各種技巧分享,但這些資源往往比較零散,於是就有人想到,為什么不把它們集中到一起呢?
        Derrick Mwiti 就帶頭做了這么一件事,他和他所在的團隊將過去 39 場 Kaggle 比賽中討論過的圖像分割技巧、資料都匯總到了一起,希望可以幫到在圖像分割任務中遇到困難的同學。

 

        這份列表分為十大板塊,包括外部數據、預處理、數據增強、建模、硬件配置、損失函數、訓練技巧、評估和交叉驗證、集成方法以及后處理。

 

       每個版塊的具體內容以條目的形式呈現,每個條目又都嵌入了一些鏈接,點開可以看到一些優秀的 Kaggle 解決方案分享、Medium 博客教程、高贊的 GitHub 項目等,讀者可以根據自己的具體問題和需要進行查找。
       本文選取了其中一部分內容進行介紹,具體細節及鏈接請參見原文。
        接下來,我們來看每個步驟都有哪些技巧吧。

預處理

 

 這一部分包含眾多常見的有效圖像預處理方法,例如:

  • 使用高斯差分方法進行斑點檢測;

  • 使用基於圖像塊的輸入進行訓練,以減少訓練時間;

  • 加載數據時,用 cudf 替換 Pandas;

  • 確保所有圖像保持相同的方向

  • 使用 OpenCV 對所有常規圖像進行預處理

  • 采用自主學習並手動添加注釋

  • 將所有圖像調整成相同的分辨率,以便將相同的模型用於不同厚度的掃描等。

 

 

 數據增強

        數據增強能夠使網絡具有更復雜的表征能力,從而減小網絡性能在驗證集和訓練集以及最終測試集上的差距,讓網絡更好地學習遷移數據集上的數據分布。這部分介紹了一些常用的數據增強方法:

  • 用 albumentations 包進行數據增強;

  • 使用 90 度隨機旋轉;

  • 使用水平、垂直翻轉或這兩個方向都做翻轉;

  • 嘗試進行復雜的幾何變換,包括彈性變換、透視變換、分段仿射變換、枕形失真;

  • 應用隨機 HSV;

  • 使用損失較小的增強數據進行泛化,以防止有用圖像信息丟失;

  • 應用通道 shuffle;

  • 根據類別頻率進行數據擴充;

  • 應用高斯噪聲等。

建模

網絡架構

 這一部分介紹了一些可用在圖像分割上的常用網絡框架,例如:

 

  • 使用基於 U-net 的架構;

  • 用 inception-ResNet v2 架構得到具備不同感受野的訓練特征;

  • 經過對抗訓練的 Siamese 網絡;

  • 以密集(FC)層作為最后一層的 ResNet50、Xception、Inception ResNet v2 x 5;

  • 使用全局最大池化層,無論輸入尺寸如何,該層都將返回固定長度的輸出;

  • 使用堆疊的膨脹卷積

  • VoxelNet;

  • concat 和 conv1x1 替換 LinkNet 跳躍連接中的加號

  • 廣義平均池化

  • 3D 卷積網絡在圖像上滑動

  • 使用在 Imagenet 數據集上預訓練的 ResNet152 作為特征提取器等。

以及下列經典網絡框架:

 

損失函數

損失函數常用來估計模型預測結果與真值之間的差距。選擇合適的損失函數,對模型效果很重要。

這部分介紹了一系列損失函數和使用場景,例如:

  • dice 系數:能夠很好地處理不平衡數據;

  • 加權邊界損失:減少預測分割與真值之間的距離;

  • MultiLabelSoftMarginLoss:基於最大熵優化多標簽一對多損失的標准;

  • 具備 logit 損失的平衡交叉熵(Balanced cross entropy,BCE):以特定系數權衡正例和負例;

  • ……

此外,作者還介紹了 Arc margin 損失、BCE 和 dice 系數的組合等等,更多詳情參見原文。

 

訓練技巧

這部分介紹了常用的模型訓練技巧,如:

  • 嘗試不同的學習率;

  • 嘗試不同的批大小;

  • 使用帶有動量項的SDG,並且手動設置學習衰減率;
  • 數據增強過多會降低准確率;
  • 使用裁剪后的圖像訓練,並在完整的圖像上做預測;
  • 在學習速率調整上使用 Kears 中的 ReduceLROnPlateau()方法;
  • 凍結除了最后一層以外所有的網絡層,並使用Stage1中的1000張圖片進行模型微調;
  • 開發一個能使標簽更加均勻的采樣器;
  • 使用類別感知采樣(class aware sample)等。

 

評估和交叉驗證

這部分介紹了 k 折交叉驗證、對抗驗證和權衡等方法,以及在調整模型最后一層時使用交叉驗證方法以有效避免過擬合

 

 集成方法

許多機器學習競賽(包括 Kaggle)中最優秀的解決方案所采用的集成方法都建立在一個這樣的假設上:將多個模型組合在一起通常可以產生更強大的模型。

這部分介紹了多種集成方法,如多數投票法、XGBoost、LightGBM、CatBoost 等方法,以及集成 ResNet50、InceptionV3 和 InceptionResNetV2 的方法。

 

 后處理:

這部分介紹了多種后處理方法:

  • 測試時增強(Test Time Augmentation,TTA):向模型多次展示經過不同隨機變換的圖像,取預測平均值;

  • 均衡使用測試預測概率,而不是僅使用預測類;

  • 幾何平均數應用於預測;

  • 在推理過程中將圖塊重疊,使每個邊緣像素至少覆蓋 3 次,因為 UNET 在邊緣區域范圍的預測往往較差;

  • 非極大抑制和邊界框收縮

  • 分水嶺后處理:在實例分割問題中分離對象。

 最后需要注意的是,這份列表給出的某些技巧可能有一定的適用范圍,具體能不能用還要視數據而定。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM