【目标检测(五)】YOLOv1——开启one-stage目标检测的篇章

2,709 阅读6分钟

【目标检测(一)】RCNN详解——深度学习目标检测的开山之作
【目标检测(二)】SPP Net——让卷积计算共享
【目标检测(三)】Fast RCNN——让RCNN模型能端到端训练
【目标检测(四)】Faster RCNN——RPN网络替代selective search
【目标检测(五)】YOLOv1——开启one-stage目标检测的篇章
【目标检测(六)】YOLOv2——引入anchor, Better, Faster, Stronger
【目标检测(七)】YOLOv3——准确率的全面提升
【目标检测(八)】一文吃透目标检测回归框损失函数——IoU、GIoU、DIoU、CIoU原理及Python代码
【目标检测(九)】FPN详解——通过特征金字塔网络进行多尺度特征融合
【目标检测(十)】RetinaNet详解——Focal Loss将one-stage算法推向巅峰
【目标检测(十一)】CenterNet——Anchor Free, NMS Free
【目标检测(十二)】FCOS——用实例分割的思想做Anchor Free的目标检测

1. Motivation: 把两阶段的目标检测网络变成单阶段网络

从目标检测的发展历史来看,从RCNN开始开创了深度学习目标检测的先河,再到后来的SPP Net、Fast RCNN和Faster RCNN,这四个算法都需要Region Proposal,前三者是通过selective search方法生成近2000个Region Proposal,Faster RCNN是通过RPN网络来生成候选框区域,但是无一例外都需要先生成候选框区域,再对候选框区域进行分类和回归修正,所以我们统一把RCNN系列算法称为two-stage目标检测算法。

YOLO的想法是,既然RPN网络能生成若干的建议框,还对这些框进行了分类(二分类,是否是目标),并且对这些框进行了回归修正,为什么不让这个网络直接预测类别和框位置呢?YOLO就把two-stage整合到了一起,用一个阶段就能完成目标类别的确定和bbox框的回归任务,所以我们把YOLO系列的算法统称为one-stage算法。本文主要详细介绍YOLOv1算法。

2. YOLOv1原理

2.1 YOLO的思想

  • 将一幅图像进行平均分成S*S个网格(grid cell),如果某个object的中心落在这个网格中,那么这个网格就负责预测那个object。比如下图中这只狗的中心落在了第五行第二列的格子中,那么这个格子就负责预测狗的分类和框信息。
  • 每个网格要预测B个Bounding Box(论文中S=2, B=2),每个Bounding Box除了要预测位置以外,还要预测一个confidence值。除此之外,每个网络还要预测C个类别的分数(对于VOC来说,C=20)。输出维度是S * S * (B * (4 + 1) + C),以S=7,B=2,C=20为例输出tensor如下图所示:

image.png

  • 每个Bounding Box包含5个预测值:x, y, w, h和confidence。x和y表示框中心坐标点在grid cell中的相对位置,即x,y∈[0, 1],w和h表示框的宽和高相对整张图的比例,也有w,h∈[0, 1],confidence表示预测框和真实框的IOU值,特别地,可以理解为confidence=Pr(object)*IOUpredtruthIOU^{truth}_{pred},这里当grid cell内为目标中心时Pr(object)为1,当grid cell内不包含目标中心时Pr(object)为0。截取一些论文中涉及到以上表述的细节如下图。

    Notes: 测试的时候,将对应类别预测的概率和confidence乘起来作为预测的分数。

2.2 YOLOv1网络结构

整个网络架构的设计灵感由GoogleNet而来,将Inception Module替换为一个1*1和一个3*3的卷积操作。如下图所示,输入一张448*448*3的图片,总计经过24个卷积层,得到一个维度为7*7*1024的feature map,之后进行flatten展平操作,得到1*50176的一维向量,然后接一个4096的全连接层,再接一个1470的全连接层,然后进行Reshape操作,输出7*7*30的结果(5 + 5 + 20)。

image.png

2.3 Loss损失函数设计

Loss主要由三部分组成,bbox的损失、confidece损失和class分类损失。

  • bbox损失:回归函数前的指数函数1表示第i个grid cell的第j个预测的Bounding Box是否负责该目标的预测(即第j个预测的Bounding Box框与GT Box有最大的IOU)。损失计算思路非常简单,分别计算中心点和宽高与GT的L2距离,因为要考虑大目标的损失可能会比小目标大很多,所以加上了根号,否则loss会极度偏向大目标。

  • confidence损失:由两部分组成,第一部分是当第i个grid cell的第j个预测的Bounding Box负责该目标的预测时confidence的GT值为预测框与真实框的IOU值,第二部分是当格子中没有(负责)目标时confidence的GT值应当为0。

  • 分类loss:指示函数表示第i个grid cell是否应当负责该目标的预测(即该目标的中心是否在第i个grid cell里面),进行类别的损失计算。

  • 平衡系数:因为图像中多数grid cell是不负责预测目标的,也就是说loss中的项在多数情况下是no_object状态的,那么我们需要提高bbox的回归损失权重、降低没有目标的confidence损失,加入了λcoord 和 λnoobj两个参数,论文中λcoord=5, λnoobj=0.5。

image.png

3. YOLO的效果评价和优劣分析

3.1 YOLO的准确率和速度效果

我们聚焦红框内的的比较:

  • YOLO和Faster RCNN都使用VGG16的backbone,速度上快了3倍,但是mAP准确率降低了7个点。
  • YOLO做到实时检测的网络的话,速度可以达到45fps,已经可以实现实时检测,但是mAP准确率降低了接近10个点。

3.2 YOLO优缺点分析

  • YOLO优点:

    • 真正实现了实时目标检测,使得CV目标检测开始真正大规模应用到工业界,推理速度快。
    • 不需提取region proposal,是整张图像放进网络进行检测的,可以更多的联系上下文信息和特征,减少将背景检测为物体的错误。
  • YOLO缺点:

    • 对重叠目标无法检测:YOLO进行打格操作,每个grid cell只能预测一个类别,因此出现重叠目标尤其是重叠小目标,检测效果会很差,比如成群的小鸟。
    • 对小目标检测效果不好:两点原因,一是由于损失函数设计较为粗糙,尽管使用了根号的方式来抑制大物体的overpower效应,但是效果依然欠佳;二是经过多次下采样,使得最终得到的feature的分辨率比较低,就是得到coarse feature这可能会影响到物体的定位。
    • YOLO是根据训练数据来预测bbox的,但是当测试数据中的物体出现了训练数据中的物体没有的长宽比时,YOLO的泛化能力低。
    • 直接回归GT和预测值,不是回归的offset,增加了训练的难度。
    • 未使用BN。

Reference:

  1. gitthhub.github.io/2019/03/17/…
  2. arxiv.org/pdf/1506.02…