未經(jīng)允許倘屹,不得轉(zhuǎn)載,謝謝~~
《Deformable Convolutional Networks》是微軟亞洲研究院發(fā)在ICCV2017上的論文。
原文鏈接: Deformable Convolutional Networks
這是一篇我琢磨了很久才看懂的論文,也是每看一次都覺得idea很驚艷的一篇論文。
那主要從以下幾個問題進(jìn)行介紹吧:
- 為什么要提出可變的神經(jīng)網(wǎng)絡(luò)居夹?
- 論文的主要貢獻(xiàn)在哪里?
- 可變卷積層是怎么樣實(shí)現(xiàn)的本冲?
為什么要提出可變的神經(jīng)網(wǎng)絡(luò)准脂?
怎么樣在計(jì)算機(jī)視覺識別上更好的適應(yīng)物體在大小,姿態(tài)檬洞,角度上的幾何變換狸膏?
通俗地說就是一個物體比如杯子,由于拍攝的遠(yuǎn)近添怔,視角等因素最后呈現(xiàn)的樣子在大小湾戳,角度上都會有差別,那怎么樣更好的在這些差別存在的情況下識別這個杯子呢广料?
一般來說砾脑,有2種方法可以解決這個問題:
- 用充分多的變種構(gòu)建訓(xùn)練數(shù)據(jù)庫;
還是以杯子為例艾杏,即采集不同大小韧衣,姿勢的杯子作為訓(xùn)練數(shù)據(jù)。 - 用變換不變特征糜颠;
例如尺度不變特征轉(zhuǎn)換的SIFT就屬于這一類方法汹族。
這兩種方法都具有一些共同的局限性:
- 都假定幾何變換是固定的且可以預(yù)知的萧求,對于新出現(xiàn)的任務(wù)處理效果不好其兴;
- 手動去采集或者設(shè)計(jì)不同的特征非常的困難。
廣泛應(yīng)用于深度學(xué)習(xí)的CNN網(wǎng)絡(luò)也由于其卷積核是固定的形狀夸政,所以很難處理這種變換的情況元旬。
以上就是現(xiàn)有方法對于解決幾何變換問題的不足,哪里有需求守问,哪里就會有創(chuàng)新匀归,這也正是該論文的閃光之處。
論文的主要貢獻(xiàn)在哪里耗帕?
論文提出了兩種用于提高CNN應(yīng)對幾何變換的建模能力:
- deformable convolution穆端;
- deformable ROI pooling;
- 第一次發(fā)現(xiàn)在深度網(wǎng)絡(luò)總學(xué)習(xí)稠密的空間變化對復(fù)雜的任務(wù)有幫助仿便。
兩個方法都是基于用額外的偏置來增強(qiáng)空間采樣位置的想法体啰,其基本原理都是類似的攒巍,因此本文只講解可變卷積的實(shí)現(xiàn),具體的可以詳細(xì)去看論文荒勇。
可變卷積層是怎么樣實(shí)現(xiàn)的柒莉?
核心思想
以2D卷積,3×3的卷積核為例沽翔,先上圖:
- 圖(a)是我們最熟悉的標(biāo)準(zhǔn)卷積網(wǎng)絡(luò)兢孝。
- 圖(b)是變換之后的卷積采樣點(diǎn)分布,輕綠色的表示原來的采樣點(diǎn)仅偎,藍(lán)色的表示變換后的采樣點(diǎn)跨蟹。
- 圖(c)是圖(b)的一種特例:采樣尺寸放大的情況。
- 圖(d)是圖(b)的一種特例:采樣尺寸放大+旋轉(zhuǎn)的情況哨颂。
普通2D卷積的實(shí)質(zhì)其實(shí)是用卷積核在輸入特征上滑動喷市,各個采樣點(diǎn)乘上模板的權(quán)重之和得到一個新的值。
以圖(a)為例威恼,最中間的綠色點(diǎn)卷積后的值就等于9個采樣點(diǎn)對應(yīng)的x值乘上對應(yīng)卷積核的權(quán)重之和品姓。
這里注意一個思維的轉(zhuǎn)換:采樣點(diǎn)指的是原輸入特征上對應(yīng)點(diǎn),權(quán)重指的是卷積核對應(yīng)的值箫措。
用數(shù)學(xué)方法來表示:
以坐標(biāo)化的方式來表示接受域:
那么原輸入特征中的點(diǎn)P0卷積后的值就等于:
其實(shí)就是就是采樣點(diǎn)的值×卷積核權(quán)重之和腹备。
那么可變卷積的實(shí)現(xiàn)是不是只需要改變采樣點(diǎn)的位置即可。而這個改變就可以根據(jù)給每一個采樣點(diǎn)+一個偏置deta-p(x方向的偏置斤蔓,y方向的偏置)得到植酥,偏置具體值仍然是通過神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的。弦牡。
以圖b為例友驮,每個輕綠色的點(diǎn)表示原來常規(guī)卷積下的采樣點(diǎn),現(xiàn)在每一個點(diǎn)都移到了新的位置(藍(lán)色處)驾锰,而且每個點(diǎn)的移動方向和長度都可以是不一樣的卸留。
這里先不管是偏置怎么樣得到的,假設(shè)我們已經(jīng)知道每個采樣點(diǎn)對應(yīng)的偏置值椭豫。那么點(diǎn)P0卷積之后的值就等于:
這樣呢就完成了可變卷積的的部分耻瑟,也就是我們看到的圖(b)。
圖(c)和圖(d)都是圖(b)的特殊情況赏酥。
圖(c)中的采樣區(qū)域變大了喳整,很自然的可以想到這對于物體尺寸變化的處理效果是會比較好的,能比較完整地抽象到物體的特征裸扶。
圖(d)也是同樣的道理框都,可以很好的理解這種變換后的接受域?qū)τ谖矬w尺寸變化+旋轉(zhuǎn)之后的特征學(xué)習(xí)是有益的。
細(xì)節(jié)補(bǔ)充
由于學(xué)到的偏置一般都很小呵晨,新的坐標(biāo)并不能落在整數(shù)的坐標(biāo)點(diǎn)上魏保,所以需要用到雙線性插值來實(shí)現(xiàn)蔗蹋。
這里簡單介紹一下是什么意思,對于我們的新采樣點(diǎn)p_new, 大概率不會剛好落在整數(shù)的坐標(biāo)點(diǎn)上囱淋,但它一定能找到與它最近的4個點(diǎn)猪杭,并且落在這4個點(diǎn)的內(nèi)部。
那么就利用這四個點(diǎn)進(jìn)行雙線性插值即可妥衣,在scipy的包中提供了這個函數(shù):
from scipy.ndimage.interpolation import map_coordinates
我們來看一下運(yùn)行效果就知道了
import numpy as np
from scipy.ndimage.interpolation import map_coordinates as sp_map_coordinates
input=np.arange(12,dtype=float).reshape(3,4)
print input
coords=[[0.5,1.5,1.8],[0.5,1.2,2.0]]
output_array=sp_map_coordinates(input,coords,order=1)
print output_array
運(yùn)行結(jié)果如下所示:
如上圖皂吮,input為輸入的數(shù)組,order=1 表示為線性插值税手。
coords里面存的是列表蜂筹,為(npoints,2)大小的,左邊的數(shù)組代表要插入的x坐標(biāo)芦倒,右邊的數(shù)組表示要插入的y坐標(biāo)艺挪。即在此處要在原來的inputs中插入三個點(diǎn),這是三個點(diǎn)的坐標(biāo)分別為(0.5,0.5) (1.5,1.2) (1.8,2.0)兵扬,以(0.5,0.5)為例麻裳,下標(biāo)落在(0,0) , (0,1), (1,0), (1,1)這四個點(diǎn)之間,即要在在值0器钟,1津坑,4,5之間差值傲霸,所以這里用了雙線性插值疆瑰,最后得到的值為2.5
具體實(shí)現(xiàn)
這里論文中讓我很驚艷的一點(diǎn)是:
上面的圖1我們看到的好像是對卷積核的坐標(biāo)做了偏置。
但其實(shí)還是上文提到的思維轉(zhuǎn)換的問題:可變卷積是由改變采樣點(diǎn)的位置決定的昙啄,而采樣點(diǎn)是對于輸入特征而言的穆役。更宏觀一點(diǎn)來看,它是對采樣點(diǎn)對了偏置梳凛,就是對輸入feature的每個位置學(xué)習(xí)一個offset耿币。
這里給出論文中的結(jié)構(gòu)圖:
這里的offset filed就是通過卷積層conv學(xué)到的偏置。
因?yàn)檩斎胩卣鱥nput feature map 上的每個點(diǎn)都需要一個偏置offset(x上的偏置,y上的偏置), 所以得到的offest field的平面大小的input feature map是一樣的伶跷,但深度方向是input feature map的2倍(x,y兩個方向的偏置)掰读。
這樣就得到每個點(diǎn)p的偏置窗口了秘狞,也就是得到了上文圖1中的圖(b)叭莫。
得到偏置窗口之后就可以用上文中的方式去得到最后的output feature map了。
寫在最后
文中圖片來自原文: Deformable Convolutional Networks
這真的是一篇創(chuàng)新點(diǎn)新奇的文章烁试,超級推薦閱讀雇初。
有理解不到位的地方歡迎簡信交流~~
轉(zhuǎn)載記得注明出處,感激不盡减响。