目标检测和感受野的总结和想法
點擊上方“計算機視覺工坊”,選擇“星標”
干貨第一時間送達
作者丨pprp@知乎(已授權)
來源丨https://zhuanlan.zhihu.com/p/108493730
編輯丨極市平臺
導讀
?經典的目標檢測如Faster R-CNN, YOLOv3等都用到了Anchor,本文詳細介紹了目標檢測中理論感受野、Anchor、實際感受野三者之間的關系。?
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提出的。
文章主要貢獻有以下幾點:
并不是感受野內所有像素對輸出向量的貢獻相同,實際感受野是一個高斯分布,有效感受野僅占理論感受野的一部分
以上就是不同層下的不同的感受野。
使用不同的激活函數與不同的卷積采樣方法,產生的實際感受野也不盡相同。其中ReLU的高斯分布沒有另外兩個平滑,創建了一個較少的高斯分布,ReLU導致很大一部分梯度歸零。
另外就是非常關心的問題,實際感受野是如何變化的?實際感受野和理論感受野的關系是什么樣的?
文章中也給出了答案,見上圖,隨著網絡層數的加深,實際有效的感受野是程級別增長。而右圖展示了隨著網絡層數的加深,有效感受野占理論感受野的比例是按照級別進行縮減的。其中需要注意的是實際感受野的計算方式:若像素值大于(1-96.45%)的中心像素值,就認為該像素處于實際感受野中。
訓練的過程中,感受野也會發生變化。
可以看出分類和分割任務經過訓練后的感受野都有提升,不過提升幅度不太一樣。這也說明了神經網絡通過學習,擴大了感受也,能夠自適應把越來越大的權重放在感受野之外的像素上。也在一定程度上說明更大感受野的必要性。
2. 計算
2.1 一種簡單的感受野計算方法
以下內容整理自:zhihu@YaqiLYU,https://zhuanlan.zhihu.com/p/44106492
規定一下:k代表kernel size, s代表stride, r代表感受野
第一個feature map(也就是原始圖片)的感受野默認為1
經過kernelSize=k, s=1 的卷積層, 感受野計算方法如下:
經過kernelSize=k, s=2 的卷積層, 感受野計算方法如下:
經過s=2的maxpool或avgpool層,感受野計算方法如下:
經過kernelSize=1的卷積層不改變感受野
經過全連接層和Global Average Pooling層的感受野就是整個輸入圖像
經過多路分支的網絡,按照感受野最大支路計算
shortcut層不改變感受野
ReLU、BN、Dropout不改變感受野
全局Stride等于所有層Stride的累乘
全局Padding需要通過以下公式計算(通過feature map反推即可):
出個計算題,計算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代表網絡的層數, 定義feature map:?, 代表第層的輸出,高寬深度分別為。規定輸入的圖片為,最后一層feature map輸出為
代表第幾層;代表feature map;代表left padding;
代表right padding;代表stride,代表kernel size。
在這里,定義元素級操作的kernel size=1,比如加法,filter concatenation、relu等操作。
下圖是一個四層的網絡的感受野示意圖:
經過了兩個3x3卷積和一個stride=2的maxpooling層,如果按照原來的方法從上往下進行計算,那最后一層每個點的感受野應該是:(1+2+2)x2=10, 要比上圖的6要大很多,所以就知道為啥計算的感受野偏大了(沒有處理重疊部分),而且也可以發現感受野中間集中更多信息,兩邊信息處理較少。
單路網絡中的計算方法
單路網絡就是沒有分支的網絡,比如VGG。
規定是第層feature map相對于?的感受野。說人話,就是最后一層的一個像素值是由第層feature map的個值計算出來的,注意。所以整個計算過程是從后往前進行的。
上圖是一個簡單例子,層的感受野就是2。
然后我們要考慮更加一般的情況,也就是通過能計算出,這樣就能通過類推,得到最終結果。具體推導過程推薦去原文看一下,非常詳細,在這里不多贅述,否則篇幅會太大。直接給出結論:
遞推公式:
通項公式:
建議自己推導的時候使用遞推公式,非常方便,代碼實現的時候考慮使用通項公式。
觀察一下通項公式,可以發現,如果每一層kernel size都是1,那么最終的感受野就是1。如果所有的stride=1,那么最終感受野之和就是。并且可以發現,影響感受野最大的參數應該是stride,如果stride>1,那將成倍的影響之后的層。
補充一下知道感受野以后的,如何計算有效stride和有效padding。
Effective Stride:
遞推公式:
通項公式:
Effective Padding:
遞推公式:
通項公式:
下面我們來重新計算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的感受野計算需要補充。
空洞卷積:引入空洞率, 經過空洞卷積,kernel size有原來的變為,所以只要替換原來的公式中的k即可。
上采樣:一般通過插值來實現,假如通過2倍上采樣得到,上采樣的感受野相當于為了生成?的一個pixel,參與的?的pixel的數目。(經評論區 @Kevin)英文原文也附在下邊供參考。
可分離卷積: 等價于普通卷積,并沒有變化。
BatchNorm:推理過程中BN不改變感受野,而訓練過程中,BN的感受野是整個輸入圖像。
轉置卷積: 會增加感受野,和普通計算方法類似
3. 作用
目標檢測:像SSD、RPN、YOLOv3等都使用了anchor,而anchor的設計正是依據感受野,如果感受野太小,只能觀察到局部的特征,不足以得到整個目標的信息。如果感受野過大,則會引入過多噪聲和無效信息。Anchor太大或太小均會影響性能。
語義分割:最終預測的像素的感受野越大越好,涉及網絡一般也是越深越好,這樣才能捕獲更多的上下文信息,預測才會更準。
分類任務:圖像分類中最后卷積層的感受野要大于輸入圖像,網絡深度越深,感受野越大,性能越好。
為了更合適的感受野,各種多尺度的模型架構被提出,可以分為圖像金字塔和特征金字塔,具體實現方面可以是: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和大體上是正比例關系。其實這里只是探索一下他們之間的關系,實際感受野實際上依然是一個超參數,我們不可能明確計算出來,然后設置對應的anchor,不過我們了解了這個之后,最起碼anchor的限制范圍應該是小于理論感受野的。
作者在論文中說明了Anchor設置的理由,, 這樣就跟上(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
另外,以上內容是基于論文以及自己的理解表述的,如果有問題,歡迎評論,互相交流。
參考文獻:
[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]?感受野推導: "Computing Receptive Fields of Convolutional Neural Networks", Distill, 2019.
[5]?一個用來計算感受野的網站:https://fomoro.com/research/article/receptive-field-calculator
本文僅做學術分享,如有侵權,請聯系刪文。
下載1
在「計算機視覺工坊」公眾號后臺回復:深度學習,即可下載深度學習算法、3D深度學習、深度學習框架、目標檢測、GAN等相關內容近30本pdf書籍。
下載2
在「計算機視覺工坊」公眾號后臺回復:計算機視覺,即可下載計算機視覺相關17本pdf書籍,包含計算機視覺算法、Python視覺實戰、Opencv3.0學習等。
下載3
在「計算機視覺工坊」公眾號后臺回復:SLAM,即可下載獨家SLAM相關視頻課程,包含視覺SLAM、激光SLAM精品課程。
重磅!計算機視覺工坊-學習交流群已成立
掃碼添加小助手微信,可申請加入3D視覺工坊-學術論文寫作與投稿?微信交流群,旨在交流頂會、頂刊、SCI、EI等寫作與投稿事宜。
同時也可申請加入我們的細分方向交流群,目前主要有ORB-SLAM系列源碼學習、3D視覺、CV&深度學習、SLAM、三維重建、點云后處理、自動駕駛、CV入門、三維測量、VR/AR、3D人臉識別、醫療影像、缺陷檢測、行人重識別、目標跟蹤、視覺產品落地、視覺競賽、車牌識別、硬件選型、深度估計、學術交流、求職交流等微信群,請掃描下面微信號加群,備注:”研究方向+學校/公司+昵稱“,例如:”3D視覺?+ 上海交大 + 靜靜“。請按照格式備注,否則不予通過。添加成功后會根據研究方向邀請進去相關微信群。原創投稿也請聯系。
▲長按加微信群或投稿
▲長按關注公眾號
3D視覺從入門到精通知識星球:針對3D視覺領域的視頻課程(三維重建系列三維點云系列結構光系列、手眼標定、相機標定、orb-slam3知識點匯總、入門進階學習路線、最新paper分享、疑問解答五個方面進行深耕,更有各類大廠的算法工程人員進行技術指導。與此同時,星球將聯合知名企業發布3D視覺相關算法開發崗位以及項目對接信息,打造成集技術與就業為一體的鐵桿粉絲聚集區,近2000星球成員為創造更好的AI世界共同進步,知識星球入口:
學習3D視覺核心技術,掃描查看介紹,3天內無條件退款
?圈里有高質量教程資料、答疑解惑、助你高效解決問題
覺得有用,麻煩給個贊和在看~??
總結
以上是生活随笔為你收集整理的目标检测和感受野的总结和想法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打飞机--C语言版(是真打飞机!)
- 下一篇: 一款好看,有科技感的动态背景线条动态效果