Deeplab系列是谷歌團隊的分割網絡.
DeepLab V1
CNN處理圖像分割的兩個問題
- 下采樣導致信息丟失
maxpool造成feature map尺寸減小,細節信息丟失. - 空間不變性
所謂空間不變性,就是說比如一張狗的圖,狗位於圖片正中還是某一個角,都不影響模型識別出這是一個狗. 即模型對於輸入圖像的空間位置不敏感,不管這個圖片旋轉,平移等,都能夠識別. 對分類來說,這是ok的.但是對於分割來說,這就不OK了,圖片旋轉以后,每一個像素所屬的分類當然就改變了.
究其原因,分類處理的是更"高級"的特征,而分割是對每一個像素做分類,需要更多的細節.
deeplab v1采用2個方法解決這兩個問題
- 空洞卷積
- 條件隨機場CRF
空洞卷積
為什么要有maxpool?
一方面是為了減小feature map尺寸.一方面也是為了增大feature map中的每一個元素的感受野.
FCN是怎么做的?
得到特征圖后,用deconv的方式上采樣將feature map恢復到原始圖像尺寸.但是這種先max pool下采樣再deconv上采樣的過程勢必會損失掉一部分信息.
deeplab如何解決這個問題?
deeplab提出了一種dilated conv(空洞卷積)的卷積方式,去替代max pool,但同時感受野不丟失.
dilated的好處是不做pooling損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大范圍的信息。,對圖像分割這種對空間位置,細節信息很敏感的任務而言,空洞卷積是一種很好的方式.
空洞卷積的卷積方式如下圖所示:
(a)圖對應3x3的1-dilated conv,和普通的卷積操作一樣,(b)圖對應3x3的2-dilated conv,實際的卷積kernel size還是3x3,但是空洞為1,也就是對於一個7x7的圖像patch,只有9個紅色的點和3x3的kernel發生卷積操作,其余的點略過。也可以理解為kernel的size為7x7,但是只有圖中的9個點的權重不為0,其余都為0。 可以看到雖然kernel size只有3x3,但是這個卷積的感受野已經增大到了7x7(如果考慮到這個2-dilated conv的前一層是一個1-dilated conv的話,那么每個紅點就是1-dilated的卷積輸出,所以感受野為3x3,所以1-dilated和2-dilated合起來就能達到7x7的conv),(c)圖是4-dilated conv操作,同理跟在兩個1-dilated和2-dilated conv的后面,能達到15x15的感受野。對比傳統的conv操作,3層3x3的卷積加起來,stride為1的話,只能達到(kernel-1)*layer+1=7的感受野,也就是和層數layer成線性關系,而dilated conv的感受野是指數級的增長。
CRF
由於CNN天然的空間不變性,使得對分割任務而言,CNN提取到的特征不夠精細.所以在特征提取后,我們再加一個CRF,達到更精細的特征提取目的.
以前寫過一篇條件隨機場筆記
說白了,就是一堆特征提取函數(相當於CNN中的卷積核),對不同的特征提取函數賦以不同的權重(相當於全連接層),再做指數化和正則化(相當於softmax)得到一個概率值.
https://blog.csdn.net/hjimce/article/details/50888915
DeepLab V2
相較於v1
- ASPP
- 基礎特征提取網絡由vgg替換為resnet
重點是ASPP
ASPP(Atrous Spatial Pyramid Pooling)
看名字就知道了,空間金字塔.用以解決多尺度問題.即對同一個物體,不管其在圖像中是大或小都可以准確識別.
具體如下:
用不同的空洞卷積對輸入做卷積,再融合不同的feature map.
如上圖所示,(a)是沒有用ASPP的,(b)是用了ASPP的結構.
DeepLab V3
論文地址:https://arxiv.org/abs/1706.05587
v3對網絡結構做了比較大的改變,主要是:
- 去掉了crf.
- 改造了resnet,在resnet中使用空洞卷積和金字塔空洞卷積
對resnet的改造體現在兩點:
- 使用空洞卷積,去掉下采樣,如此,保證感受野與feature map尺寸不變
- 在殘差塊內部使用ASPP,保證對多尺度的敏感
使用空洞卷積
feature map的尺寸減小的同時,相當於空間信息的丟失.圖像分割對空間信息很敏感,所以保持feature map的size是非常重要的,deeplab系列的設計思路也是如此,即在保留感受野的情況下,同時保持feature map的size不變
(a)是普通的不帶空洞卷積的方式,(b)通過空洞卷積的方式,在保持了感受野的同時,還沒有減小feature map的尺寸.
aspp
在block內部使用rate不同的空洞卷積並行地做卷積,再對得到的feature做融合.
google團隊的網絡風格就是這樣,總是喜歡在一種卷積方式上不斷演化,inception系列如此,deeplab系列也是如此.