本文是作者參加CCF BDCI獲得冠軍的比賽經驗總結以及語義分割trick的整理。作者的比賽方案最大的特點是將連通性問題轉換為二分類問題解決,結果優異,傳統圖像形態學後處理仍然可靠。且無須針對性設計loss和module,分類器可用多種小模型,實際環境下並行處理也更快。 >>加入極市CV技術交流群,走在計算機視覺的最前沿
賽題分析賽題分析
這次比賽也是第一次正式參加的比賽,地塊分割本質上也是個語義分割的問題,之前沒搞過,花了比較多的時間對網上的trick進行了整理學習,見最後附錄整理的資料。初賽並不困難,主要考慮7類結果的平均IOU,複賽加入了對水體和道路類的連通性評判指標。最終的方案以較大的優勢在A榜和B榜取得了第一名的成績。
數據分析數據分析
統計數據集中各類面積佔比餅狀圖如上圖所示,可以發現數據集中存在類別不均衡現象,建築、道路和草地類較少,而其他類較多。進一步的統計,可以得知只有分別約7%/10%/13%的圖片滿足建築/道路/草地面積佔比大於1%。數據存在極度類別不均衡現象,常規的方法不適於訓練。
baseline分析
結合baseline結果可以發現,儘管建築類數據較少,但由於其地貌容易辨識,分類結果較準確;而道路和草地類則因為與其他類存在相似性,但訓練數據不足,結果較差。因此,提升模型分類能力(MIOU)的關鍵是解決類別不均衡問題,尤其是道路類和草地類。
思路介紹整體思路整體思路
要解決這些問題,直接的方式是使用針對IOU設計的損失函數進行re-weighting(如Lovasz-Softmax Loss、 Focal Loss等),但訓練較慢,結果收斂不穩定。其次是可以針對特殊類設計模塊,但結構複雜且周期長。最終我們借鑑了Adaboost的思想,用不同概率分布的訓練數據訓練一系列弱分類器,並通過投票融合得到強分類器。這裡之所以用類似,是因為與Adaboost不同,我們這裡的數據並不是每輪增加錯誤樣本權重,弱分類器的**「弱」**也是指特殊類別上弱,融合權重根據準確率與連通性需求人為規定。
數據處理數據處理
為了獲取不同的訓練數據,我們設計了不同數據處理方案:(1) 劃分道路草地類正負樣本(負樣本指不包含該類的樣本),多階段逐步增加負樣本比例(借鑑Bengio的curriculum learning的思想由簡單到複雜訓練,結果更好收斂);(2) 在原數據的基礎上,對道路草地類樣本re-sampling,為了避免過擬合,對重採樣數據進行多種數據增強(水平翻轉+垂直翻轉+放縮為0.75/0.875/1.125/1.25倍),與re-weighting相比,簡單直接效果好;(3) 針對建築/道路/水體類轉換處理得到二分類訓練數據(同樣進行數據增強並加入隨機旋轉90/180/270度),訓練特殊的二分類器,加強模型對特殊類別的前景後景區分能力。在數據增強時,我們還進行了閾值篩選,僅對面積佔比較大的圖像進行相應處理,直覺上這些數據對訓練更友好。
值得注意的是,上圖中預測效果對比可以發現,多分類模型只能識別筆直的道路,部分彎曲的道路難以識別,而二分類模型可以很好地識別彎曲的道路,並且連通性也更好,這也是我們複賽的主要思路(很長一段時間內都比第二名高3-5個點)。
模型訓練模型訓練
有了這些數據,我們訓練了一系列以HRNet和OCRNet為backbone的模型。並且我們探索了SE、CBAM、scSE等attention module,最後是採用了提升效果最多的SE attention。由於比賽經驗生疏,當時訓了些許大模型,然而融合後提升微薄,實際上模型差異越大後續融合結果一般更好。實際環境下,若考慮計算開銷,也許訓練UNet等諸多小模型融合,效果更好,速度更快。
模型預測模型預測
在測試時,我們進行了多種數據增強,包括尺度放縮、水平/垂直翻轉、90度倍數旋轉(實際上,原圖+水平翻轉+垂直翻轉+180度旋轉足矣,更多的TTA提升效果很小)。得到這些預測後,我們不是進行softmax分數求和的軟投票,而是逐像素少數服從多數的硬投票,並且用二分類預測逐優先級覆蓋多分類預測,人為地規定了道路>水體>建築>其他的優先級。這裡我們利用多進程+numpy矩陣運算,大大減小了投票花費的時間。
連通性後處理連通性後處理
最後我們使用形態學處理進一步提高了連通性,首先是用閉運算連接斷裂處以及中值濾波去除毛刺;其次用面積和長度篩選閾值孤立像素團,用左邊像素類別進行替換去除;第三是設計了骨架連通性增強方案,提取出某類的骨架,並適當地膨脹腐蝕,保證連通的同時不會過度超出原始預測區域;最後是設計了一個動態優先級算法,動態地進行不同類別的覆蓋(主要考慮水體與道路類覆蓋優先級)。
結果對比原圖(左),單模型預測(中),多模型預測(右)
最終的結果輸出如上圖右所示,可以看到最終的預測圖更加平滑,類別噪點大大減少,並且保證了道路和水體較好的連通性。這裡融合的結果更多考慮了連通性,因而可能存在「誤判」的結果,實際環境下可考慮準確性和連通性的權衡,調整閾值和權值。
總結方案最大的特點是將連通性問題轉換為二分類問題解決,結果出奇地好,傳統圖像形態學後處理仍然可靠。無須針對性設計loss和module,分類器可用多種小模型,實際環境下並行處理也更快。來了新的類別,大可以訓練二分類器簡單投票,數十個迭代即可得到較強的分類器。
整場比賽打下來挺累的,日常翹課熬夜debug,所幸最後結果尚可。答辯時也認識了不少比賽老手,感慨自己經驗尚淺,無論是在學術上還是工程上,都有很大的進步空間,繼續努力吧~
最後,有各種比賽、論文合作意願的小夥伴可私戳,帶帶弟弟,thx~~
附錄-語義分割trick整理基於SegNet和U-Net的遙感圖像語義分割(https://zhuanlan.zhihu.com/p/58521469)
數據增強:原圖與label圖旋轉90度的整數倍(90/180/270),原圖和label圖沿y軸旋轉,原圖做模糊操作,原圖做光照調整操作,原圖加噪聲(高斯/椒鹽)轉為二分類:對每一分類訓練二分類模型,對預測圖進行按優先級疊加語義分割訓練與優化技巧(https://niecongchong.github.io/2019/08/20/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2%E8%AE%AD%E7%BB%83%E4%B8%8E%E4%BC%98%E5%8C%96%E6%8A%80%E5%B7%A7/)
幾何變換:水平翻轉(遙感還可以垂直翻轉)、平移、隨機裁剪和縮放(比例需要研究)、旋轉紋理增強:亮度和對比度、色調飽和度對比度HSV、運動模糊、顏色抖動、限制對比度的自適應直方圖均衡化Airbus Ship Detection 衛星圖像分割檢測(https://zhuanlan.zhihu.com/p/48381892)
TTA單圖多測,單圖多scale投票:https://zhuanlan.zhihu.com/p/131539596Kaggle 氣胸識別分割比賽新手銅牌總結及冠軍分案(https://zhuanlan.zhihu.com/p/89838787)
聯合損失函數:BCE+Dice+Focal lossKaggle冠軍告訴你,如何從衛星圖像分割及識別比賽中勝出?(https://zhuanlan.zhihu.com/p/26663913)
Kaggle優勝者詳解:如何用深度學習實現衛星圖像分割與識別(https://zhuanlan.zhihu.com/p/26377387)
對數據先歸一化為具有零均值和單位方差,之後進行數據增強過採樣在測試的時候滑動窗口拼接(256可否借鑑小窗口滑動拼接?),TTA平均輸出後處理簡單使用擴展和腐蝕操作,去除小於給定閾值的物體和小孔ECCV 2020 大規模實例分割挑戰賽(LVIS Challenge)冠軍方案(https://zhuanlan.zhihu.com/p/224851085)
Repeat Factor Sampling 樣本採樣技術(應該類似於重採樣保證樣本均衡)分類器平衡,在表示學習部分結束後,凍結網絡的 backbone,使用Balanced GroupSoftmax進行分類器平衡(目標檢測長尾效應中使用)Kaggle TGS 鹽體分割任務第五名解決方案:kaglge硬核高中生玩家,模型集成策略太高級了看不懂(https://zhuanlan.zhihu.com/p/47412338)
在Lovasz loss中我們使用了elu+1而不是默認的reluKaggle圖像分割比賽中的損失函數及keras實現:介紹了BCE、weighted BCE、Dice和Lovasz loss(https://zhuanlan.zhihu.com/p/80716099)
數據增強repo,注意裡面做分割的demo ipynb:https://github.com/albumentations-team/albumentations
【圖像後處理】python實現全連接CRFs後處理,CRF+填孔後處理(https://zhuanlan.zhihu.com/p/64854535)代碼參考:https://github.com/Gurupradeep/FCN-for-Semantic-Segmentation、https://github.com/1044197988/Semantic-segmentation-of-remote-sensing-images等推薦閱讀