YOLO v2 详解

YOLO9000: Better, Faster, Stronger

论文链接


  YOLO v2 相对于 YOLO v1 主要就是通过一系列的 tricks 对模型进行优化。所以在本篇中我们会逐个介绍这些 tricks,以及这些 tricks 所带来的提升。在论文的最后,作者提出了 YOLO9000,它可以支持实时运行同时检测 9000 多个物体。


一、Tricks


  下图就是 YOLO v2 在 YOLO v1 上做的改进。其中行代表所有的 tricks,列代表当前使用的 tricks(使用的话打上对号)。我们可以看出,经过一系列的 tricks,最终 YOLO v2 在 VOC2007 数据集上能达到 78.6。

图 1

图 1:各个 tricks 以及它们在 VOC2007 数据集上的检测效果


(一)Batch Norm


  批归一化使 mAP 有 2.4 的提升。

  批归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个 batch 分别进行归一化的时候,起到了一定的正则化效果(YOLO2 不再使用 dropout),从而能够获得更好的收敛速度和收敛效果。

  通常,一次训练会输入一批样本(batch)进入神经网络。批规一化在神经网络的每一层,在网络(线性变换)输出后和激活函数(非线性变换)之前增加一个批归一化层(BN),BN 层进行如下变换:

  (1)对该批样本的各特征量(对于中间层来说,就是每一个神经元)分别进行归一化处理,分别使每个特征的数据分布变换为均值 0,方差 1。从而使得每一批训练样本在每一层都有类似的分布。这一变换不需要引入额外的参数。

  (2)对上一步的输出再做一次线性变换,假设上一步的输出为 Z,则 Z1 = γZ + β。这里 γ、β 是可以训练的参数。增加这一变换是因为上一步骤中强制改变了特征数据的分布,可能影响了原有数据的信息表达能力。增加的线性变换使其有机会恢复其原本的信息。


(二)使用高分辨率图像微调分类模型


  mAP 提升了 3.7。

  图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以 YOLO v1 使用 ImageNet 的图像分类样本采用 224 * 224 作为输入,来训练 CNN 卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448 * 448 的图像作为输入。但这样切换对模型性能有一定影响。

  所以 YOLO2 在采用 224 * 224 图像进行分类模型预训练后,再采用 448 * 448 的高分辨率样本对分类模型进行微调(10 个 epoch),使网络特征逐渐适应 448 * 448 的分辨率。然后再使用 448 * 448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。


(三)采用先验框(Anchor Boxes)


  召回率大幅提升到 88%,同时 mAP 轻微下降了 0.2。

  借鉴 Faster RCNN 的做法,YOLO2 也尝试采用先验框(anchor)。在每个 grid 预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。

  同时 YOLO2 移除了全连接层。另外去掉了一个池化层,使网络卷积层输出具有更高的分辨率。

  之前 YOLO1 并没有采用先验框,并且每个 grid 只预测两个 bounding box,整个图像 98 个。YOLO2 如果每个 grid采用 9 个先验框,总共有 13 * 13 * 9 = 1521 个先验框。所以,相对 YOLO1 的 81% 的召回率,YOLO2 的召回率大幅提升到 88%。同时 mAP 有 0.2% 的轻微下降。

  不过 YOLO2 接着进一步对先验框进行了改良。


(四)聚类提取先验框尺度


  聚类提取先验框尺度,使得 mAP 有 4.8 的提升。

  使用(三)的方法生成先验框,我们发现虽然召回率增大了,但是 mAP 值减少。这说明使用 Faster R-CNN 的方法固定生成先验框的效果并不算很好。这样生成的先验框虽然数量多,但是并不能代表物体中大多数的更加合适的大小和长宽比例。那么有没有更好的方法?实际上我们可以利用聚类方法,先对数据集所有的 ground truth 框进行 k-means 聚类。提取出更具有代表性的框的大小和比例。那么我们的网络只用对生成的先验框做很少的微调,就能有很好的效果。

  聚类算法最重要的是选择如何计算两个边框之间的“距离”,对于常用的欧式距离,大边框会产生更大的误差,但我们关心的是边框的 IOU。所以,YOLO2 在聚类时采用以下公式来计算两个边框之间的“距离”。

d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box, centroid)=1-IOU(box, centroid) d(box,centroid)=1IOU(box,centroid)

  centroid 是被选做的聚类的中心,box 就是其它边框,d 就是两者间的“距离”。IOU 越大,“距离”越近。YOLO2 给出的聚类分析结果如下图所示:

图 2

图 2:(左)使用 k-means 不同的 k 值生成的 centroid 所有边框与 ground truth 的 IOU 的均值(右)在 COCO 数据集和 VOC 数据集上取 k = 5 提取到的先验框的可视化结果。

  上图左边是选择不同的聚类 k 值情况下,得到的 k 个 centroid 边框,计算样本中标注的边框与各 centroid 的 Avg IOU。显然,边框数 k 越多,Avg IOU越大。YOLO2 选择 k = 5 作为边框数量与 IOU 的折中。对比手工选择的先验框,使用 5 个聚类框即可达到 61 Avg IOU,相当于 9 个手工设置的先验框 60.9 Avg IOU。

  上图右边显示了 5 种聚类得到的先验框,VOC 和 COCO 数据集略有差异,不过都有较多的瘦高形边框。


(五)约束预测边框的位置


  借鉴于 Faster RCNN 的先验框方法,在训练的早期阶段,其位置预测容易不稳定。其位置预测公式为:

x = ( t x ∗ w a ) + x a x=(t_x*w_a)+x_a x=(txwa)+xa

y = ( t y ∗ h a ) + y a y=(t_y*h_a)+y_a y=(tyha)+ya

  其中, x x x y y y 是预测边框的中心,

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值