目标检测和感受野的总结和想法
點擊上方“計算機視覺工坊”,選擇“星標(biāo)”
干貨第一時間送達
作者丨pprp@知乎(已授權(quán))
來源丨h(huán)ttps://zhuanlan.zhihu.com/p/108493730
編輯丨極市平臺
導(dǎo)讀
?經(jīng)典的目標(biāo)檢測如Faster R-CNN, YOLOv3等都用到了Anchor,本文詳細介紹了目標(biāo)檢測中理論感受野、Anchor、實際感受野三者之間的關(guān)系。?
1. 概念
經(jīng)典的目標(biāo)檢測如Faster R-CNN, YOLOv3等都用到了Anchor, 怎么設(shè)計Anchor每個目標(biāo)檢測方法各不相同。Faster R-CNN中的Anchor有三種形狀,三種長寬比,比如形狀有[128, 256, 512]三個,長寬比有[1:1, 1:2, 2:1]三種,這樣組合就是9個anchor。YOLOv3中的Anchor是通過K-Means聚類得到的。這些基于anchor的方法的目的是學(xué)習(xí)一個從Anchor到GT Box的轉(zhuǎn)換函數(shù),下邊我們了解一下理論感受野、Anchor、實際感受野三者之間的關(guān)系。
先看一張圖:
圖源Medium
一個kernel size=3的卷積核,通過在原feature map上劃窗,然后計算得到的是一個值,這個值是通過計算原來feature map上3×3面積上的值得到的結(jié)果,那就說經(jīng)過這個3×3卷積以后,這一層feature map的感受野就是3×3。如果是兩個kernel size=3的卷積核堆疊起來,那么上圖黃色的feature map每個值對應(yīng)最下面的5×5的感受野。
理論感受野:某一層feature map中的某一個位置,是由前面某一層固定區(qū)域輸入計算出來的,那這個固定區(qū)域就是這個位置的感受野。
實際感受野:?實際感受野要小于理論感受野,是在NIPS2016中的Understanding the Effective Receptive Field in Deep Convolutional Neural Networks提出的。
文章主要貢獻有以下幾點:
并不是感受野內(nèi)所有像素對輸出向量的貢獻相同,實際感受野是一個高斯分布,有效感受野僅占理論感受野的一部分
以上就是不同層下的不同的感受野。
使用不同的激活函數(shù)與不同的卷積采樣方法,產(chǎn)生的實際感受野也不盡相同。其中ReLU的高斯分布沒有另外兩個平滑,創(chuàng)建了一個較少的高斯分布,ReLU導(dǎo)致很大一部分梯度歸零。
另外就是非常關(guān)心的問題,實際感受野是如何變化的?實際感受野和理論感受野的關(guān)系是什么樣的?
文章中也給出了答案,見上圖,隨著網(wǎng)絡(luò)層數(shù)的加深,實際有效的感受野是程級別增長。而右圖展示了隨著網(wǎng)絡(luò)層數(shù)的加深,有效感受野占理論感受野的比例是按照級別進行縮減的。其中需要注意的是實際感受野的計算方式:若像素值大于(1-96.45%)的中心像素值,就認為該像素處于實際感受野中。
訓(xùn)練的過程中,感受野也會發(fā)生變化。
可以看出分類和分割任務(wù)經(jīng)過訓(xùn)練后的感受野都有提升,不過提升幅度不太一樣。這也說明了神經(jīng)網(wǎng)絡(luò)通過學(xué)習(xí),擴大了感受也,能夠自適應(yīng)把越來越大的權(quán)重放在感受野之外的像素上。也在一定程度上說明更大感受野的必要性。
2. 計算
2.1 一種簡單的感受野計算方法
以下內(nèi)容整理自:zhihu@YaqiLYU,https://zhuanlan.zhihu.com/p/44106492
規(guī)定一下:k代表kernel size, s代表stride, r代表感受野
第一個feature map(也就是原始圖片)的感受野默認為1
經(jīng)過kernelSize=k, s=1 的卷積層, 感受野計算方法如下:
經(jīng)過kernelSize=k, s=2 的卷積層, 感受野計算方法如下:
經(jīng)過s=2的maxpool或avgpool層,感受野計算方法如下:
經(jīng)過kernelSize=1的卷積層不改變感受野
經(jīng)過全連接層和Global Average Pooling層的感受野就是整個輸入圖像
經(jīng)過多路分支的網(wǎng)絡(luò),按照感受野最大支路計算
shortcut層不改變感受野
ReLU、BN、Dropout不改變感受野
全局Stride等于所有層Stride的累乘
全局Padding需要通過以下公式計算(通過feature map反推即可):
出個計算題,計算VGG16最后一層感受野, 代入公式:
VGG16對應(yīng)D系列,來計算這一列的感受野(從上往下):
R=(((((1+2+2)x2+2+2)x2+2+2+2)x2+2+2+2)x2+2+2+2)x2=308 S=2x2x2x2x2=32 P=138實際上tensorflow和pytorch已經(jīng)有人開發(fā)出了計算CNN感受野的模型,實際上VGG16感受野沒有那么大,下圖是可視化一個416x416大小輸入圖片的感受野,RF實際上只有212x212,也就是下邊黃色和藍色的正方形。
PS:提供一下pytorch和tensorflow計算感受野的庫:
Tensorflow:
https://github.com/google-research/receptive_field
Pytorch:
https://github.com/Fangyh09/pytorch-receptive-field
以上的計算方式是國內(nèi)認可度比較高的一種計算方式,在知乎上獲得了400+的高贊,但是與谷歌計算出來的結(jié)果不一樣,所以我就去讀了一下谷歌發(fā)在Distill上的一篇論文:Computing Receptive Fields of Convolutional Neural Networks,里邊非常豐富的講解了如何計算感受野,包含的情況非常廣。先說結(jié)論,實際上以上計算方法應(yīng)該是從下往上進行的,而不是從上往下,另外以上規(guī)則只能適合比較有限范圍的卷積,而沒有一個詳細的公式。在講解下一節(jié)以后,我們嘗試重新計算VGG的感受野
2.2 自下而上的計算方法
首先也來規(guī)定一下默認的符號意義,規(guī)定L代表網(wǎng)絡(luò)的層數(shù), 定義feature map:?, 代表第層的輸出,高寬深度分別為。規(guī)定輸入的圖片為,最后一層feature map輸出為
代表第幾層;代表feature map;代表left padding;
代表right padding;代表stride,代表kernel size。
在這里,定義元素級操作的kernel size=1,比如加法,filter concatenation、relu等操作。
下圖是一個四層的網(wǎng)絡(luò)的感受野示意圖:
經(jīng)過了兩個3x3卷積和一個stride=2的maxpooling層,如果按照原來的方法從上往下進行計算,那最后一層每個點的感受野應(yīng)該是:(1+2+2)x2=10, 要比上圖的6要大很多,所以就知道為啥計算的感受野偏大了(沒有處理重疊部分),而且也可以發(fā)現(xiàn)感受野中間集中更多信息,兩邊信息處理較少。
單路網(wǎng)絡(luò)中的計算方法
單路網(wǎng)絡(luò)就是沒有分支的網(wǎng)絡(luò),比如VGG。
規(guī)定是第層feature map相對于?的感受野。說人話,就是最后一層的一個像素值是由第層feature map的個值計算出來的,注意。所以整個計算過程是從后往前進行的。
上圖是一個簡單例子,層的感受野就是2。
然后我們要考慮更加一般的情況,也就是通過能計算出,這樣就能通過類推,得到最終結(jié)果。具體推導(dǎo)過程推薦去原文看一下,非常詳細,在這里不多贅述,否則篇幅會太大。直接給出結(jié)論:
遞推公式:
通項公式:
建議自己推導(dǎo)的時候使用遞推公式,非常方便,代碼實現(xiàn)的時候考慮使用通項公式。
觀察一下通項公式,可以發(fā)現(xiàn),如果每一層kernel size都是1,那么最終的感受野就是1。如果所有的stride=1,那么最終感受野之和就是。并且可以發(fā)現(xiàn),影響感受野最大的參數(shù)應(yīng)該是stride,如果stride>1,那將成倍的影響之后的層。
補充一下知道感受野以后的,如何計算有效stride和有效padding。
Effective Stride:
遞推公式:
通項公式:
Effective Padding:
遞推公式:
通項公式:
下面我們來重新計算VGG16整個模型的感受野:
多路網(wǎng)絡(luò)
以上講解了單路情況下的感受野計算方法,但是現(xiàn)在STOA的卷積網(wǎng)絡(luò)通常都是擁有多分支的,比如說ResNet、Inception、DenseNet等網(wǎng)絡(luò)。
多路網(wǎng)絡(luò)不得不提到對齊問題,感受野是不具有平移不變性,下圖就是一個例子:
可以看到,最后一層通過兩條不同路徑后對應(yīng)到第一層feature map的感受野的中心是不重合的。這是感受野的一個性質(zhì),不過好在大多數(shù)現(xiàn)代的網(wǎng)絡(luò)設(shè)計是對齊的,對很多計算機視覺任務(wù)來說,都需要對其輸出特征,包括目標(biāo)檢測、語義分割、邊緣檢測、著色等。
在網(wǎng)絡(luò)對齊時候,所有不同路徑都會導(dǎo)致感受野的中心是重合的,所以不同路徑必須保持相同的stride。這一點可以觀察Inception系列的網(wǎng)絡(luò),兩條路的Stride是不可能不同的。
在網(wǎng)絡(luò)對齊的情況下,多路網(wǎng)絡(luò)的感受野應(yīng)該是所有分支中最大感受野,比如下邊是一個對齊的網(wǎng)絡(luò),中心是重合的,感受野的大小就是3。
有了以上的計算方法,我們可以很方便計算所有卷積網(wǎng)絡(luò)的感受野:
上圖是常用分類模型對應(yīng)的感受野的結(jié)果,我們可以發(fā)現(xiàn),隨著模型的不斷進化,感受野在不增大,在比較新提出的網(wǎng)絡(luò)中,感受野已經(jīng)能夠覆蓋整個輸入圖像了,這就意味著最終特征圖中每個點都會使用到整個圖像所有得上下文信息。
上圖是感受野大小和在ImageNet上top-1準(zhǔn)確率的關(guān)系,其中圓圈的大小代表每個網(wǎng)絡(luò)的浮點運算數(shù)量。分類的準(zhǔn)確率和感受野大小大體程對數(shù)關(guān)系,也就是說雖然感受野可以無限增長,越往后,帶來的準(zhǔn)確率上的提升也就越小,而需要的計算代價會變得更大。
上圖MobileNet和VGG16準(zhǔn)確率相當(dāng),但是MobileNet所需計算量卻非常小(約為VGG16的27分之1),這是由于MobileNet使用了大量depth-wise Convolution,這樣可以以較小的計算代價來增加模型感受野。這個對比可以表明生成更大感受野的網(wǎng)絡(luò)可以有更好的識別準(zhǔn)確率。
注意:?感受野并不是唯一影響準(zhǔn)確率的因素,其他因素,比如網(wǎng)絡(luò)的深度,寬度,殘差連接,BatchNorm等也起著非常重要的作用。也就是說,感受野是我們在設(shè)計網(wǎng)絡(luò)的時候需要考慮的一個因素,但還是要綜合其他方法。
補充:
除了最普通的卷積,還有空洞卷積、上采樣、BatchNorm、Separable Conv的感受野計算需要補充。
空洞卷積:引入空洞率, 經(jīng)過空洞卷積,kernel size有原來的變?yōu)?所以只要替換原來的公式中的k即可。
上采樣:一般通過插值來實現(xiàn),假如通過2倍上采樣得到,上采樣的感受野相當(dāng)于為了生成?的一個pixel,參與的?的pixel的數(shù)目。(經(jīng)評論區(qū) @Kevin)英文原文也附在下邊供參考。
可分離卷積: 等價于普通卷積,并沒有變化。
BatchNorm:推理過程中BN不改變感受野,而訓(xùn)練過程中,BN的感受野是整個輸入圖像。
轉(zhuǎn)置卷積: 會增加感受野,和普通計算方法類似
3. 作用
目標(biāo)檢測:像SSD、RPN、YOLOv3等都使用了anchor,而anchor的設(shè)計正是依據(jù)感受野,如果感受野太小,只能觀察到局部的特征,不足以得到整個目標(biāo)的信息。如果感受野過大,則會引入過多噪聲和無效信息。Anchor太大或太小均會影響性能。
語義分割:最終預(yù)測的像素的感受野越大越好,涉及網(wǎng)絡(luò)一般也是越深越好,這樣才能捕獲更多的上下文信息,預(yù)測才會更準(zhǔn)。
分類任務(wù):圖像分類中最后卷積層的感受野要大于輸入圖像,網(wǎng)絡(luò)深度越深,感受野越大,性能越好。
為了更合適的感受野,各種多尺度的模型架構(gòu)被提出,可以分為圖像金字塔和特征金字塔,具體實現(xiàn)方面可以是:1. 采用多尺度輸入,如yolov3的multi scale機制。2. 多尺度特征融合,最經(jīng)典的是FPN。3. 多尺度特征預(yù)測融合,如SSD。4. 以上方法的多種組合。
4. 關(guān)系
在論文 Single Shot Scale-invariant Face Detector 中,說明了目標(biāo)檢測中Anchor, 理論感受野,實際感受野三者的關(guān)系。這篇論文主要針對的是中小目標(biāo),密集人臉情況下的anchor設(shè)置。
Anchor一般是通過先驗進行指定的,Anchor與目標(biāo)的大小和位置越匹配(IOU>0.5or0.7),回歸效果就會越好。如果小人臉和anchor的IOU過小,就會造成anchor很難回歸到GT上,從而導(dǎo)致Recall過低。
文章中指出了Anchor、理論感受野、實際感受野三者的關(guān)系。(a)圖中,整個黑色的box是理論感受野,中間的白點是一個高斯分布的實際感受野。(b)圖中舉了一個例子,黑色點狀的框代表是理論感受野的面積,藍色的代表實際感受野位置,而最合適的anchor就是紅色的框,所以關(guān)系為:
Anchor大小<實際感受野<理論感受野
SFD是基于SSD進行改進的,SSD中使用了6個層來進行檢測,以下是文章中設(shè)置內(nèi)容:
為了探究Anchor和RF的關(guān)系,這里使用MATLAB的工具箱來擬合兩者關(guān)系:
設(shè)anchors=x, RFs=y則有如下關(guān)系:
所以y和大體上是正比例關(guān)系。其實這里只是探索一下他們之間的關(guān)系,實際感受野實際上依然是一個超參數(shù),我們不可能明確計算出來,然后設(shè)置對應(yīng)的anchor,不過我們了解了這個之后,最起碼anchor的限制范圍應(yīng)該是小于理論感受野的。
作者在論文中說明了Anchor設(shè)置的理由,, 這樣就跟上(c)圖一樣,這樣設(shè)置可以保證不同尺度的anchor在圖片上采樣的密度是一樣的。將鋪設(shè)的anchor的scale值設(shè)為大致覆蓋到有效感受野的size。
SFD效果可以說是非常好了,以下是mAP對比圖:
5. 總結(jié)
1. 首先,許多經(jīng)典的網(wǎng)絡(luò)結(jié)構(gòu)中的這些卷積不是隨便決定的,在修改網(wǎng)絡(luò)的時候不能隨便刪除。比如在yolov3中,backbone后邊的幾個卷積再接yolo層這個當(dāng)時就覺得很隨意,但是他是有一定道理的。
2. 假如出于對小目標(biāo)的考慮,想要降低下采樣率,那么直接刪掉一個maxpool層,或者刪掉stride=2的卷積層都是不可取的。通過公式我們知道,stride對一個網(wǎng)絡(luò)的感受野影響非常大,而且會對后邊的網(wǎng)絡(luò)層的感受野都進行影響,所以要通過使用stride=1的maxpool或者空洞卷積來彌補對感受野帶來的損失。
3. 實際感受野依然是一個超參數(shù),他是會隨著訓(xùn)練的過程發(fā)生變化,我們無法準(zhǔn)確計算出來實際感受野,但是通過分析anchor,實際感受野和理論感受野,我們知道了anchor<實際感受野<理論感受野,所以anchor還是會被理論感受野的大小所限制。
4. 自己嘗試過使用kmeans算法聚類自己數(shù)據(jù)集的Anchor,之前兩個數(shù)據(jù),兩次聚類,都出現(xiàn)了自己聚類得到的Anchor不如默認的Anchor得到的結(jié)果。之前一直不知道原因在哪里。在總結(jié)了感受野以后,我覺得可以合理推測,Anchor應(yīng)該和實際感受野盡量匹配,但是實際感受野實際上是一個超參數(shù),通過聚類得到的anchor有一定代表性,但是效果反而不如默認的anchor,這是因為我們自己聚類得到的Anchor的范圍實際上沒有默認的廣。
比如yolov3-tiny里邊的anchor最小是【10,14】最大是【344,319】,經(jīng)過計算理論感受野是382,按照SFD里邊推導(dǎo)得到的公式計算,對應(yīng)的anchor大小應(yīng)該為159,如果按照理論感受野的三分之一來計算,大概是127.3。大概在這個范圍,自己聚類得到的最大anchor也就是20左右,所以網(wǎng)絡(luò)如果想要適應(yīng)(回歸)20左右的anchor需要網(wǎng)絡(luò)更長時間的訓(xùn)練。
最后想推薦一下以上涉及到的三篇文章,都特別有價值,值得多看幾遍:
(1)S3FD
(2)Computing Receptive Fields of Convolutional Neural Networks
(3)Understanding the Effective Receptive Field in Deep Convolutional Neural Networks
另外,以上內(nèi)容是基于論文以及自己的理解表述的,如果有問題,歡迎評論,互相交流。
參考文獻:
[1] ?SFD論文:https://arxiv.org/abs/1708.05237
[2] YaqiLYU:https://zhuanlan.zhihu.com/p/44106492
[3]?感受野計算論文:https://distill.pub/2019/computing-receptive-fields
[4]?感受野推導(dǎo): "Computing Receptive Fields of Convolutional Neural Networks", Distill, 2019.
[5]?一個用來計算感受野的網(wǎng)站:https://fomoro.com/research/article/receptive-field-calculator
本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
下載1
在「計算機視覺工坊」公眾號后臺回復(fù):深度學(xué)習(xí),即可下載深度學(xué)習(xí)算法、3D深度學(xué)習(xí)、深度學(xué)習(xí)框架、目標(biāo)檢測、GAN等相關(guān)內(nèi)容近30本pdf書籍。
下載2
在「計算機視覺工坊」公眾號后臺回復(fù):計算機視覺,即可下載計算機視覺相關(guān)17本pdf書籍,包含計算機視覺算法、Python視覺實戰(zhàn)、Opencv3.0學(xué)習(xí)等。
下載3
在「計算機視覺工坊」公眾號后臺回復(fù):SLAM,即可下載獨家SLAM相關(guān)視頻課程,包含視覺SLAM、激光SLAM精品課程。
重磅!計算機視覺工坊-學(xué)習(xí)交流群已成立
掃碼添加小助手微信,可申請加入3D視覺工坊-學(xué)術(shù)論文寫作與投稿?微信交流群,旨在交流頂會、頂刊、SCI、EI等寫作與投稿事宜。
同時也可申請加入我們的細分方向交流群,目前主要有ORB-SLAM系列源碼學(xué)習(xí)、3D視覺、CV&深度學(xué)習(xí)、SLAM、三維重建、點云后處理、自動駕駛、CV入門、三維測量、VR/AR、3D人臉識別、醫(yī)療影像、缺陷檢測、行人重識別、目標(biāo)跟蹤、視覺產(chǎn)品落地、視覺競賽、車牌識別、硬件選型、深度估計、學(xué)術(shù)交流、求職交流等微信群,請掃描下面微信號加群,備注:”研究方向+學(xué)校/公司+昵稱“,例如:”3D視覺?+ 上海交大 + 靜靜“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進去相關(guān)微信群。原創(chuàng)投稿也請聯(lián)系。
▲長按加微信群或投稿
▲長按關(guān)注公眾號
3D視覺從入門到精通知識星球:針對3D視覺領(lǐng)域的視頻課程(三維重建系列三維點云系列結(jié)構(gòu)光系列、手眼標(biāo)定、相機標(biāo)定、orb-slam3知識點匯總、入門進階學(xué)習(xí)路線、最新paper分享、疑問解答五個方面進行深耕,更有各類大廠的算法工程人員進行技術(shù)指導(dǎo)。與此同時,星球?qū)⒙?lián)合知名企業(yè)發(fā)布3D視覺相關(guān)算法開發(fā)崗位以及項目對接信息,打造成集技術(shù)與就業(yè)為一體的鐵桿粉絲聚集區(qū),近2000星球成員為創(chuàng)造更好的AI世界共同進步,知識星球入口:
學(xué)習(xí)3D視覺核心技術(shù),掃描查看介紹,3天內(nèi)無條件退款
?圈里有高質(zhì)量教程資料、答疑解惑、助你高效解決問題
覺得有用,麻煩給個贊和在看~??
總結(jié)
以上是生活随笔為你收集整理的目标检测和感受野的总结和想法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打飞机--C语言版(是真打飞机!)
- 下一篇: 这就是神经网络 7:深度学习-目标检测-