您的位置:首页 > 其它

【Deep Learning】YOLO_v1:You Only Look Once 原理

2017-12-14 15:32 357 查看
  这篇的主要内容是对 yolo_v1 进行原理介绍,下一篇对 yolo 的 tensorflow 实现源码进行分析。

1. 综述

   yolo——you onle look once,顾名思义,采用 yolo 进行检测任务的时候只需要对整张图像进行一次全局视野的“扫描即可”,而不需要其余的操作。它的核心思想就是直接在输出层进行 回归 bounding box 的位置和 bounding box 所属的类别(是将整张图像作为网络的输入),从而将 Object Detection 问题转化成为一个完全的 Regression 问题。而用原文中的话就是:

We reframe object detection as a single regression problem, straight from image pixels to bounding box coordinates and class probabilities. Using our system, you only look once (YOLO) at an image to predict what objects are present and where they are.

  YOLO 的主要特性:

速度快(extremely fast),能够达到实时监测的要求。在 Titan X 上能够达到 45 帧每秒。

讲背景认作检测目标比较少,这是因为 yolo 是采用全局图像作为 context(语义)信息。

泛化能力强,在艺术作品上同样能够获得不错的检测效果。

2. 整体框架



上面图片来自 cs231n 课件



上面图片分别来自cs231n 课件yolo_v1 论文

上面论文中的这个图片下面这段话是说:

将图片 Resize 成 448*448 大小,再将图片分割成为 7×7 的网格(也就是 cell)。

利用 CNN 进行特征提取和预测,也就是说,卷积部分负责进行特征提取,全连接部分负责预测(回归),这其中包括了①7×7×2=98个 bounding box(bbox)的坐标 xcenter,ycenter,ω,h 和时候有物体的 confidence。 ②7×7=49 个cell 所属的 20 个物体的概率.

过滤 bbox (NMS)。



  yolo 的整体网络结构如上面第一张图中右下角和上面所示,采用的是一个改动版本的 GoogleNet,主要改动是没有使用 GoogleNet 中的 Inception 模块,转而仅仅使用 1x1 卷积和 3x3 卷积进行简单代替。

原文内容如下:

Our network architecture is inspired by the GoogLeNet model for image classification. Our network has 24 convolutional layers followed by 2 fully connected layers. However, instead of the inception modules used by GoogLeNet we simply use 1×1 reduction layers followed by 3×3 convolutional layers.

  下面按照论文中的顺序对 yolo 的细节进行介绍。

3.unified detection

  首先,我们将待检测的图像分成 S×S 大小的网格(cell),如果有检测目标的中心落在这个 网格(cell) 内,则这个网格负责对这个物体进行检测。

  同时,每个 网格(cell)内预测 B 个 bounding boxes(可以当做候选框理解) 以及这些 bounding boxes 的 confidence scores (置信度)。通常来说,这个置信度不但表示这个框包含目标的概率还表示了这个预测边框的精确程度。如果在这个 网格(cell) 不存在要检测的目标,则这个网格的置信度为 0。通常我们将这个 confidence 定义为:Pr(Object)∗IOUtruthpred

  从公式中可以看出,如果这个网格中不存在一个 Object,则 confidence score 值为 0,否则置信度为 predicted bounding box 与 ground truth box 之间的 IOU 的值。

  每个预测的 bounding box 包含5个预测值,分别是:x,y,w,h以及一个 confidence,其中,(x,y) 反映的是预测框的中心与网格(cell)边界的相对值。w,h 分别表示预测的 bounding box 的 width 和 height 相对于整幅图像 width 和 height 的比例。而 confidence 标识的就是预测的 bounding box 与 ground truth box 的 IOU 值。

  此外,每个网格(cell) 还要预测 C 个条件概率,也就是在确定存在目标的条件下是某个类别 Classi 的概率。我们用 Pr(Classi|Object) 来表示。需要注意的是,我们在每个网格(cell)内仅仅预测一组(C个)类的概率,而不用考虑预测框 bounding box 的数量

  具体如下面的图所示:



  上面这张图说明的是对这个网格(cell)预测的第一个 bounding box 进行回归预测,其中包含 5 个预测值;



  上面这张图说明的是对这个网格预测的第二个 bounding box 进行回归预测,其中包含同样的 5 个相同意义的值。



  上面这张图说明的是我们要为每个网格(cell) 预测出 C 个条件概率,因此在这里需要注意:conditiona class probability 信息是针对每个网格 cell 来说的,而 confidence 信息是针对每个 bounding box 而言的。

  此外,还需要说明的是,在测试阶段,我们会将每个网格的 conditional class probability 与每个 bounding box 的 confidence 进行相乘的操作,如下公式所示:Pr(Classi|Object)∗Pr(Object)∗IOUtruthpred=Pr(Classi)∗IOUtruthpred 这样得到的乘积不仅包含了 bounding box 中预测的 class probability (类别条件概率),也同时反映了 bounding box 中是否含有 Object 和 bounding box 坐标的准确度。具体操作如下图所示:



  上面这个图说明的是对于这个网格(cell) 的第一个 bounding box 来说,进行上面这个公式所做的操作。



  上面这个图说的是对于这个网格(cell) 的第二个 bounding box 来说,进行尚敏的公式所进行的操作。

  这部分最后,文中还提到,在将 YOLO 用在 PASCAL VOC 数据库的时候,论文中使用的 S = 7,也就是将一张图像分割成为 7×7 =49 个网格以及每个网格(cell) 预测出 B = 2 个 bounding box (每个包含5个预测值),同时,因为在这个数据集中一共有 20类目标,因此这里 C = 20。

因此,最后得到的prediction是7×7×30 (也就是S×S∗(B∗5+C)) 的 Tensor。

3.1 网络结构

  网络结构这部分在上面的整体框架中已经进行了说明,在这里不在进行赘述。

3.2 Training

  首先,我们利用 Image-Net 的 1000 类的分类任务的数据集对上面的网络结构中的卷积层进行与训练。在这里我们使用上面网络中的前 20 个卷积层,在后面加上一个全局池化层(average-pooling layer),最后加上一个全连接层,作为这个 pretrained(预训练)的网络。训练时间大约是一周的时间。这个结果和 GoogleNet 的结果相当。

  然后我们将上面得到的预训练好的20层卷积层应用到检测任务中,并在这个卷积层后加入 4 个卷积层和 2 个全连接层。并将这些新加入的权重进行随机初始化。为了得到更为精细化的效果,我们将网络的输入从 224×224 提升到 448×448。

  在网络最后的输出我们预测的是每个bounding box 的类别概率以及坐标信息,我们将所有的预测结果都归一化到 0~1之间。其中,我们利用原始图像的 width 和 height 信息对每个bounding box 的边长进行归一化,这样使预测的 width 和 height 落入到 0~1 之间。而对于每个bounding box 的中心点 x,y 来说,我们将边界框x和y坐标参数化为特定网格单元位置的偏移,因此它们也在0和1之间。(可能理解的不太准确,这里给出原文):

We parametrize the bounding box x and y coordinates to be offsets of a particular grid cell location so they are also bounded between 0 and 1.

3.2.1 激活函数

  在网络中是用的激活函数是 Leaky Relu 函数,具体的表达式如下所示:ϕ(x)={x,0.1x,if x>0otherwise

3.2.2 dropout

  此外,为了防止网络发生过拟合现象,网络在第一个全连接层后面使用了一个 ratio=0.5 的 dropout 层。

3.2.3 学习速率

  对于网络中的学习速率,使用的也是渐进式的学习率,在第一个 epoch 中我们将学习速率从 10−3 缓慢的增长到10−2。在论文中也有提到,如果以一个比较大的学习速率开始训练,那么我们的模型容易得到不稳定的梯度。在接下来的 75个 epochs 中,是用的都是 10−2 的学习速率,然后在接下来的 30 epochs 将学习速率再次下降到10−3。在最后的 30 epochs 中,我们将学习速率再次下降到10−4。

3.2.4 数据增强

  对于网络中得到数据增强的方法,主要是引入的随机剪裁和对源图像进行translation。同时还可以在 HSV 空间内对图像的曝光度和饱和度进行调节。

3.2.5 损失——Loss

  因为 YOLO 将检测中的所有问题(分类,定位)都用一个回归来表示,因此在这里损失函数的定义就十分重要。

  损失函数的设计目标就是让坐标 (x,y,w,h),confidence,classification 这三个方面达到很好的平衡。

  如果简单的全部采用 sum-squared error loss 来进行损失函数的计算会出现下面的问题:

8维的 localization error 和 20 维的 classification error 同等重要显然是不合理的。

如果一些网格(cell)中不存在 object,在一幅图像中这种 cell 很多,那么就会将这些网格中的 bounding box 的confidence 推向 0,相比于较少的有 object 的网格(cell),这些不包含物体的网格(cell)对梯度的更新的贡献会远远大于包含物体的网格(cell)对梯度的贡献,这回很容易导致网络的不稳定甚至是发散。

这里引用一张图像:来自图解YOLO



  对于上面会出现的问题,主要解决方法如下所示:

这里我们更重视的是 8 维坐标的预测,因此我们给这些损失前面赋予更大的 loss weight,这里记为 λcoord,对于 pascal VOC 数据集中我们取 5 (上图中的蓝色框);

对没有 object 的 bounding box,我们赋予小的 loss weight,记为 λnoobj,对于 pascal VOC 数据集中我们取 0.5(上图中的橙色框);

对于有 object 的 bounding box 和 类别的 loss 的 损失权重(loss weight)我们取正常值 1。(上图中的红色框和紫色框)

同时,下面这个图也可以很好的说明,图片来自于:[RCNN学习笔记(6):You Only Look Once(YOLO):Unified, Real-Time Object Detection]



  需要说明的是,在这个损失函数中:

只有当某个网格中有 object 的时候才对 classification 进行惩罚;

只有当某个 bounding box 对某个 ground truth box 负责的时候,才会对 box 的 coordinate error 进行惩罚,而对于哪个 ground truth box 负责就看其预测值和 ground truth box 的 IOU 是不是在那个cell 中的所有 box 中是最大的。

这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行,每一个 predictor对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。

  此外,还有一个问题需要注意,对于不同大小的 bounding box 的预测中,相比于大的 bounding box ,小的 bounding box 出现相同的偏差,则对小的 bounding box 对 IOU 的影响更大。而 sum-square error loss 中同样的偏移 loss 是一样的。

  为了解决这个问题,作者提出了一个很有技巧性的方法,也就是将 box 的 width 和 height 取平方根来代替原本的 width 和 height,如下图所示,小的 bounding box 的横轴值表较小,在发生偏移的时候,反映到 y 轴上的 loss 比 big bounding box 的要大。



4. Inference

  同训练过程相似,检测过程网络的一次估计计算。在 PASVAL VOC 数据集中网络对每个图像预测产生 98 个 bounding box 和 对每个 bounding box 预测相应的类别。

  下面的检测流程使用图像进行说明,图像均来自于deepsystems.io:











  通过上面这组图片可以看到,我们为每个网格(cell)都做相同的相乘操作,然后一共能得到 98 个乘积。



  如果我们想要预测上面这张图像,大致的步骤如下:







  上面这几张图是说,

1. 在得到待检测的图像的 98 个 20维张量后,对每一类设置一个阈值(threshold),小于这个阈值的分类评分直接令其为 0,这里取的阈值是 0.2,

2. 然后再对这 98 个 20 维张量对每一类进行降序排序,如上图所示;

3. 最后再利用 NMS 算法去除掉多余的 bounding boxes;

  在进行了上面的三步后,根据每个 bounding box 的得分情况在原图上进行画框。如下所示:











4.1 NMS 算法

  最后介绍一下 NMS 算法,也就是我们常说的非极大值抑制:

  这里还是使用图片进行说明,在对所有的 98 个 20 维张量进行排序后,我们换一个角度看得到的这些数据:



  如上面动图所示,对98个张量的第一维上进行操作,上面的每个数字代表这个 bounding box 对这一类物体的评分,分数越高,表示置信度越高;



  如上所示,我们选择评分最高的 bounding box 当做这一轮的 bbox_max, 然后一次选取其余的候选款,这里我们称为这一轮的 bbox_cur,然后我们进行 IoU 运算,如下所示:



  如果有IoU(bbox_max,bbox_cur)>0.5则 将当前的 bbox_cur 置零。如果<0.5 则保持原来的数值,一次往复,然后在进行第二轮,第三轮等等。

  如下所示:



5.优缺点

  最后列举一下 yolo 的优缺点

5.1 优点:

YOLO 检测物体的速度非常快;

YOLO 可以很好的避免背景错误,产生 false positves;

YOLO 可以学到物体的泛化特性;

5.2 缺点:

YOLO 的物体检测精度低于其他 state-of-the-art 的物体检测系统;

YOLO 容易产生物体的定位错误;

YOLO 对小物体的检测效果不好(尤其是密集的小物体,因为一个网格 cell 只能预测 2 个物体)。

  最后给出各个物体检测系统的检测性能对比:



6.参考文献

You Only Look Once: Unified, Real-Time Object Detection

deepsystems.io

YOLOv1论文理解

图解YOLO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深度学习