Multi-Attention Convolutional Network筆記

此篇文章記錄自己對2017年的ICCV一篇關於圖像領域的注意力模型的理解。(論文題目《Learning Multi-Attention Convolutional Neural Network for Fine-Grained Image Recognition》)

Approach

整個結構由三部分組成,分別是特徵提取的卷積層、channel grouping層和part classifier 組成。 提出了兩個損失函數,一個是對於part classification loss 和對於channel grouping loss。整體架構如下所示
在這裏插入圖片描述
首先,將圖片輸入到MA-CNN,得到feature channels,我們假定feature channels的表達是WXW*X,維度爲whcw*h*c。看過《Visualizing and Understanding Convolutional Networks》這篇論文的應該知道,其實每個feature map即每個feature channel都會對應於原圖的某一個pattern(e.g.,頭或翅膀等),所以我們會得到如上圖所示的feature channel,接着對channels進行grouping,這個通過文中給的LcngL_{cng}損失韓式進行聚類,會使得parts之間分離,part內部更加聚集。其中LcngL_{cng}的形式如下所示
Lcng=Dis(Mi)+λDiv(Mi)where Dis(Mi)=(x,y)Mimi(x,y)[xtx2+yty2]Div(Mi)=(x,y)Mimi(x,y)[maxk!=imk(x,y)mrg] L_{cng}=Dis(M_i)+\lambda Div(M_i) \\ where\ Dis(M_i)=\sum_{(x,y)\in M_i} m_i(x,y)[||x-t_x||^2+||y-t_y||^2] \\ Div(M_i)=\sum_{(x,y)\in M_i} m_i(x,y)[\max_{k!=i} m_k(x,y)-mrg]
其中mrgmrg是指margin,估計是爲了能夠允許一定的overlap,這樣能夠有更強的泛化性能(舉個例子,如汽車的燈和輪胎,他們之間很近,難免會有重疊)。從表達式很明顯可以看出DivDiv用於將不同part分離開,DisDis負責使part內部更加聚集。作者通過如此的方法獲得了更加具有辨別性的區域,並且從channels的豐富信息中獲得了更多part,這樣能夠獲得更強的robustness,例如當wing被遮住了,那麼我們還可以通過beak等進行分類。論文提出了一種可以方便訓練的grouping方法,即用兩層全連接近似grouping過程。對於上圖中的part attentions的計算,這裏在論文中提到的方法和作者實現有點略微差別。例如我們現在設定提取N個part,論文中提到使用N個全連接,那麼每個全連接我們得到一個向量:
di(X)=fi(WX) d_i(X)=f_i(W*X)
向量的維度爲channels的個數,其中的每個元素表示是否某個channel屬於這個part,上述的損失函數會使得各個part(即表示原圖中的一個region,例如beak、wing等)分開,也就是說channel會被儘可能唯一地分配給一個part。然後我們使用如下式子計算part attention:
Mi(X)=sigmoid(j=1cdj[WX]j) M_i(X)=sigmoid(\sum_{j=1}^cd_j[W*X]_j)
其中[]j[]_j表示jthj^{th}channel,實質上就是將屬於某一個part的所有feature channels相加,得到一個比較集中的part表示,結合了多個feature channel的信息,然後對MiM_i進行標準化。進一步我們通過一種空間的池化獲得part representations,如下所示
Pi(X)=j=1c([WX]jMi(X)) P_i(X)=\sum_{j=1}^c([W*X]_j*M_i(X))
上面的*是對應元素相乘,其實可以這樣理解Mi(X)M_i(X),它表示的只是對於某一個part來說,某一個像素屬於這個part的probability,也之所以作者做了一下歸一化(通過所有元素的和)。進一步我們使用這個part Representation通過softmax進行分類,這裏作者沒有說明是否還要加一層全連接,我覺得都可以,還可以使用一個卷積+全局池化或者全局池化+全連接。對於類別的損失,作者使用如下:
i=1N[Lcls(Y(i),Y)] \sum_{i=1}^N[L_{cls}(Y^{(i)},Y^*)]
其中LclsL_{cls}可以是任意的一般分類損失函數,Y(i)Y^{(i)}是第ithi^{th} part的預測結果(是一個向量)。對於最後的預測,在這一部分作者並沒有給出,可以將這些特徵和整個圖像的特徵進行concat,然後通過一個分類層進行分類,在後面的試驗中作者也是這麼做的。具體實現時,作者使用了Deconvolution with bilinear type(就是使用bilinear的方式初始化卷積核的參數,然後進行卷積運算,實質就是bilinear插值)進行求解Mi(X)M_i(X),然後與所有的feature channels按元素乘,然後進行空間pooling,最後進行了一系列的softmax操作、縮放變換,可能爲了讓大數值與小數值分得更清晰吧。

Optimization

作者的優化思路是基於上面兩個損失函數進行的,這兩個損失函數相互加強,不斷迭代。先固定住b、g部分的參數,使用LcngL_{cng}優化channels grouping部分。然後固定住channels grouping的參數,然後使用LclsL_{cls}對b、g部分進行優化。這樣不斷迭代,直到兩個損失值都不再變化。

Some difference

作者在給出了上面的基本模型後,又說了我們現在好的part已經可以得到了,但是由於local region太小了,難以去表示在local region裏面的subtle差別,比如說鳥嘴的顏色啊等等,即我們之前使用那個Pi(X)P_i(X)不能很好地表示part Representation,因爲作者的目的就是對fine-grained image進行分類,對於part內的difference是很重要的。作者的解決思路是放大part,並且加入整個圖片的特徵。具體做法是加入part-CNNs(作者使用了VGG19),我們首先求得Mi(X)M_i(X),然後得到peak response point的座標,然後切一個9696的part,將這些parts放大到224224,然後放入各自的part-CNNs中進行提取特徵,然後將整個圖片(根據數據集而定,有些不是整個圖片)放入屬於它的part-CNN中提取特徵(同樣使用VGG19),然後將這些特徵進行concat,最後輸入到一個fc layer+softmax進行最終的分類。這裏作者應該是使用兩個損失函數先訓練前述的MA-CNN,然後能夠獲得好的parts後,將part和整個圖片傳入最後的part-CNN中進行最終的分類。

Ref:
[1]源碼鏈接 https://onedrive.live.com/?authkey=!ADwfD7C9IwnEc9k&id=693885F2E24EFF4D!125&cid=693885F2E24EFF4D
[2]《Learning Multi-Attention Convolutional Neural Network for Fine-Grained Image Recognition》
[3] https://github.com/minfengUCAS/Muti-Attention-CNN

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章