原文链接:https://arxiv.org/abs/1909.02466
项目代码:https://github.com/zhangxiaosong18/FreeAnchor
问题
在基于anchor的目标检测算法中,训练时,通常通过anchor和真实object 框之间的IoU来决定该anchor是否用来预测object (包括类别和位置),通常IoU超过某一阈值则认为该anchor为正例(即作为预测object ),小于某一阈值则认为该anchor为背景。本文的思想就是通过修改loss函数去除人工参与指定anchor的过程,使网络能够自主学习选择哪个anchor和真实object 进行匹配。
通用loss函数
基于anchor算法常用的loss函数如下所示,A表示anchor集,每一个anchor a j ∈ A a_{j} \in A aj∈A包含了一个类别预测项 a j c l s ∈ R k a_{j}^{cls} \in R^{k} ajcls∈Rk和一个位置预测项 a j l o c ∈ R 4 a_{j}^{loc} \in R^{4} ajloc∈R4, k k k指的是object 类别的数目。B表示object 集, b i ∈ B b_{i} \in B bi∈B表示一个object。公式中的 C i j ∈ 0 , 1 C_{ij} \in {0,1} Cij∈0,1表示object b i b_{i} bi和anchor a j a_{j} aj是否匹配。
通常, b i b_{i} bi和 a j a_{j} aj的IoU大于某个阈值,则 C i j = 1 C_{ij}=1 Cij=1(当有多个 b i b_{i} bi满足条件时,取最大IoU最大的,这样就保证了一个anchor只能匹配一个object),否则 C i j = 0 C_{ij}=0 Cij=0。
从该loss函数可以看出,只优化了分类和位置回归,忽视了对object-anchor匹配的优化。
自定义检测似然函数
**目标 :**该似然函数能够与召回率、精度和NMS算法兼容。
为了理解,假设一张图像anchors数目为20000,object数目为2。
为了定义优化似然函数,对于每一个object b i b_{i} bi选择n(实验中取50最佳,后续为了便于理解,直接取50)个候选anchors,这些候选anchors是通过20000个anchors与 b i b_{i} bi计算iou,选取iou最大的前50个,所有候选anchor集记为 A i A_{i} Ai。
-
为了优化召回率(正确预测的object 数目/真实的object 数目),对于每一个object b i b_{i} bi我们需要保证至少存在一个anchor a j ∈ A i a_{j} \in A_{i} aj∈Ai使得预测的类别和位置与ground-truth相近,则定义召回似然函数如下:
P ( θ ) r e c a l l = ∏ i max a j ∈ A i ( P ( θ ) i j c l s P ( θ ) i j l o c ) ( 公 式 2 ) P(\theta)_{recall}=\prod_{i}\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc}) (公式2) P(θ)recall=i∏aj∈Aimax(P(θ)ijclsP(θ)ijloc)(公式2)
P ( θ ) i j c l s P(\theta)_{ij}^{cls} P(θ)ijcls: 表示分类置信度,取值范围为[0,1],size(2,50) ,网络类别估计层经过Sigmoid函数输出,第一行表示object b 1 b_{1} b1对应的50个候选anchors属于该object 类的概率。P ( θ ) i j l o c P(\theta)_{ij}^{loc} P(θ)ijloc: 表示定位置信度。取值范围为[0,1],size(2, 50), 第一行表示object b 1 b_{1} b1对应的50个候选anchors定位该object 的置信度。其计算是将公式1中的位置损失函数 L ( θ ) i j l o c L(\theta)_{ij}^{loc} L(θ)ijloc改写为似然概率的形式:
P ( θ ) i j l o c = e − β L ( θ ) i j l o c P(\theta)_{ij}^{loc}=e^{-\beta L(\theta)_{ij}^{loc}} P(θ)ijloc=e−βL(θ)ijlocL ( θ ) i j l o c = s m o o t h L 1 ( a j l o c , b i l o c ) L(\theta)_{ij}^{loc}=smoothL1(a_{j}^{loc},b_{i}^{loc}) L(θ)ijloc=smoothL1(ajloc,biloc)
smoothL1损失函数请参看:https://blog.csdn.net/weixin_41940752/article/details/93159710
定义上述似然函数后,再回头看看 P ( θ ) r e c a l l = ∏ i max a j ∈ A i ( P ( θ ) i j c l s P ( θ ) i j l o c ) P(\theta)_{recall}=\prod_{i}\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc}) P(θ)recall=∏iaj∈Aimax(P(θ)ijclsP(θ)ijloc)的含义:
-
max a j ∈ A i ( P ( θ ) i j c l s P ( θ ) i j l o c ) \max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc}) aj∈Aimax(P(θ)ijclsP(θ)ijloc): 对一个object b i b_{i} bi,其有50个候选anchors,将每个anchor的分类置信度和定位置信度相乘,作为该anchor的置信度,选取置信度最高的anchor。
-
∏ i max a j ∈ A i ( P ( θ ) i j c l s P ( θ ) i j l o c ) \prod_{i}\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc}) ∏iaj∈Aimax(P(θ)ijclsP(θ)ijloc):将每个object 对应的最高置信度相乘。此处优化的object 是希望 P ( θ ) r e c a l l P(\theta)_{recall} P(θ)recall越大越好。
2.为了提高检测精度(正确预测的object 数目/预测为object 的数目),检测器需要将定位较差的anchor分为背景类,精度似然概率函数定义如下:
P
(
θ
)
p
r
e
c
i
s
i
o
n
=
∏
j
(
1
−
P
{
a
j
∈
A
−
}
(
1
−
P
(
θ
)
j
b
g
)
)
(
公
式
3
)
P(\theta)_{precision}=\prod_{j}(1-P\{a_{j} \in A_{-}\}(1-P(\theta)_{j}^{bg})) (公式3)
P(θ)precision=j∏(1−P{aj∈A−}(1−P(θ)jbg))(公式3)
- ( 1 − P ( θ ) j b g ) (1-P(\theta)_{j}^{bg}) (1−P(θ)jbg):反应分类置信度,不属于背景类的置信度。size(20000)。
- P { a j ∈ A − } P\{a_{j} \in A_{-}\} P{aj∈A−}:反应定位置信度,属于背景类的置信度。
为了提高检测精度,我们需要当anchor属于背景类的定位置信度比较高时(及anchor定位较差),属于背景类的分类置信度比较高,即不属于背景类的置信度比较低。 P ( θ ) p r e c i s i o n P(\theta)_{precision} P(θ)precision的定义能满足该需要。
接下来就要定义anchor
a
j
a_{j}
aj属于背景类的定位置信度:
P
{
a
j
∈
A
−
}
=
1
−
max
i
P
{
a
j
−
>
b
i
}
P\{a_{j} \in A_{-}\}=1-\max \limits_{i}P\{a_{j} -> b_{i}\}
P{aj∈A−}=1−imaxP{aj−>bi}
其中
P
{
a
j
−
>
b
i
}
P\{a_{j} -> b_{i}\}
P{aj−>bi}表示anchor
a
j
a_{j}
aj能够正确匹配object
b
i
b_{i}
bi的概率(不要着急问为什么,目前只是理论定义,接下来会讲如何定义该函数才能表达此意义),那么
P
{
a
j
∈
A
−
}
P\{a_{j} \in A_{-}\}
P{aj∈A−}就反应了
a
j
a_{j}
aj与所有object 都不匹配的概率,即属于背景类的概率。
那么接下来就要开始研究如何定义 P { a j − > b i } P\{a_{j} -> b_{i}\} P{aj−>bi}才能表示anchor a j a_{j} aj能够正确匹配object b i b_{i} bi的概率,另外需要注意的一点是,该概率是从定位角度出发的。
P { a j − > b i } P\{a_{j} -> b_{i}\} P{aj−>bi}定义
为了能够与NMS兼容, P { a j − > b i } P\{a_{j} -> b_{i}\} P{aj−>bi}应该满足三个性质:
(1) P { a j − > b i } P\{a_{j} -> b_{i}\} P{aj−>bi}应是 a j l o c a_{j}^{loc} ajloc与 b i l o c b_{i}^{loc} biloc之间IOU(即 I o U i j l o c IoU_{ij}^{loc} IoUijloc)的单调递增函数,即两者之间IoU越大,概率应该越大,这与我们的直观认知是一样的;
(2)当 I o U i j l o c IoU_{ij}^{loc} IoUijloc小于某个阈值时,此概率应该接近于0;
(3)对于每个object b i b_{i} bi,应该有且只有一个anchor a j a_{j} aj满足 P { a j − > b i } = 1 P\{a_{j}->b_{i}\}=1 P{aj−>bi}=1。
则
P
{
a
j
−
>
b
i
}
=
S
a
t
u
r
a
t
e
d
l
i
n
e
a
r
(
I
o
U
i
j
l
o
c
,
t
,
m
a
x
j
(
I
o
U
i
j
l
o
c
)
)
P\{a_{j}->b_{i}\}=Saturated linear(IoU_{ij}^{loc},t,max_{j}(IoU_{ij}^{loc}))
P{aj−>bi}=Saturatedlinear(IoUijloc,t,maxj(IoUijloc))
S a t u r a t e d l i n e a r ( x , t 1 , t 2 ) = { 0 x ≤ t 1 x − t 1 t 2 − t 1 t 1 < x < t 2 1 x ≥ t 2 Saturated linear(x,t1,t2)=\begin{cases} 0 & x\leq t1 \\ \frac{x-t1}{t2-t1} & t1<x<t2 \\ 1 & x \geq t2 \end{cases} Saturatedlinear(x,t1,t2)=⎩⎪⎨⎪⎧0t2−t1x−t11x≤t1t1<x<t2x≥t2
损失函数
回忆开头讲的自定义检测似然函数的目标 是:该似然函数能够与召回率、精度和NMS算法兼容。
则检测似然函数为:
P
(
θ
)
=
P
(
θ
)
r
e
c
a
l
l
×
P
(
θ
)
p
r
e
c
i
s
i
o
n
=
∏
i
max
a
j
∈
A
i
(
P
(
θ
)
i
j
c
l
s
P
(
θ
)
i
j
l
o
c
)
×
∏
j
(
1
−
P
{
a
j
∈
A
−
}
(
1
−
P
(
θ
)
j
b
g
)
)
P(\theta)=P(\theta)_{recall}\times P(\theta)_{precision} =\prod_{i}\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc}) \times \prod_{j}(1-P\{a_{j} \in A_{-}\}(1-P(\theta)_{j}^{bg}))
P(θ)=P(θ)recall×P(θ)precision=i∏aj∈Aimax(P(θ)ijclsP(θ)ijloc)×j∏(1−P{aj∈A−}(1−P(θ)jbg))
转换为损失函数为:
L
(
θ
)
=
−
l
o
g
(
P
(
θ
)
)
=
−
∑
i
l
o
g
(
max
a
j
∈
A
i
(
P
(
θ
)
i
j
c
l
s
P
(
θ
)
i
j
l
o
c
)
)
−
∑
j
l
o
g
(
1
−
P
{
a
j
∈
A
−
}
(
1
−
P
(
θ
)
j
b
g
)
)
(
公
式
4
)
L(\theta)=-log(P(\theta))=-\sum_{i}log(\max \limits_{a_{j}\in A_{i}}(P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc}) )-\sum_{j}log(1-P\{a_{j} \in A_{-}\}(1-P(\theta)_{j}^{bg})) (公式4)
L(θ)=−log(P(θ))=−i∑log(aj∈Aimax(P(θ)ijclsP(θ)ijloc))−j∑log(1−P{aj∈A−}(1−P(θ)jbg))(公式4)
式中max函数是用来为每个object 选择最匹配的anchor,初始训练阶段,所有anchors的置信度都比较低,而且因为网络的参数是随机初始化的,具有最高置信度的anchor不一定是最匹配的anchor,为了解决这个问题,将max函数换为Mean-max函数:
M
e
a
n
−
m
a
x
(
X
)
=
∑
x
j
∈
X
x
j
1
−
x
j
∑
x
j
∈
X
1
1
−
x
j
Mean-max(X)=\frac{\sum_{x_j\in X}\frac{x_j}{1-x_j}}{\sum_{x_j\in X}\frac{1}{1-x_j}}
Mean−max(X)=∑xj∈X1−xj1∑xj∈X1−xjxj
其示意图如下:
可以看出,当初始anchors置信度比较低的时候, Mean-max函数接近取平均值,即所有候选anchor都参与训练;随着不断训练,一些候选anchors的置信度增加,Mean-max函数越接近max函数,训练充足时,就可以从候选anchors中选出一个最好的anchor来匹配object 。
除此之外,还做了两项修改:公式4的第二项采用focalloss,第一项和第二项分别乘以权重因子
w
1
,
w
2
w_1,w_2
w1,w2,最终的loss函数为:
L
(
θ
)
=
−
w
1
∑
i
l
o
g
(
M
e
a
n
_
m
a
x
(
X
i
)
)
+
w
2
∑
j
F
L
_
(
P
{
a
j
∈
A
−
}
(
1
−
P
(
θ
)
j
b
g
)
)
(
公
式
5
)
L(\theta)=-w_1\sum_{i}log(Mean\_max(X_i))+w_2 \sum_{j}FL\_(P\{a_{j} \in A_{-}\}(1-P(\theta)_{j}^{bg})) (公式5)
L(θ)=−w1i∑log(Mean_max(Xi))+w2j∑FL_(P{aj∈A−}(1−P(θ)jbg))(公式5)
其中
X
i
=
{
P
(
θ
)
i
j
c
l
s
P
(
θ
)
i
j
l
o
c
)
∣
a
j
∈
A
i
}
X_i=\{P(\theta)_{ij}^{cls}P(\theta)_{ij}^{loc})|a_j \in A_i\}
Xi={P(θ)ijclsP(θ)ijloc)∣aj∈Ai},
F
L
_
(
p
)
=
−
p
γ
l
o
g
(
1
−
p
)
FL\_(p)=-p^{\gamma}log(1-p)
FL_(p)=−pγlog(1−p),
w
1
=
α
∣
∣
B
∣
∣
w_1=\frac{\alpha}{||B||}
w1=∣∣B∣∣α,
w
2
=
1
−
α
n
∣
∣
B
∣
∣
w_2=\frac{1-\alpha}{n||B||}
w2=n∣∣B∣∣1−α,
∣
∣
B
∣
∣
||B||
∣∣B∣∣为object 数目,
n
n
n为候选anchor数目。
实验
-
数据:CoCo
-
网络:RetinaNet
-
效果:
细长object :FreeAnchor效果更好,这是因为FreeAnchor至少会从候选anchors中选出一个来正确的预测类别和位置,所选的anchor不一定是空间最匹配的,但是其特征肯定是最具有代表性的。
拥挤object :在一张中含有object 比较多时,本文算法效果明显好于手动筛选anchor的方法。
本文算法与NMS兼容性更好: N R = 采 用 N M S 后 的 召 回 率 未 用 N M S 的 召 回 率 NR=\frac{采用NMS后的召回率}{未用NMS的召回率} NR=未用NMS的召回率采用NMS后的召回率
本文learning-to-matching机制提高AP。
与其他算法对比。