導(dǎo)讀
本文主要講述:1.無Anchor的目標(biāo)檢測(cè)算法:YOLOv1,CenterNet,CornerNet的邊框回歸策略;2.有Anchor的目標(biāo)檢測(cè)算法:SSD,YOLOv2,F(xiàn)aster R-CNN的邊框回歸策略。
寫在前面
目標(biāo)檢測(cè)包括目標(biāo)分類和目標(biāo)定位2個(gè)任務(wù),目標(biāo)定位一般是用一個(gè)矩形的邊界框來框出物體所在的位置,關(guān)于邊界框的回歸策略,不同算法其回歸方法不一。本文主要講述:1.無Anchor的目標(biāo)檢測(cè)算法:YOLOv1,CenterNet,CornerNet的邊框回歸策略;2.有Anchor的目標(biāo)檢測(cè)算法:SSD,YOLOv2,F(xiàn)aster R-CNN的邊框回歸策略。如有錯(cuò)誤和疑問,還望交流與指正!
無Anchor的目標(biāo)檢測(cè)算法邊框回歸策略
1. YOLOv1
原文鏈接:https://pjreddie.com/media/files/papers/yolo.pdf 解讀鏈接: https://zhuanlan.zhihu.com/p/75106112 YOLOv1先將每幅圖片reshape到448x448大小,然后將圖片分成7x7個(gè)單元格,每個(gè)格子預(yù)測(cè)2個(gè)邊界框,而每個(gè)邊界框的位置坐標(biāo)有4個(gè),分別是x,y,w,h。其中x,y是邊界框相對(duì)于其所在單元格的偏移(一般是相對(duì)于單元格左上角坐標(biāo)點(diǎn)的偏移,在這里每個(gè)正方形單元格的邊長視為1,故x,y在[0,1]之間);w,h分別是預(yù)測(cè)的邊界框?qū)?,高相?duì)于整張圖片寬,高的比例,也是在[0,1]之間。YOLOv1中回歸選用的損失函數(shù)是均方差損失函數(shù),因此我們訓(xùn)練時(shí),有了預(yù)測(cè)的邊界框位置信息,有了gtbbox,有了損失函數(shù)就能按照梯度下降法,優(yōu)化我們網(wǎng)絡(luò)的參數(shù),使網(wǎng)絡(luò)預(yù)測(cè)的邊界框更接近與gt_bbox。
2. CornerNet
原文鏈接:https://arxiv.org/pdf/1808.01244.pdf 代碼鏈接: https://github.com/umich-vl/CornerNet 解讀鏈接:ECCV 2018 | CornerNet:目標(biāo)檢測(cè)算法新思路
這是在ECCV2018發(fā)表的一篇文章,文章將目標(biāo)檢測(cè)問題當(dāng)作關(guān)鍵點(diǎn)檢測(cè)問題來解決,具體來說就是通過檢測(cè)目標(biāo)框的左上角和右下角兩個(gè)關(guān)鍵點(diǎn)得到預(yù)測(cè)框,因此CornerNet算法中也沒有anchor的概念,在目標(biāo)檢測(cè)領(lǐng)域Anchor大行其道的時(shí)候,這種無Anchor的做法在目標(biāo)檢測(cè)領(lǐng)域是比較創(chuàng)新的而且取得的效果還很不錯(cuò)。此外,整個(gè)檢測(cè)網(wǎng)絡(luò)的訓(xùn)練是從頭開始的,并沒有基于預(yù)訓(xùn)練的分類模型,這使得用戶能夠自由設(shè)計(jì)特征提取網(wǎng)絡(luò),不用受預(yù)訓(xùn)練模型的限制。
算法結(jié)構(gòu)
首先原圖經(jīng)過1個(gè)7×7的卷積層將輸入圖像尺寸縮小為原來的1/4(論文中輸入圖像大小是511×511,縮小后得到128×128大小的輸出),然后經(jīng)過特征提取網(wǎng)絡(luò)Hourglass network提取特征,Hourglass module后會(huì)有兩個(gè)輸出分支模塊,分別表示左上角點(diǎn)預(yù)測(cè)分支和右下角點(diǎn)預(yù)測(cè)分支,每個(gè)分支模塊經(jīng)過應(yīng)該Corner pooling層后輸出3個(gè)信息:Heatmaps、Embeddings和Offsets。1.Corner pooling:更好的定位角點(diǎn),一個(gè)角點(diǎn)的定位不能只依靠局部信息,Corner pooling層有兩組特征圖,相同的像素點(diǎn),匯集值一個(gè)是該像素水平向右的最大值,一個(gè)是垂直向下的最大值,之后兩組特征圖求和;2.Heatmaps:預(yù)測(cè)角點(diǎn)位置信息,一個(gè)支路預(yù)測(cè)左上角,一個(gè)支路預(yù)測(cè)右下角。Heatmaps可以用維度為CxHxW的特征圖表示,其中C表示目標(biāo)的類別(不包含背景類),這個(gè)特征圖的每個(gè)通道都是一個(gè)mask,mask的每個(gè)值是0到1,表示該點(diǎn)是角點(diǎn)的分?jǐn)?shù)(注意一個(gè)通道只預(yù)測(cè)同一類別的物體的角點(diǎn)信息);3.Embeddings:用來對(duì)預(yù)測(cè)的角點(diǎn)分組,也就是找到屬于同一個(gè)目標(biāo)的左上角角點(diǎn)和右下角角點(diǎn),同一個(gè)預(yù)測(cè)框的一對(duì)角點(diǎn)的角距離短。如下圖: 4. Offsets:調(diào)整角點(diǎn)位置,使得獲得的邊界框更緊密。
Corner poolin
1)有無Corner pooling的預(yù)測(cè)框?qū)Ρ瓤梢钥闯鲇辛薈orner pooling,預(yù)測(cè)的目標(biāo)邊界框的角點(diǎn),位置信息更加的精確了。2)主要思想如上圖所示,通常一個(gè)目標(biāo)的邊界框的角點(diǎn)是不包含該目標(biāo)的局部特征信息的,那么我們?nèi)绾闻袛嗄骋粋€(gè)位置的像素點(diǎn)是否是某一個(gè)目標(biāo)的角點(diǎn)呢?拿左上角點(diǎn)來說,對(duì)于左上角點(diǎn)的上邊界,我們需要從左往右看尋找目標(biāo)的特征信息,對(duì)于左上角點(diǎn)的左邊界,我們需要從上往下看尋找目標(biāo)的特征信息(比如上圖中的第一張圖,左上角點(diǎn)的右邊有目標(biāo)頂端的特征信息:第一張圖的頭頂,左上角點(diǎn)的下邊有目標(biāo)左側(cè)的特征信息:第一張圖的手,因此如果左上角點(diǎn)經(jīng)過池化操作后能有這兩個(gè)信息,那么就有利于該點(diǎn)的預(yù)測(cè),這就是Corner pooling的主要思想)。3)具體做法 如Figure3所示,Corner pooling層有2個(gè)輸入特征圖,特征圖的寬高分別用W和H表示,假設(shè)接下來要對(duì)圖中紅色點(diǎn)(坐標(biāo)假設(shè)是(i,j))做corner pooling,那么首先找到像素點(diǎn)以下(包括本身)即(i,j)到(i,H)(左角點(diǎn)的最下端)這一列中的最大值,然后將這張?zhí)卣鲌D中(i,j)位置的特征值用這個(gè)最大值替代,類似于找到Figure2中第一張圖的左側(cè)手信息;然后找到(i,j)到(W,j)(左角點(diǎn)的最右端)的最大值,然后將這張?zhí)卣鲌D中(i,j)位置的特征值用這個(gè)最大值替代,類似于找到Figure2中第一張圖的頭頂信息,然后將這2個(gè)特征圖中的(i,j)位置的特征值相加,也就是將找到的這兩個(gè)最大值相加得到(i,j)點(diǎn)的值(對(duì)應(yīng)Figure3最后一個(gè)圖的藍(lán)色點(diǎn))。對(duì)于,右下角點(diǎn)的Corner pooling操作類似,只不過找最大值變成從(i,j)到(0,j)和從(i,j)到(i,0)中找。比如Figure6中,第一張?zhí)卣鲌D,比如第2行的第1個(gè)點(diǎn)(值為2),其右邊同一行的最大值是3,故經(jīng)過Corener Pooling后,其值變?yōu)?,其他同理;第2張?zhí)卣鲌D,第2列的第一個(gè)點(diǎn)為3,其下面所在列的最大值(包括本身)也是3,因此經(jīng)過Corener pooling之后,其中也變?yōu)?,最后將2張?zhí)卣鲌D對(duì)應(yīng)位置的點(diǎn)的特征值相加,得到一張?zhí)卣鲌D。
Heatmaps
CornerNet的第一個(gè)輸出是headmaps,網(wǎng)絡(luò)一共輸出2組Heatmap,一組預(yù)測(cè)左上角點(diǎn),一組預(yù)測(cè)右下角點(diǎn)。每組Heatmap有C個(gè)通道,代表C類。每個(gè)角點(diǎn),只要ground truth處的點(diǎn)為postive,其余位置為negative,因?yàn)樵趃round-truth附近的負(fù)樣本也可以得到overlap較大的box,滿足要求。因此,不同負(fù)樣本的點(diǎn)的損失函數(shù)權(quán)重不是相等的,而是在以ground-truth為中心圓內(nèi)呈非歸一化高斯分布,圓半徑以在圓內(nèi)的點(diǎn)形成的box與ground-truth的IoU不小于t(t=0.7)為標(biāo)準(zhǔn),如下圖所示: 上圖是針對(duì)角點(diǎn)預(yù)測(cè)(headmaps)的損失函數(shù),整體上是改良版的Focal loss。幾個(gè)參數(shù)的含義:N為整張圖片中目標(biāo)的數(shù)量,?為控制每個(gè)點(diǎn)的權(quán)重的超參數(shù),具體來說,參數(shù)用來控制難易分類樣本的損失權(quán)重(在文章中?為2,為4),pcij表示預(yù)測(cè)的heatmaps在第c個(gè)通道(類別c)的(i,j)位置的值,ycij表示對(duì)應(yīng)位置的ground truth,ycij=1時(shí)候的損失函數(shù)就是focal loss;ycij等于其他值時(shí)表示(i,j)點(diǎn)不是類別c的目標(biāo)角點(diǎn),照理說此時(shí)ycij應(yīng)該是0(大部分算法都是這樣處理的),但是這里ycij不是0,而是用基于ground truth角點(diǎn)的高斯分布計(jì)算得到,因此距離ground truth比較近的(i,j)點(diǎn)的ycij值接近1,這部分通過β參數(shù)控制權(quán)重,這是和Focal loss的差別。為什么對(duì)不同的負(fù)樣本點(diǎn)用不同權(quán)重的損失函數(shù)呢?這是因?yàn)榭拷黦round truth的誤檢角點(diǎn)組成的預(yù)測(cè)框仍會(huì)和ground truth有較大的重疊面積。
Offset
從heatmap層回到input image會(huì)有精度損失(不一定整除存在取整),對(duì)小目標(biāo)影響大,因此預(yù)測(cè)location offset,調(diào)整corner位置。損失函數(shù)如下: Xk,Yk是角點(diǎn)的坐標(biāo),n為下采樣的倍數(shù),公式中符合為向下取整。 O^k代表Offsets的predicted offset;Ok代表gt的offset。
Embeddings
負(fù)責(zé)檢測(cè)哪個(gè)top-left corner和哪個(gè)bottom-right corner是一對(duì),組成一個(gè)box,同一個(gè)box的corner距離短。top-left和bottom-right corner各預(yù)測(cè)一個(gè)embedding vector,距離小的corner構(gòu)成一個(gè)box(一個(gè)圖多個(gè)目標(biāo),多對(duì)點(diǎn),因此確定group是必要的)embedding這部分的訓(xùn)練是通過兩個(gè)損失函數(shù)實(shí)現(xiàn)的,如下圖: etk表示第k個(gè)目標(biāo)的左上角角點(diǎn)的embedding vector,ebk表示第k個(gè)目標(biāo)的右下角角點(diǎn)的embedding vector,ek表示etk和ebk的均值。公式4用來縮小屬于同一個(gè)目標(biāo)(第k個(gè)目標(biāo))的兩個(gè)角點(diǎn)的embedding vector(etk和ebk)距離。公式5用來擴(kuò)大不屬于同一個(gè)目標(biāo)的兩個(gè)角點(diǎn)的embedding vector距離。Pull loss越小,則同一object的左上角和右下角的embedding得分距離越??;Push loss越小,則不同object的左上角和右下角的embedding得分距離越大。
總損失函數(shù)
其中,α, β, γ是超參數(shù),分別取0.1, 0.1, 1。
回歸策略
說了那么多,CornerNet主要是通過預(yù)測(cè)目標(biāo)的左上角點(diǎn)和右下角點(diǎn),來完全目標(biāo)的邊界框預(yù)測(cè)。Corner pooling負(fù)責(zé)更好的找到角點(diǎn)位置,headmaps輸出角點(diǎn)位置信息,Embeddings負(fù)責(zé)找到同一個(gè)目標(biāo)的一組角點(diǎn),Offsets用于對(duì)角點(diǎn)微調(diào),使預(yù)測(cè)框更加精準(zhǔn)。
補(bǔ)充
CornerNet通過檢測(cè)物體的左上角點(diǎn)和右下角點(diǎn)來確定目標(biāo),但在確定目標(biāo)的過程中,無法有效利用物體的內(nèi)部的特征,即無法感知物體內(nèi)部的信息,因?yàn)樵谂袛鄡蓚€(gè)角點(diǎn)是否屬于同一物體時(shí),缺乏全局信息的輔助,因此很容易把原本不是同一物體的兩個(gè)角點(diǎn)看成是一對(duì)角點(diǎn),因此產(chǎn)生了很多錯(cuò)誤目標(biāo)框,另外,角點(diǎn)的特征對(duì)邊緣比較敏感,這導(dǎo)致很多角點(diǎn)同樣對(duì)背景的邊緣很敏感,因此在背景處也檢測(cè)到了錯(cuò)誤的角點(diǎn)從而導(dǎo)致該類方法產(chǎn)生了很多誤檢(錯(cuò)誤目標(biāo)框)。其實(shí)不光是基于關(guān)鍵點(diǎn)的 one-stage 方法無法感知物體內(nèi)部信息,幾乎所有的 one-stage 方法都存在這一問題。與下面介紹的CenterNet同名的還有一篇文章,文章主要基于CorenNet出現(xiàn)的誤檢問題,作了改進(jìn),文章除了預(yù)測(cè)左上角點(diǎn)和右下角點(diǎn)外,還額外預(yù)測(cè)了目標(biāo)的中心點(diǎn),用三個(gè)關(guān)鍵點(diǎn)而不是兩個(gè)點(diǎn)來確定一個(gè)目標(biāo),使網(wǎng)絡(luò)花費(fèi)了很小的代價(jià)便具備了感知物體內(nèi)部信息的能力,從而能有效抑制誤檢。大家可以參考以下資料: 論文:https://arxiv.org/pdf/1904.08189.pdf 解讀:中科院牛津華為諾亞提出:CenterNet,One-stage目標(biāo)檢測(cè)最強(qiáng)算法!可達(dá)47mAP,已開源! 代碼:https://github.com/Duankaiwen/CenterNet
3. CenterNet
這里區(qū)別一下呀,今年好像有2篇稱CenterNet的論文,我要介紹的這篇名為“Objects as Points”,另外一篇就是上面提到的中科院牛津華為諾亞提出的,名為“CenterNet: Keypoint Triplets for Object Detection”是基于CornerNet作的改進(jìn)。這篇CenterNet算法也是anchor-free類型的目標(biāo)檢測(cè)算法,基于點(diǎn)的思想和CornerNet是相似的,方法上做了較大的調(diào)整,與Corenet不同的是,CenterNet預(yù)測(cè)的是目標(biāo)的中心點(diǎn),然后再預(yù)測(cè)目標(biāo)框的寬和高,來生成預(yù)測(cè)框。此外此網(wǎng)絡(luò)還能作3D目標(biāo)檢測(cè)和人體姿態(tài)估計(jì)。
與CornerNet對(duì)比
1、CenterNet,從算法名也可以看出這個(gè)算法要預(yù)測(cè)的是目標(biāo)的中心點(diǎn),而不再是CornerNet中的2個(gè)角點(diǎn);相同點(diǎn)是都采用熱力圖(heatmap)來實(shí)現(xiàn),都引入了預(yù)測(cè)點(diǎn)的高斯分布區(qū)域計(jì)算真實(shí)預(yù)測(cè)值,同時(shí)損失函數(shù)一樣(修改版Focal loss,網(wǎng)絡(luò)輸出的熱力圖也將先經(jīng)過sigmod函數(shù)歸一化成0到1后再傳給損失函數(shù))。另外CenterNet也不包含corner pooling等操作,因?yàn)橐话隳繕?biāo)框的中心點(diǎn)落在目標(biāo)上的概率還是比較大的,因此常規(guī)的池化操作能夠提取到有效的特征,這是其一。2、CerterNet中也采用了和CornerNet一樣的偏置(offset)預(yù)測(cè),這個(gè)偏置表示的是標(biāo)注信息從輸入圖像映射到輸出特征圖時(shí)由于取整操作帶來的坐標(biāo)誤差,只不過CornerNet中計(jì)算的是2個(gè)角點(diǎn)的offset,而CenterNet計(jì)算的是中心點(diǎn)的offset。這部分還有一個(gè)不同點(diǎn):損失函數(shù),在CornerNet中采用SmoothL1損失函數(shù)來監(jiān)督回歸值的計(jì)算,但是在CenterNet中發(fā)現(xiàn)用L1損失函數(shù)的效果要更好,差異這么大是有點(diǎn)意外的,這是其二。 3、CenterNet直接回歸目標(biāo)框尺寸,最后基于目標(biāo)框尺寸和目標(biāo)框的中心點(diǎn)位置就能得到預(yù)測(cè)框,這部分和CornerNet是不一樣的,因?yàn)镃ornerNet是預(yù)測(cè)2個(gè)角點(diǎn),所以需要判斷哪些角點(diǎn)是屬于同一個(gè)目標(biāo)的過程,在CornerNet中通過增加一個(gè)corner group任務(wù)預(yù)測(cè)embedding vector,最后基于embedding vector判斷哪些角點(diǎn)是屬于同一個(gè)框。而CenterNet是預(yù)測(cè)目標(biāo)的中心點(diǎn),所以將CornerNet中的corner group操作替換成預(yù)測(cè)目標(biāo)框的size(寬和高),這樣一來結(jié)合中心點(diǎn)位置就能確定目標(biāo)框的位置和大小了,這部分的損失函數(shù)依然采用L1損失,這是其三。
回歸策略
CenterNet對(duì)目標(biāo)框的回歸策略,采用先預(yù)測(cè)目標(biāo)的中心點(diǎn)位置,然后再預(yù)測(cè)目標(biāo)框的寬和高來達(dá)到目標(biāo)檢測(cè)。預(yù)測(cè)中心點(diǎn)的偏移采用修改版的Focal loss,對(duì)于熱力圖中中心點(diǎn)到原圖映射的偏差,采樣L1損失函數(shù),對(duì)于目標(biāo)框?qū)捄透叩念A(yù)測(cè)也是采用L1損失函數(shù)。
有Anchor的目標(biāo)檢測(cè)算法邊框回歸策略
1. Faster R-CNN
關(guān)于論文和解讀,網(wǎng)上有很多大佬講的很好(https://zhuanlan.zhihu.com/p/31426458),這里其他方面我就不說了,主要談一下,F(xiàn)aster R-CNN的回歸策略。 X為預(yù)測(cè)框的中心點(diǎn)坐標(biāo),Xa為Anchor的中心點(diǎn)坐標(biāo),X為gt_bbox的中心點(diǎn)坐標(biāo)(y,w,h同理),目標(biāo)是使變換因子tx跟tx*差距最小,損失函數(shù)為Smooth L1損失函數(shù)。
2. YOLOv2
YOLOv2中作者引入了Faster R-CNN中類似的anchor,但是回歸策略不同,對(duì)bbox中心坐標(biāo)的預(yù)測(cè)不是基于anchor坐標(biāo)的偏移量得到的,而是采用了v1中預(yù)測(cè)anchor中心點(diǎn)相對(duì)于對(duì)于單元格左上角位置的偏移,如下圖 上圖中tx,ty,tw,th為坐標(biāo)變換系數(shù),Cx,Cy為Anchor中心的坐標(biāo),Pw,Ph為Anchor的寬和高,tx和tw是Anchor中心點(diǎn)相對(duì)于其所在單元格左上角點(diǎn)坐標(biāo)的偏移,在這里作者說之所以沒有采樣Faster R-CNN中的回歸策略是因?yàn)镕aster R-CNN對(duì)于預(yù)測(cè)框中心點(diǎn)的回歸太不穩(wěn)定了,而YOLOv2將中心點(diǎn)能夠固定在單元格范圍之內(nèi)。損失函數(shù)采樣的是MSE均方差損失函數(shù),回歸損失函數(shù)輸入的參數(shù)分別是Anchor到預(yù)測(cè)框的坐標(biāo)變換系數(shù)和Anchor到gt_bbox的坐標(biāo)變換系數(shù)。 ?
3. SSD
論文:https://arxiv.org/pdf/1512.02325.pdf
? 回歸策略基本和Faster R-CNN中一致,對(duì)邊界框的回歸的損失函數(shù)也是采樣的Smooth L1損失函數(shù),不過這里的先驗(yàn)框名字叫 Default Box和Faster R-CNN中的Anchor叫法不一樣。
責(zé)任編輯:彭菁
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7600瀏覽量
89280 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62989 -
目標(biāo)檢測(cè)
+關(guān)注
關(guān)注
0文章
211瀏覽量
15667
原文標(biāo)題:目標(biāo)檢測(cè)中邊界框的回歸策略
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論