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