论文地址:Generalized Focal Loss: Towards Efficient Representation Learning for Dense Object Detection
研究人员最近更加关注边界框的表示(representation)及其定位质量估计(LQE,本论文中指的是IoU score),导致该领域取得了令人鼓舞的进展。具体来说,边界框表示被建模为简单的狄拉克δ分布,该分布在过去几年中被广泛使用。在 FCOS 中,当 LQE 与分类置信度相结合(通常是相乘)作为Non_max_suppression中排序的最终分数时,预测额外的定位质量(例如IoU score或Centerness score)会带来检测精度的持续提高。尽管取得了巨大的成功,但我们在密集检测器的现有实践中观察到这些表示(分类、定位和 LQE)存在以下三个问题:
训练和推理之间 LQE 和分类分数的使用不一致
图
1
图1
图1论文中阐述,如图1a所示,在最近的密集检测器中,LQE和分类分数通常是独立训练的,但在推理过程中综合利用(例如乘法)。目前,LQE 的监督仅分配给正样本 [18]、[20]、[42],这是不可靠的(只有正样本计算box_loss),因为负样本可能有机会获得无法控制的更高质量的预测(图 2)。 这两个因素导致训练和测试之间存在差距,并可能降低检测性能,例如,在 NMS 期间,具有随机高质量分数的负实例可能排在具有较低质量预测的正实例之前。
图
2
图2
图2注意
yolov8中的是NMS排序分数是conf,conf是cls中最大的那个,并不是conf * iou。
conf, j = cls.max(1, keepdim=True)
x = torch.cat((box, conf, j.float(), mask), 1)[conf.view(-1) > conf_thres]
x = x[x[:, 4].argsort(descending=True)[:max_nms]] # sort by confidence and remove excess boxes
boxes, scores = x[:, :4] + c, x[:, 4] # boxes (offset by class), scores
i = torchvision.ops.nms(boxes, scores, iou_thres) # NMS
边界框的不灵活表示
广泛使用的边界框表示可以看作目标框坐标的狄拉克δ分布。 然而,它没有考虑数据集中的模糊性和不确定性(见图3中图形边界不清晰)。 尽管最近的一些工作]将框建模为高斯分布,但捕获边界框位置的真实分布过于简单。 事实上,真实分布可以更加任意和灵活,而不需要像高斯函数那样对称。
图
3
图3
图3
缺乏可靠 LQE 的明确指导
许多先前的作品探索了LQE。 例如,YOLO家族首先采用Objectness来描述定位质量,其定义为预测框和真实框之间的交并集(IoU)。 此后,IoU在IoU-Net、IoU-aware、PAA、GFL和VFNet中被进一步探索并证明是有效的。 最近,FCOS和ATSS引入了Centerness,即到物体中心的距离程度,以抑制低质量的检测结果。 一般来说,上述方法都有一个共同的特点,即它们都是基于普通的卷积特征,例如点、边界或区域的特征(见图4a、4b、4c、4d、4e、4f和4g)来估计定位质量。 不幸的是,这些抽象的卷积特征无法具有推断 LQE scores的明确含义,而只是由定位质量信号隐式监督,从而使其可靠 LQE 的效率较低。
图
4
图4
图4
For object classification representation,我们建议将其与 LQE 分数合并为单个统一的表示:
Classification -> Classification-IoU Joint Representation
下面的
J
\mathbf{J}
J就是预测框标签的分类分数,
y
\mathbf{y}
y就是真实框标签的分类分数
为了解决上述训练和测试阶段之间的不一致问题,我们提出了联合表示
J
=
[
J
1
,
J
2
,
…
,
J
m
]
\mathbf{J}=[J_1,J_2,\ldots,J_m]
J=[J1?,J2?,…,Jm?](m 表示类别总数)的定位质量(即 IoU 分数)和分类分数(称为“Classification-IoU Joint Representation”),其supervision软化了标准的one-hot类别标签,并且导致可能的浮点向量
y
=
[
y
1
,
y
2
,
…
,
y
m
]
\mathbf{y}=[y_1,y_2,\ldots,y_m]
y=[y1?,y2?,…,ym?]。 给定一个对象类别标签
c
∈
{
1
,
2
,
…
,
m
}
c\in\{1,2,\ldots,m\}
c∈{1,2,…,m}, y 满足
y
i
=
{
I
o
U
(
B
p
r
e
d
,
B
g
t
)
,
if?
i
=
c
;
0
,
otherwise
,
\left.y_i=\left\{\begin{array}{ll}\mathrm{IoU}(B_{pred},B_{gt}),&\text{if }i=c;\\0,&\text{otherwise},\end{array}\right.\right.
yi?={IoU(Bpred?,Bgt?),0,?if?i=c;otherwise,?其中
I
o
U
(
B
p
r
e
d
,
B
g
t
)
\mathrm{IoU}(B_{pred},B_{gt})
IoU(Bpred?,Bgt?)表示预测边界框
B
p
r
e
d
B_{pred}
Bpred?和真实框
B
g
t
B_{gt}
Bgt?之间的 IoU。 具体来说,
y
=
0
y=0
y=0表示负样本的质量分数为0,
0
<
y
≤
1
0<y\leq1
0<y≤1表示正样本的质量分数为IoU分数
y
y
y。(原先的真实标签的分类分数一般是{0, 1}, 现在将正样本的对应的真实标签的分类分数变为
I
o
U
(
B
p
r
e
d
,
B
g
t
)
\mathrm{IoU}(B_{pred},B_{gt})
IoU(Bpred?,Bgt?),负样本的对应的真实标签的分类分数变为0。这个yolov8介绍的跟这个差不多,yolov8中的在经过TAA正负样本标签分配后,原始的target_scores正样本的真实标签的分类分数乘以weights,负样本的真实标签的分类分数是0(可以见yolov8下面截取代码)
) 。对于多类别,作者采用带有 sigmoid 运算符
σ
(
?
)
\sigma(\cdot)
σ(?)的多重二元分类。 为了简单起见,将 sigmoid 的输出标记为
σ
\sigma
σ。 请注意,如图1b所示,训练时,J 受到质量焦点损失(QFL)的监督,推理时,直接作为NMS 分数,这大大减少了训练和推理之间的 LQE 和对象分类的不一致。
# Normalize
# 设定一个动态权重,更加关注那些与真实目标对齐良好且重叠程度较高的预测框
# 这个动态权重由overlaps和align_metric决定,那些align_metric和overlaps小的预测框,它们对应的target_scores也小
# 这样求解bce_loss(分类损失)的时候相对来说会变小,这样模型在训练过程中就不会过多关注那些align_metric和overlaps小的预测框了
# 注意align_metric是跟预测分类分数和ciou都有关,这样模型在预测的时候,分类分数和iou会保持一致性,尽可能的不会存在分类分数低,而iou高的情况。
align_metric *= mask_pos
pos_align_metrics = align_metric.amax(axis=-1, keepdim=True) # b, max_num_obj
pos_overlaps = (overlaps * mask_pos).amax(axis=-1, keepdim=True) # b, max_num_obj
norm_align_metric = (align_metric * pos_overlaps / (pos_align_metrics + self.eps)).amax(-2).unsqueeze(-1)
target_scores = target_scores * norm_align_metric
For bounding box representation,我们建议通过直接学习连续空间上的离散概率分布来表示框位置的任意分布(在本文中表示为“一般分布”),而不引入任何其他更强的先验(例如,高斯):
学习到的任意分布提供了对真实数据本质的复杂性进行建模的灵活性,不仅可以预测精确的边界框回归,还可以反映信息丰富的潜在不确定性估计
Dirac delta ! General Distribution Representation
作者采用该位置(在yolov8中是anchor center)到边界框四个边的相对偏移量(anchor center到bbox的距离)作为回归目标。 边界框回归的传统操作将回归标签
y
y
y建模为
δ
(
x
?
y
)
\delta(x-y)
δ(x?y)狄拉克分布,其中满足
∫
?
∞
+
∞
δ
(
x
?
y
)
d
x
=
1
\int_{-\infty}^{+\infty}\delta(x-y)\mathrm{d}x=1
∫?∞+∞?δ(x?y)dx=1,并且通常通过全连接层实现。更正式地说,恢复
y
y
y 的积分形式如下(不好意思,高数还给老师了,忘记怎么推的):
y
=
∫
?
∞
+
∞
δ
(
x
?
y
)
x
d
x
y=\int_{-\infty}^{+\infty}\delta(x-y)x\mathrm{d}x
y=∫?∞+∞?δ(x?y)xdx作者提出直接学习没有先验知识的基础一般分布
P
(
x
)
P(x)
P(x)。给定标签
y
y
y 的范围,其中最小
y
0
y_0
y0? 和最大
y
n
y_n
yn?
(
y
0
≤
y
≤
y
n
,
n
∈
N
+
)
(y_0\leq y\leq y_n,n\in\mathbb{N}^+)
(y0?≤y≤yn?,n∈N+),我们可以通过下面的计算公式从模型(
y
^
\hat{y}
y^?也满足
y
0
≤
y
^
≤
y
n
y_0\leq \hat{y}\leq y_n
y0?≤y^?≤yn?)中获得估计值
y
^
\hat{y}
y^?。(这个
P
(
x
)
P(x)
P(x)就是
y
0
y_0
y0?~
y
n
y_n
yn?之间的概率分布)。
y
^
=
∫
?
∞
+
∞
P
(
x
)
x
d
x
=
∫
y
0
y
n
P
(
x
)
x
d
x
.
\hat{y}=\int_{-\infty}^{+\infty}P(x)x\mathrm{d}x=\int_{y_0}^{y_n}P(x)x\mathrm{d}x.
y^?=∫?∞+∞?P(x)xdx=∫y0?yn??P(x)xdx.为了与卷积神经网络保持一致,作者将连续域上的积分转换为离散表示,通过将范围
[
y
0
,
y
n
]
[y_0,y_n]
[y0?,yn?]离散化为间隔
Δ
\Delta
Δ的集合
{
y
0
,
y
1
,
…
,
y
i
,
y
i
+
1
,
…
,
y
n
?
1
,
y
n
}
\{y_0,y_1,\ldots,y_i,y_{i+1},\ldots,y_{n-1},y_n\}
{y0?,y1?,…,yi?,yi+1?,…,yn?1?,yn?},
Δ
=
y
i
+
1
?
y
i
,
?
i
∈
[
0
,
n
?
1
]
\Delta=y_{i+1}-y_i,\forall i\in[0,n-1]
Δ=yi+1??yi?,?i∈[0,n?1](为了简单,作者在后续的实验直接使用
Δ
=
1
\Delta=1
Δ=1)。因此,给定离散分布特性
∑
i
=
0
n
P
(
y
i
)
=
1
\sum_{i=0}^nP(y_i)=1
∑i=0n?P(yi?)=1,估计回归值
y
^
\hat{y}
y^?可以表示为
y
^
=
∑
i
=
0
n
P
(
y
i
)
y
i
\hat{y}=\sum_{i=0}^nP(y_i)y_i
y^?=i=0∑n?P(yi?)yi?
P
(
y
i
)
P(y_i)
P(yi?)可以通过由n + 1个单元组成的 softmax
S
(
?
)
\mathcal{S}(\cdot)
S(?)层轻松实现。 请注意,
y
^
\hat{y}
y^?可以使用任何传统损失目标(例如 SmoothL1、IoU Loss或 GIoU Loss)以端到端方式进行训练。 为了促进其有效优化,我们进一步引入分布焦点损失(DFL)。
为了方便理解,现举例yolov8使用的方法
yolov8中bbox分支回归的是
4
?
r
e
g
_
m
a
x
=
4
?
16
=
64
4 * reg\_{max} = 4 * 16=64
4?reg_max=4?16=64(bbox分支最终结果: [bs, num_anchor, 64]),也就是
{
y
0
,
y
1
,
…
,
y
i
,
y
i
+
1
,
…
,
y
n
?
1
,
y
n
}
=
{
0
,
1
,
.
.
.
,
7
,
8
,
.
.
.
,
14
,
15
}
\{y_0,y_1,\ldots,y_i,y_{i+1},\ldots,y_{n-1},y_n\}=\{0, 1, ...,7,8,...,14, 15\}
{y0?,y1?,…,yi?,yi+1?,…,yn?1?,yn?}={0,1,...,7,8,...,14,15},因为有上、下、左、右四条边,所以是
4
?
16
4 * 16
4?16。这个
{
0
,
1
,
.
.
.
,
7
,
8
,
.
.
.
,
14
,
15
}
\{0, 1, ...,7,8,...,14, 15\}
{0,1,...,7,8,...,14,15}的value是softmax输出,因此是一个概率分布,这个anchor center对于边界框四条边偏移量
y
^
\hat{y}
y^?由下面公式可得出:(
(
P
(
y
0
)
,
P
(
y
1
)
,
…
,
P
(
y
7
)
,
P
(
y
8
)
,
…
,
P
(
y
15
)
)
({P(y_0)}, {P(y_1)}, \dots, {P(y_7)}, {P(y_8)}, \dots,{P(y_{15})})
(P(y0?),P(y1?),…,P(y7?),P(y8?),…,P(y15?))分别是
(
0
,
1
,
…
,
7
,
8
,
…
,
15
)
一一对应处的概率
(0, 1, \dots, 7, 8, \dots,15)一一对应处的概率
(0,1,…,7,8,…,15)一一对应处的概率)
y
^
=
∑
i
=
0
n
P
(
y
i
)
y
i
=
∑
i
=
0
15
P
(
y
i
)
y
i
=
0
×
P
(
y
0
)
+
1
×
P
(
y
1
)
+
?
+
7
×
P
(
y
7
)
+
8
×
P
(
y
8
)
+
?
+
15
×
P
(
y
15
)
\hat{y}=\sum_{i=0}^nP(y_i)y_i=\sum_{i=0}^{15}P(y_i)y_i=0\times{P(y_0)}+1\times{P(y_1)+\dots +7\times{P(y_7)}+8\times{P(y_8)}+\dots+15\times{P(y_{15})}}
y^?=i=0∑n?P(yi?)yi?=i=0∑15?P(yi?)yi?=0×P(y0?)+1×P(y1?)+?+7×P(y7?)+8×P(y8?)+?+15×P(y15?)然后yolov8会使用dist2box函数将偏移量(anchor center 到bbox四条边的距离)转化为xywh
For localization quality representation
图
5
图5
图5
如图5b所示,一般分布的统计量往往与其真实的定位质量有很强的相关性。更具体地来说,图5c和5d所示,边界框分布的形状(平坦度)可以清晰地反映预测结果的定位质量:分布越尖锐,预测的边界框越准确,反之亦然。 最后,由于输入(边界框的分布统计)和输出(LQE 分数)潜在地高度相关,因此通过分布信息的指导可能会更容易且非常有效地进行更好的 LQE。
Convolution -> Distribution-Guided Quality Predictor.
受分布统计和 LQE 分数之间可能存在的强相关性的启发,作者提出了一个非常轻量级的子网络,它只有几十个(例如 64 个)隐藏单元,在这些分布统计的基础上产生可靠的 LQE 分数,而不是隐式卷积特征。作者将这种轻量级子网络称为分布引导质量预测器(DGQP)。它将学习到的一般分布 P 的统计数据传送到一个微小的子网络中(见图6中的红色虚线框),从而获得预测的 LQE 分数。
图
6
图6
图6
首先会从bbox分支中的分布中选择Top-k个values和它们的mean,图中的k=4,将Top-K和m进行concat,并且bbox有上、下、左、右四条边,这样就由
H
×
W
×
4
n
H\times W\times4n
H×W×4n变为
H
×
W
×
20
H\times W\times20
H×W×20(
20
=
4
×
5
20 = 4 \times 5
20=4×5)。
F
=
C
o
n
c
a
t
(
{
T
o
p
k
m
(
P
w
)
∣
w
∈
{
l
,
r
,
t
,
b
}
}
)
,
\mathbf{F}=\mathrm{Concat}(\{\mathrm{Topkm}(\mathbf{P}^w)\mid w\in\{l,r,t,b\}\}),
F=Concat({Topkm(Pw)∣w∈{l,r,t,b}}),选择Top-k个values和它们的mean有一下两个好处:
1、 因为
P
w
\mathbf{P}^{w}
Pw的和是固定值1(softmax的输出,概率和为1),Top-k个values和它们的mean可以基本的反映分布的平坦程度:值越大,分布越尖锐,IoU越大;值越小,分布越扁平,IoU越小。
2、 Top-k values和mean可以使统计特征对其在分布域中的相对偏移不敏感(见图7),从而产生不受对象尺度影响的稳健表示。(就是不管gt的尺度大小,Top-k values和mean的大小都反映的是1中的平坦程度)
图
7
图7
图7
然后就是下面的公式,因为全连接层就相当于乘上一个矩阵,
W
1
∈
R
d
×
4
(
k
+
1
)
\mathbf{W}_1\in\mathbb{R}^{d\times4(k+1)}
W1?∈Rd×4(k+1),
W
2
∈
R
1
×
d
\mathbf{W}_{2}\in\mathbb{R}^{1\times d}
W2?∈R1×d,
σ
\sigma
σ和
δ
\delta
δ分别是sigmoid和relu。
I
=
F
(
F
)
=
σ
(
W
2
δ
(
W
1
F
)
)
,
I=\mathcal{F}(\mathbf{F})=\sigma(\mathbf{W}_2\delta(\mathbf{W}_1\mathbf{F})),
I=F(F)=σ(W2?δ(W1?F)),最终的
J
\mathbf{J}
J通过下面的公式得出
J
=
C
×
I
\mathbf{J}=\mathbf{C}\times I
J=C×I其中的
C
=
[
C
1
,
C
2
,
…
,
C
m
]
,
C
i
∈
[
0
,
1
]
\mathbf{C}=[C_1,C_2,\ldots,C_m],C_i\in[0,1]
C=[C1?,C2?,…,Cm?],Ci?∈[0,1]就是分类分支的输出,m个类别的最初的分类表示。
原始的Focal Loss (FL)
Quality Focal Loss (QFL)
Distribution Focal Loss (DFL)
'''
target相当于y=1.2
tl = 1 = y(i)
tr = 2 = y(i+1)
wl = y(i+1) - y = 2 - 1.2 = 0.8
wr = y - y(i) =1.2 - 1 = 0.2 = 1 - wl = 1 - 0.8
# F.cross_entropy的详细介绍可参考https://blog.csdn.net/wuliBob/article/details/104119616
F.cross_entropy(pred_dist, tl.view(-1), reduction='none').view(tl.shape): log(P(i))
F.cross_entropy(pred_dist, tr.view(-1), reduction='none').view(tl.shape): log(P(i+1))
'''
tl = target.long() # target left
tr = tl + 1 # target right
wl = tr - target # weight left
wr = 1 - wl # weight right
return (F.cross_entropy(pred_dist, tl.view(-1), reduction='none').view(tl.shape) * wl +
F.cross_entropy(pred_dist, tr.view(-1), reduction='none').view(tl.shape) * wr).mean(-1, keepdim=True)
Generalized Focal Loss (GFocal)