YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3

YOLOv1

YOLOv1结构及工作流程

YOLO最早于2016年提出。它的核心思想就是利用整张图作为网络的输入,将目标检测作为回归问题解决,直接在输出层回归预选框的位置及所属的类别。YOLO最左边是一个InceptionV1网络,共20层。但作者对InceptionV1进行了改造,他没有使用inception模块,而是用一个1x1的卷积并联一个3x3的卷积来替代。
InceptionV1提取出的特征图再经过4个卷积层和2个全连接层,最后生成7x7x30的输出。

YOLO将一副448x448的原图分割成了7x7=49个网格,每个网格要预测两个bounding box的坐标(x, y, w, h)和box内是否包含物体的置信度confidence(每个bounding box有一个confidence),以及物体属于20类别中每一类的概率(YOLO的训练数据为voc2012,它是一个20分类的数据集)。所以一个网络对应一个(4x2+2+20)=30维的向量。
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
输出YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
7x7网格内的每个grid(红色框),对应两个大小形状不同的bounding box(黄色框)。每个box的位置坐标为(x, y, w, h),x和y表示box中心店与该格子边界的相对值,w和h表示预测box的宽度和高度相对于整幅图像的宽度和高度的比例。(x, y, w, h)会限制在[0, 1]之间。与训练数据集上标定的物体真实坐标(Gx, Gy, Gw, Gh)进行对比训练,每个grid负责检查中心点落在该格子的物体。

这个置信度只是为了表达box内有无物体的概率(类似于Faster R-CNN中RPN层的softmax预测anchor是前景还是背景的概率),并不预测box内物体属于哪一类。
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
confidence置信度
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真是标记的box之间的IoU。值越大则box越接近真是位置。

confidence是针对bounding box的,每个网格有两个bounding box,所以每个网格会有两个confidence与之对应。

YOLO-V1预测工作流程

  1. 每一个格子得到两个bounding boxes
  2. 每个网格预测的class信息和bounding boxes预测的confidence信息相乘,得到了每个bounding box预测具体物体的概率和位置重叠的概率PrIoUYOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
  3. 对于每一个类别,对PrIoU进行排序,去除小于阈值的PrIoU,然后做非极大值抑制YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3

YOLOv1代价函数讲解以及缺点分析

YOLO的loss函数包含三部分:位置误差、confidence误差、分类误差

YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
绿色为bounding box,红色为真实标注。如果w和h没有平方根,那么bounding box跟两个真实标注的位置loss是相同的,但是从面积看来B框是A框的25倍,C框是B框的81/25倍。B框跟A框的大小偏差更大,不应该得到相同的loss。
如果w和h加上平方根,那么B对A的位置loss约为3.06,B对C的位置loss约为1.17,B对A的位置loss的值更大,更符合我们的实际判断。
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
不同的任务重要程度不同,所以也应该给予不同的loss weight。

  • 每个网格两个预测框坐标比较重要,给这些损失前面赋予更大的loss weight,在pascal VOC取值为5。
  • 对没有object的box的confidence loss,赋予小的loss weight,在pascal VOC训练中取0.5。
  • 有object的box的confidence loss和类别的loss的loss weight正常取1。

YOLO-V1缺点

  1. 每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果较差。
  2. 原始图片只划分为7x7的网格,当两个物体靠的很近时,效果比较差。
  3. 最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
  4. 对于图片中比较小的物体,效果比较差。这其实是所有目标检测算法的通病,SSD对这个问题有一些优化。

YOLO9000(v2)

YOLOv2网络结构Darknet-19讲解

YOLO-V2速度优化
针对YOLO准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,2016提出了YOLO-V2。

为了精度与速度并重,作者在速度上也做了一些改进措施。
大多数监测网络依赖于VGG-16作为特征提取网络,VGG-16是一个强大而准确的分类网络,但是过于复杂,224*224的图片进行一次前向传播,其卷积层就需要多大306.9亿次浮点数运算。
YOLO使用的是基于GoogleNet的自定制网络,比VGG-16更快,一次前向传播仅需85.2亿次运算,不过它的精度要略低于VGG-16、

作者使用Darknet-19在标准1000类的ImageNet上训练了160周期。训练的时候仍然使用了很多常见的数据扩充方法。初始的224224训练后把分辨率上调到了448448,又训练了10次。高分辨率下训练的分类网络top-1准确率76.5%,top-5准确率93.3%。YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3

YOLOv2精度优化-高分辨率和anchor

为了达到更精确(Better)的目的,YOLOv2主要做了如下改进:

  1. High Resolution Classifier

YOLOv2首先修改预训练分类网络的分辨率为448*448,在ImageNet数据集上训练10个周期。这个过程让网络有足够的时间去适应高分辨率的输入。然后再fine tune为检测网络,mAP获得了4%的提升。

  1. Convolutional with Anchor Boxes

YOLO(v1)使用全连接层数据进行bounding box预测,这会丢失较多的空间信息,导致定位不准。YOLOv2借鉴了Faster R-CNN中的anchor思想:简单理解为卷积特征图上进行滑窗采样,每个重心预测9种不同大小和比例的anchor。总的来说就是移除全连接层(以获得更多空间信息)使用anchor boxes去预测bounding boxes。并且,YOLOv2由anchor box同时预测类别和坐标。

Convolutional with Anchor Boxes具体做法:

  • 去掉最后的池化层确保输出的卷积特征图有更高的分辨率。
  • 缩减网络,让图片输入分辨率为416*416,目的是让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个center cell。因为作者观察到,大物体通常占据了图像的中间位置,可以只用一个中心的cell来预测这些物体的位置,否则就要用中间的4个cell来进行预测,这个技巧可稍稍提升效率。
  • 使用卷积层降采样(factor为32),使得输入卷积网络的416416图片最终得到1313的卷积特征图(416/32=13)。
  • 由anchor box同时预测类别和坐标。因为YOLO是由每个cell来负责预测类别,每个cell对应的2个bounding box负责预测坐标(回想YOLO中最后输出7730的特征,每个cell对应1130,前10个主要是2个bounding box用来预测坐标,后20个表示该cell在假设包含物体的条件下属于20个类别的概率)。YOLOv2中,不再让类别的预测与每个cell(空间位置)绑定在一起,而是全部放到anchor box中。

加入了anchor boxes后,我们来计算一下,假设每个cell预测9个anchor,那么总共会预测13139=1521个boxes,而之前的网络仅仅预测772=98个boxes。具体数据为:没有anchor boxes,模型recall 为81%,mAP为69.5%;加入anchor boxes,模型recall为88%,mAP为69.2%。YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3

YOLOv2精度优化-维度聚类

  1. Dimension Clusters(维度聚类)

在使用anchor时,Faster-RCNN中anchor boxes的个数和宽高维度往往是手动精选的先验框(hand-picked priors),如果能够一开始就选择了更高的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置。YOLOv2中利用K-means聚类方法,通过对数据集中的ground truth box做聚类,找到ground truth box的统计规律。以聚类个数k为anchor boxes个数,以k个聚类中心box的宽和高为anchor box的宽和高。

如果按照标准k-means试用贴欧式距离函数,大boxes比小boxes产生更多error。但是,我们真正想要的是产生好的IoU得分的boxes(与box的大小无关)。因此采用了如下距离度量:
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
假设有两个框,一个框是35,一个框是55
欧氏距离的计算:((5-3)2+(5-5)2)^0.5=2
IoU的计算:(35)/(55)

随着k的增大,IoU也在增大(高召回率),但是复杂度也在增加。所以平衡复杂度和IoU之后,最终得到k值为5.5聚类的重心与手动精选的boxes是完全不同的,扁长的框较少瘦高的框较多。
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
作者做了对比实验,5种boxes的avg IoU(61.0)就和Faster R-CNN的9种avg IoU(60.9)相当。说明K-means方法生成的boxes更具有代表性,使得检测任务更好学习

YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3

YOLOv2精度优化-直接位置预测

  1. Direct location prediction(直接位置预测)

使用anchor boxes的另一个问题是模型不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的(x, y)坐标时,YOLOv2没有用Faster-RCNN的预测方式。

YOLOv2位置预测值t_x, t_y就是预测边界框中心店相对于对应cell左上角位置的相对偏移值,为了将边界框中心店约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0, 1)范围内(每个cell的尺度看做1)。

作者通过使用维度聚类和直接位置预测这两项anchor boxes改进方法,将mAP提高了5%。

网络在特征图(13*13)的每个cell上预测5个anchor,每一个anchor预测5个值:t_x, t_y, t_w, t_h, t_o。如果这个cell距离图像左上角的边距为(c_x, c_y),cell对应的先验框(anchor)的长和宽分别为(p_w, p_h),那么网络预测框为下图蓝框:
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3

YOLOv2精度优化-细粒度特征和多尺度训练

  1. FIne-Grained Features(细粒度特征)

SSD通过不同Scale的Feature Map来预测Box来实现多尺度,而YOLOv2则采用了另一种思路:添加一个passthrough layer,来获取之前的26x26x512的特征图特征,对于26x26x512的特征图,经passthrough层处理之后就变成了13x13x2048的新特征图(特征图大小降低4倍,而channels增加4倍),这样就可以与后面的13x13x1024特征图连接在一起形成13x13x3072大小的特征图,然后在此特征图基础上卷积做预测。
YOLOv2的检测器使用的就是经过扩展后的特征图,它可以使用细粒度特征,使得模型的性能获得了1%的提升。

26x26x512 -> 13x13x2048 + 13x13x1024 -> 13x13x3072YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
6. Multi-Scale Training

原始YOLO网络使用固定的448448的图片作为输入,加入anchor boxes后输入变成416416,对于网络只用到了卷积层和池化层,就可以进行动态调整(检测任意大小图片)。为了让YOLOv2对不同尺寸图片具有鲁棒性,在训练的时候也考虑了这一点。

不同于固定网络输入图片尺寸的方法,没经过10批训练(10 btaches)就会随机选择新的图片尺寸。网络使用的降采样参数为32,于是使用32的倍数{320, 352, …, 608,最小的尺寸为320320,最大的尺寸为608608。调整网络到响应维度然后继续进行训练。

这种机制使得网络可以更好地预测不同尺寸的图片,同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
YOLOv2结果YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3

YOLOv3

YOLOv3模型结构

YOLOv3于2018年推出,基础框架为Darknet-53
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
YOLOv3有3个不同特征尺度的输出,分别为13x13x255,26x26x255,52x52x255。

YOLOv3一般使用416x416大小的图片作为输入,最后得到的特征图为13x13,再大一些的特征图为26x26,再大一些的特征图为52x52。

论文中YOLOv3使用COCO数据集训练,COCO数据集目标检测有80个种类,YOLOv3中每个cell有3个box,每个box还有(x, y, w, h, confidence)五个基本参数。所以3*(5+80)=255。

对于416x416的图片,YOLOv2的bounding boxes有13x13x5=845个,YOLOv3的bounding boxes有3*(1313+2626+52*52)=10467个。

YOLOv3先验框设置

YOLOv2已经开始采用K-means聚类得到先验框的尺寸,YOLOv3延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:10x13, 16x30, 33x23, 30x61, 62x45, 59x119, 156x198, 373x326。

分配上,在最小的13x13特征图上(有最大的感受野)应用较大的先验框116x90, 156x198, 373x326, 适合检测较大的对象。中等的26x26特征图上(中等感受野)应用中等的先验框30x61, 62x45, 59x119, 适合检测中等大小的对象。较大的52x52特征图上(较小的感受野)应用较小的先验框10x13, 16x30, 33x23, 适合检测较小的对象。
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3
YOLO-V3先验框
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3

YOLOv3代价函数修改

YOLOv3对类别预测的代价函数进行了修改,但是没有使用softmax。首先说明一下为什么不用softmax,原来分类网络中的softmax层都是假设一张图像或一个object只属于一个类别,但是在一些复杂场景下,一个object可能属于多个类,比如你的类别中有woman和person这两个类,那么如果一张图像中有一个woman,那么你检测的结果中类别标签就要同时有woman和person两个类,这就是多标签分类。

所以YOLOv3用逻辑回归层来对每个类别做二分类。逻辑回归层主要用到sigmoid函数,该函数可以将输入约束在0到1的范围内,因此当一张图像经过特征提取后的某一类输出经过sigmoid函数约束后如果大于0.5,就表示属于该类,这样一个框就可以预测多个类别。代价函数用的是sigmoid的交叉熵。

YOLO-V3结果
YOLO目标检测系列 YOLOv1, YOLO9000(v2), YOLOv3