FCOS: A Simple and Strong Anchor-free Object Detector
論文鏈接
一.背景
1.anchor-base缺點
(1).anchor的設置對結果影響很大,不同項目這些超參都需要根據經驗來確定,難度較大.
(2).anchor太過密集,其中很多是負樣本,引入了不平衡.
(3).anchor的計算涉及IOU增加計算復雜度.
2.anchor free檢測框
yolov1可看成是anchor free方式,通過劃分格子,target的中心點位于格子里的,才將相應的格子負責預測target.而yolov2采用了anchor的思想.anchor遍布圖片,自然召回率上升了.fcos取長補短,采取了gt框里的所有點進行回歸,同時采用center-ness分支優化框的質量.
二.網絡介紹
1.網絡結構
輸出分支主要由三部分組成
(1)classification,大小為(W,H,C),輸出不同類別
(2)Regression,大小為(W,H,4),輸出圖上每個點的上下左右偏差
(3)Center-ness大小為(W,H,1),預測檢測框中心點與gt檢測框的中心點的重合概率,用來提升檢測框精度,下面有具體分析.
2.中心采樣(center sampling)
對于任何一個gt bbox,首先映射到每一個輸出層,利用center_sample_radius×stride計算出該gt bbox在每一層的正樣本區域以及對應的left/top/right/bottom的target.
對于每個輸出層的正樣本區域,遍歷每個point位置,計算其max(left/top/right/bottom的target)值是否在指定范圍內,不再范圍內的認為是背景.
(1).減少歧義target數目,能很大解決overlap特征點不知道該回歸那個框的問題
(2).減少標注噪聲干擾
box標注通常會框住很多無關區域,如果無關區域的point也要回歸明顯不對,比如空中的飛機,飛機旁邊的天空就是無關區域.
3.FPN
通過FPN在每層feature map去預測不同尺度大小的物體,就解決了這種overlap的問題(overlap特征點不知道該回歸那個框).
如果FPN和中心采樣還沒解決的話,就按最小的框來.
同時FPN每一層回歸范圍進行約束.
P3:回歸范圍在[0,64],P4:回歸范圍在[64,128],P5:回歸范圍在[128,256]
P6:回歸范圍在[256,512],P7:回歸范圍在[612,inf],這樣就解決了不同層預測不同大小目標的問題.
但是比如還是存在多個head回歸一物體現象,比如在第二層回歸的最大范圍是80,在往上一層回歸的最大范圍就是40(因為第二層是第一層的1/2),所以導致同一個物體是有兩層進行回歸的。
4.分類
訓練C個二分類器,而不是訓練一個多分類器.
5.坐標回歸
anchor-based回歸方式在于回歸anchor與gt框之間的偏移量,而fcos在特征圖上面的每一個點回歸上下左右的距離(可認為是point-based).
公式:
(l ? , t ? , r ? , b ? ) :回歸的上下左右四個量;
(x0,y0),(x1,y1):gt在原圖上面的左上右下坐標;
(x,y):特征圖內的點的坐標;
s: 相應feature map的步長, 用于壓縮預測范圍,容易平衡分類和回歸Loss權重.
6. center-ness
作者發現引入了很多遠離taget中心點的低質量預測框,預測框的中心點與target框的中心點更接近的話,預測框更加可靠.所以在回歸的分支引入center-ness分支來回歸預測框中心與target中心,雖然是回歸問題,但采用的是celoss
可看出低IOU但score高的box得到了很大減少,IOU和score的一致性得到了改善.
7.loss函數
Lcls:?focal loss
Lreg:?GIoU loss
Npos:正樣本數據
λ:取1平衡回歸與分類loss
centerness loss用于約束預測框中心與gt中心點,限制邊界處的loss,直接與上面分類與回歸相加即可,在推理時,輸出的score為分類score乘以中心score.
import cv2 import numpy as np def draw_centerness(box):x1, y1, x2, y2 = boxw, h = x2 - x1, y2 - y1print(np.arange(w).repeat(h).reshape(h, w))print(np.arange(w).repeat(h).reshape(h, w).transpose(1, 0))xs = np.arange(w).repeat(h).reshape(h, w).transpose(1, 0).reshape(-1, 1)print('==xs:', xs)ys = np.arange(h).repeat(w).reshape(h, w).reshape(-1, 1)print('==ys:', ys)left = xs - x1print('==left:', left)right = x2 - xstop = ys - y1bottom = y2 -yshm = np.sqrt(np.minimum(left, right)/np.maximum(left, right) * np.minimum(top, bottom)/np.maximum(top, bottom))hm = hm.reshape(h, w)return hm hm =draw_centerness([0, 0, 100, 100]) max_num = np.max(hm) cv2.imwrite('./test.jpg', hm/max_num*255.)8.推理
獲取feature map上每個點的分類score在與回歸的四個邊界進行組合即可得出預測框.在進行閾值0.6的NMS.
三.實驗結果
參考:https://www.zybuluo.com/huanghaian/note/1747551
總結
以上是生活随笔為你收集整理的FCOS: A Simple and Strong Anchor-free Object Detector的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv简单的矩阵操作
- 下一篇: Shell—grep、sed、awk