图像目标分割_4 DeepLab-V1
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在語義分割下非常有效。
- 系統與其他先進模型的主要區別在于DenseCRFs和DCNN的結合。是將每個像素視為CRF節點,利用遠程依賴關系,并使用CRF推理直接優化DCNN的損失函數。拓展:Koltun(2011)的工作表明完全連接的CRF在語義分割下非常有效。
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。
- 也就是說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設置
全連接CRF模型使用的能量函數E(x)E(x)?E(x)=\sum_i\theta_i(x_i)+\sum_{ij}\theta_{ij}(x_i,y_j)E(x)=?i?∑??θ?i??(x?i??)+?ij?∑??θ?ij??(x?i??,y?j??)
-
x:對全局pixels的概率預測分布
-
xi:其中一個pixel的概率預測分布
-
θi:一元勢函數 unary potential function,定義在觀測序列位置i的狀態特征函數,用于刻畫觀測序列對標記變量的影響
- 則:
\theta_i(x_i)=-\log P(x_i)θ?i??(x?i??)=?logP(x?i??)
-
θi:二元勢函數 unary potential function,定義在不同觀測位置上的轉移特征函數,用于刻畫變量之間的相關關系以及觀測序列對其影響(實質是像素之間的關系)
-
則:
-
其中k^m(f_i,f_j)k?m??(f?i??,f?j??)為(f_i,f_j)(f?i??,f?j??)之間的高斯核,fi是像素i的特征向量,例如像素點i的特征向量fi用(x,y,r,g,b)表示。對應的權重為w_{m}w?m??
-
\theta_{ij} (x_i,y_j)=u(x_i,x_j)\sum^K_{m=1}\omega_m\cdot k^m(f_i,f_j)θ?ij??(x?i??,y?j??)=u(x?i??,x?j??)?m=1?∑?K??ω?m???k?m??(f?i??,f?j??)
-
在DeepLab中高斯核采用雙邊位置和顏色組合,式為:第一核取決于像素位置(p)和像素顏色強度(I),第二個核取決于像素位置(p).
- \omega_1\exp-\frac{||p_i-p_j||^2}{2\sigma_{\alpha}^2}-\frac{||I_i-I_j||^2}{2\sigma_{\beta}^2})+\omega_2\exp(-\frac{||p_i-p_j||^2}{2\sigma_{\gamma}^2})ω?1??exp??2σ?α?2????∣∣p?i???p?j??∣∣?2??????2σ?β?2????∣∣I?i???I?j??∣∣?2????)+ω?2??exp(??2σ?γ?2????∣∣p?i???p?j??∣∣?2????)
-
總結:二元勢函數是描述像素和像素之間的關系,如果比較相似,那可能是一類,否則就裂開,這可以細化邊緣。一般的二元勢函數只取像素點與周圍像素之間的邊,這里使用的是全連接,即像素點與其他所有像素之間的關系。
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倍,得到預測結果。
測試細節:
| 數據集 | PASCAL VOC 2012 segmentation benchmark |
| DCNN模型 | 權重采用預訓練的VGG16 |
| DCNN損失函數 | 交叉熵 |
| 訓練器 | SGD,batch=20 |
| 學習率 | 初始為0.001,最后的分類層是0.01。每2000次迭代乘0.1 |
| 權重 | 0.9的動量, 0.0005的衰減 |
- DeepLab由DCNN和CRF組成,訓練策略是分段訓練,即DCNN的輸出是CRF的一元勢函數,在訓練CRF時是固定的。
- DeepLab由DCNN和CRF組成,訓練策略是分段訓練,即DCNN的輸出是CRF的一元勢函數,在訓練CRF時是固定的。在對DCNN做了fine-tune后,對CRF做交叉驗證。這里使用ω2=3和σγ=3在小的交叉驗證集上尋找最佳的\omega_1,\sigma_{\alpha},\sigma_{\beta}ω?1??,σ?α??,σ?β??,采用從粗到細的尋找策略。
CRF和多尺度的表現
經過DeepLap之后的效果和之前的效果對比:
總結
以上是生活随笔為你收集整理的图像目标分割_4 DeepLab-V1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构之二叉树:二叉查找树的先序、中序
- 下一篇: Django 模板实现(动态)图片/头像