Anchor-free目標檢測 | 工業(yè)應(yīng)用更友好的新網(wǎng)絡(luò)(1)
隨著 CVPR 2020和ICCV 2020的結(jié)束,一大批目標檢測的論文在arXiv上爭先恐后地露面,更多的論文都可以直接下載。
下面幾篇paper有異曲同工之妙,開啟了anchor-based和anchor-free的輪回。
1. Feature Selective Anchor-Free Module for Single-Shot Object Detection
2. FCOS: Fully Convolutional One-Stage Object Detection
3. FoveaBox: Beyond Anchor-based Object Detector
4. High-level Semantic Feature Detection: A New Perspective for Pedestrian Detection
這幾篇論文不約而同地將矛頭對準了Anchor這個檢測里面的基礎(chǔ)模塊,采用anchor-free的方法在單階段檢測器上達到了和anchor-based方法類似或者更好的效果。
anchor-free和anchor-based區(qū)別
這個問題首先需要回答為什么要有anchor。在深度學(xué)習(xí)時代,物體檢測問題通常都被建模成對一些候選區(qū)域進行分類和回歸的問題。在單階段檢測器中,這些候選區(qū)域就是通過滑窗方式產(chǎn)生的anchor;在兩階段檢測器中,候選區(qū)域是RPN生成的proposal,但是RPN本身仍然是對滑窗方式產(chǎn)生的anchor進行分類和回歸。
而在上面幾篇論文的anchor-free方法中,是通過另外一種手段來解決檢測問題的。同樣分為兩個子問題,即確定物體中心和對四條邊框的預(yù)測。預(yù)測物體中心時,具體實現(xiàn)既可以像1、3那樣定義一個hard的中心區(qū)域,將中心預(yù)測融入到類別預(yù)測的target里面,也可以像2、4那樣預(yù)測一個soft的centerness score。對于四條邊框的預(yù)測,則比較一致,都是預(yù)測該像素點到ground truth框的四條邊距離,不過會使用一些trick來限制 regress 的范圍。
為什么anchor-free能卷土重來
anchor-free 的方法能夠在精度上媲美 anchor-based 的方法,最大的功勞我覺得應(yīng)該歸于 FPN,其次歸于 Focal Loss。(內(nèi)心OS:RetinaNet 賽高)。在每個位置只預(yù)測一個框的情況下,F(xiàn)PN 的結(jié)構(gòu)對尺度起到了很好的彌補,F(xiàn)ocalLoss 則是對中心區(qū)域的預(yù)測有很大幫助。當然把方法調(diào) work 并不是這么容易的事情,相信有些細節(jié)會有很大影響,例如對重疊區(qū)域的處理,對回歸范圍的限制,如何將 target assign 給不同的 FPN level,head 是否 share 參數(shù)等等。
anchor-free 和 single anchor
上面提到的 anchor-free 和每個位置有一個正方形 anchor 在形式上可以是等價的,也就是利用 FCN 的結(jié)構(gòu)對 feature map 的每個位置預(yù)測一個框(包括位置和類別)。但 anchor-free 仍然是有意義的,我們也可以稱之為 anchor-prior-free。另外這兩者雖然形式上等價,但是實際操作中還是有區(qū)別的。在 anchor-based 的方法中,雖然每個位置可能只有一個 anchor,但預(yù)測的對象是基于這個 anchor 來匹配的,而在 anchor-free 的方法中,通常是基于這個點來匹配的。
anchor-free的局限性
雖然上面幾種方法的精度都能夠與 RetinaNet 相媲美,但也沒有明顯優(yōu)勢(或許速度上有),離兩階段和級聯(lián)方法相差仍然較遠。和 anchor-based 的單階段檢測器一樣,instance-level 的 feature representation 是不如兩階段檢測器的,在 head 上面的花樣也會比較少一些。順便吐槽一下,上面的少數(shù) paper 為了達到更好看的結(jié)果,在實驗上隱藏了一些細節(jié)或者有一些不公平的比較。
anchor-free的其他套路
anchor-free 除了上面說的分別確定中心點和邊框之外,還有另一種 bottom-up 的套路,以 CornerNet 為代表。如果說上面的 anchor-free 的方法還殘存著區(qū)域分類回歸的思想的話,這種套路已經(jīng)跳出了這個思路,轉(zhuǎn)而解決關(guān)鍵點定位組合的問題。
這里就不詳細討論每一篇論文的方法(回復(fù)提供下載鏈接),下面開始主要分享一下個人的想法。
早期探索:
DenseBox: https://arxiv.org/abs/1509.04874
YOLO: https://arxiv.org/abs/1506.02640
基于關(guān)鍵點:
CornerNet: https://arxiv.org/abs/1808.01244
ExtremeNet: https://arxiv.org/abs/1901.08043
密集預(yù)測:
FSAF: https://arxiv.org/abs/1903.00621
FCOS: https://arxiv.org/abs/1904.01355
FoveaBox: https://arxiv.org/abs/1904.03797v1
DenseBox:
如上圖所示,單個FCN同時產(chǎn)生多個預(yù)測bbox和置信分數(shù)的輸出。測試時,整個系統(tǒng)將圖片作為輸入,輸出5個通道的feature map。每個pixel的輸出feature map得到5維的向量,包括一個置信分數(shù)和bbox邊界到該pixel距離的4個值。最后輸出feature map的每個pixel轉(zhuǎn)化為帶分數(shù)的bbox,然后經(jīng)過NMS后處理。除了NMS之外,檢測系統(tǒng)的所有組成部分都構(gòu)建在FCN之中。
網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示,基于VGG19進行的改進,整個網(wǎng)絡(luò)包含16層卷積,前12層由VGG19初始化,輸出conv4_4后接4個1x1的卷積,前兩個卷積產(chǎn)生1-channel map用于類別分數(shù),后兩個產(chǎn)生4-channel map用于預(yù)測相對位置。最后一個1x1的卷積擔(dān)當這全連接層的作用。
Refine with Landmark Localization
在DenseBox中由于是全卷積網(wǎng)絡(luò),因此,基于landmark定位可以通過簡單添加一些層來進行實現(xiàn)。通過融合landmark heatmaps及目標score maps來對檢測結(jié)果進行增強。如下圖所示,增加了一個分支用于landmark定位,假設(shè)存在N個landmarks,landmark 定位分支將會輸出N個響應(yīng)maps,其中,每個像素值代表該位置為landmark的置信分數(shù)。該任務(wù)的ground truth maps與檢測的十分相似,對于一個landmark 實例,landmark k的第i個實例,其對應(yīng)的ground truth 是位于輸出坐標空間中第k個響應(yīng) map上的positive 標記的區(qū)域。半徑rl應(yīng)當較小從而避免準確率的損失。與分類任務(wù)相似,landmark 定位損失也是定義為預(yù)測值與真實值的L2損失。同樣使用negative mining及ignore region。
YOLOv1:
YOLO意思是You Only Look Once,創(chuàng)造性的將候選區(qū)和對象識別這兩個階段合二為一,看一眼圖片(不用看兩眼哦)就能知道有哪些對象以及它們的位置。
實際上,YOLO并沒有真正去掉候選區(qū),而是采用了預(yù)定義的候選區(qū)(準確點說應(yīng)該是預(yù)測區(qū),因為并不是Faster RCNN所采用的Anchor)。也就是將圖片劃分為 7*7=49 個網(wǎng)格(grid),每個網(wǎng)格允許預(yù)測出2個邊框(bounding box,包含某個對象的矩形框),總共 49*2=98 個bounding box??梢岳斫鉃?8個候選區(qū),它們很粗略的覆蓋了圖片的整個區(qū)域。
RCNN:我們先來研究一下圖片,嗯,這些位置很可能存在一些對象,你們對這些位置再檢測一下看到底是哪些對象在里面。
YOLO:我們把圖片大致分成98個區(qū)域,每個區(qū)域看下有沒有對象存在,以及具體位置在哪里。
RCNN:你這么簡單粗暴真的沒問題嗎?
YOLO:當然沒有......咳,其實是有一點點問題的,準確率要低一點,但是我非常快!快!快!
RCNN:為什么你用那么粗略的候選區(qū),最后也能得到還不錯的bounding box呢?
YOLO:你不是用過邊框回歸嗎?我拿來用用怎么不行了。
1)結(jié)構(gòu)
去掉候選區(qū)這個步驟以后,YOLO的結(jié)構(gòu)非常簡單,就是單純的卷積、池化最后加了兩層全連接。單看網(wǎng)絡(luò)結(jié)構(gòu)的話,和普通的CNN對象分類網(wǎng)絡(luò)幾乎沒有本質(zhì)的區(qū)別,最大的差異是最后輸出層用線性函數(shù)做激活函數(shù),因為需要預(yù)測bounding box的位置(數(shù)值型),而不僅僅是對象的概率。所以粗略來說,YOLO的整個結(jié)構(gòu)就是輸入圖片經(jīng)過神經(jīng)網(wǎng)絡(luò)的變換得到一個輸出的張量,如下圖所示。
因為只是一些常規(guī)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),所以,理解YOLO的設(shè)計的時候,重要的是理解輸入和輸出的映射關(guān)系.
2)輸入和輸出的映射關(guān)系
3)輸入
參考圖5,輸入就是原始圖像,唯一的要求是縮放到448*448的大小。主要是因為YOLO的網(wǎng)絡(luò)中,卷積層最后接了兩個全連接層,全連接層是要求固定大小的向量作為輸入,所以倒推回去也就要求原始圖像有固定的尺寸。那么YOLO設(shè)計的尺寸就是448*448。
4)輸出
輸出是一個 7*7*30 的張量(tensor)。
4.1)7*7網(wǎng)格
根據(jù)YOLO的設(shè)計,輸入圖像被劃分為 7*7 的網(wǎng)格(grid),輸出張量中的 7*7 就對應(yīng)著輸入圖像的 7*7 網(wǎng)格?;蛘呶覀儼?7*7*30 的張量看作 7*7=49個30維的向量,也就是輸入圖像中的每個網(wǎng)格對應(yīng)輸出一個30維的向量。參考上面圖5,比如輸入圖像左上角的網(wǎng)格對應(yīng)到輸出張量中左上角的向量。
要注意的是,并不是說僅僅網(wǎng)格內(nèi)的信息被映射到一個30維向量。經(jīng)過神經(jīng)網(wǎng)絡(luò)對輸入圖像信息的提取和變換,網(wǎng)格周邊的信息也會被識別和整理,最后編碼到那個30維向量中。
4.2)30維向量
具體來看每個網(wǎng)格對應(yīng)的30維向量中包含了哪些信息。
① 20個對象分類的概率
綜合來說,一個bounding box的置信度Confidence意味著它 是否包含對象且位置準確的程度。置信度高表示這里存在一個對象且位置比較準確,置信度低表示可能沒有對象 或者 即便有對象也存在較大的位置偏差。
簡單解釋一下IOU。下圖來自Andrew Ng的深度學(xué)習(xí)課程,IOU=交集部分面積/并集部分面積,2個box完全重合時IOU=1,不相交時IOU=0。
總的來說,30維向量 = 20個對象的概率 + 2個bounding box * 4個坐標 + 2個bounding box的置信度
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。
LCD顯示屏相關(guān)文章:lcd顯示屏原理
lcd相關(guān)文章:lcd原理