0x00 Abstract

以往的目标检测网络是在分类基础上完成目标检测,最典型的就是RCNN系列,这种也叫two- stage。YOLO是一个新的目标检测方式(将目标检测作为一个回归问题来处理),所以属于one-stage。YOLO的意思就是:You Only Look Once。

YOLO将分类和边框预测作为回归问题来处理,它是端到端(end-to-end) 的,也就是说输入图像经过CNN之后,直接得到分类和定位结果。

YOLO是全局获取图像信息,整体操作(DPM、RCNN每次都只是检测框里的,框外的不检测,管中窥豹),由于是一个单独的网络,能够直接优化。

检测速度很快(文章中多次出现,这也是YOLO系列最大的亮点),速度:45FPS(实时:30FPS),作者还训练了一个更快的版本Fast YOLO,可以达到155FPS,并且可以达到其他实时目标检测网络的2倍mAP。

对比其他网络:定位错误多、背景误判少(主要是定位错误,误判少)。特点:通用性强。对于艺术作品的的检测效果明显优于DPM、RCNN(体现了YOLO的泛化能力强)

0x01 Introduction

首先是对比了DPM和RCNN。DPM是用滑动窗口的方式进行检测的,RCNN是要先生成候选区域(使用selective search)。它们的缺点是网络的两步是独立的,要分类训练,这就导致了模型难以优化。

简单介绍一下滑动窗口:采用滑动窗口的目标检测算法思路非常简单,它将检测问题转化为了图像分类问题。其基本原理就是采用不同大小和比例(宽高比)的窗口在整张图片上以一定的步长进行滑动,然后对这些窗口对应的区域做图像分类(应该是在学习这个东西是目标物还是背景)如下图所示:

YOLOv1网络学习笔记-萤火

但是在实际情况中你并不知道要检测的目标大小是什么规模,所以你要设置不同大小和比例的窗口去滑动,而且还要选取合适的步长,这样会产生很多的子区域,并且都要经过分类器去做预测,这需要很大的计算量,所以你的分类器不能太复杂,因为要保证速度。解决思路之一就是减少要分类的子区域,这就是R-CNN(基于区域提议的CNN)的一个改进策略,其采用了selective search方法来找到最有可能包含目标的子区域(Region Proposal),其实可以看成采用启发式方法过滤掉很多子区域,这会提升效率。

YOLOv1网络学习笔记-萤火

接下来看YOLO的做法:

  • 核心就是一步直接完成定位+分类
YOLOv1网络学习笔记-萤火
  • 优点:
    • 非常快
    • mAP是其他实时系统的两倍以上(注意这里对比的实时系统,像Fast RCNN这种非实时的网络,mAP在当时是比YOLO高的)
    • 看全局,不需要候选框。例如和RCNN比较:Fast R-CNN由于看不到较大的上下文,因此会将图像中的背景色块误认为是目标对象。与Fast R-CNN相比,YOLO产生的背景错误少于一半
    • 泛化性(通用性)强。
      • 表现:在自然图像上训练,在艺术图像上识别,表现远远超过DPM和RCNN
      • 结论:由于具有较高的泛化性,在遇到新领域、碰到意外输入时,不容易奔溃
  • 缺点:
    • 准确性较低(相比RCNN)
    • 在小对象的识别上不足(例如鸟群):因为分成了7*7个cell,天生就不利于检小对象

0x02 Unified Detection

YOLO把目标检测的“分类+定位”整合到一起,网络使用来自整张图像的特征来预测目标的边界框(end-to-end)

  • 同时对图像中所有目标类别的边界框进行预测
  • 可以对整张图像及其图像中的目标进行全局分析
  • 端到端、实时、高AP(也就是PR曲线围城的面积)

1. 怎么做的?

YOLOv1网络学习笔记-萤火
  • 把整幅图像分为S*S个格子(S=7)
  • 如果对象的中心点所在某个格子中,那么这个格子就负责检测这个对象
  • 每个格子都预测B个bbox,对应的每个bbox也有1个置信度(B=2)
    • 也就是说整幅图像有49个格子,98个bbox
    • 置信度confidence。当没有对象时Pr为0,有对象Pr为1,IOU就是预测框与真实框的交并比)
      \(confidence=Pr(Object)*IOU_{pred}^{true}\)
      Pr在训练阶段是非0即1的;在预测阶段代表grid cell中有对象的概率,0-1之间。但是预测阶段不需要分别计算出Pr和IOU各为多少,而是隐式地包含它们。
YOLOv1网络学习笔记-萤火
  • 每个bbox包括5个预测值:x、y、w、h、confidence
    • (x, y):bbox中心点位置,相对的是其所在grid cell的,归一化到0-1之间
    • w、h:bbox的宽和高,相对的是整幅图像的,也归一化到0-1之间
    • confidence:置信度,当格子里没有对象时为0,有对象时为gtbox和predbox的交并比
  • 每个格子同时也预测C个类别(训练使用的数据集时PASCAL VOC,所以C=20)
    • 概率值通过条件概率计算得到:
      \(Pr(Class_i|Object)\)
      (解释:在当前bbox已经包含物体的条件下,各类别的概率)
    • 每个单元格只预测一组类别的概率(也就是说B个bbox共用)
    • 上述概率限制了YOLOv1预测重叠或临近物体的能力,即每个格子仅只能预测一个类别,一共49个格子,YOLO仅仅能预测49个对象。如果图像中的物体超出,则无能为力
    • 在测试阶段(也就是最终预测,闭卷考试),将每个bbox的置信度与上面的条件概率相乘,结果就是每个box的特定特定类别的置信度分数,这个分数既编码了该类别出现在box中的概率,又编码了预测框与对象的拟合程度:

$$Pr(Class_i|Object)Pr(Object)IOU_{pred}^{true}=Pr(Class_i)*IOU_{pred}^{true} $$

  • 最后预测的结果:
    S * S * (B * 5 + C)大小的tensor,这里就是7 * 7 * 30,这个tensor就是YOLO的输出:
YOLOv1网络学习笔记-萤火
YOLOv1网络学习笔记-萤火

2. Network Design

YOLOv1网络学习笔记-萤火
  • 属于CNN网络,主要分为两部分:
    • 卷积层,作用:提取特征。这里有24个卷积层(不包括池化层)
    • 全连接层,作用:分类。这里有2个全连接层
  • 作者说受到了GoogLeNet网络的启发
    • 但是没有使用Inception块,而是简单地用1×1卷积后接3×3卷积替代

复习一下1×1卷积:

YOLOv1网络学习笔记-萤火
YOLOv1网络学习笔记-萤火
  • 通道数必须和原始的一样
  • 结果W、H不变,通道数与使用了多少个1×1卷积核一样
  • 作用:
    • 降维,减少运算量(当然也可以升维)。这里是先用1×1卷积降维,再用3×3卷积
    • 跨通道信息传递

如果不使用1×1来降维,而是直接用3×3卷积核降维,运算量会大大增加:

YOLOv1网络学习笔记-萤火

上图SSD网络,如果想从A到B有两种方法:
1. 直接用3×3卷积核
2. 先用1×1卷积核,再用3×3卷积核
可以看出,第2种方法的参数更少,运算量更少

  • 在ImageNet数据集上预训练卷积层,训练的时候使用的图像分辨率是检测的一半(训练用224×224)
  • Faster YOLO
    • 用了更少的卷积层核卷积核(9层)
    • 除了网络的size,训练和测试用的其他参数与YOLO一样
  • YOLO的最终输出:7x7x30的tensor

3. Training

  • 在ImageNet上预训练
  • 一开始用了前20个卷积层+1个均值池化+1个全连接层
  • 训练了约一周
  • ImageNet2012作为验证集,top-5准确率88%
  • 接着根据任少卿等人的研究经验,在预训练网络中添加了卷积层和全连接层,以提高性能
  • 添加了4层卷积层+2层全连接层,并随机初始化这些层的权重(所以最后的网络是24层)
  • 由于检测通常需要细粒度的信息,把输入从224×224调整到448×448
  • 最后的层同时预测了类别概率和bbox坐标
  • 对bbox做了归一化:
    • (x, y):bbox中心点位置,相对的是其所在grid cell的,归一化到0-1之间
    • w、h:bbox的宽和高,相对的是整幅图像的,也归一化到0-1之间
  • 激活函数:
    • 网络的最后一层使用线性激活函数,其他层使用leaky ReLU
    • leaky ReLU:
YOLOv1网络学习笔记-萤火
  • 损失函数:平方和误差
    • 优点:易于优化(好求导)
    • 缺点:
      • 分类和定位误差的权重是一样的
      • 大多数格子没有对象,这会导致这些cell的“置信度”趋向0,然后会压制哪些有对象的cell的梯度,从而使模型不稳定、在训练早期就发散了
      • 大尺寸的bbox和小尺寸的bbox具有相同权重,但是我们希望小框带来的误差更大
    • 改进:
      • 加强bbox定位误差损失,给予高权重:5
      • 削弱不包含对象的bbox的置信度的损失,给予低权重:0.5
      • 使用bbox宽高的平方根来计算误差
        • 例如大框的宽为16,小框宽为4,大框偏了4才变成了20,小框的宽偏了4,变成了两倍,虽然都是偏了相同的距离,但是明显小框受到的影响更大;若换成平方根就将他们之间的影响凸显出了,大框宽的平方根是4,小框为2;大框宽的偏移量为 √20-√16=2√5-4=0.4721,小框宽的偏移量为√8-√4=2√2-2=0.8284。很明显小框的变化大于大框,可以更好的凸显变化;这里只是举例说明。
YOLOv1网络学习笔记-萤火
YOLOv1网络学习笔记-萤火

(这样大框尺寸发生变化时,比小框带来的影响会小点)

  • YOLO的每个格子都会预测B个bbox。但是在训练的时候,只会取其中一个bbox,取的就是那个IOU最大的,其他的丢弃掉。这会导致B个bbox逐渐特异化,使得每个框都逐渐聚焦至特定的形状或长宽比
    • 包含物体的cell,有2个predictor(B=2)
      • 1个负责预测(这个bbox具有更大的IOU)
      • 另一个不负责
    • 不包含对象的cell
  • 只有当网格中有对象时,才会对分类错误进行惩罚(就是之前那个条件概率)
  • 只有当该predictor对某个对象负责时,才会惩罚这个bbox的坐标错误(一个cell有2个predictor,只有1个负责预测)
  • 超参数:
    • 在PASCAL VOC数据集、测试集上训练135个epoch
    • 同时训练VOC2007/2012
    • batch-size:64
    • momentum(动量):0.9,作用:冲过局部最优解、鞍点
    • decay(权重衰减):0.0005,作用:防止过拟合
    • 学习策略:
      • 最开始的几个epoch学习率从0.001缓慢地增加到0.01。如果一开始就使用高学习率,模型通常会因为不稳定的梯度而发散
      • 前75个epoch使用0.01,再用0.001训练30个epoch,最后再用0.0001训练30个eppch
    • 使用了dropout
      • 防止过拟合
      • 概率:0.5
      • 在第一层全连接层之后
    • 数据增强
      • 随机缩放和平移
      • 在HSV色彩空间中随机调整图像的曝光度和饱和度
YOLOv1网络学习笔记-萤火

4. Inference

  • 会预测出98个bbox,以及每个bbox的类别概率
  • NMS:非极大值抑制
YOLOv1网络学习笔记-萤火
YOLOv1网络学习笔记-萤火
  • NMS做法:
    • 首先筛选出分数最大的bbox
    • 把与上面bbox的IOU比较大的其他bbox去掉(这里会设一个NMS的IOU阈值)
    • 再筛选出剩余bbox中分数最大的
    • 重复上面的流程

5. Limitations

  • 对bbox预测施加了很强的空间约束(分成了7×7个grid cell)
  • 每个cell至预测了2个bbox,且只有一个类别
  • 空间约束限制了模型可以预测的邻近物体的数量
  • 对成群出现的小物体(如鸟群)的检测效果差
  • 由于模型时从数据中学习,去预测bbox的,所以难以泛化到新的,不常见的纵横比的对象
  • 由于模型包含了多个下采样层,模型使用到的特征的粒度也比较粗
  • 在损失函数中,对大bbox和小bbox采取了一致的处理,但是小框带来的错误对IOU带来的影响要大很多
  • YOLO的误差主要在定位误差上,即分类正确但是定位偏差较大