目标检测 YOLO 系列模型

Posted by Lucius on September 3, 2022

YOLO (You Only Look Once) 系列模型追求实时目标检测,因此会在一定程度上牺牲精度,以实现更高的检测速度。

目标检测评价指标

IoU

模型预测框的 IoU 值与 IoU 阈值进行比较,若大于阈值,即为正确的检测,否则为错误的检测。

mAP

目标检测中,每个预测框都对应一个置信度,不同的置信度阈值,意味着最终留下的预测框的不同。

AP 是针对目标检测中某个单独的类别的检测效果,即在同一 IoU 阈值下,通过调整置信度阈值,得到 P-R 曲线,其下方面积即为 AP 值。相应地,mAP 即是所有类别的 AP 值取平均后的结果。

$$ \text{mAP}=\frac{1}{C}\sum_{i=1}^C \text{AP}_i $$

YOLOv1

论文链接:[CVPR16 - Joseph Redmon] You Only Look Once: Unified, Real-Time Object Detection

网络架构

整体网络架构如下:

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

  • 1~5:当前网格对应预测框 1 的信息,框中心 x、y 坐标,宽度 w,高度 h,置信度 c

  • 6~10:当前网格对应预测框 2 的信息,框中心 x、y 坐标,宽度 w,高度 h,置信度 c

  • 11~30:对 20 个类别的预测概率

损失函数

其中对 w、h 开根再求差,是为了放大小物体检测框的权重,因为 $y=\sqrt{x}$ 在数值较小时变化更剧烈。

模型特点

  • 优点:
    • 快速、简单
  • 不足:
    • 每个网格只预测一个类别,如果物体重叠,则难以识别
    • 只有两个预选框,小物体检测效果一般

YOLOv2

论文链接:[CVPR17 - Joseph Redmon] YOLO9000:Better, Faster, Stronger

改进方案

  • Batch Normalization

    • v2 舍弃 Dropout,卷积后全部加入 Batch Normalization,即网络的每一层的输入都做了归一化,使收敛更容易

    • 经过 BN 处理后的网络会提升 2% 的 mAP

  • 更大的分辨率

    • v1 训练时用 224x224,测试时使用 448x448;因此 v2 训练时再额外进行 10 次 448x448 的微调

    • 该项改进提升 4% 的 mAP

  • 网络结构改变

    • 采用 Darknet-19,去除所有全连接层,进行 19 次卷积,且再进行 5 次降采样,以及多次 1x1 卷积,节省大量参数

    • 每一层卷积核尺寸都较小,原因在于多个小卷积核比一个大卷积核更省参数,以及多个小卷积核,每次卷积后再进行 BN,网络输出更稳定

    • 最终输出从 7x7 提升至 13x13,预测的框更多了

  • 聚类提取先验框
    • faster-rcnn 中选取的先验框比例都是常规的,而 v2 中先验框大小通过对训练集中标注的边框进行 k-means 聚类,其中聚类采用的距离形式如下(欧式距离对大框和小框不公平):
    $$ d(\text { box, centroids })=1-\operatorname{IOU}(\text { box, centroids }) $$
    • 根据 k 和 Avg IOU 曲线,选择 k = 5
  • 预测框偏移量计算
    • 原先的 $x=x_p+w_p*tx$ 为直接偏移量,存在收敛问题,导致模型不稳定;因此修改为相对网格的偏移,使得中心点不会偏移出网格:

    • 计算举例(根据预测值,以及一开始聚类得到的先验框大小,得到最终的预测框):

  • 特征融合
    • 最后一层感受野(特征图上的点能看到原始图像的区域)太大了,小目标可能丢失,因此与之前的特征进行融合

  • 适配多尺度输入
    • 由于网络中不再有全连接层,因此可以适配多尺度的输入

改进结果

YOLOv3

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

改进方案

  • 多 scale
    • 为了检测不同大小的物体,设计了 3 个 scale

  • 网络架构修改
    • 将 multi scale 进行融合

改进效果

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

YOLOv4

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

网络架构

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

优化策略

  • 数据增广:Mosaic 图片拼接,增加样本多样性

YOLOv5

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

网络架构

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

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

  • 整体架构采用了 FPN (Feature Pyramid Networks) + PAN (借鉴PANet) 的形式,其中 FPN 是自顶向下的上采样,将感受野更大的特征,逐步上采样与感受野更小的特征融合;PAN 则是自底向上的下采样,将感受野更小的特征,逐步下采样与感受野更大的特征融合。

  • YOLOv5 作者根据实验最终确定激活函数为 SiLU,即 $f(x)=x\cdot \sigma(x)=x/(1+e^{-x})$

  • 将 SPP (Spatial Pyramid Pooling) 改为 SPPF,将并行的池化改为串行池化,通过实验证明性能得到提升;另外该结构主要目的是将不同尺度的池化结果融合在一起

数据增广

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

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

  • 数据增广:Copy paste

Anchor 框的确定

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 的平均匹配值

1
2
3
4
5
6
7
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 聚类时的距离依然是欧式距离。

Anchor 框的匹配

在 YOLOv5 中,每一个 cell 内的对象,会同时考虑相邻两个格子的 anchor,即一共 3x3=9 个 anchor。如下图所示,当 gt 中心靠近右下角,则会将右边和下边两个 cell 的 anchor 也考虑进来。

随后,YOLOv5 会去计算 gt 和每个 anchor 的宽高比例,即:

$$ r_w=\frac{w_{g}}{w_{a}},r_h=\frac{h_g}{h_a} $$

随后计算 $r_w$ 和其倒数的最大值,以及宽度和高度的最大差异 $r^{\max}$,即:

$$ \begin{aligned} 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})\\ \end{aligned} $$

若 $r^{\max}$ 小于阈值 anchor_t(通常为 4.0),则匹配成功,保留;否则丢弃。

输出框的确定

每个 cell 的 anchor 框匹配后,再搭配上网络在该 cell 上输出的 $t_x, t_y, t_w, t_h$,即可得到最终的预测边框:

$$ \begin{aligned} b_x&=2\sigma(t_x)-0.5+c_x \\ b_y&=2\sigma(t_y)-0.5+c_y \\ b_w&=(2\sigma(t_w))^2\cdot w_a \\ b_h&=(2\sigma(t_h))^2\cdot h_a \\ \end{aligned} $$

其中 $c_x,c_y,w_a,h_a$ 分别为当前 cell 左上角坐标,以及 anchor 框的宽高。

损失函数

$$ \text{Loss}=\lambda_{box}\cdot L_{box}+\lambda_{obj}\cdot L_{obj}+\lambda_{cls}\cdot L_{cls} $$

$L_{box}$ 刻画了每一对匹配的 gt 和 anchor 的 CIoU 损失,即:

$$ \begin{aligned} L_\text{CIoU}&=1-\text{IoU}+\frac{\rho^2}{c^2}+\alpha\cdot v \\ v&=\frac{4}{\pi^2}(\arctan\frac{w_g}{h_g}-\arctan\frac{w_a}{h_a})^2 \\ \alpha&=\frac{v}{1-\text{IoU}+v} \end{aligned} $$

其中 $\rho$ 为两个框的中心点距离,$c$ 为两个框的最小外接矩形的对角线长度。

另外,$L_{obj}$ 和 $L_{cls}$ 均采用了 BCEWithLogitsLoss,其中正类权重分别由 obj_pw 与 cls_pw 两个超参控制,并且 $L_{obj}$ 为 “每个 cell 的预测框的置信度” 与 “预测框与该 cell 上的 gt 的 IoU” 之间的损失。

参考资料