Anchor-free目標檢測 | 工業應用更友好的新網絡(附大量相關論文下載)
隨著CVPR和ICCV的結束,一大批目標檢測的論文在arXiv上爭先恐后地露面,更多的論文都可以直接下載。下面幾篇paper有異曲同工之妙,開啟了anchor-based和anchor-free的輪回。1. Feature Selective Anchor-Free Module for Single-Shot Object Detection2. FCOS: Fully Convolutional One-Stage Object Detection3. FoveaBox: Beyond Anchor-based Object Detector4. High-level Semantic Feature Detection: A New Perspective for Pedestrian Detection
這幾篇論文不約而同地將矛頭對準了Anchor這個檢測里面的基礎模塊,采用anchor-free的方法在單階段檢測器上達到了和anchor-based方法類似或者更好的效果。
anchor-free和anchor-based區別這個問題首先需要回答為什么要有anchor。在深度學習時代,物體檢測問題通常都被建模成對一些候選區域進行分類和回歸的問題。在單階段檢測器中,這些候選區域就是通過滑窗方式產生的anchor;在兩階段檢測器中,候選區域是RPN生成的proposal,但是RPN本身仍然是對滑窗方式產生的anchor進行分類和回歸。
而在上面幾篇論文的anchor-free方法中,是通過另外一種手段來解決檢測問題的。同樣分為兩個子問題,即確定物體中心和對四條邊框的預測。預測物體中心時,具體實現既可以像1、3那樣定義一個hard的中心區域,將中心預測融入到類別預測的target里面,也可以像2、4那樣預測一個soft的centerness score。對于四條邊框的預測,則比較一致,都是預測該像素點到ground truth框的四條邊距離,不過會使用一些trick來限制 regress 的范圍。
為什么anchor-free能卷土重來anchor-free 的方法能夠在精度上媲美 anchor-based 的方法,最大的功勞我覺得應該歸于 FPN,其次歸于 Focal Loss。(內心OS:RetinaNet 賽高)。在每個位置只預測一個框的情況下,FPN 的結構對尺度起到了很好的彌補,FocalLoss 則是對中心區域的預測有很大幫助。當然把方法調 work 并不是這么容易的事情,相信有些細節會有很大影響,例如對重疊區域的處理,對回歸范圍的限制,如何將 target assign 給不同的 FPN level,head 是否 share 參數等等。
anchor-free 和 single anchor上面提到的 anchor-free 和每個位置有一個正方形 anchor 在形式上可以是等價的,也就是利用 FCN 的結構對 feature map 的每個位置預測一個框(包括位置和類別)。但 anchor-free 仍然是有意義的,我們也可以稱之為 anchor-prior-free。另外這兩者雖然形式上等價,但是實際操作中還是有區別的。在 anchor-based 的方法中,雖然每個位置可能只有一個 anchor,但預測的對象是基于這個 anchor 來匹配的,而在 anchor-free 的方法中,通常是基于這個點來匹配的。
anchor-free的局限性雖然上面幾種方法的精度都能夠與 RetinaNet 相媲美,但也沒有明顯優勢(或許速度上有),離兩階段和級聯方法相差仍然較遠。和 anchor-based 的單階段檢測器一樣,instance-level 的 feature representation 是不如兩階段檢測器的,在 head 上面的花樣也會比較少一些。順便吐槽一下,上面的少數 paper 為了達到更好看的結果,在實驗上隱藏了一些細節或者有一些不公平的比較。
anchor-free的其他套路anchor-free 除了上面說的分別確定中心點和邊框之外,還有另一種 bottom-up 的套路,以 CornerNet 為代表。如果說上面的 anchor-free 的方法還殘存著區域分類回歸的思想的話,這種套路已經跳出了這個思路,轉而解決關鍵點定位組合的問題。
這里就不詳細討論每一篇論文的方法(回復提供下載鏈接),下面開始主要分享一下個人的想法。
早期探索:
DenseBox: https://arxiv.org/abs/1509.04874
YOLO: https://arxiv.org/abs/1506.02640
基于關鍵點:
CornerNet: https://arxiv.org/abs/1808.01244
ExtremeNet: https://arxiv.org/abs/1901.08043密集預測:
FSAF: https://arxiv.org/abs/1903.00621
FCOS: https://arxiv.org/abs/1904.01355
FoveaBox: https://arxiv.org/abs/1904.03797v1
DenseBox:
如上圖所示,單個FCN同時產生多個預測bbox和置信分數的輸出。測試時,整個系統將圖片作為輸入,輸出5個通道的feature map。每個pixel的輸出feature map得到5維的向量,包括一個置信分數和bbox邊界到該pixel距離的4個值。最后輸出feature map的每個pixel轉化為帶分數的bbox,然后經過NMS后處理。除了NMS之外,檢測系統的所有組成部分都構建在FCN之中。
網絡結構如下圖所示,基于VGG19進行的改進,整個網絡包含16層卷積,前12層由VGG19初始化,輸出conv4_4后接4個1x1的卷積,前兩個卷積產生1-channel map用于類別分數,后兩個產生4-channel map用于預測相對位置。最后一個1x1的卷積擔當這全連接層的作用。
Refine with Landmark Localization
在DenseBox中由于是全卷積網絡,因此,基于landmark定位可以通過簡單添加一些層來進行實現。通過融合landmark heatmaps及目標score maps來對檢測結果進行增強。如下圖所示,增加了一個分支用于landmark定位,假設存在N個landmarks,landmark 定位分支將會輸出N個響應maps,其中,每個像素值代表該位置為landmark的置信分數。該任務的ground truth maps與檢測的十分相似,對于一個landmark 實例,landmark k的第i個實例,其對應的ground truth 是位于輸出坐標空間中第k個響應 map上的positive 標記的區域。半徑rl應當較小從而避免準確率的損失。與分類任務相似,landmark 定位損失也是定義為預測值與真實值的L2損失。同樣使用negative mining及ignore region。
YOLOv1:
YOLO意思是You Only Look Once,創造性的將候選區和對象識別這兩個階段合二為一,看一眼圖片(不用看兩眼哦)就能知道有哪些對象以及它們的位置。
實際上,YOLO并沒有真正去掉候選區,而是采用了預定義的候選區(準確點說應該是預測區,因為并不是Faster RCNN所采用的Anchor)。也就是將圖片劃分為 7*7=49 個網格(grid),每個網格允許預測出2個邊框(bounding box,包含某個對象的矩形框),總共 49*2=98 個bounding box。可以理解為98個候選區,它們很粗略的覆蓋了圖片的整個區域。
RCNN:我們先來研究一下圖片,嗯,這些位置很可能存在一些對象,你們對這些位置再檢測一下看到底是哪些對象在里面。YOLO:我們把圖片大致分成98個區域,每個區域看下有沒有對象存在,以及具體位置在哪里。RCNN:你這么簡單粗暴真的沒問題嗎?YOLO:當然沒有......咳,其實是有一點點問題的,準確率要低一點,但是我非常快!快!快!RCNN:為什么你用那么粗略的候選區,最后也能得到還不錯的bounding box呢?YOLO:你不是用過邊框回歸嗎?我拿來用用怎么不行了。
1)結構
去掉候選區這個步驟以后,YOLO的結構非常簡單,就是單純的卷積、池化最后加了兩層全連接。單看網絡結構的話,和普通的CNN對象分類網絡幾乎沒有本質的區別,最大的差異是最后輸出層用線性函數做激活函數,因為需要預測bounding box的位置(數值型),而不僅僅是對象的概率。所以粗略來說,YOLO的整個結構就是輸入圖片經過神經網絡的變換得到一個輸出的張量,如下圖所示。
因為只是一些常規的神經網絡結構,所以,理解YOLO的設計的時候,重要的是理解輸入和輸出的映射關系.
2)輸入和輸出的映射關系
3)輸入
參考圖5,輸入就是原始圖像,唯一的要求是縮放到448*448的大小。主要是因為YOLO的網絡中,卷積層最后接了兩個全連接層,全連接層是要求固定大小的向量作為輸入,所以倒推回去也就要求原始圖像有固定的尺寸。那么YOLO設計的尺寸就是448*448。
4)輸出
輸出是一個 7*7*30 的張量(tensor)。
4.1)7*7網格
根據YOLO的設計,輸入圖像被劃分為 7*7 的網格(grid),輸出張量中的 7*7 就對應著輸入圖像的 7*7 網格。或者我們把 7*7*30 的張量看作 7*7=49個30維的向量,也就是輸入圖像中的每個網格對應輸出一個30維的向量。參考上面圖5,比如輸入圖像左上角的網格對應到輸出張量中左上角的向量。
要注意的是,并不是說僅僅網格內的信息被映射到一個30維向量。經過神經網絡對輸入圖像信息的提取和變換,網格周邊的信息也會被識別和整理,最后編碼到那個30維向量中。
4.2)30維向量
具體來看每個網格對應的30維向量中包含了哪些信息。
① 20個對象分類的概率
因為YOLO支持識別20種不同的對象(人、鳥、貓、汽車、椅子等),所以這里有20個值表示該網格位置存在任一種對象的概率。可以記為 ,之所以寫成條件概率,意思是如果該網格存在一個對象Object,那么它是
的概率是
。(記不清條件概率的同學可以參考一下 理解貝葉斯定理)
② 2個bounding box的位置
每個bounding box需要4個數值來表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心點的x坐標,y坐標,bounding box的寬度,高度),2個bounding box共需要8個數值來表示其位置。
③ 2個bounding box的置信度
bounding box的置信度 = 該bounding box內存在對象的概率 * 該bounding box與該對象實際bounding box的IOU用公式來表示就是:
是bounding box內存在對象的概率,區別于上面第①點的
。Pr(Object)并不管是哪個對象,它體現的是 有或沒有 對象的概率。第①點中的
意思是假設已經有一個對象在網格中了,這個對象具體是哪一個。
是 bounding box 與 對象真實bounding box 的IOU(Intersection over Union,交并比)。要注意的是,現在討論的30維向量中的bounding box是YOLO網絡的輸出,也就是預測的bounding box。所以
體現了預測的bounding box與真實bounding box的接近程度。
還要說明的是,雖然有時說"預測"的bounding box,但這個IOU是在訓練階段計算的。等到了測試階段(Inference),這時并不知道真實對象在哪里,只能完全依賴于網絡的輸出,這時已經不需要(也無法)計算IOU了。
綜合來說,一個bounding box的置信度Confidence意味著它 是否包含對象且位置準確的程度。置信度高表示這里存在一個對象且位置比較準確,置信度低表示可能沒有對象 或者 即便有對象也存在較大的位置偏差。
簡單解釋一下IOU。下圖來自Andrew Ng的深度學習課程,IOU=交集部分面積/并集部分面積,2個box完全重合時IOU=1,不相交時IOU=0。
總的來說,30維向量 = 20個對象的概率 + 2個bounding box * 4個坐標 + 2個bounding box的置信度
4.3)討論
① 一張圖片最多可以檢測出49個對象
每個30維向量中只有一組(20個)對象分類的概率,也就只能預測出一個對象。所以輸出的 7*7=49個 30維向量,最多表示出49個對象。
② 總共有 49*2=98 個候選區(bounding box)
每個30維向量中有2組bounding box,所以總共是98個候選區。
③ YOLO的bounding box并不是Faster RCNN的Anchor
Faster RCNN等一些算法采用每個grid中手工設置n個Anchor(先驗框,預先設置好位置的bounding box)的設計,每個Anchor有不同的大小和寬高比。YOLO的bounding box看起來很像一個grid中2個Anchor,但它們不是。YOLO并沒有預先設置2個bounding box的大小和形狀,也沒有對每個bounding box分別輸出一個對象的預測。它的意思僅僅是對一個對象預測出2個bounding box,選擇預測得相對比較準的那個。
這里采用2個bounding box,有點不完全算監督算法,而是像進化算法。如果是監督算法,我們需要事先根據樣本就能給出一個正確的bounding box作為回歸的目標。但YOLO的2個bounding box事先并不知道會在什么位置,只有經過前向計算,網絡會輸出2個bounding box,這兩個bounding box與樣本中對象實際的bounding box計算IOU。這時才能確定,IOU值大的那個bounding box,作為負責預測該對象的bounding box。
訓練開始階段,網絡預測的bounding box可能都是亂來的,但總是選擇IOU相對好一些的那個,隨著訓練的進行,每個bounding box會逐漸擅長對某些情況的預測(可能是對象大小、寬高比、不同類型的對象等)。所以,這是一種進化或者非監督學習的思想。
另外論文中經常提到responsible。比如:Our system divides the input image into an S*S grid. If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object. 這個 responsible 有點讓人疑惑,對預測"負責"是啥意思。其實沒啥特別意思,就是一個Object只由一個grid來進行預測,不要多個grid都搶著預測同一個Object。更具體一點說,就是在設置訓練樣本的時候,樣本中的每個Object歸屬到且僅歸屬到一個grid,即便有時Object跨越了幾個grid,也僅指定其中一個。具體就是計算出該Object的bounding box的中心位置,這個中心位置落在哪個grid,該grid對應的輸出向量中該對象的類別概率是1(該gird負責預測該對象),所有其它grid對該Object的預測概率設為0(不負責預測該對象)。
還有:YOLO predicts multiple bounding boxes per grid cell. At training time we only want one bounding box predictor to be responsible for each object. 同樣,雖然一個grid中會產生2個bounding box,但我們會選擇其中一個作為預測結果,另一個會被忽略。下面構造訓練樣本的部分會看的更清楚。
④ 可以調整網格數量、bounding box數量
7*7網格,每個網格2個bounding box,對448*448輸入圖像來說覆蓋粒度有點粗。我們也可以設置更多的網格以及更多的bounding box。設網格數量為 S*S,每個網格產生B個邊框,網絡支持識別C個不同的對象。這時,輸出的向量長度為:
整個輸出的tensor就是:
YOLO選擇的參數是 7*7網格,2個bounding box,20種對象,因此 輸出向量長度 = 20 + 2 * (4+1) = 30。整個輸出的tensor就是 7*7*30。
因為網格和bounding box設置的比較稀疏,所以這個版本的YOLO訓練出來后預測的準確率和召回率都不是很理想,后續的v2、v3版本還會改進。當然,因為其速度能夠滿足實時處理的要求,所以對工業界還是挺有吸引力的。
5)訓練樣本構造
作為監督學習,我們需要先構造好訓練樣本,才能讓模型從中學習。
對于一張輸入圖片,其對應輸出的7*7*30張量(也就是通常監督學習所說的標簽y或者label)應該填寫什么數據呢。
首先,輸出的 7*7維度 對應于輸入的 7*7 網格;然后具體看下30維向量的填寫。
① 20個對象分類的概率
對于輸入圖像中的每個對象,先找到其中心點。比如圖8中的自行車,其中心點在黃色圓點位置,中心點落在黃色網格內,所以這個黃色網格對應的30維向量中,自行車的概率是1,其它對象的概率是0。所有其它48個網格的30維向量中,該自行車的概率都是0。這就是所謂的"中心點所在的網格對預測該對象負責"。狗和汽車的分類概率也是同樣的方法填寫。
② 2個bounding box的位置
訓練樣本的bounding box位置應該填寫對象實際的bounding box,但一個對象對應了2個bounding box,該填哪一個呢?上面討論過,需要根據網絡輸出的bounding box與對象實際bounding box的IOU來選擇,所以要在訓練過程中動態決定到底填哪一個bounding box。參考下面第③點。
③ 2個bounding box的置信度
上面討論過置信度公式:
6)損失函數
損失就是網絡實際輸出值與樣本標簽值之間的偏差。
YOLO給出的損失函數如下
DenseBox和YOLO的區別:
1.DenseBox最初應用于人臉檢測,相當于只有兩類,而YOLO是通用檢測,通常大于兩類。
2.DenseBox是密集預測,對每個pixel進行預測,而YOLO先將圖片進行網格化,對每個grid cell進行預測,所以前者更適合于小目標,后者更適合于大目標。
3.DenseBox的gt通過bbox中心圓形區域確定的,而YOLO的gt由bbox中心點落入的grid cell確定的。
CornerNet:
下圖,經過特征提取主干網絡(主干網絡為Hourglass-104)后分為兩個分支(兩個分支分別接前面提到的corner pooling,隨后細談),一個分支生成目標左上點熱力圖,一個分支生成目標右下點熱力圖,而此時兩個熱力圖并沒有建立聯系,因此無法確定兩點是夠屬于同一目標,因此兩分支同時生成embeddings,通過判斷兩個embedding vector的相似性確定同一物體(距離小于某一閾值則劃為同一目標)。
1、輸入一張圖像,經過backbone網絡(Hourglass network)后,得到feature map。
2、將feature map同時輸入到兩個branch,分別用于預測Top-Left Corners和Bottom-right Corners。
3、兩個branch都會先經過一個叫Corner Pooling的網絡,最后輸出三個結果,分別是Heatmaps、Embeddings、Offsets。
4、根據Heatmaps能夠得到物體的左上角點和右下角點,根據Offsets對左上角和右下角點位置進行更加精細的微調,根據Embeddings可以將同一個物體的左上角和右下角點進行匹配。得到到最終的目標框。
1:怎么檢測這個兩個點?生成keypoint的heatmap,heatmap中響應值最大的位置就是點的位置。
2:怎么知道這兩個點所組成的框包含物體的類別?每個heatmaps集合的形式都是CxHxW,其中C代表的是檢測目標的類別數,H和W則代表的heatmap的分辨率,Corner響應值最大所在的channel即對應了物體的類別。
3:當圖像中有多個物體時,怎么知道哪些點可以組成框?(哪些左上角的點和哪些右下角的點能夠組成有效的框)生成embedding向量,用向量的距離衡量兩個Corner是否可以組成對。
4:Loss是什么形式?loss總共分了三個部分,一部分是用于定位keypoint點的detecting loss,一個是用于精確定位的offset loss,一個是用于對Corner點進行配對的grouping loss。
5:網絡結構是怎么樣的?使用Hourglass作為backbone,使用Corner Pooling構造了prediction module,用來得到最終的結果。
6:有沒有什么比較新奇的東西?提出的Corner Pooling,第一次使用檢測點的方法檢測物體。
貢獻:
1.通過檢測bbox的一對角點來檢測出目標。
2.提出corner pooling,來更好的定位bbox的角點。
上圖是top-left corner的 Corner Pooling過程。在水平方向,從最右端開始往最左端遍歷,每個位置的值都變成從最右到當前位置為止,出現的最大的值。同理,bottom-right corner的Corner Pooling則是最左端開始往最右端遍歷。同樣的,在垂直方向上,也是這樣同樣的Pooling的方式。
以左上角點為例,當我們決定此點是否個corner點的時候,往往會沿著水平的方向向右看,看看是否與物體有相切,還會沿著垂直方向向下看,看看是否與物體相切。簡而言之,其實corner點是物體上邊緣點和坐邊緣點的集合,因此在pooling的時候通過Corner Pooling的方式能夠一定程度上體現出當前點出發的射線是否與物體相交。
ExtremeNet:
作者使用了最佳的關鍵點估計框架,通過對每個目標類預測4個多峰值的heatmaps來尋找極值點。另外,作者使用每個類center heatmap來預測目標中心。僅通過基于幾何的方法來對極值點分組,如果4個極值點的幾何中點在center map上對應的分數高于閾值,則這4個極值點分為一組。
offset的預測是類別無關的,而極值點的預測是類別相關的。對每種極值點heatmap,不包含center map,預測2張offset map(分別對應XY軸方向)。網絡的輸出是5xC heatmaps和4x2offset maps,C是類別數。
分組算法的輸入是每個類的5個heatmaps,一個center heatmap和4個extreme heatmaps,通過檢測所有的峰值來提取出5個heatmaps的關鍵點。給出4個極值點,計算幾何中心,如果幾何中心在center map上對應高響應,那么這4個極值點為有效檢測。作者使用暴力枚舉的方式來得到所有有效的4個關鍵點。
貢獻:
1.將關鍵點定義為極值點。
2.根據幾何結構對關鍵點進行分組。
CornerNet和ExtremeNet的區別:
1.CornerNet通過預測角點來檢測目標的,而ExtremeNet通過預測極值點和中心點來檢測目標的。
2.CornerNet通過角點embedding之間的距離來判斷是否為同一組關鍵點,而ExtremeNet通過暴力枚舉極值點、經過中心點判斷4個極值點是否為一組。
FSAF:
讓每個實例選擇最好的特征層來優化網絡,因此不需要anchor來限制特征的選擇。
一個anchor-free的分支在每個特征金字塔層構建,獨立于anchor-based的分支。和anchor-based分支相似,anchor-free分支由分類子網絡和回歸子網絡。一個實例能夠被安排到任意層的anchor-free分支。訓練期間,基于實例的信息而不是實例box的尺寸來動態地為每個實例選擇最合適的特征層。選擇的特征層學會檢測安排的實例。推理階段,FSAF模塊和anchor-based分支獨立或者聯合運行。
在RetinaNet的基礎上,FSAF模塊引入了2個額外的卷積層,這兩個卷積層各自負責anchor-free分支的分類和回歸預測。具體的,在分類子網絡中,feature map后面跟著K個3x3的卷積層和sigmoid,在回歸子網絡中,feature map后面跟著4個3x3的卷積層和ReLU。
實例輸入到特征金字塔的所有層,然后求得所有anchor-free分支focal loss和IoU loss的和,選擇loss和最小的特征層來學習實例。訓練時,特征根據安排的實例進行更新。推理時,不需要進行特征更新,因為最合適的特征金字塔層自然地輸出高置信分數。
FCOS:
和語義分割相同,檢測器直接將位置作為訓練樣本而不是anchor。具體的,如果某個位置落入了任何gt中,那么該位置就被認為是正樣本,并且類別為該gt的類別。基于anchor的檢測器,根據不同尺寸安排anchor到不同的特征層,而FCOS直接限制邊界框回歸的范圍(即每個feature map負責一定尺度的回歸框)。
Center-ness:
為了剔除遠離目標中心的低質量預測bbox,作者提出了添加center-ness分支,和分類分支并行。
優點:
1.將檢測和其他使用FCN的任務統一起來,容易重用這些任務的思想。
2.proposal free和anchor free,減少了超參的設計。
3.不使用trick,達到了單階段檢測的最佳性能。
4.經過小的修改,可以立即拓展到其他視覺任務上。
FoveaBox:
人類眼睛的中央凹:視野(物體)的中心具有最高的視覺敏銳度。FoveaBox聯合預測對象中心區域可能存在的位置以及每個有效位置的邊界框。由于特征金字塔的特征表示,不同尺度的目標可以從多個特征層中檢測到。
FoveaBox添加了2個子網絡,一個子網絡預測分類,另一個子網絡預測bbox。
Object Fovea:
目標的中央凹如上圖所示。目標中央凹只編碼目標對象存在的概率。為了確定位置,模型要預測每個潛在實例的邊界框。
FSAF、FCOS、FoveaBox的異同點:
1.都利用FPN來進行多尺度目標檢測。
2.都將分類和回歸解耦成2個子網絡來處理。
3.都是通過密集預測進行分類和回歸的。
4.FSAF和FCOS的回歸預測的是到4個邊界的距離,而FoveaBox的回歸預測的是一個坐標轉換。
5.FSAF通過在線特征選擇的方式,選擇更加合適的特征來提升性能,FCOS通過center-ness分支剔除掉低質量bbox來提升性能,FoveaBox通過只預測目標中心區域來提升性能。
總結:
1.各種方法的關鍵在于gt如何定義
2.主要是基于關鍵點檢測的方法和密集預測的方法來做Anchor-Free
3.本質上是將基于anchor轉換成了基于point/region
下一期我們詳細說說商湯的《CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection》,基于向心偏移的anchor-free目標檢測網絡centripetalnet,為基于關鍵點的目標檢測方法研究帶來了新思路。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。
雙控開關相關文章:雙控開關原理