《ICNet》論文閱讀及源碼實現

  • 2019 年 12 月 9 日
  • 筆記

論文原文

https://arxiv.org/pdf/1704.08545.pdf

介紹

香港中文大學,騰訊優圖,商湯科技聯合發表的一篇用於語義分割的論文。ICNet是一個基於PSPNet的實時語義分割網絡,設計目的是減少PSPNet推斷時期的耗時,論文對PSPNet做了深入分析,在PSPNet的基礎上引入級聯特徵融合模塊,實現快速且高質量的分割模型。論文報告了在Cityscape上的表現。關於PSPNet請看昨天的推文。

可以看到之前的許多分割的經典方法速度不快,而速度快的ENet的精度又不高,PSPNet在速度和精度找到了一個平衡點。論文的主要貢獻在於:

  1. 綜合低分辨率的處理速度和高分辨率圖像的推斷質量,提出圖像級聯框架逐步細化分割預測
  2. ICNet可以在1024*2048分辨率下保持30fps運行

相關工作

高質量的語義分割模型

先驅工作FCN將全連接層換成卷積層;DeepLab等使用空洞卷積(dilated convolution);Encoder-Decoder結構融合高層的語義和底層的細節;也有使用CRG,MRF模擬空間關係;PSPNet採用空間上的金字塔池化結構。這些方法對於提升性能有效,但不能用於實時系統。

快速的語義分割模型

SegNet放棄層信息來提速;ENet是一個輕量級網絡,這些方法雖然快,但是性能差。

視頻分割模型

視頻中包含大量冗餘信息,可利用減少計算量。

PSPNet給出了一個快速的語義分割的層次結構,利用級聯圖像作為輸入加速推理,構建一個實時分割系統。

網絡耗時分析

藍色的分辨率為1024*2048,綠色的分辨率為512*512。上圖顯示了多個信息:

  1. 不同分辨率下的速度差異很大,呈平方趨勢增加
  2. 網絡的寬度越大速度越慢
  3. 核數量越多速度越慢

網絡加速技巧

輸入降採樣

根據上面的分析,半分辨率的推斷時間為全分辨率的1/4。測試不同分辨率下輸入下的預測情況。一個簡單的測試方法使用1/2,1/4的輸入,將輸出上採樣回原來的大小。實驗如下:

對比在不同縮放比例下得到的結果可以發現,在縮放比例為0.25的情況下,雖然推斷時間大大減短,但是預測結果非常粗糙,丟失了很多小但是重要的細節。縮放0.5相對來說好了很多,但丟失了很多細節,並且最麻煩的是推理速度達不到實時要求了。

特徵降採樣

輸入能降採樣,自然特徵也可以降採樣。這裡以1:8,1:16,1:32的比例測試PSPNet50,結果如下:

較小的特徵圖可以以犧牲準確度換取更快的推斷,但就算使用1:32(132ms)依然達不到實時要求。

模型壓縮

減少網絡的複雜度,有一個直接的方法就是修正每層的核數量,論文測試了一些有效的模型壓縮策略。即使只保留四分之一的核,推斷時間還是很長。並且準確率大大降低了。

ICNet的結構

ICNet在總結了上面的加速策略後,提出了一個綜合性的方法:使用低分辨率加速捕捉語義,使用高分辨率獲取細節,和級聯網絡結合,在限制的時間內獲得有效的結果。模型結構如下:

圖片分為1,1/2,1/4這3個尺度分三路送到模型中。3個分支介紹如下:

對於第一個1/4分支,可以看到經過3次卷積(下採樣)後分辨率為原圖的1/32,經過卷積後使用幾個空洞卷積層擴展感受野但不縮小尺寸,最終以原圖的1/32大小輸出feture map。這一個分支雖然層數較多,但分辨率小,速度快,且與第二個分支共享一部分權重。

以原圖的1/2分辨率作為輸入,經過卷積後以1/8縮放,得到原圖1/16大小的feature map,再將低分辨率分支的輸出feature map通過CFF單元融合得到最終輸出。這一個分子有17個卷積層,與第一個分支共享一部分權重,與分支1一共耗時6ms。

第3個分支以原圖作為輸入,經過卷積後以1/8縮放,得到原圖大小1/8的特徵圖,再將處理後的輸出和第二個分支的輸出通過CFF單元融合,第3層有3個卷積層,雖然分辨率高,但層少,耗時9ms。

對於每個分支的輸出特徵,首先會上採樣二倍做輸出,在訓練的時候,會以ground truth的1/16,1/8,1/4來指導各個分支的訓練,這樣的輔助訓練使得梯度優化更加平滑,便於訓練收斂,隨着每個分支學習能力的增強,預測沒有被任何一個分支主導。利用這樣漸變的特徵融合級聯引導結構可以產生合理的預測結果。ICNet使用低分辨率完成語義分割,使用高分辨率幫助細化結果,在結構上,產生的feature大大減少,同時仍然保持必要的細節。

CFF單元

損失函數和模型壓縮

損失函數

模型壓縮

這裡不是很懂,論文採用的一個簡單而有效的辦法:漸進式壓縮。例如以壓縮率1/2為例,我們可以先壓縮到3/4,對壓縮後的模型進行微調,完成後,再壓縮到1/2,再微調。保證壓縮穩定進行。這裡採用Pruning filters for efficient convnets(可以查一下這篇論文)的方法,對於每個濾波器計算核權重的L1和,降序排序,刪除權重值較小的。模型壓縮的結果如下:

可以看到mIoU降低的同時,推理時間170ms扔達不到實時要求。這表明只有模型壓縮是不能得到良好分割結果且達到實時性能的。

而我們提出的ICNet,有很好的分割結果和性能,且速度提升了5倍多。

上圖中sub4代表只有低分辨率輸入的結果,sub24代表前兩個分支,sub124全部分支。注意到全部分支的速度很快,並且性能接近PSPNet了,且能保持30fps。而且內存消耗也明顯減少了。

結論

論文在PSPNet的基礎上改進出一個ICNet。核心的思想是利用低分辨率的快速獲取語義信息,高分辨率的細節信息。將兩者相融合搞出一個折中的模型。

代碼實現

https://github.com/BBuf/Keras-Semantic-Segmentation