如何評價deeplab v3+


3+繼承了該系列論文一貫的嚴謹作風,對各種改進和技巧都做了控制變數實驗,以Google無限的算力給大家展示了煉丹的各種可能性,幫大家踩坑,值得稱讚。

論文創新主要在於改進的backbone網路,和引入decoder進一步提高上採樣的準確度,最後的實驗結果也確實顯示了新Xception結構的優勢,並在各個數據集上實現了STOA。最難能可貴的是對於各種不work的場景,作者非常坦誠的給大家羅列了出來。

好了表揚的部分說完了現在開始純主觀無理性胡攪蠻纏的吐槽部分了,請大佬們迴避。

  1. 如果說3代開啟了面向測試集設計evaluation(多尺度,翻轉,降低OS),那3+代就是已經開啟了面向測試集設計網路了。3代花了大量篇幅討論的image level feature,結果到了CS測試集上反而跌了不少,所以rethinking出來的global context information是隻針對VOC的?
  2. Decoder的回歸刷高了不到1%的miou,卻成了全文最大的賣點,這不是回到FCN的老路,啪啪打1代的臉嗎?不過該系列倒是一貫堅持每一代打上一代臉。
  3. 到3代的時候,作者花了三年基本上把自己空洞卷積金字塔和dense feature的故事講圓了,1代2代一些錯誤設計到3代基本上也都糾正。但這個3+,我覺得可能作者自己也不好意思再自稱4代了,畢竟前面每一代至少還有一些真正的創新點,這次更像一個實驗報告了。

總之,deeplab系列在3代達到巔峯,也算是可以收場了,再把各種別人的花樣往這套系統裏揉的話,可能更適合發做一個tech report吧。這麼小的提高下,還是面向測試集設計的網路,我覺得工程上的意義也不太大,resnet deeplab v3就夠了。


想對樓上的同學說,看了我們的源碼後你會覺得畢設壓力小更多

PaddlePaddle/models?

github.com圖標

DeepLab v3+ 是DeepLab語義分割系列網路的最新作,其前作有 DeepLab v1,v2, v3, 在最新作中,Liang-Chieh Chen等人通過encoder-decoder進行多尺度信息的融合,同時保留了原來的空洞卷積和ASSP層, 其骨幹網路使用了Xception模型,提高了語義分割的健壯性和運行速率。其在Pascal VOC上達到了 89.0% 的mIoU,在Cityscape上也取得了 82.1%的好成績,下圖展示了DeepLab v3+的基本結構4:

DeepLab v3+在主幹網路之後連接了Encoder和Decoder,能夠在擴大網路感受的同時獲得更加高清的分割結果。

在PaddlePaddle的模型庫中已經包含了DeepLab v3+的訓練以及測試的代碼。我們首先安裝最新版本的PaddlePaddle並且下載PaddlePaddle的模型庫:

pip install -U paddlepaddle
git clone https://github.com/PaddlePaddle/models.git

當模型倉庫成功克隆,你將可以在目錄fluid/PaddleCV/deeplabv3+ 下看到用於訓練以及測試的代碼:

ls fluid/PaddleCV/deeplabv3+

├── models.py # 網路結構定義腳本

├── train.py # 訓練任務腳本

├── eval.py # 評估腳本

└── reader.py # 定義通用的函數以及數據預處理腳本

二、開始訓練

當數據和代碼都已經準備好,我們可以開始訓練了,訓練的參數和指令如下:

CUDA_VISIBLE_DEVICES=0 FLAGS_fraction_of_gpu_memory_to_use=0.99
inplace_normalize=1 fuse_relu_before_depthwise_conv=1 python3
/home/cjld/nfs/liangdun/deeplabv3+/train.py --batch_size=-1 --train_crop_size=-1 --
total_step=10 --base_lr=0.005 --train_set=train --norm_type=gn --
save_weights_path=$YOUR_SAVE_WEIGHTS_PATH –dataset_path=$YOUR_DATASET_PATH

在這個命令中,我們沒有使用任何預訓練模型,從噪音開始訓練DeepLab v3+。並且是直接使用全解析度進行訓練(1024x2048,batch size=1)。幾個比較關鍵的參數解釋如下:

    • 環境變數CUDA_VISIBLE_DEVICES=0限制了訓練過程僅使用一張GPU,如果存在多張GPU,可以通過修改參數來得到訓練速度的提升。
    • 環境變數FLAGS_fraction_of_gpu_memory_to_use=0.99, 該環境變數將會讓PaddlePaddle佔用99%的顯存,可以根據實際情況進行調節。
    • 環境變數inplace_normalize=1,該參數是PaddlePaddle進行顯存優化的關鍵,打開該開關將會讓框架對normalize layer進行 inplace 操作來優化顯存,現在支持的 normalize layer 有 group normalize。
    • 環境變數fuse_relu_before_depthwise_conv=1,該參數是顯存優化的另一個關鍵參數。這個參數會融合relu和depthwise conv來優化顯存。
    • 參數--save_weights_path=$YOUR_SAVE_WEIGHTS_PATH, 這裡你需要填入保存模型的路徑。
    • 參數--dataset_path=$YOUR_DATASET_PATH, 這裡你需要填入數據集的路徑。

三、空間時間消耗分析

根據列印出來的信息,我們可以發現,PaddlePaddle在訓練DeepLab v3+時,輸入一張全解析度的圖片,顯存消耗為10.2GB。得益於顯存消耗小於11G,我們可以使用1080ti完成訓練,訓練中每次迭代速度約為0.85s。

我們還可以使用工具,分析DeepLab v3+各部分顯存消耗情況:

在該圖中,顯存消耗最多的是主幹網路,佔用了68.1%,其次是decoder部分,佔用了16.4%,以及encoder佔用了5.3%,剩下其他部分為損失函數和數據預處理的顯存消耗。

顯存消耗最多的是主幹網路,佔用了68.1%,我們可以繼續查看主幹網路內部顯存消耗情況:

這個圖展示了在主幹網路中的顯存消耗,Xception主幹網路主要由三部分組成, EntryFlow,MiddleFlow,以及ExitFlow,可以發現顯存消耗最大的是EntryFlow。

在上圖中,我們可以發現,儘管Xception主幹網路層數最多的部分是MiddleFlow,但是顯存消耗最大的卻是EntryFlow,這是因為在EntryFlow裏的特徵還沒有被充分下採用,解析度相當高,同時EntryFlow裏的通道數也不容小覷,因此造成了EntryFlow巨大的顯存開銷,這也為我們的優化指明瞭方向。

DeepLab v3+使用的主幹網路 Xception, MiddleFlow中的分離卷積塊重複了16次,層數相比較EntryFlow和ExitFlow要多得多,然而顯存消耗最大的卻是EntryFlow。

框架對比

除開對網路內部的顯存消耗進行分析,我們還對不同框架的顯存消耗進行了對比,下表展示了PaddlePaddle和TensorFlow1.12的顯存消耗以及性能對比,以下對比實驗使用的輸入數據是1024x2048全解析度的圖片,batch size為1,測試設備P40(24G):

四、優化原理

這裡我們採用的顯存優化策略是 fuse_relu_before_depthwise_conv 和 inplace_normalize。顧名思義,fuse_relu_before_depthwise_conv 是講relu和depthwise_conv融合為同一個operator, 達到顯存的節省。而 inplace_normalize 則是使用原地操作來節省顯存。在卷積神經網路中,conv+normalize+activation是常見模式,在這種模式下,使用這兩種優化策略,可以節省3倍的顯存。這兩種優化策略歸納起來就是操作融合和原地計算, 是顯存優化中的常見策略, 對於不同的框架常常需要耗費人力進行開發, 而我們通過paddle的顯存優化可以很輕鬆的實現這一點。 該優化圖示如下:

在該圖中,紅框標註的data為會消耗顯存的數據塊,可以看到,通過inpalce和fuse兩種操作,原來需要存儲6個數據塊,優化後僅僅需要2個數據塊。

在上圖中,我們可以發現,inplace和fuse兩種操作,都分別幫助我們在每一個conv+normalize+activation塊中節省了1個數據塊,所以顯存節省的更多了,我們的分割網路也可以消耗更少的顯存資源。


遙感背景,不是cv專業的學生,強行補了一個禮拜CNN的paper,還請各位大神批評指教

1.首先可以看到deeplab v3+效果非常好,空間細節非常好,各位就看看圖吧。

2.戳到笑點的是,deeplab v3的那張翻車圖,在v3+裏還是翻車了。

2.代碼開源之後(https://github.com/tensorflow/models/tree/master/research/deeplab),依賴庫是cuda9和Tensorflow 1.6要逼死不方便換環境的伺服器。

3.採用了很簡單的兩步4倍上採樣,先雙線性然後和底層作feature跳接,是不是為了告訴大家其實decoder隨便搞搞就行,好好提取多尺度特徵(人間正道是滄桑??誤)。

4.用了修改過的Xception,替換了所有的max-pooling並且加了一些atrous concolution layers,以及空間金字塔池化的繼續使用如上圖。

5.小結:Xception是新加的,在segmentation內效果似乎不錯,Atrous從第一個版本就開始用從未被拋棄,ASPP也算是deeplab的招牌了,decoder相對簡單,v3已經去掉了CRF。


最想說的是代碼開源之後畢設壓力小了好多。。。

=========================20180321

原理就不講了,寫一下分割自己圖片的正確姿勢:

https://colab.research.google.com/github/tensorflow/models/blob/master/research/deeplab/deeplab_demo.ipynb?

colab.research.google.com

打開以上鏈接,填好url,從上到下的運行點一遍


如果先看過MobileNet V2,那麼這篇基本就類似於Kaggle比賽的賽後報告了。


直接調他們訓練好的模型,cpu都能跑。畢設幫了大忙


試了一下,NVIDAI GTX 1080TI ,513*288用時1.9s差不多,是不是我哪裡出錯了?有沒有誰還試過...


推薦閱讀:
相關文章