目標(biāo)檢測(cè)中Anchor的本質(zhì)分析

極市導(dǎo)讀
?本文以人臉識(shí)別為例解釋了目標(biāo)檢測(cè)中Anchor的本質(zhì),也就是多尺度的滑動(dòng)窗口。通過(guò)與傳統(tǒng)的detection的做法進(jìn)行比較凸顯Anchor的優(yōu)點(diǎn),文末還附有Retina-Face的代碼鏈接以及相關(guān)論文。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿
在object detection的一些非常有名的model上面,有一個(gè)最開(kāi)始非常難以理解的概念----Anchor。這個(gè)Anchor在Faster RCNN上面也叫reference boxes,也就是參考框。參考框的意思肯定是會(huì)帶來(lái)先驗(yàn)的知識(shí)。首先考慮目標(biāo)檢測(cè)的任務(wù),輸入圖片,輸出的是包含目標(biāo)類(lèi)別的矩形框(Bounding Boxes)具體可以看下圖:

那么一個(gè)比較核心的問(wèn)題,就是這個(gè)框的形狀和大小,對(duì)應(yīng)的就是在各種anchor-based的文章里面提的非常多的ratio和scale。ratio很簡(jiǎn)單,就是長(zhǎng)寬之比(1:1,1:2, 2:1....),scale可以理解為邊長(zhǎng)。那為什么會(huì)有Anchor這種東西?其起到的作用是什么?其實(shí)Anchor的本質(zhì)就是多尺度的滑動(dòng)窗口(sliding window in multi-scale)。好像現(xiàn)在還沒(méi)有人這樣去理解他,下面具體來(lái)分析。
首先看下傳統(tǒng)的detection是怎么做的,比如haar、hog特征的人臉、行人、車(chē)輛檢測(cè)。這些方法是在CNN-based之前的主流方法,只不過(guò)后來(lái)被CNN打敗。其具體的流程如下:
1.生成圖像金字塔,因?yàn)榇龣z測(cè)的物體的scale是變化的

2.用滑動(dòng)窗口在圖片金字塔上面滾動(dòng)生成很多候選區(qū)域(如下面動(dòng)圖所示)

3.各種特征提取(hog)和分類(lèi)器(svm)來(lái)對(duì)上面產(chǎn)生的候選區(qū)域中的圖片信息來(lái)分類(lèi)(比如:是否為人臉)
4.NMS非極大值抑制得到最后的結(jié)果

那么CNN以其強(qiáng)大的特征提取能力,自然而然的可以替代步驟3。但是由于步驟1和2的存在是獨(dú)立于CNN之外,而且需要大量的循環(huán)遍歷,速度受到了限制。而且要想好的定位精度,必須有比較多的scale和ratio不同的滑窗,這樣又增加了時(shí)間。那么在深度學(xué)習(xí)中,我們總是在講end2end,那么怎么把1/2步驟融合進(jìn)去?其實(shí)在窗口滑動(dòng)的時(shí)候,本質(zhì)是一個(gè)遍歷像素的過(guò)程,那么我們可以直接為每個(gè)像素分配幾個(gè)不同scale和ratio的窗口矩形,這些矩形的中心都是其所屬的像素點(diǎn)。至于scale和ratio的選取,可以根據(jù)一些先驗(yàn)知識(shí)或者像YOLO-v2一樣通過(guò)k-means聚類(lèi)得到。然后每個(gè)像素分配幾個(gè)不同scale和ratio的窗口矩形就是Anchor。其實(shí)本質(zhì)就是把基于像素遍歷的一個(gè)過(guò)程直接分配到每個(gè)像素來(lái)做,然后CNN是可以直接做基于像素的一個(gè)Dense Map的預(yù)測(cè)的。下面可視化一下Anchor(這里只可視化了200個(gè)):

可以看出200個(gè)anchor已經(jīng)基本上覆蓋了整個(gè)圖片了,一般的網(wǎng)絡(luò)模型的anchor都是在幾萬(wàn)個(gè)左右,比如Retina-Face的anchor在25000左右。那么我們回到步驟3. 現(xiàn)在就是要用CNN來(lái)給這么多個(gè)Anchor來(lái)分類(lèi)了,比如是否為人臉。
那么怎么判斷這些anchor的分類(lèi)就比較簡(jiǎn)單了,就是看這些anchor與給定的矩形框的iou是否滿(mǎn)足條件,比如iou>0.5認(rèn)為是Postive,<0.2認(rèn)為是Negtive。iou的計(jì)算也很簡(jiǎn)單,如下:

那么我們實(shí)際看一張人臉圖片中,Postive anchor的可視化情況:

可以看出這些綠色的anchor都是基本上大部分包含了人臉的,是Postive的樣本。可以看出這樣cnn現(xiàn)在對(duì)于分類(lèi)的基本上沒(méi)有問(wèn)題,但是在定位上面會(huì)有較大的誤差。所以后續(xù)還有基于anchor的bbox的坐標(biāo)的預(yù)測(cè),其實(shí)本質(zhì)也是增加CNN的輸出的depth,來(lái)預(yù)測(cè)4個(gè)值(x, y, w, h)的offset。這個(gè)可以詳細(xì)看下YOLO系列或者Faster RCNN。那么現(xiàn)在anchor的機(jī)制本質(zhì)上,就是一堆變scale和ratio的滑動(dòng)窗口,只不過(guò)通過(guò)CNN的Dense Map Prediction的方式整個(gè)嵌入到一個(gè)end2end的框架里面了。
其實(shí)最重要的核心還是弄懂CNN網(wǎng)絡(luò)的輸入與輸出的shape
輸入是圖片、輸出的是一個(gè)表示各個(gè)anchor的classification和localization的預(yù)測(cè)值
針對(duì)人臉檢測(cè)來(lái)看,比如假設(shè)有N個(gè)anchor,那么輸出的shape應(yīng)該是N*(2 + 4),其中2表示分類(lèi)的預(yù)測(cè),是否為人臉,4表示(x,y,w,h)相對(duì)于anchor的offset的預(yù)測(cè)。
這里強(qiáng)烈推薦Retina-Face的代碼:
https://link.zhihu.com/?target=https%3A//github.com/supernotman/RetinaFace_Pytorch
也可以看一下Retina-Face的論文:
https://arxiv.org/pdf/1905.00641.pdfarxiv.org
參考:
https://www.datacamp.com/community/tutorials/object-detection-guidewww.datacamp.com
推薦閱讀

