Offsets用于对预测角点位置进行精修。输出的是Channel数为2的Feature,如下公式所示:
o
k
=
(
x
k
n
−
⌊
x
k
n
⌋
,
y
k
n
−
⌊
y
k
n
⌋
)
\boldsymbol{o}_k=\left(\frac{x_k}{n}-\left\lfloor\frac{x_k}{n}\right\rfloor, \frac{y_k}{n}-\left\lfloor\frac{y_k}{n}\right\rfloor\right)
ok=(nxk−⌊nxk⌋,nyk−⌊nyk⌋)我们通过Heatmaps输出的位置还原到原始分辨率后肯定是一个取整后的位置
(
⌊
x
n
⌋
,
⌊
y
n
⌋
)
\left(\left\lfloor\frac{x}{n}\right\rfloor,\left\lfloor\frac{y}{n}\right\rfloor\right)
(⌊nx⌋,⌊ny⌋),为了恢复原始分辨率的精度,网络就会输出这样一个修正量
o
k
\boldsymbol{o}_k
ok
此外,在上图中还有一个Top-left Corner Pooling Module操作,该操作公式如下:
t
i
j
=
{
max
(
f
t
i
j
,
t
(
i
+
1
)
j
)
if
i
<
H
f
t
H
j
otherwise
t_{i j}=\left\{\begin{array}{cc} \max \left(f_{t_{i j}}, t_{(i+1) j}\right) & \text { if } i<H \\ f_{t_{H j}} & \text { otherwise } \end{array}\right.
tij={max(ftij,t(i+1)j)ftHj if i<H otherwise
l
i
j
=
{
max
(
f
l
i
j
,
l
i
(
j
+
1
)
)
if
j
<
W
f
l
i
W
otherwise
l_{i j}=\left\{\begin{array}{cc} \max \left(f_{l_{i j}}, l_{i(j+1)}\right) & \text { if } j<W \\ f_{l_{i W}} & \text { otherwise } \end{array}\right.
lij={max(flij,li(j+1))fliW if j<W otherwise 其实就是取水平和竖直最大值,最后求和,具体的案例下图所示:
在构建Heatmaps Groundtruth时,如果不加任何惩罚,那么正样本处应该就为1,而负样本处为0;而加上惩罚后就是在角点半径范围内构建一个
e
−
x
2
+
y
2
2
σ
2
e^{-\frac{x^2+y^2}{2 \sigma^2}}
e−2σ2x2+y2的高斯分布,该
σ
\sigma
σ可以是个固定值,可以与物体大小相关,总而言之是越靠近角点的地方越接近于1,越远离角点的地方越接近于0。如下图所示:
作者做了负样本惩罚的消融实验如下: 注意,这里还是只有角点一个正样本,在计算
L
pull
L_{\text {pull }}
Lpull 、
L
push
L_{\text {push }}
Lpush 和
L
o
f
f
L_{o f f}
Loff时还是只在角点处计算。
1.3 关键知识点——损失计算
Corner损失函数定义如下:
L
=
L
det
+
α
L
pull
+
β
L
push
+
γ
L
o
f
f
L=L_{\text {det }}+\alpha L_{\text {pull }}+\beta L_{\text {push }}+\gamma L_{o f f}
L=Ldet +αLpull +βLpush +γLoff其中
L
det
L_{\text {det }}
Ldet 是Heatmaps的Loss,采用的是Focal Loss,准确地说,是针对Heatmaps改进的Focal Loss,公式如下所示:
L
det
=
−
1
N
∑
c
=
1
C
∑
i
=
1
H
∑
j
=
1
W
{
(
1
−
p
c
i
j
)
α
log
(
p
c
i
j
)
if
y
c
i
j
=
1
(
1
−
y
c
i
j
)
β
(
p
c
i
j
)
α
log
(
1
−
p
c
i
j
)
otherwise
L_{\text {det }}=\frac{-1}{N} \sum_{c=1}^C \sum_{i=1}^H \sum_{j=1}^W\left\{\begin{array}{cc} \left(1-p_{c i j}\right)^\alpha \log \left(p_{c i j}\right) & \text { if } y_{c i j}=1 \\ \left(1-y_{c i j}\right)^\beta\left(p_{c i j}\right)^\alpha \log \left(1-p_{c i j}\right) & \text { otherwise } \end{array}\right.
Ldet =N−1c=1∑Ci=1∑Hj=1∑W{(1−pcij)αlog(pcij)(1−ycij)β(pcij)αlog(1−pcij) if ycij=1 otherwise 其中
y
c
i
j
y_{c i j}
ycij为真值,
p
c
i
j
p_{c i j}
pcij是预测值,我们分两部分来解释该公式:
当
y
c
i
j
=
1
y_{c i j}=1
ycij=1时,此时如果
p
c
i
j
p_{c i j}
pcij接近于1时,说明该真值是容易预测的,那么我们减少其在样本中的权重,所以在log损失的基础上乘以
(
1
−
p
c
i
j
)
α
\left(1-p_{c i j}\right)^\alpha
(1−pcij)α;反之,如果
p
c
i
j
p_{c i j}
pcij接近于0,说明该角点还没有学习到,所以会加大其权重。
而
y
c
i
j
y_{c i j}
ycij不为
1
1
1时,
p
c
i
j
p_{c i j}
pcij应该输出
0
0
0。在角点附近
p
c
i
j
p_{c i j}
pcij输出接近于1的概率时容易造成误检,为了对角点附接近于1的
(
p
c
i
j
)
α
\left(p_{c i j}\right)^\alpha
(pcij)α进行抑制,因此在log损失上乘以
(
p
c
i
j
)
α
\left(p_{c i j}\right)^\alpha
(pcij)α,这样网络就会更加关注这些误检的点,但是又正由于这个已经接近于角点了,因此输出稍微大一些也是情有可原的,因此用
(
1
−
y
c
i
j
)
β
\left(1-y_{c i j}\right)^\beta
(1−ycij)β来抑制一下惩罚。当然,如果在距离角点较远的地方输出接近于
1
1
1肯定也是不对的,那么此时
(
1
−
y
c
i
j
)
β
\left(1-y_{c i j}\right)^\beta
(1−ycij)β和
(
p
c
i
j
)
α
\left(p_{c i j}\right)^\alpha
(pcij)α都会用来加强惩罚。反之,如果
p
c
i
j
p_{c i j}
pcij接近于0,那么
(
p
c
i
j
)
α
\left(p_{c i j}\right)^\alpha
(pcij)α就会告诉网络,这个负样本已经学好了,不需要太多关注。
L
pull
L_{\text {pull }}
Lpull 和
L
push
L_{\text {push }}
Lpush 是Embeddings的Loss,
L
pull
L_{\text {pull }}
Lpull 使同一函目标的顶点进行分组,
L
push
L_{\text {push }}
Lpush 用与分离不同目标的顶点:
L
pull
=
1
N
∑
k
=
1
N
[
(
e
t
k
−
e
k
)
2
+
(
e
b
k
−
e
k
)
2
]
L_{\text {pull }}=\frac{1}{N} \sum_{k=1}^N\left[\left(e_{t_k}-e_k\right)^2+\left(e_{b_k}-e_k\right)^2\right]
Lpull =N1k=1∑N[(etk−ek)2+(ebk−ek)2]
L
p
u
s
h
=
1
N
(
N
−
1
)
∑
k
=
1
N
∑
j
=
1
j
≠
k
N
max
(
0
,
Δ
−
∣
e
k
−
e
j
∣
)
L_{p u s h}=\frac{1}{N(N-1)} \sum_{k=1}^N \sum_{\substack{j=1 \\ j \neq k}}^N \max \left(0, \Delta-\left|e_k-e_j\right|\right)
Lpush=N(N−1)1k=1∑Nj=1j=k∑Nmax(0,Δ−∣ek−ej∣)其中
e
k
e_k
ek为真值,其他为网络输出结果,
Δ
\Delta
Δ为在作者实验中设置为1,我们简单分析下就可以看出,同一物体的
L
pull
L_{\text {pull }}
Lpull 应该为
0
0
0,而不同物体的Embeddings结果如果比较越接近
L
p
u
s
h
L_{p u s h}
Lpush就会越大。
L
o
f
f
L_{o f f}
Loff是Offsets的Loss,采用的是Smooth L1 Loss,公式如下:
L
o
f
f
=
1
N
∑
k
=
1
N
SmoothL1Loss
(
o
k
,
o
^
k
)
L_{o f f}=\frac{1}{N} \sum_{k=1}^N \operatorname{SmoothL1Loss}\left(\boldsymbol{o}_k, \hat{\boldsymbol{o}}_k\right)
Loff=N1k=1∑NSmoothL1Loss(ok,o^k)
L
det
L_{\text {det }}
Ldet 在正负样本处都会计算,而
L
pull
L_{\text {pull }}
Lpull 、
L
push
L_{\text {push }}
Lpush 和
L
o
f
f
L_{o f f}
Loff只在正样本处计算
2. CenterNet
CenterNet发表于2019年,原论文名为《Objects as Points》,CenterNet感觉是基于CornerNet进行的该井,使得检测速度和精度相比于One-Stage和Two-Stage的方法都了不小的提高,在和YOLO v3的比较中,相同速度下,CenterNet提高了4个左右的点。同时网络经过少量的扩展,就可以迁移到3D目标检测和人体关键点检测上。
CornreNet的损失由三部分构成,分别是类别损失、目标中心偏置损失和目标大小损失:
L
det
=
L
k
+
λ
size
L
size
+
λ
off
L
o
f
f
L_{\text {det }}=L_k+\lambda_{\text {size }} L_{\text {size }}+\lambda_{\text {off }} L_{o f f}
Ldet =Lk+λsize Lsize +λoff Loff首先,类被采用的是类别损失采用的Focal Loss:
L
k
=
−
1
N
∑
x
y
c
{
(
1
−
Y
^
x
y
c
)
α
log
(
Y
^
x
y
c
)
if
Y
x
y
c
=
1
(
1
−
Y
x
y
c
)
β
(
Y
^
x
y
c
)
α
log
(
1
−
Y
^
x
y
c
)
otherwise
L_k=\frac{-1}{N} \sum_{x y c}\left\{\begin{array}{cc} \left(1-\hat{Y}_{x y c}\right)^\alpha \log \left(\hat{Y}_{x y c}\right) & \text { if } Y_{x y c}=1 \\ \left(1-Y_{x y c}\right)^\beta\left(\hat{Y}_{x y c}\right)^\alpha \log \left(1-\hat{Y}_{x y c}\right) & \text { otherwise } \end{array}\right.
Lk=N−1xyc∑⎩⎨⎧(1−Y^xyc)αlog(Y^xyc)(1−Yxyc)β(Y^xyc)αlog(1−Y^xyc) if Yxyc=1 otherwise 该公式的和CornerNet中的公式没有区别,在此就不再赘述。 目标中心偏置损失采用的是L1 Loss,如下所示:
L
o
f
f
=
1
N
∑
p
∣
O
^
p
~
−
(
p
R
−
p
~
)
∣
L_{o f f}=\frac{1}{N} \sum_p\left|\hat{O}_{\tilde{p}}-\left(\frac{p}{R}-\tilde{p}\right)\right|
Loff=N1p∑∣∣O^p~−(Rp−p~)∣∣其中,
O
^
∈
R
W
R
×
H
R
×
2
\hat{O} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2}
O^∈RRW×RH×2为网络输出,
R
R
R是特征图下采样倍率,
p
p
p为原始图像中心点坐标,
p
~
\tilde{p}
p~为特征图上中心点坐标。 目标大小损失使用的同样是L1损失:
L
s
i
z
e
=
1
N
∑
k
=
1
N
∣
S
^
p
k
−
s
k
∣
L_{s i z e}=\frac{1}{N} \sum_{k=1}^N\left|\hat{S} p_k-s_k\right|
Lsize=N1k=1∑N∣∣S^pk−sk∣∣其中
S
^
∈
R
W
′
R
×
H
R
×
2
\hat{S} \in \mathcal{R}^{\frac{W^{\prime}}{R} \times \frac{H}{R} \times 2}
S^∈RRW′×RH×2为预测值,
s
k
=
(
x
2
(
k
)
−
x
1
(
k
)
,
y
2
(
k
)
−
y
1
(
k
)
)
s_k=\left(x_2^{(k)}-x_1^{(k)}, y_2^{(k)}-y_1^{(k)}\right)
sk=(x2(k)−x1(k),y2(k)−y1(k))为真值,
(
x
1
(
k
)
,
y
1
(
k
)
,
x
2
(
k
)
,
y
2
(
k
)
)
\left(x_1^{(k)}, y_1^{(k)}, x_2^{(k)}, y_2^{(k)}\right)
(x1(k),y1(k),x2(k),y2(k))分别为左上角和右下角坐标。
Regression头输出的是四个值,分别是距离边框左侧、上侧、右侧、底侧的距离:
x
min
=
c
x
−
l
⋅
s
x_{\min }=c_x-l \cdot s
xmin=cx−l⋅s
x
min
=
c
x
−
t
⋅
s
x_{\min }=c_x-t \cdot s
xmin=cx−t⋅s
x
min
=
c
x
−
r
⋅
s
x_{\min }=c_x-r \cdot s
xmin=cx−r⋅s
x
min
=
c
x
−
b
⋅
s
x_{\min }=c_x-b \cdot s
xmin=cx−b⋅s其中
l
,
t
,
r
,
b
l, t, r, b
l,t,r,b为网络的输出值,由于输出值是在特征图的尺度上,因此需要乘以一个尺度参数
s
s
s。
c
x
,
c
y
c_x, c_y
cx,cy是参考点映射到原图的坐标。
Centerness头输出的是一个值,反应的是预测点相对与目标中心点的远近程度:
centerness
=
min
(
l
∗
,
r
∗
)
max
(
l
∗
,
r
∗
)
×
min
(
t
∗
,
b
∗
)
max
(
t
∗
,
b
∗
)
\text { centerness }=\sqrt{\frac{\min \left(l^*, r^*\right)}{\max \left(l^*, r^*\right)} \times \frac{\min \left(t^*, b^*\right)}{\max \left(t^*, b^*\right)}}
centerness =max(l∗,r∗)min(l∗,r∗)×max(t∗,b∗)min(t∗,b∗)其中
l
∗
,
t
∗
,
r
∗
,
b
∗
l^*, t^*, r^*, b^*
l∗,t∗,r∗,b∗是当前预测点相对于Ground Truth各个方向边界的距离,该值输出的范围是0-1,当预测点位于Ground Truth的Bounding Box的中心点时,该值为1,当位于Bounding Box的边界时,该值为0。在论文中,作者有做关于Centerness头的消融实验
FCOS的损失计算函数如下:
L
(
{
p
x
,
y
}
,
{
t
x
,
y
}
)
=
1
N
pos
∑
x
,
y
L
c
l
s
(
p
x
,
y
,
c
x
,
y
∗
)
+
λ
N
p
o
s
∑
x
,
y
1
{
c
x
,
y
∗
>
0
}
L
r
e
g
(
t
x
,
y
,
t
x
,
y
∗
)
+
λ
N
p
o
s
∑
x
,
y
1
{
c
x
,
y
∗
>
0
}
L
c
e
n
t
e
r
n
e
s
s
(
s
x
,
y
,
s
x
,
y
∗
)
\begin{aligned} L\left(\left\{\boldsymbol{p}_{x, y}\right\},\left\{\boldsymbol{t}_{x, y}\right\}\right) &=\frac{1}{N_{\text {pos }}} \sum_{x, y} L_{\mathrm{cls}}\left(\boldsymbol{p}_{x, y}, c_{x, y}^*\right) \\ &+\frac{\lambda}{N_{\mathrm{pos}}} \sum_{x, y} \mathbb{1}_{\left\{c_{x, y}^*>0\right\}} L_{\mathrm{reg}}\left(\boldsymbol{t}_{x, y}, \boldsymbol{t}_{x, y}^*\right) \\ &+\frac{\lambda}{N_{\mathrm{pos}}} \sum_{x, y} \mathbb{1}_{\left\{c_{x, y}^*>0\right\}} L_{\mathrm{centerness}}\left(\boldsymbol{s}_{x, y}, \boldsymbol{s}_{x, y}^*\right) \end{aligned}
L({px,y},{tx,y})=Npos 1x,y∑Lcls(px,y,cx,y∗)+Nposλx,y∑1{cx,y∗>0}Lreg(tx,y,tx,y∗)+Nposλx,y∑1{cx,y∗>0}Lcenterness(sx,y,sx,y∗)其中分类损失
L
c
l
s
L_{\mathrm{cls}}
Lcls采用的BECLoss+FocalLoss,回归损失
L
r
e
g
L_{\mathrm{reg}}
Lreg和中心度损失
L
c
e
n
t
e
r
n
e
s
s
L_{\mathrm{centerness}}
Lcenterness损失只计算正样本下的损失。回归损失
L
r
e
g
L_{\mathrm{reg}}
Lreg为GIoULoss,而
L
c
e
n
t
e
r
n
e
s
s
L_{\mathrm{centerness}}
Lcenterness损失为BCELoss。
4. YOLOX
YOLOX发表于2021年,原论文名为《YOLOX: Exceeding YOLO Series in 2021》,YOLOX相对于之前的YOLO版本的一些的亮点在于:Anchor-Free,Decoupeld Detection Head和Advanced Label Assigning Strategy。与SOTA方法对比如下,相对于YOLO v5是有一定的提升:
Coupled Head中预测的四个位置信息是和对应的Anchor强相关的,而Decoupled Head中使用的Anchor Free的思想,其预测的位置信息计算公式如下所示:
x
center
=
c
x
+
t
x
x_{\text {center }}=c_x+t_x
xcenter =cx+tx
y
center
=
c
y
+
t
y
y_{\text {center }}=c_y+t_y
ycenter =cy+ty
w
=
e
t
w
w=e^{t_w}
w=etw
h
=
e
t
h
h=e^{t_h}
h=eth其中
t
x
,
t
y
,
t
w
,
t
h
t_x,t_y,t_w,t_h
tx,ty,tw,th为网络输出参数,
c
x
,
c
y
c_x,c_y
cx,cy对应栅格的左上角坐标
论文中指出使用Decoupled head不但使得收敛速度变快,同时使得AP也有所提升:
4.2 关键知识点——正负样本匹配
YOLOX中使用的正负样本匹配的是SimOTA,SimOTA是OTA(Optimal Transport Assignment)简化得到的,OTA对应的论文名为《Optimal transport assignment for object detection》,目的是将匹配正负样本的过程看成一个最优传输问题,和DETR中的匹配方法区别是,在DETR中预测结果和真值是一对一匹配,而在SimOTA中预测结果和真值是多对一匹配。下面我们来具体看下:
这里我们来理解下第3步中的Dynamic_K的原理,其实很好理解,还是以人和网球的例子为例,同样分辨率的特征图上,与人的Ground Truth IOU较大的预测值肯定较多,因此按照第3步计算出来的Dynamic_K肯定就大,人获得的正样本就多。
如下表所示,SimOTA给网络带来了2.3个点的AP提升:
4.3 关键知识点——损失计算
由于在网络检测头中有类别、位置参数和IoU三个分支,因此损失由
L
c
l
s
、
L
r
e
g
、
L
i
o
u
L_{cls}、L_{reg}、L_{iou}
Lcls、Lreg、Liou这三部分组成:
L
o
s
s
=
L
c
l
s
+
λ
L
r
e
g
+
L
i
o
u
N
p
o
s
L o s s=\frac{L_{c l s}+\lambda L_{r e g}+L_{iou}}{N_{p o s}}
Loss=NposLcls+λLreg+Liou其中
L
c
l
s
、
L
i
o
u
L_{cls}、L_{iou}
Lcls、Liou由BCELoss,而
L
r
e
g
L_{reg}
Lreg采用的是IoULoss,还需要注意的是,
L
c
l
s
、
L
r
e
g
L_{cls}、L_{reg}
Lcls、Lreg只计算正样本损失,而
L
i
o
u
L_{iou}
Liou既计算正样本损失有计算负样本损失,其实可以理解为我们先判断这里是否存在物体,然后再看物体的类别和位置。
N
p
o
s
N_{pos}
Npos指的是被划分为正样本的Anchor Point数。