新開源!實時語義分割演算法Light-Weight RefineNet

  • 2019 年 12 月 27 日
  • 筆記

前幾日52CV君分享了論文《Real-Time Joint Semantic Segmentation and Depth Estimation Using Asymmetric Annotations》(詳見:17毫秒每幀!實時語義分割與深度估計),引起了廣泛關注,被轉載到多個網站。

文中原作者修改了一篇BMVC2018的論文《Light-Weight RefineNet for Real-Time Semantic Segmentation》中提出的演算法,使用知識蒸餾的方法,使輕量級模型17毫秒完成語義分割與深度估計任務。 可惜那篇文章並沒有開源程式碼。其使用的Light-Weight RefineNet模型非常值得參考。 恰巧昨日原作者開源了Light-Weight RefineNet,今天我們就來看看其廬山真面目。 作者資訊:

該文的目的很簡單,在CVPR2017的RefineNet語義分割演算法基礎上減少模型參數和計算量。

RefineNet的網路架構:

RefineNet使用經典的編碼器-解碼器架構,CLF為3*3卷積,卷積核個數為語義類的個數,編碼器的骨幹網可以是任意影像分類特徵提取網路,重點是解碼器部分含有RCU、CRP、FUSION三種重要結構。

RCU即residual convolutional unit(殘差卷積單元),為經典殘差網路ResNet中的residual block去掉batch normalisation部分,由ReLU和卷積層構成。 CRP為鏈式殘差池化(chained residual pooling),由一系列的池化層與卷積層構成,以殘差的形式排列。 RCU與CRP中使用3*3卷積和5*5池化。 FUSION部分則是對兩路數據分別執行3*3卷積並上取樣後求和SUM。

Light-Weight RefineNet改進方法

改進圖示:

1)替換3*3卷積為1*1卷積 雖然理論3*3卷積理論上有更大的感受野有利於語義分割任務,但實際實驗證明,對於RefineNet架構的網路其並不是必要的。

2)省略RCU模組 作者嘗試去除RefineNet網路中部分及至所有RCU模組,發現並沒有任何的精度下降,並進一步發現原來RCU blocks已經完全飽和。

表格中RefineNet-101為原始RefineNet網路,RefineNet-101-LW-WITH-RCU為使用了1)中的改進替換卷積,RefineNet-101-LW為使用了1)與2)中的改進替換卷積並省略RCU。 從上圖表格中可知,1)的改進直接減少了2倍的參數量降低了3倍的浮點計算量,2)的改進則進一步使參數更少浮點計算量更小。

3)使用輕量級骨幹網 作者發現即使使用輕量級NASNet-Mobile 、MobileNet-v2骨幹網,網路依舊能夠達到非常穩健的性能表現,性能不會大幅下降。

實驗結果 軟硬體平台:8GB RAM, Intel i5-7600 處理器, 一塊GT1080Ti GPU,CUDA 9.0 ,CuDNN 7.0。 作者首先在NYUDv2 和 PASCAL Person-Part數據集上進行了實驗,結果如下:

可以看到雖性能略有下降,但參數量和計算時間大幅降低。

同時作者也在PASCAL VOC資料庫上進行了實驗,並加入NASNet-Mobile 、MobileNet-v2骨幹網,發現對比於使用相同骨幹網路的目前幾乎是最先進的語義分割架構DeepLab-v3,RefineNet-LW的性能表現更具優勢。

語義分割結果對比圖示:

總結 這篇文章的改進非常簡單,幾乎所有想法都來自於實驗摸索出來的。原來通過實驗發現現有模型中的計算冗餘也很有價值啊!

程式碼地址: https://github.com/DrSleep/light-weight-refinenet 論文地址: http://bmvc2018.org/contents/papers/0494.pdf