《DeepLab V2》論文閱讀
- 2019 年 12 月 9 日
- 筆記
前言
昨天的推文《DeepLab V2》組織方式很不清晰,沒有將關鍵結論以及空洞卷積這種方法的優點講出來,所以重新組織了一下這篇論文的解讀,希望可以帶來不一樣的體驗。
背景
作者提到DeepLab系列面臨三大挑戰:
挑戰一:為分類任務設計的DCNN中的多次Max-Pooling和全連接層會導致空間資訊的丟失。在DeepLabV1中引入了空洞卷積來增加輸出的解析度,以保留更多的空間資訊。
挑戰二:影像存在多尺度問題,有大有小。一種常見的處理方法是影像金字塔,即將原圖resize到不同尺度,輸入到相同的網路,獲得不同的feature map,然後做融合,這種方法的確可以提升準確率,然而帶來的另外一個問題就是速度太慢。DeepLab v2為了解決這一問題,引入了ASPP(atrous spatial pyramid pooling)模組,即是將feature map通過並聯的採用不同膨脹速率的空洞卷積層,並將輸出結果融合來得到影像的分割結果。
挑戰三:分割結果不夠精細的問題。這個和DeepLabV1的處理方式一樣,在後處理過程使用全連接CRF精細化分割結果。
同時,相比於DeepLabV1,DeepLabV2的backbone由V1的VGG16變成了ResNet,並帶來了效果提升。最後DeepLabV2在PASCAL VOC 2012獲得了SOAT結果。程式碼開源在http://liangchiehchen.com/projects。
網路結構

相比於DeepLabV1的輸出步幅是16,需要雙線性插值上取樣16倍才可以得到預測結果,DeepLabV2的輸出步幅是8,只需要上取樣8倍,結果清晰了很多。
空洞/(膨脹)卷積

空洞卷積作用在一維訊號時可以用公式1表示,其中x代表輸入訊號,w是卷積核係數,y是輸出,其中k是輸入訊號維度,r是膨脹速率,如果r等於就退化為標準卷積。Fig.2表示空洞卷積的一維示意圖:

其中Fig.2(a)表示表示標準卷積在低解析度圖上提取稀疏特徵的示意圖,底部為輸入為3維向量,zeropadding=1,經kenel_size=3,stride=1的卷積後輸出為3維。而Fig.2(b)在高解析度輸入5維圖片上,zeropadding=2,膨脹速率2的膨脹卷積來採集密集特徵的示意圖,使用空洞卷積能提取到更多的密集特徵,計算量較常規卷積基本保持不變。
在二維影像上的空洞卷積,論文給了另外一張圖Fig3:

Fig.3中上分支是將輸入圖片下取樣1/2後使用卷積核大小為7的標註卷積得到feature map後再上取樣2倍得到結果。下分支是將原卷積函數中每個係數中間都插入0(rate=2),用空洞卷積在原圖上直接進行卷積操作,這樣省去了下取樣和上取樣的操作,而且計算量不變的情況下(卷積核中那些為0的係數在反向梯度計算中沒有傳遞性),能得到更大的感受野,也就是說能獲取到更多的密集特徵,尤其是像素的邊界資訊,對比兩個分支的輸出可以得到印證。
從上面可以看到我們可以通過膨脹卷積的膨脹速率,隨意控制特徵圖的感受野(FOV)大小。
ASPP模組
傳統方法是把影像強行resize成相同的尺寸,但是這樣會導致某些特徵扭曲或者消失,這裡聯想到SIFT特徵提取的時候用到過影像金字塔,將影像放縮到不同的尺度,再提取的SIFT特徵點具有旋轉,平移不變性。因此這裡也是借鑒這種方式使用空間金字塔的方法,來實現對影像大小和不同長寬比的處理。這樣產生的新的網路,叫做SPP-Net,可以不論影像的大小產生相同大小長度的表示特徵。ASPP(多孔金字塔池化)就是通過不同的空洞卷積來對影像進行不同程度的縮放,得到不同大小的輸入特徵圖,因為DeepLab的ASPP擁有不同rate的濾波器,再把子窗口的特徵進行池化就生成了固定長度的特徵表示。之前需要固定大小的輸入影像的原因是全連接層需要固定大小。現在將SPP層接到最後一個卷積層後面,SPP層池化特徵並且產生固定大小的輸出,它的輸出再送到全連接層,這樣就可以避免在網路的入口處就要求影像大小相同。ASPP模組可以用下圖表示:

訓練細節
論文在ImageNet預訓練的VGG-16和ResNet-101網路上進行finetune,將輸出的1000類改成語義分割數據集的分類數,COCO和VOC都是21類,損失函數是CNN的輸出(原圖1/8大小)特徵圖和GT(同樣下取樣到1/8)的交叉熵損失和,每個位置在損失函數中的權重是相等的,並且使用SGD優化演算法,後處理過程仍然使用和DeepLab V1一樣的全連接CRF來進一步確定像素邊界和分割結果。在訓練時,作者分享了三個關鍵技術。
一,數據增強,參考Semantic contours from inverse detectors》將VOC 2012的訓練集由1464擴增到10582張。
二,初始學習率、動量以及CRF參數的選取都類似於DeepLabv1,通過調整膨脹速率來控制FOV(field-of-view),在DeepLab-LargeFOV上,作者對學習率下降策略進行了不同的嘗試,相對step的測試,poly在Batch_size=30,迭代20000次時能在VOC2012驗證集上達到65.88%的mIOU(未做CRF後處理)。
三,二提到了LargeFOV,LargeFOV是指採用膨脹速率r=12的膨脹卷積策略,作者在VGG-16的fc6採用該膨脹卷積,並將fc7和fc8改為1×1的全卷積,命名為DeepLab-LargeFOV,作為對比,同時在VGG-16的fc6-fc8層用四路採用不同膨脹速率的膨脹卷積作用於各自的fc6,在fc7和fc8同樣採用全卷積策略,命名為DeepLab-ASPP,根據膨脹卷積r的不同組合,r={2,4,8,12}的稱為DeepLab-ASPP-S,r={6,12,18,24}的稱為DeepLab-ASPP-L,如下圖分別為VGG16上的DeepLab-LargeFOV和DeepLab-ASPP示意圖:
如果不經過CRF,DeepLab-ASPP-S的效果會比DeepLab-LargeFOV mIOU超1.22%,經過CRF後兩個的準確率相似,而ASPP-L則經過CRF前和後都超過LargeFOV大概2-3個百分點,具體數據如表3。


除了這些工作,論文還嘗試了在COCO數據集上進行了測試,mIOU可以達到77.69%,具體可以參考原文,這個演算法也是達到了當時的SOAT。
後記
可以看到DeepLabv2仍然存在兩個階段,即DCNN+CRF,後面我們會介紹DeepLabV3扔掉CRF並且精度更高,請期待一下。


