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