【蜂口 | AI人工智慧】影像分割的關鍵技術——龍鵬的一站式caffe工程實踐連載(五)

絵飛的魚發表於2018-09-25

知識引入

本次主要和大家分享的是影像分割中的關鍵技術,首先對任務分析,一般在正式開始影像任務之前,我們會對任務的整個的技術方案進行一個評估,評估之後我們會選擇比較簡單比較穩妥的方案,也就是精簡我們的任務。我們的任務是一個影像分割的任務,影像分割任務與影像分類任務不同,影像分類任務,它的輸入是圖片,輸出是一個level,也就是一個數。而影像分割任務不同,它的輸出也是一張圖片,這個圖片與輸入的圖片大小相等,所以我們不僅需要卷積,我們還需要反摺積,卷積的過程就是不斷降低影像的解析度,抽象知識,而在反摺積過程中,我們就要不斷的提升解析度,來恢復影像的細節。反摺積是影像分割任務的基礎結構,我們會在後面進行詳述。

殘差連線

殘差連線現在是影像任務中的一個非常非常重要的一個技術。它主要有兩個方面的作用。首先它可以有效地緩解深層神經網路中的梯度消散問題。其次,可以融合細節,融合底層和高層的支援。這一點是提升影像分割任務的一個非常關鍵的技術。可以說殘差連線是提升影像分割任務的利器。我們首先看一些人臉,這些人臉是在開放環境下的人臉,如下圖所示:

 

我們可以看到這些人臉的背景都非常的複雜,有些是純色,有些包含其他的干擾,有些包含非常非常雜亂的顏色。假如我們直接在這樣的一張輸入圖上做我們的影像分割,也就是嘴唇分割的任務的話,它會受到背景的嚴重干擾,所以我們需要進一步簡化任務,具體來說就是這樣:首先我們利用人類檢測演算法檢測到人臉,然後利用關鍵點檢測演算法定位到我們嘴唇的區域。我們將嘴唇的區域擷取出來之後,我們在這樣的一個輸入影像上訓練我們的影像風格的網路。這樣一來,他的背景干擾就基本上沒有了,整個任務也被大大的精簡,演算法的魯棒性也會提升很多。如圖所示:

第二步,反摺積。可以看作是卷積的逆過程。我們先看看卷積,下方的藍色是輸入,上方的綠色是輸出。我們輸入的是 4×4,輸出的是2×2。可以看到輸出的每一個畫素,它都是由輸入的3×3的一個區域來決定,如圖所示:  

我們再看看反摺積,下方 2×2的藍色是輸入,上方4×4的綠色是輸出。我們可以看到反摺積將解析度提升了一倍,輸入的每一個畫素都會對輸出的其中一個區域的畫素產生作用。如圖所示:

下面是 Caffe中卷積和反摺積輸入輸出的一個尺寸的計算。

卷積輸出結果,假設用變數   表示 , 則:

x= (input + 2 * pad  - kernel_size)  / stride + 1;

反摺積輸出結果,假設用變數   表示 , :

 

y = (input - 1) * stride + kernel_size - 2 * pad;

總結一下,我們可以簡單的認為卷積的操作,就是像一個大的分率降為一個小的解析度。而反摺積的操作正好相反,就是將小的解析度波動的上取樣,轉化為大的解析度。

網路 -Segnet

下面我們看一個比較經典的反摺積的影像分割網路 -Segnet,如下圖所示:

它最早被用於自動駕駛。我們可以看到整個的網路呈對稱的結構,左邊這一塊是卷積,右邊這一塊是反摺積。反摺積跟卷積,基本上是處於完全定向的一個結構。在卷積的過程中,我們不斷降低我們的 feature map的尺寸,在反摺積的過程中,我們不斷地提升我們影像解析度,同時對於相同解析度的featuremap,他們之間還有 一個skip連線,在後面章節中會詳細的介紹。下面我們說說我們的殘差連線,也就是skip connection, 再說我們的殘差連線之前,我們先說深層神經網路中的一個比較經典的問題,也就是梯度消散。

梯度消散

也就是說在網路進行反向傳播的過程中,梯度最終變得非常小,直到為零。 梯度消散 來源於鏈式法則。我們假設有這樣的一個任務,如圖所示:  

我們的輸入是 X,我們的輸出是cost,f,g,k,都可以都可以看作是一些非線性的變化。比如說f是卷積操作,g是啟用層,K是最後的分類器,cost就是我們最終的一個損失函式。當我們要求我們的損失函式對於F的導數的時候,就要透過鏈式法則 來進行 求取。具體來說就是這樣。我們可以看到它包含了好幾個部分的相乘,如下圖所示:

假如這幾個相乘的部分,其中有數值非常小的,那麼在多次連乘之後,梯度可能就變得非常非常小。尤其對於上百層上千層的深度神經網路,不用穿多少層,它的梯度就幾乎可以忽略不計。當梯度消散之後,誤差就無法傳播到淺層的神經網路,就無法進行正確的學習。這個時候殘差連線就橫空出世了,這是殘差連線的一個基本的結構。對於非殘差連線它的豎式 X輸出是FX,對於殘差連線,他就是在X這個通道上,直接拉了一條支路 ,加上輸出的FX,也就是說,這個時候我們的輸出變成了f(x)+x,如圖所示:

 

它有什麼好處呢?我們直接給大家舉一個例子。

https://mp.weixin.qq.com/s/DyU3bBtbtYTw5PQjBk_gNg

此處影片內容由於受編輯器的限制,請根據連結移步到我們的微信公眾號去觀看,謝謝 

除了以上可以有效的緩解梯度消散的問題之外,殘差連線還可以融合底層和高層的資訊。同樣我們看一個非常經典的網路,這個網路是全卷積網路,也是第一個真正意義上的比較有用的一個影像分割網路。如圖所示:

我們可以看到,它的卷積卷積層包含了若干的卷積層, conv1,pool1 , conv2,pool2,這樣的一個連線,在做反摺積也就是恢復影像解析度的過程中,他會不斷的進行相進行上取樣。在上取樣的過程中,我們可以看到它將pool4跟兩倍的conv7,這兩個featuremap進行的融合,它將pool3跟兩倍的pool4,以及四倍的conv7的featuremap,這三個featuremap進行融合,這樣的融合有什麼作用呢?我們可以看到在網路不斷的往下傳的過程中,從pool3到pool4,pool4的感受也越來越大,在反摺積的過程中也是如此。我們將pool4跟兩倍的conv7的感受也進行融合,這樣的話就實現了區域性和全域性的感受也一個個融合。這樣的一個融合帶來好處就是我們將底層的資訊跟高層的資訊進行融合,在網路比較淺層的時候,比如從conv1到conv2到conv3,它就是一個從底層資訊到高層資訊的一個抽象,越到後面越是如此。 我們在做反摺積操作的時候,我們將底層的資訊也融合進來,這樣可以大大提升影像的分割任務,尤其是對邊緣部分,可以大大的提升影像風格任務的baselines。

以上就是影像分割任務中的一些關鍵的技術的分享。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31553577/viewspace-2214822/,如需轉載,請註明出處,否則將追究法律責任。

相關文章