目標檢測和感受野的總結和想法


1. 概念

經典的目標檢測如Faster R-CNN, YOLOv3等都用到了Anchor, 怎么設計Anchor每個目標檢測方法各不相同。Faster R-CNN中的Anchor有三種形狀,三種長寬比,比如形狀有[128, 256, 512]三個,長寬比有[1:1, 1:2, 2:1]三種,這樣組合就是9個anchor。YOLOv3中的Anchor是通過K-Means聚類得到的。這些基於anchor的方法的目的是學習一個從Anchor到GT Box的轉換函數,下邊我們了解一下理論感受野、Anchor、實際感受野三者之間的關系。

先看一張圖:

圖源Medium

一個kernel size=3的卷積核,通過在原feature map上划窗,然后計算得到的是一個值,這個值是通過計算原來feature map上3×3面積上的值得到的結果,那就說經過這個3×3卷積以后,這一層feature map的感受野就是3×3。如果是兩個kernel size=3的卷積核堆疊起來,那么上圖黃色的feature map每個值對應最下面的5×5的感受野。

理論感受野:某一層feature map中的某一個位置,是由前面某一層固定區域輸入計算出來的,那這個固定區域就是這個位置的感受野。

實際感受野: 實際感受野要小於理論感受野,是在NIPS2016中的Understanding the Effective Receptive Field in Deep Convolutional Neural Networks提出的。

文章主要貢獻有以下幾點:

  1. 並不是感受野內所有像素對輸出向量的貢獻相同,實際感受野是一個高斯分布,有效感受野僅占理論感受野的一部分

以上就是不同層下的不同的感受野。

使用不同的激活函數與不同的卷積采樣方法,產生的實際感受野也不盡相同。其中ReLU的高斯分布沒有另外兩個平滑,創建了一個較少的高斯分布,ReLU導致很大一部分梯度歸零。

  1. 另外就是非常關心的問題,實際感受野是如何變化的?實際感受野和理論感受野的關系是什么樣的?

文章中也給出了答案,見上圖,隨着網絡層數的加深,實際有效的感受野是程\(\sqrt{n}\)級別增長。而右圖展示了隨着網絡層數的加深,有效感受野占理論感受野的比例是按照\(1/\sqrt{n}\)級別進行縮減的。其中需要注意的是實際感受野的計算方式:若像素值大於(1-96.45%)的中心像素值,就認為該像素處於實際感受野中。

  1. 訓練的過程中,感受野也會發生變化。

可以看出分類和分割任務經過訓練后的感受野都有提升,不過提升幅度不太一樣。這也說明了神經網絡通過學習,擴大了感受也,能夠自適應把越來越大的權重放在感受野之外的像素上。也在一定程度上說明更大感受野的必要性。

2. 計算

2.1 一種簡單的感受野計算方法

以下內容整理自:zhihu@YaqiLYUhttps://zhuanlan.zhihu.com/p/44106492

規定一下:k代表kernel size, s代表stride, r代表感受野

  • 第一個feature map(也就是原始圖片)的感受野默認為1

  • 經過kernelSize=k, s=1 的卷積層, 感受野計算方法如下:

\[r = r +(k-1) \]

  • 經過kernelSize=k, s=2 的卷積層, 感受野計算方法如下:

\[r = (r\times2)+(k-2) \]

  • 經過s=2的maxpool或avgpool層,感受野計算方法如下:

\[r = r \times 2 \]

  • 經過kernelSize=1的卷積層不改變感受野
  • 經過全連接層和Global Average Pooling層的感受野就是整個輸入圖像
  • 經過多路分支的網絡,按照感受野最大支路計算
  • shortcut層不改變感受野
  • ReLU、BN、Dropout不改變感受野
  • 全局Stride等於所有層Stride的累乘
  • 全局Padding需要通過以下公式計算(通過feature map反推即可):

\[P=\frac{(f_{out}-1)\times stride -f_{in}+ kernelSize}{2} \]

出個計算題,計算VGG16最后一層感受野, 代入公式:

VGG16對應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已經有人開發出了計算CNN感受野的模型,實際上VGG16感受野沒有那么大,下圖是可視化一個416x416大小輸入圖片的感受野,RF實際上只有212x212,也就是下邊黃色和藍色的正方形。

PS:提供一下pytorch和tensorflow計算感受野的庫:

Tensorflow:https://github.com/google-research/receptive_field/

Pytorch:https://github.com/Fangyh09/pytorch-receptive-field

以上的計算方式是國內認可度比較高的一種計算方式,在知乎上獲得了400+的高贊,但是與谷歌計算出來的結果不一樣,所以我就去讀了一下谷歌發在Distill上的一篇論文:Computing Receptive Fields of Convolutional Neural Networks,里邊非常豐富的講解了如何計算感受野,包含的情況非常廣。先說結論,實際上以上計算方法應該是從下往上進行的,而不是從上往下,另外以上規則只能適合比較有限范圍的卷積,而沒有一個詳細的公式。在講解下一節以后,我們嘗試重新計算VGG的感受野

2.2 自下而上的計算方法

首先也來規定一下默認的符號意義,規定L代表網絡的層數\(l=1,2,...,L\), 定義feature map: \(f_l\in R^{h_l\times w_l\times d_l}\), 代表第\(l\)層的輸出,高寬深度分別為\(h_l,w_l,d_l\)。規定輸入的圖片為\(f_0\),最后一層feature map輸出為\(f_l​\)

\(l\)代表第幾層;\(f\)代表feature map;\(p\)代表left padding;

\(q\)代表right padding;\(s\)代表stride,\(k​\)代表kernel size。

在這里,定義元素級操作的kernel size=1,比如加法,filter concatenation、relu等操作。

下圖是一個四層的網絡的感受野示意圖:

經過了兩個3x3卷積和一個stride=2的maxpooling層,如果按照原來的方法從上往下進行計算,那最后一層每個點的感受野應該是:(1+2+2)x2=10, 要比上圖的6要大很多,所以就知道為啥計算的感受野偏大了(沒有處理重疊部分),而且也可以發現感受野中間集中更多信息,兩邊信息處理較少。

單路網絡中的計算方法

單路網絡就是沒有分支的網絡,比如VGG。

規定\(r_l​\)是第\(l​\)層feature map相對於 \(r_L​\) 的感受野。說人話,就是最后一層\(f_L​\)的一個像素值是由第\(l​\)層feature map的\(r_l​\)個值計算出來的,注意\(r_L=1​\)。所以整個計算過程是從后往前進行的。

上圖是一個簡單例子,\(kernel size=2, padding=0, stride=3​\)的情況下,下邊這層每個值只受上一層2個值的影響,所以第\(l-1​\)層的感受野就是2。

然后我們要考慮更加一般的情況,也就是通過\(r_l\)能計算出\(r_{l-1}\),這樣就能通過類推,得到最終結果。具體推導過程推薦去原文看一下,非常詳細,在這里不多贅述,否則篇幅會太大。直接給出結論:

遞推公式:

\[r_{l-1}=s_l\times r_l+(k_l-s_l) \]

通項公式:

\[r_0=\sum_{l=1}^{L}((k_l-1)\prod_{i=1}^{l-1}s_i)+1 \]

建議自己推導的時候使用遞推公式,非常方便,代碼實現的時候考慮使用通項公式。

觀察一下通項公式,可以發現,如果每一層kernel size都是1,那么最終的感受野就是1。如果所有的stride=1,那么最終感受野之和就是\(\sum(k_l-1)+1\)。並且可以發現,影響感受野最大的參數應該是stride,如果stride>1,那將成倍的影響之后的層。

補充一下知道感受野以后的,如何計算有效stride和有效padding。

Effective Stride:

遞推公式:

\[S_{l-1}=s_l\times S_l \]

通項公式:

\[S_l=\prod_{i=l+1}^{L}s_i \]

Effective Padding:

遞推公式:

\[P_{l-1}=s_l\times P_l+p_l \]

通項公式:

\[P_l=\sum_{m=l+1}^{L}p_m\prod^{m-1}_{i=l+1}s_i \]

下面我們來重新計算VGG16整個模型的感受野:

多路網絡

以上講解了單路情況下的感受野計算方法,但是現在STOA的卷積網絡通常都是擁有多分支的,比如說ResNet、Inception、DenseNet等網絡。

多路網絡不得不提到對齊問題,感受野是不具有平移不變性,下圖就是一個例子:

可以看到,最后一層通過兩條不同路徑后對應到第一層feature map的感受野的中心是不重合的。這是感受野的一個性質,不過好在大多數現代的網絡設計是對齊的,對很多計算機視覺任務來說,都需要對其輸出特征,包括目標檢測、語義分割、邊緣檢測、着色等。

在網絡對齊時候,所有不同路徑都會導致感受野的中心是重合的,所以不同路徑必須保持相同的stride。這一點可以觀察Inception系列的網絡,兩條路的Stride是不可能不同的。

在網絡對齊的情況下,多路網絡的感受野應該是所有分支中最大感受野,比如下邊是一個對齊的網絡,中心是重合的,感受野的大小就是3。

有了以上的計算方法,我們可以很方便計算所有卷積網絡的感受野:

上圖是常用分類模型對應的感受野的結果,我們可以發現,隨着模型的不斷進化,感受野在不增大,在比較新提出的網絡中,感受野已經能夠覆蓋整個輸入圖像了,這就意味着最終特征圖中每個點都會使用到整個圖像所有得上下文信息。

上圖是感受野大小和在ImageNet上top-1准確率的關系,其中圓圈的大小代表每個網絡的浮點運算數量。分類的准確率和感受野大小大體程對數關系,也就是說雖然感受野可以無限增長,越往后,帶來的准確率上的提升也就越小,而需要的計算代價會變得更大。

上圖MobileNet和VGG16准確率相當,但是MobileNet所需計算量卻非常小(約為VGG16的27分之1),這是由於MobileNet使用了大量depth-wise Convolution,這樣可以以較小的計算代價來增加模型感受野。這個對比可以表明生成更大感受野的網絡可以有更好的識別准確率

注意: 感受野並不是唯一影響准確率的因素,其他因素,比如網絡的深度,寬度,殘差連接,BatchNorm等也起着非常重要的作用。也就是說,感受野是我們在設計網絡的時候需要考慮的一個因素,但還是要綜合其他方法。

補充:

除了最普通的卷積,還有空洞卷積、上采樣、BatchNorm、Separable Conv的感受野計算需要補充。

  • 空洞卷積:引入空洞率\(\alpha\), 經過空洞卷積,kernel size有原來的\(k\)變為\(\alpha \times (k-1)+1\),所以只要替換原來的公式中的k即可。
  • 上采樣:一般通過插值來實現,假如\(\alpha\)通過2倍上采樣得到\(\beta\),那么認為這個層感受野計算等價於與\(\alpha\)的kernel size相等的卷積。
  • 雙線性插值進行的upsample的具體計算可視為kernel size為4,stride為1的卷積處理的結果。

Upsampling. Upsampling is frequently done using interpolation (e.g., bilinear, bicubic or nearest-neighbor methods), resulting in an equal or larger receptive field — since it relies on one or multiple features from the input. Upsampling layers generally produce output features which depend locally on input features, and for receptive field computation purposes can be considered to have a kernel size equal to the number of input features involved in the computation of an output feature.

  • 可分離卷積: 等價於普通卷積,並沒有變化。
  • BatchNorm:推理過程中BN不改變感受野,而訓練過程中,BN的感受野是整個輸入圖像。
  • 轉置卷積: 會增加感受野,和普通計算方法類似

3. 作用

1.目標檢測:像SSD、RPN、YOLOv3等都使用了anchor,而anchor的設計正是依據感受野,如果感受野太小,只能觀察到局部的特征,不足以得到整個目標的信息。如果感受野過大,則會引入過多噪聲和無效信息。Anchor太大或太小均會影響性能。

2.語義分割:最終預測的像素的感受野越大越好,涉及網絡一般也是越深越好,這樣才能捕獲更多的上下文信息,預測才會更准。

3.分類任務:圖像分類中最后卷積層的感受野要大於輸入圖像,網絡深度越深,感受野越大,性能越好。

為了更合適的感受野,各種多尺度的模型架構被提出,可以分為圖像金字塔和特征金字塔,具體實現方面可以是:1. 采用多尺度輸入,如yolov3的multi scale機制。2. 多尺度特征融合,最經典的是FPN。3. 多尺度特征預測融合,如SSD。4. 以上方法的多種組合。

4. 關系

在論文 Single Shot Scale-invariant Face Detector 中,說明了目標檢測中Anchor, 理論感受野,實際感受野三者的關系。這篇論文主要針對的是中小目標,密集人臉情況下的anchor設置。

Anchor一般是通過先驗進行指定的,Anchor與目標的大小和位置越匹配(IOU>0.5or0.7),回歸效果就會越好。如果小人臉和anchor的IOU過小,就會造成anchor很難回歸到GT上,從而導致Recall過低。

文章中指出了Anchor、理論感受野、實際感受野三者的關系。(a)圖中,整個黑色的box是理論感受野,中間的白點是一個高斯分布的實際感受野。(b)圖中舉了一個例子,黑色點狀的框代表是理論感受野的面積,藍色的代表實際感受野位置,而最合適的anchor就是紅色的框,所以關系為:

Anchor大小<實際感受野<理論感受野

SFD是基於SSD進行改進的,SSD中使用了6個層來進行檢測,以下是文章中設置內容:

為了探究Anchor和RF的關系,這里使用MATLAB的工具箱來擬合兩者關系:

設anchors=x, RFs=y則有如下關系:

\[y=9.421\times \sqrt{12.44\times x}-46.92 \\ R^2=0.989 \]

所以y和\(\sqrt{x}​\)大體上是正比例關系。其實這里只是探索一下他們之間的關系,實際感受野實際上依然是一個超參數,我們不可能明確計算出來,然后設置對應的anchor,不過我們了解了這個之后,最起碼anchor的限制范圍應該是小於理論感受野的。

作者在論文中說明了Anchor設置的理由,\(Anchor=stirde\times 4\), 這樣就跟上(c)圖一樣,這樣設置可以保證不同尺度的anchor在圖片上采樣的密度是一樣的。將鋪設的anchor的scale值設為大致覆蓋到有效感受野的size。這一點並不是特別理解

SFD效果可以說是非常好了,以下是mAP對比圖:

5. 總結

  1. 首先,許多經典的網絡結構中的這些卷積不是隨便決定的,在修改網絡的時候不能隨便刪除。比如在yolov3中,backbone后邊的幾個卷積再接yolo層這個當時就覺得很隨意,但是他是有一定道理的。

  2. 假如出於對小目標的考慮,想要降低下采樣率,那么直接刪掉一個maxpool層,或者刪掉stride=2的卷積層都是不可取的。通過公式我們知道,stride對一個網絡的感受野影響非常大,而且會對后邊的網絡層的感受野都進行影響,所以要通過使用stride=1的maxpool或者空洞卷積來彌補對感受野帶來的損失。

  3. 實際感受野依然是一個超參數,他是會隨着訓練的過程發生變化,我們無法准確計算出來實際感受野,但是通過分析anchor,實際感受野和理論感受野,我們知道了anchor<實際感受野<理論感受野,所以anchor還是會被理論感受野的大小所限制。

  4. 自己嘗試過使用kmeans算法聚類自己數據集的Anchor,之前兩個數據,兩次聚類,都出現了自己聚類得到的Anchor不如默認的Anchor得到的結果。之前一直不知道原因在哪里。在總結了感受野以后,我覺得可以合理推測,Anchor應該和實際感受野盡量匹配,但是實際感受野實際上是一個超參數,通過聚類得到的anchor有一定代表性,但是效果反而不如默認的anchor,這是因為我們自己聚類得到的Anchor的范圍實際上沒有默認的廣。

    比如yolov3-tiny里邊的anchor最小是【10,14】最大是【344,319】,經過計算理論感受野是382,按照SFD里邊推導得到的公式計算,對應的anchor大小應該為159,如果按照理論感受野的三分之一來計算,大概是127.3。大概在這個范圍,自己聚類得到的最大anchor也就是20左右,所以網絡如果想要適應(回歸)20左右的anchor需要網絡更長時間的訓練。

最后想推薦一下以上涉及到的三篇文章,都特別有價值,值得多看幾遍:

(1)S3FD

(2)Computing Receptive Fields of Convolutional Neural Networks

(3)Understanding the Effective Receptive Field in Deep Convolutional Neural Networks

另外,以上內容是基於論文以及自己的理解表述的,如果有問題,歡迎加我微信,互相交流。

6. 參考文獻

SFD論文: https://arxiv.org/abs/1708.05237

YaqiLYU:https://zhuanlan.zhihu.com/p/44106492

感受野計算論文:https://distill.pub/2019/computing-receptive-fields/

感受野推導: "Computing Receptive Fields of Convolutional Neural Networks", Distill, 2019.

一個用來計算感受野的網站:https://fomoro.com/research/article/receptive-field-calculator


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM