国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

更靈活、有個(gè)性的卷積——可變形卷積(Deformable Conv)

2020-12-10 17:00 作者:深藍(lán)學(xué)院  | 我要投稿

作者CW,廣東深圳人,畢業(yè)于中山大學(xué)(SYSU)數(shù)據(jù)科學(xué)與計(jì)算機(jī)學(xué)院,畢業(yè)后就業(yè)于騰訊計(jì)算機(jī)系統(tǒng)有限公司技術(shù)工程與事業(yè)群(TEG)從事Devops工作,期間在AI LAB實(shí)習(xí)過(guò),實(shí)操過(guò)道路交通元素與醫(yī)療病例圖像分割、視頻實(shí)時(shí)人臉檢測(cè)與表情識(shí)別、OCR等項(xiàng)目。目前也有在一些自媒體平臺(tái)上參與外包項(xiàng)目的研發(fā)工作,項(xiàng)目專(zhuān)注于CV領(lǐng)域(傳統(tǒng)圖像處理與深度學(xué)習(xí)方向均有)。

前言

相信大家在看paper的時(shí)候或多或少都能見(jiàn)到Deformable操作的身影,這種可變形操作可嵌入到算法中的許多部分,最常見(jiàn)的是可變形卷積,另外還有對(duì)候選區(qū)域的池化等,它們都是從 Deformable Convolutional Networks(DCN)?中衍生出來(lái)的。

作者將DCN中有關(guān)可變形卷積的知識(shí)梳理了一番,同時(shí)基于Pytorch框架進(jìn)行源碼實(shí)現(xiàn),在加深理解的同時(shí)還可方便自己日后使用,感興趣的朋友們也可以共同享用,我不獨(dú)食,一起嚼,更香!

本文概述

I. Deformable Conv:我是個(gè)會(huì)變形(不是變性哦)的個(gè)性boy

II. 揭秘可變形卷積大法

III. 還沒(méi)吃飽?這就來(lái)解析源碼!??

Deformable Conv:我是個(gè)會(huì)變形的個(gè)性boy

傳統(tǒng)的卷積操作是將特征圖分成一個(gè)個(gè)與卷積核大小相同的部分,然后進(jìn)行卷積操作,每部分在特征圖上的位置都是固定的。這樣,對(duì)于形變比較復(fù)雜的物體,使用這種卷積的效果就可能不太好了。

對(duì)于這種情況,傳統(tǒng)做法有豐富數(shù)據(jù)集,引入更多復(fù)雜形變的樣本、使用各種數(shù)據(jù)增強(qiáng)和trick,以及人工設(shè)計(jì)一些手工特征和算法。

基于數(shù)據(jù)集和數(shù)據(jù)增強(qiáng)的做法都有點(diǎn)“暴力”,通常收斂慢而且需要較復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)來(lái)配合;而基于手工特征算法就實(shí)在是有點(diǎn)“太難了”。特變是物體形變可能千變?nèi)f化,這種做法本身難度就很大,而且不靈活,煉丹本身就夠辛苦了,何必這么折騰呢?

這時(shí)候,Deformable Conv 出道了!他站上演講臺(tái),說(shuō)他是個(gè)性boy,他會(huì)變形,不像常規(guī)卷積那樣死板,他更靈活,可以應(yīng)對(duì)上述提到的物體復(fù)雜形變的場(chǎng)景。

那?Deformable Conv?是怎么解決問(wèn)題的呢?

Deformable Conv 在感受野中引入了偏移量,而且這偏移量是可學(xué)習(xí)的,我這招可以使得感受野不再是死板的方形,而是與物體的實(shí)際形狀貼近,這樣之后的卷積區(qū)域便始終覆蓋在物體形狀周?chē)瑹o(wú)論物體如何形變,我加入可學(xué)習(xí)的偏移量后通通搞定!” 話音剛落,他還順帶秀出了他這招的效果:

可變形卷積 vs 標(biāo)準(zhǔn)卷積

上圖(a)中綠色的點(diǎn)代表原始感受野范圍,(b)、(c)和(d)中的藍(lán)色點(diǎn)代表加上偏移量后新的感受野位置,可以看到添加偏移量后可以應(yīng)對(duì)諸如目標(biāo)移動(dòng)、尺寸縮放、旋轉(zhuǎn)等各種情況。

揭秘可變形卷積大法

Deformable conv 一直遵奉開(kāi)源協(xié)同,共同學(xué)習(xí),共同進(jìn)步,大家好才是真的好,世界才美好!下面他就為大家揭秘了他的大招——可變形卷積大法。

傳統(tǒng)的卷積結(jié)構(gòu)可以定義成公式1,其中是輸出特征圖的每個(gè)點(diǎn),與卷積核中心點(diǎn)對(duì)應(yīng),pn是p0在卷積核范圍內(nèi)的每個(gè)偏移量。

?常規(guī)卷積公式

而可變形卷積則在上述公式1的基礎(chǔ)上為每個(gè)點(diǎn)引入了一個(gè)偏移量,偏移量是由輸入特征圖與另一個(gè)卷積生成的,通常是小數(shù)。

可變形卷積公式

由于加入偏移量后的位置非整數(shù),并不對(duì)應(yīng)feature map上實(shí)際存在的像素點(diǎn),因此需要使用插值來(lái)得到偏移后的像素值,通??刹捎秒p線性插值,用公式表示如下:

雙線性插值公式

上述公式的意義就是說(shuō)將插值點(diǎn)位置的像素值設(shè)為其4領(lǐng)域像素點(diǎn)的加權(quán)和,領(lǐng)域4個(gè)點(diǎn)是離其最近的在特征圖上實(shí)際存在的像素點(diǎn),每個(gè)點(diǎn)的權(quán)重則根據(jù)它與插值點(diǎn)橫、縱坐標(biāo)的距離來(lái)設(shè)置,公式最后一行的max(0, 1-...)就是限制了插值點(diǎn)與領(lǐng)域點(diǎn)不會(huì)超過(guò)1個(gè)像素的距離。

可變形卷積示意圖

Deformable Conv boy給出了可變形卷積操作的簡(jiǎn)單示意圖,可以看到offsets是額外使用一個(gè)卷積來(lái)生成的,與最終要做卷積操作那個(gè)卷積不是同一個(gè)。

源碼解析

畢竟煉丹本來(lái)就夠玄的了,敘述完原理后,如果沒(méi)有實(shí)實(shí)在在的代碼,那就如同癡人說(shuō)夢(mèng)話!Deformable Conv boy不愧是大度的boy,他二話不說(shuō),立刻就對(duì)他的大招進(jìn)行源碼解析。

常規(guī)操作,他使用nn.Module的子類(lèi)來(lái)封裝可變形卷積操作,其中modulation是可選參數(shù),若設(shè)置為T(mén)rue,那么在進(jìn)行卷積操作時(shí),對(duì)應(yīng)卷積核的每個(gè)位置都會(huì)分配一個(gè)權(quán)重。

Deformable Conv 源碼(i)

p_conv是生成offsets所使用的卷積,輸出通道數(shù)為卷積核尺寸的平方的2倍,代表對(duì)應(yīng)卷積核每個(gè)位置橫縱坐標(biāo)都有偏移量,因此需要乘2。

conv則是最終實(shí)際要進(jìn)行的卷積操作,注意這里步長(zhǎng)設(shè)置為卷積核大小,因?yàn)榕c該卷積核進(jìn)行卷積操作的特征圖是由輸出特征圖中每個(gè)點(diǎn)擴(kuò)展為其對(duì)應(yīng)卷積核那么多個(gè)點(diǎn)后生成的。

比如conv是3x3卷積,輸出特征圖尺寸2x3(hxw),那么其每個(gè)點(diǎn)都被擴(kuò)展為9(3x3)個(gè)點(diǎn),對(duì)應(yīng)卷積核的每個(gè)位置。于是與conv進(jìn)行卷積的特征圖尺寸變?yōu)?2x3) x (3x3),將stride設(shè)置為3,最終輸出的特征圖尺寸就剛好是2x3。

Deformable Conv 源碼(ii)

以上還對(duì)p_conv和m_conv的權(quán)重進(jìn)行了初始化。p_conv的權(quán)重初始化為0,代表初始時(shí)沒(méi)有偏移量;m_conv的權(quán)重初始化為1,代表初始時(shí)卷積核每個(gè)位置的權(quán)重都為1。

下圖這部分對(duì)應(yīng)的就是上一節(jié)講到的可變形卷積公式?

,即輸出特征圖上每點(diǎn)(對(duì)應(yīng)卷積核中心)加上其對(duì)應(yīng)卷積核每個(gè)位置的相對(duì)(橫、縱)坐標(biāo)后再加上自學(xué)習(xí)的(橫、縱坐標(biāo))偏移量。

p0就是將輸出特征圖每點(diǎn)對(duì)應(yīng)到卷積核中心,然后映射到輸入特征圖中的位置;pn則是p0對(duì)應(yīng)卷積核每個(gè)位置的相對(duì)坐標(biāo)。

比如使用3x3卷積,那么對(duì)于卷積核的1個(gè)中心點(diǎn)來(lái)說(shuō),在pn中,橫、縱相對(duì)坐標(biāo)各3個(gè)值(-1、0、1),組合起來(lái)一共有9(3x3)個(gè)值,pn僅與卷積核尺寸相關(guān)。p0、pn、offset的形狀都是一樣的,其中N為卷積核尺寸的平方(如果是3x3卷積的話,N就是9)。

Deformable Conv 源碼(iii)

接下來(lái)解析p0的計(jì)算,p0_y、p0_x就是輸出特征圖每點(diǎn)映射到輸入特征圖上的縱、橫坐標(biāo)值。根據(jù)torch.arange()那部分可知,縱、橫坐標(biāo)分別都有out_h和out_w個(gè),與輸出特征圖尺寸對(duì)應(yīng)。

kc是卷積核中心位置,比如3x3卷積的話,中心點(diǎn)位置就是(1,1),然后根據(jù)卷積的步長(zhǎng)和輸出特征圖尺寸就能得到在每個(gè)卷積過(guò)程中,中心點(diǎn)對(duì)應(yīng)在輸入特征圖上的位置。

最后,這里將p0_y和p0_x進(jìn)行reshape是為了在后續(xù)操作時(shí)和pn以及offset的形狀對(duì)應(yīng)上。

Deformable Conv 源碼(iv)

搞定完p0,接下來(lái)擼一擼pn。與p0的計(jì)算類(lèi)似,只不過(guò)其僅由卷積核尺寸決定,由于卷積核中心點(diǎn)位置是其尺寸的一半,于是中心點(diǎn)向左(上)方向移動(dòng)尺寸的一半就得到起始點(diǎn),向右(下)方向移動(dòng)另一半就得到終止點(diǎn),這就是以下torch.arange()部分對(duì)應(yīng)的內(nèi)容。

Deformable Conv 源碼(v)

OK,至此我們得到了卷積時(shí)每點(diǎn)偏移后的位置,但是如上一節(jié)所述,這些位置通常是小數(shù),并不對(duì)應(yīng)特征圖上實(shí)際的像素點(diǎn),Deformable Conv boy 使用雙線性插值來(lái)計(jì)算這些位置的像素值,使用這招首先需要知道每個(gè)位置點(diǎn)最近的4領(lǐng)域點(diǎn),它們是特征圖上實(shí)際的像素點(diǎn),再根據(jù)4領(lǐng)域點(diǎn)與插值點(diǎn)位置的距離設(shè)置權(quán)重,最終由這些權(quán)重和像素值進(jìn)行加權(quán)求和得到插值點(diǎn)的像素。

以下就是得到4領(lǐng)域點(diǎn)位置的計(jì)算過(guò)程,同時(shí)需要注意將這些位置限制在輸入特征圖尺寸范圍內(nèi)。

Deformable Conv 源碼(vi)
Deformable Conv 源碼(vii)

計(jì)算出4領(lǐng)域點(diǎn)的位置后,理所當(dāng)然地,我們需要知道它們的像素值,下圖中由_get_x_q()這個(gè)方法得到。另外,g_xx部分計(jì)算的是4領(lǐng)域點(diǎn)對(duì)應(yīng)的權(quán)重。

Deformable Conv 源碼(viii)

最后,將4領(lǐng)域點(diǎn)的權(quán)重和像素值進(jìn)行加權(quán)求和得到插值點(diǎn)像素值。

Deformable Conv 源碼(ix)

以上雙線性插值的計(jì)算過(guò)程可結(jié)合下面幾張圖來(lái)理解。

雙線性插值示意圖(i)
雙線性插值示意圖(ii)

由于領(lǐng)域間像素點(diǎn)的橫、縱坐標(biāo)之差都是1,于是可以簡(jiǎn)化為下面的公式。

雙線性插值示意圖(iii)

搞定這部分,我們已經(jīng)可以得到偏移后位置的像素值了,但是還沒(méi)有解釋如何得到4領(lǐng)域點(diǎn)的像素值,現(xiàn)在就來(lái)一探究竟。

q是領(lǐng)域點(diǎn)在輸入特征圖上的位置,其最后一維2N的前半部分代表縱坐標(biāo),后半部分代表橫坐標(biāo),將輸入特征圖x進(jìn)行reshape后,最后一維是高和寬的乘積,于是q[.., :N] * in_w + q[..., N:]就是為了和x的位置對(duì)應(yīng)上。

最后使用Pytorch內(nèi)置的gather方法,將對(duì)應(yīng)位置的張量值取出。

Deformable Conv 源碼(x)

知道了如何得到領(lǐng)域點(diǎn)的像素值,之前的困惑也即煙消云散,我們終于可以進(jìn)行真正的卷積操作了!也不容易吶~

首先,如果設(shè)置了modulation,那么就對(duì)每個(gè)位置乘上其對(duì)應(yīng)的權(quán)重,在這之前注意要將權(quán)重m的形狀變?yōu)楹蛒_offset一致。然后需要對(duì)x_offset也進(jìn)行reshape操作,在這一節(jié)開(kāi)頭時(shí)談到self.conv的步長(zhǎng)設(shè)置時(shí)就提到了,最終進(jìn)行卷積時(shí)特征圖的尺寸寬、高是輸出特征圖寬、高的卷積核尺寸倍數(shù),結(jié)合卷積核大小及步長(zhǎng)(同樣為卷積核尺寸),最終輸出的特征圖尺寸便剛剛好。

Conv 源碼(xi)

Deformable Conv boy 也是夠“盡心盡力”,連最后一點(diǎn)私藏都要揭秘,他還秀出是如何對(duì)x_offset進(jìn)行reshape的。

Deformable Conv 源碼(xii)

但是他不再多言,最后這部分留給大家細(xì)細(xì)品味,他已算是“仁至義盡”了,臺(tái)下眾人也都服了,在心里傳送出“6666666...”電波。

總結(jié)

每當(dāng)寫(xiě)文章涉及到源碼解析的內(nèi)容時(shí)我都覺(jué)得真心不容易,有些代碼的實(shí)現(xiàn)很難用文字去敘述明白(所謂“道可道,非常道”..),幾乎每句話我都會(huì)斟酌好幾番才輸出,寫(xiě)完后也會(huì)反復(fù)閱讀是否有不妥,我要求自己在保證準(zhǔn)確性的同時(shí)能敘述得簡(jiǎn)單易懂。另外,為了避免文章讀起來(lái)晦澀無(wú)趣,我有時(shí)也會(huì)使用些網(wǎng)絡(luò)詞語(yǔ)營(yíng)造一個(gè)輕松活躍的氣氛。

盡管代碼解析的內(nèi)容讀起來(lái)可能有點(diǎn)繞,但我始終偏向于在文章中將這部分內(nèi)容囊括進(jìn)來(lái),因?yàn)橹恢v原理實(shí)在太空洞,只有結(jié)合了代碼進(jìn)行實(shí)踐,才是把算法知識(shí)落實(shí)了下去。

覺(jué)得文章很贊的話,可以點(diǎn)贊關(guān)注我們~

歡迎大家在評(píng)論區(qū)討論交流!

更靈活、有個(gè)性的卷積——可變形卷積(Deformable Conv)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
安康市| 松原市| 益阳市| 黑龙江省| 吉林市| 东港市| 赤峰市| 青龙| 盐津县| 嘉禾县| 宜昌市| 灌南县| 三江| 赤壁市| 方山县| 吴旗县| 盐边县| 兰溪市| 连南| 三河市| 乐至县| 长海县| 小金县| 抚州市| 景泰县| 綦江县| 乌拉特前旗| 渝中区| 古交市| 信阳市| 洛南县| 浦城县| 柞水县| 双柏县| 辛集市| 仪征市| 重庆市| 竹山县| 大英县| 麻栗坡县| 桦南县|