YOLO (You Only Look Once) 系列模型追求实时目标检测,因此会在一定程度上牺牲精度,以实现更高的检测速度。
如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。
模型预测框的 IoU 值与 IoU 阈值进行比较,若大于阈值,即为正确的检测,否则为错误的检测。

目标检测中,每个预测框都对应一个置信度,不同的置信度阈值,意味着最终留下的预测框的不同。
AP 是针对目标检测中某个单独的类别的检测效果,即在同一 IoU 阈值下,通过调整置信度阈值,得到 P-R 曲线,其下方面积即为 AP 值。相应地,mAP 即是所有类别的 AP 值取平均后的结果。
mAP
=
1
C
∑
i
=
1
C
AP
i
\text{mAP}=\frac{1}{C}\sum_{i=1}^C \text{AP}_i
mAP=C1i=1∑CAPi

论文链接:[CVPR16 - Joseph Redmon] You Only Look Once: Unified, Real-Time Object Detection
整体网络架构如下:

可以看到开始的输入被固定为 448x448x3,输出被固定为 7x7x30,其中输出的含义为将原始输入图片划分为 7x7 的网格,其中每个网格包含 30 维信息(x, y, w, h 均为归一化后结果):

其中对 w、h 开根再求差,是为了放大小物体检测框的权重,因为
y
=
x
y=\sqrt{x}
y=x 在数值较小时变化更剧烈。
论文链接:[CVPR17 - Joseph Redmon] YOLO9000:Better, Faster, Stronger





论文链接:[arXiv18 - Joseph Redmon] YOLOv3: An Incremental Improvement



神图:效率与性能远程其它模型

论文链接:[CVPR20 - Alexey Bochkovskiy] YOLOv4: Optimal Speed and Accuracy of Object Detection

注意其中的 multi-scale 融合,从 YOLOv3 中只有第二部分(自下而上),增加了第三部分(自上而下),并且融合的方式从原先的直接相加,变为了深度拼接。

代码实现:YOLOv5 in PyTorch
图片来源:YOLOv5网络详解、YOLOv5 解读,训练,复现

其中骨干网络有如下多个选择:

另外,上述结构有下述几个特点:



数据增广:Augment HSV (Hue, Saturation, Value)

数据增广:Mix up(根据透明度融合)

数据增广:Copy paste

YOLOv5 默认开启 autoanchor,即根据训练数据的 label 重新确定 anchor 宽高,其开启与否受参数 --noautoanchor 控制。
在训练时,YOLOv5 会首先判断原始 anchor 框与训练数据的 label 框是否适配,其会计算一个叫 bpr 的指标,具体代码如下,其中 wh ([n, 2]) 表示训练数据中 n 个框的宽高,k ([9, 2]) 表示 9 个 anchor 的宽高。
代码具体步骤为:(1)将 wh 的宽高除以 anchor 的宽高,比例越接近 1 则越匹配(2)每一个 anchor 框留下离 1 最远的宽或高(3)每一个 gt(训练数据的真实框)在 9 个 anchor 中留下一个最接近的 anchor(4)bpr 即为每一个超过阈值的 anchor 的平均匹配值
def metric(k): # compute metric
r = wh[:, None] / k[None]
x = torch.min(r, 1 / r).min(2)[0] # ratio metric
best = x.max(1)[0] # best_x
aat = (x > 1 / thr).float().sum(1).mean() # anchors above threshold
bpr = (best > 1 / thr).float().mean() # best possible recall
return bpr, aat
如果 bpr 小于 0.98,则 YOLOv5 会对 gt 框直接进行 kmeans 聚类,且不同于 YOLOv2,YOLOv5 聚类时的距离依然是欧式距离。
在 YOLOv5 中,每一个 cell 内的对象,会同时考虑相邻两个格子的 anchor,即一共 3x3=9 个 anchor。如下图所示,当 gt 中心靠近右下角,则会将右边和下边两个 cell 的 anchor 也考虑进来。

随后,YOLOv5 会去计算 gt 和每个 anchor 的宽高比例,即:
r
w
=
w
g
w
a
,
r
h
=
h
g
h
a
r_w=\frac{w_{g}}{w_{a}},r_h=\frac{h_g}{h_a}
rw=wawg,rh=hahg
随后计算
r
w
r_w
rw 和其倒数的最大值,以及宽度和高度的最大差异
r
max
r^{\max}
rmax,即:
r
w
max
=
max
(
r
w
,
1
/
r
w
)
r
h
max
=
max
(
r
h
,
1
/
r
h
)
r
max
=
max
(
r
w
max
,
r
h
max
)
rmaxw=max(rw,1/rw)rmaxh=max(rh,1/rh)rmax=max(rmaxw,rmaxh)
若 r max r^{\max} rmax 小于阈值 anchor_t(通常为 4.0),则匹配成功,保留;否则丢弃。
每个 cell 的 anchor 框匹配后,再搭配上网络在该 cell 上输出的
t
x
,
t
y
,
t
w
,
t
h
t_x, t_y, t_w, t_h
tx,ty,tw,th,即可得到最终的预测边框:
b
x
=
2
σ
(
t
x
)
−
0.5
+
c
x
b
y
=
2
σ
(
t
y
)
−
0.5
+
c
y
b
w
=
(
2
σ
(
t
w
)
)
2
⋅
w
a
b
h
=
(
2
σ
(
t
h
)
)
2
⋅
h
a
bx=2σ(tx)−0.5+cxby=2σ(ty)−0.5+cybw=(2σ(tw))2⋅wabh=(2σ(th))2⋅ha
其中
c
x
,
c
y
,
w
a
,
h
a
c_x,c_y,w_a,h_a
cx,cy,wa,ha 分别为当前 cell 左上角坐标,以及 anchor 框的宽高。
Loss = λ b o x ⋅ L b o x + λ o b j ⋅ L o b j + λ c l s ⋅ L c l s \text{Loss}=\lambda_{box}\cdot L_{box}+\lambda_{obj}\cdot L_{obj}+\lambda_{cls}\cdot L_{cls} Loss=λbox⋅Lbox+λobj⋅Lobj+λcls⋅Lcls
L
b
o
x
L_{box}
Lbox 刻画了每一对匹配的 gt 和 anchor 的 CIoU 损失,即:
L
CIoU
=
1
−
IoU
+
ρ
2
c
2
+
α
⋅
v
v
=
4
π
2
(
arctan
w
g
h
g
−
arctan
w
a
h
a
)
2
α
=
v
1
−
IoU
+
v
LCIoU=1−IoU+ρ2c2+α⋅vv=4π2(arctanwghg−arctanwaha)2α=v1−IoU+v
其中
ρ
\rho
ρ 为两个框的中心点距离,
c
c
c 为两个框的最小外接矩形的对角线长度。
另外, L o b j L_{obj} Lobj 和 L c l s L_{cls} Lcls 均采用了 BCEWithLogitsLoss,其中正类权重分别由 obj_pw 与 cls_pw 两个超参控制,并且 L o b j L_{obj} Lobj 为 “每个 cell 的预测框的置信度” 与 “预测框与该 cell 上的 gt 的 IoU” 之间的损失。