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