6.4 DeepLab系列
學習目标
- 目标
- 知道DeepLab系列算法的特點
- 說明DeeplabV1的結構特點
- 掌握DeeplabV1的空洞卷積與CRF應用
- 應用
- 無
6.4.1 DeepLab 背景
相比于傳統的視覺算法(SIFT或HOG),Deep-CNN以其end-to-end方式獲得了很好的效果。這樣的成功部分可以歸功于Deep-CNN對圖像轉換的平移不變性(invariance),這根本是源于重複的池化和下采樣組合層。平移不變性增強了對資料分層抽象的能力,但同時可能會阻礙低級(low-level)視覺任務,例如姿态估計、語義分割等,在這些任務中我們傾向于精确的定位而不是抽象的空間關系。
Deep-CNN在圖像标記任務中存在兩個技術障礙:
- 信号下采樣:在Deep-CNN中重複最大池化和下采樣帶來的分辨率下降問題,分辨率的下降會丢失細節。
- 了解:也就是小物體資訊無法重建 (假設有四個pooling layer 則 任何小于 2^4 = 16 pixel 的物體資訊将理論上無法重建。)
- 空間不敏感(invariance):分類器擷取以對象中心的決策是需要空間變換的不變性,這就限制了Deep-CNN的定位精度
- 比如對于同一張圖檔進行空間變換(如平移、旋轉),其圖檔分類結果是不變的。對于圖像分割等Low-Level Vision Task,對于一張圖檔進行空間變換後,其結果是改變的。
High-Level & Low-level vision task
CNN适合于Hight-Level Vision Task(如圖像分類),不太适合于Low-Level Vision Task(如圖像分割、姿态估計)。
- lower level feature :也叫進階的語義資訊,包括邊緣檢測,角點檢測,顔色之類的對細節敏感、抽象度比較低的任務。
- high level feature:一些表面,表觀的資訊,比如紋理、邊緣。目标檢測、圖像分類等對細節資訊不敏感、抽象度比較高的任務。
6.4.2 Deeplab V1介紹
在實驗中發現DCNNs做語義分割時精準度不夠的問題,根本原因是DCNNs的進階特征的平移不變性(即高層次特征映射)。
- DeepLab是結合了深度卷積神經網絡(DCNNs)和機率圖模型(DenseCRFs)的方法。
- 系統與其他先進模型的主要差別在于DenseCRFs和DCNN的結合。是将每個像素視為CRF節點,利用遠端依賴關系,并使用CRF推理直接優化DCNN的損失函數。拓展:Koltun(2011)的工作表明完全連接配接的CRF在語義分割下非常有效。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxyMVR1TykFRNdXU6hFeGNDTwYVbiVHNHpleO1GTulzRilWO5xkNNh0YwIFSh9Fd4VGdsATMfd3bkFGazxyaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cWZwpmL0czNzAjN1AjM4ATNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpeg)
6.4.2.1 密集分類下的卷積神經網絡
1、結構
- 1、把最後的全連接配接層FC6、7、8改造成卷積層
- 2、pool4的stride由2變為1,則緊接着的conv5_1, conv5_2和conv5_3中hole size為2。接着pool5由2變為1, 則後面的fc6中hole size為4。
- 3、fc7,8為标準卷積
注:由于Hole(Atrous convolution)算法讓feature map更加dense,是以網絡直接用內插補點升采樣就能獲得很好的結果,而不用去學習升采樣的參數了(FCN中采用了de-convolution)
問題:FCN中有兩個關鍵,一個是pooling減小圖像尺寸增大感受野,另一個是upsampling擴大圖像尺寸。在先減小再增大尺寸的過程中,肯定有一些資訊損失掉了,那麼能不能設計一種新的操作,不通過pooling也能有較大的感受野看到更多的資訊呢?答案就是dilated conv/atrous conv
2、空洞卷積的使用
DeepLab是采用的atrous(帶孔)算法擴充感受野,擷取更多的上下文資訊
從兩個角度考慮空洞卷積:
- 相當于在标準概念的kernel(卷積核)中,相鄰點之間添加(rate - 1)個0,然後使用擴張後的kernel(卷積核)與原圖進行卷積。下面的圖rate=2,相當于标準的3x3卷積核變為5x5卷積核,每一行中間添加(2-1)個0
- 也就是說3x3的kernel在rate為2的情況下得到相當于5x5的空洞kernel,但是隻有圖中的9個點的權重不為0,其餘都為0。 可以看到雖然kernel size隻有3x3,但是這個卷積的感受野已經增大到了7x7。
1、dilated的好處是不做pooling損失資訊的情況下,加大了感受野,讓每個卷積輸出都包含較大範圍的資訊。采樣率為r的空洞卷積插入r−1個零,将k×k的卷積核變為ke=k+(k−1)(r−1)而不增加計算量。下圖表示含有空洞卷積和不用空洞卷積的效果。結果就是使用采樣率計算更加密集的特征映射。
- 2、增大感受野的同時,不增加參數數量
3、問題:
- signal down-sampling
- 問題:DCNNs每一層重複執行下采樣 (如max-pooling和downsampling),導緻signal分辨率降低。
- 将stride改小,能得到更加dense的feature map,可是卻也帶來了另外一個問題即receptive field(RF)變小的問題。
- 将Hole(Atrous convolution)算法應用到DCNNs模型上來擴充感受野,擷取更多的上下文資訊。
- spatial “insensitivity”(invariance)
- 問題:以擷取圖像中物體為核心的決策(High Level Vision Task,如圖檔分類、目标檢測任務)需要空間不變性,即DCNNs的high-level的平移不變性(invariance),導緻DCNNs做語義分割時定位精準度不夠。
- 将DCNNs層的響應和 完全連接配接條件随機場(Fully Connected CRFs)結合(DeepLab是由兩個非常成熟的子產品(DCNN和CRFs)級聯而成)
5、API實作
tf.nn.atrous_conv2d(value, filters, rate, padding, name=None)
value: 指需要做卷積的輸入圖像,要求是一個4維Tensor,具有[batch, height, width, channels]這樣的shape,具體含義是[訓練時一個batch的圖檔數量, 圖檔高度, 圖檔寬度, 圖像通道數]
filters: 相當于CNN中的卷積核,要求是一個4維Tensor,具有[filter_height, filter_width, channels, out_channels]這樣的shape,具體含義是[卷積核的高度,卷積核的寬度,圖像通道數,卷積核個數],同理這裡第三維channels,就是參數value的第四維
rate: 要求是一個int型的正數,正常的卷積操作應該會有stride(即卷積核的滑動步長),但是空洞卷積是沒有stride參數的,這一點尤其要注意。取而代之,它使用了新的rate參數,那麼rate參數有什麼用呢?它定義為我們在輸入圖像上卷積時的采樣間隔,你可以了解為卷積核當中穿插了(rate-1)數量的“0”,把原來的卷積核插出了很多“洞洞”,這樣做卷積時就相當于對原圖像的采樣間隔變大了。具體怎麼插得,可以看後面更加詳細的描述。此時我們很容易得出rate=1時,就沒有0插入,此時這個函數就變成了普通卷積。
padding: string類型的量,隻能是”SAME”,”VALID”其中之一,這個值決定了不同邊緣填充方式。
img =tf.constant(value=[[[[1],[2],[3],[4]],
[[1],[2],[3],[4]],
[[1],[2],[3],[4]],
[[1],[2],[3],[4]]]],dtype=tf.float32)
img =tf.concat(values=[img,img],axis=3)
filter =tf.constant(value=1, shape=[3,3,2,5], dtype=tf.float32)
out_img1 =tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='SAME')
out_img2 =tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='VALID')
out_img3 =tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='SAME')
#error#out_img4 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='VALID')
print('rate=1, SAME mode result:')
print(sess.run(out_img1.numpy()))
print('rate=1, VALID mode result:')
print(sess.run(out_img2.numpy()))
print('rate=2, SAME mode result:')
print(sess.run(out_img3.numpy())) # error #print 'rate=2, VALID mode result:' #print(sess.run(out_img4))
6.4.2.2 CRF的應用
1、背景
- DCNN的預測物體的位置是粗略的,沒有确切的輪廓。圖像輸入CNN是一個被逐漸抽象的過程,原來的位置資訊會随着深度而減少甚至消失
2、CRFs for accurate localization
- CRF:簡單來講就是每個像素點作為節點,像素與像素間的關系作為邊,即構成了一個條件随機場。通過二進制勢函數描述像素點與像素點之間的關系,鼓勵相似像素配置設定相同的标簽,而相差較大的像素配置設定不同标簽。
- CRF在傳統圖像處理上主要做平滑處理。就是在決定一個位置的像素值時,會考慮周圍鄰居的像素值,這樣能抹除一些噪音。
- 但對于CNN來說,short-range CRFs可能會起到反作用,因為我們的目标是恢複局部資訊,而不是進一步平滑圖像。引入fully connected CRF來考慮全局的資訊。
效果:
3、論文CRF設定
6.4.2.3 主要貢獻
- 速度:帶atrous算法的DCNN可以保持8FPS的速度,全連接配接CRF平均推斷需要0.5s
- 準确:在PASCAL語義分割挑戰中獲得了第二的成績
- 簡單:DeepLab是由兩個非常成熟的子產品(DCNN和CRFs)級聯而成
6.4.3 DeepLab V1 實驗
- 損失函數:輸出的特征圖與ground truth下采樣8倍做交叉熵和。
- 訓練資料label:對原始Ground Truth進行下采樣8倍,得到訓練label。
- 預測資料label:對預測結果進行雙線性上采樣8倍,得到預測結果。
測試細節:
item | set |
資料集 | PASCAL VOC 2012 segmentation benchmark |
DCNN模型 | 權重采用預訓練的VGG16 |
DCNN損失函數 | 交叉熵 |
訓練器 | SGD,batch=20 |
學習率 | 初始為0.001,最後的分類層是0.01。每2000次疊代乘0.1 |
權重 | 0.9的動量, 0.0005的衰減 |
CRF和多尺度的表現
經過DeepLap之後的效果和之前的效果對比:
6.4.4 總結
- DeepLab系列算法的特點
- DeeplabV1的結構特點
- DeeplabV1的空洞卷積與CRF應用