1.YOLOv1:9 May 2016

1.1YOLO简介

YOLO算法中把目标检测(object detection)问题处理成回归问题,用一个CNN结构就可以从输入图像直接预测bounding box和类别概率。
YOLO是一种通用的检测器,可以学习同时检测多个目标。
YOLO是基于图像的全局信息进行预测的,且可以end-to-end训练。YOLO不是试图优化大型检测流程的单个组件(two-stage),而是完全抛弃流程(pipeline),被设计为快速检测(one-stage)。
YOLO的速度非常快,实时检测速度:45 ~150fps。
YOLO可以学到物体的通用表示(generalizable representations),可以理解为泛化能力强。
image.png
【评估指标】:
image.png

1.2训练阶段

  • 【网格设计】将输入图像分为 目标检测3 - 图3 个网格(grid),如果一个目标(object)的中心落入一个网格单元中,该网格单元负责检测该目标。每个grid网格单元预测 目标检测3 - 图4 个边界框(bbox),每个bbox由5个预测值组成:目标检测3 - 图5

(假设原始图像大小是224224,不断提取特征然后sample得到的feature map(缩小了32倍),然后就是把输入图像划分成77个grid cell,这样原始图像中的32个像素点就对应一个grid cell)

  • 【定位】目标检测3 - 图6坐标表示bbox框相对于grid网格边界的中心,将bbox框目标检测3 - 图7坐标参数化为当前grid网格位置的偏移量,使它们边界在0和1之间。目标检测3 - 图8是相对于整张图像预测的,通过图像宽度和高度来规范bbox框的目标检测3 - 图9,使它们落在0和1之间。
  • 【定位】目标检测3 - 图10置信度分数反映了边界框(bbox)是否包含目标的信心(即 Pr概率),以及它预测bbox的准确程度(即 IOU):目标检测3 - 图11

    如果该单元格中不存在目标,则置信度分数=0;如果存在,Pr=1,置信度分数=IOU。
    【问题】如何判断grid网格单元中是不是有目标存在?
    如果一个object的ground truth的中心点(真实框的两条对角线的交点)坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。
    在训练时,每个目标只需要一个bbox框预测器来负责预测。哪个预测框与真实值之间具有当前最高的IOU,就指定那个预测器来预测目标。这样每个预测器可以更专业,更好地预测特定大小,方向角,或目标的类别,从而改善整体召回率。

  • 【分类】每个grid网格单元还预测目标检测3 - 图12个条件类别概率目标检测3 - 图13,即一个grid cell在包含object的条件下属于某个类别的概率。每个grid网格只预测一组类别概率,不管bbox框的数量有多少。每个网格单元只预测两个bbox框,只能有一个类别。

image.png

YOLO网络结构

将YOLO作为卷积神经网络来实现,网络的初始卷积层从图像中提取特征(一共24个卷积层),而全连接层预测输出概率和坐标(一共2个全连接层)。
论文中,先用前20个卷积层在ImageNet上做1000个分类的预训练,预训练完成后,再添加卷积层和全连接层(因为有助于提高表现,再添加4个卷积层和2个全连接层,随机初始化权重)并将模型用于目标检测。
image.png
image.png

1.3 损失函数设计

  • 论文中使用平方和误差,因为它容易优化。
  • 在每张图像中,许多grid网格单元不包含任何目标,这些单元格的“置信度”分数为零,这可能导致模型不稳定,从而导致训练早期发散。所以,需要增加bbox边界框坐标预测损失,并减少了不包含目标的bbox边界框的(类别)置信度预测损失。

    论文中使用来目标检测3 - 图17约束损失,e.g.目标检测3 - 图18

  • 在大的bbox框中出现小偏差的重要性,应该小于在小的bbox框中出现小偏差的重要性。大边界框的小误差通常是良性的,但小边界框的小误差对IOU的影响要大得多。我们的主要错误来源是不正确的定位。所以,直接预测bbox框的宽度和高度的平方根,这样更精确的反映问题。

(e.g.原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7)
image.png
image.png表示目标是否出现在第i个grid网格单元中,包含object时系数为1。
如果目标存在于该grid网格单元中(即条件类别概率),则损失函数仅惩罚分类错误。如果预测器“负责”ground truth框(即该grid网格中具有最高IOU的预测器),则仅惩罚边界框坐标错误。
如果训练集中某一个GT对应的bbox中心恰好落在了输入图像的某一个grid cell中,这个grid cell就负责预测此物体的bbox,于是这个grid cell所对应的objectness score(置信度)就被赋予1,否则为0。

1.4测试阶段

将bbox框的置信度分数乘以目标的类别概率:
目标检测3 - 图21
结果就是该bbox框属于某个类别的置信度分数,这个分数表明了在该bbox框中出现某个类别的概率(分类),以及该bbox框拟合目标的程度(定位)。
在Pascal VOC上评估YOLO,论文中目标检测3 - 图22,最终预测是一个目标检测3 - 图23的张量,即目标检测3 - 图24。所以在一张图上,最终需要预测出7x7x2=98个bbox框,以及对应每个bbox框的一共98个类别概率。
【区别】
目标检测3 - 图25条件类别概率是针对每个grid网格而言的,是每个grid在包含目标的条件下属于某个类别的概率;
目标检测3 - 图26是针对bbox框而言的,是某个bbox框属于某个类别的置信度分数。
image.png
image.png
每个1*30的向量前5个元素表示第一个bounding box的4个坐标和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别。这个向量的30个元素都是预测的结果。
测试时,虽然无法计算IOU(没有Ground Truth),但是由训练好的权重已经直接计算出了bounding box的confidence,然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。
通过计算某个bbox属于某类别的置信度分数,最后得到目标检测3 - 图29大小的置信度分数矩阵,每一行代表一个类别,将每个类别的一共98个分数,通过阈值过滤(小于阈值的得分设为0)、排序、NMS(重复的框得分设为0),最后,某个bbox的20个分类得分中,取最大的分数且分数应该,这个bbox框就是这个分数对应类别的预测框。
image.png

1.5YOLO与Fast R-CNN

定位错误占YOLO错误的大多数;Fast R-CNN使定位错误少得多,但背景错误更多,Fast R-CNN比YOLO预测背景检测的可能性高出近3倍。
通过使用YOLO消除Fast R-CNN的背景检测,可以获得显著的性能提升。对于R-CNN预测的每个边界框,我们检查YOLO是否预测一个类似的框。
YOLO对边界框预测强加空间约束,因为每个网格单元只预测两个bbox,只能有一个类别。这个空间约束限制了模型可以预测的邻近目标的数量。
image.png

2.YOLOv2

2.1 YOLOv1/v2对比

YOLO v2是YOLO v1的升级版。YOLO v1有两个缺点:定位不准确;和基于region proposal的方法相比召回率较低。因此YOLOv2主要是要在这两方面做提升:提升预测和定位的准确率;突破模型的空间约束限制。
image.png

对比项 YOLO v1 YOLO v2
Batch Norm 没有批量归一化层 每个卷积层都添加了BN层
Net structure GoogleNet:24 Conv +4Pooling+ 2 FC DarkNet:19 Conv+5Pooling
passthrough 连接了最后两层的输出,类似ResNet
图像分辨率 预训练时用224x224,
检测时用448x448
预训练时分别用了224x224、448x448,
检测时用448x448
multi-scale 输入图片大小:448x448 训练时输入是动态随机选择不同的大小:32倍数
anchor box FC层直接预测bbox坐标;每个gird cell生成2个bbox,共98个box。 引入anchor box;每个grid cell生成9个anchor box,共1521个box;
使用k-mean对boxes进行聚类;
预测相对于cell的坐标位置。

2.2Batch Normalization

YOLO v1(采用的是GoogleNet网络提取特征)是没有BN层的,在YOLOv2中,为每个卷积层都添加了BN层,加入BN后就把dropout去掉了。实验证明添加了BN层可以提高2%的mAP。

2.3DarkNet-19

YOLO v1中采用的训练网络是基于GoogleNet,有24个卷积层和2个全连接层。计算复杂度方面,GoogleNet在一次前向传播中有8.52 billion次运算,VGG-16则需要30.69 billion次运算,但准确率方面,VGG-16要好于GoogleNet。
YOLO v2基于DarkNet-19作为新的分类模型,分别从网络结构和训练方式两方面入手提高了主网络的分类准确率。
【网络结构】YOLO v2中有19个卷积层和5个池化层(最后用average pooling层代替FC层进行预测)。DarkNet-19处理一张图片只需要5.58 billion次运算。在ImageNet上Top-5准确率是91.2%,Top-1准确率是72.9%。
【训练方式】在ImageNet上从头开始训练Darknet-19,160个epoch,输入图像的大小是224224;再采用448448的输入fine-tuning 网络,训练10个epoch,结果表明fine-tuning后的top-1和top-5的准确率都得到了提高。在ImageNet上训练完之后,再把网络移植到detection,并开始基于检测的数据再进行fine-tuning。
在YOLOv1中,类别概率是由grid cell来预测的,每个bbox对应5个预测值,网络输出为7x7x30;
在YOLOv2中,每个bbox对应一个类别概率,每个box对应25个预测值(5个坐标加20个类别值)。

2.4Fine-Grained Features

YOLO v2添加了一个层:passthrough layer,将1313的feature map和前面一层的2626的feature map进行连接,有点像ResNet。
因为13*13的feature map对于预测大的object以及足够了,但是对于预测小的object就不一定有效。越小的object,经过层层卷积和pooling,可能到最后都不见了,通过合并前一层的size大一点的feature map,可以有效检测小的object。
image.png

2.5High Resolution Classifier

YOLO v1网络在预训练的时候采用的是224224的输入(ImageNet数据集),在detection的时候采用448448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。
YOLO v2则将预训练分成两步:先用224224的输入从头开始训练网络160个epoch,然后再将输入调整到448448,再训练10个epoch,最后再在检测的数据集上fine-tuning,这样在detection的时候用448*448的图像作为输入就可以顺利过渡了。实验表明这样可以提高几乎4%的MAP。

2.6Multi-scale Training

YOLO v1中输入图片大小是448x448,YOLO v2中改为了416x416,并且因为网络结构中只使用卷积层和池化层,图像的大小可以动态改变。
在训练时使用了不同大小的图片来增强鲁棒性,训练时每隔几个迭代(10 batches)网络就会随机选择另一种size的输入。由于模型以32倍的因子进行下采样,使用的图片大小范围为目标检测3 - 图34,这种训练方式使得相同网络可以对不同分辨率的图像做detection。
YOLO v2可以在不同的分辨率尺寸上运行,并在速度和准确率方面做了很好的trade-off,每一个YOLO v2模型实体使用的是同样的训练模型和同一套参数,只是在不同的分辨率上做了评估。
image.png

2.7Anchor box

YOLOv2借鉴了Faster R-CNN的思想,引入anchor。首先将原网络的FC层和最后一个pooling层去掉,使得最后的卷积层可以有更高分辨率的特征;然后缩减网络,用416416大小的输入代替原来448448,网络最终将416416的输入变成1313大小的feature map输出,缩小比例为32,这样得到的特征图都有奇数大小的宽和高。
【问题】为什么要得到奇数大小宽高的特征图?
奇数大小的宽和高会使得每个特征图在划分cell的时候就只有一个center cell(比如可以划分成77或99个cell,center cell只有一个,如果划分成88或1010的,center cell就有4个),大的object一般会占据图像的中心,所以希望用一个center cell去预测,而不是4个center cell去预测。
YOLOv2通过引入anchor boxes,预测的box数量超过了1千(每个grid cell有9个anchor box的话,一共就是13139=1521个,最终每个grid cell选择5个anchor box),增加box数量是为了提高object的定位准确率。

Dimension Clusters:自动选择box

Faster RCNN是在网络训练中调整anchor box的尺寸,YOLOv2希望一开始就能选择到合适尺寸的anchor box,采用了k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。
k-means计算距离时,使用目标检测3 - 图36,这样聚类的误差和box的尺寸大小无关。当k=5时,在模型复杂度和recall方面有较好的trade-off。
image.png

Direct Location Prediction

Faster R-CNN中,通过预测偏移量目标检测3 - 图38来对anchor box进行调整,得到预测的边框。在YOLO模型上采用anchor boxes时模型不稳定性,大部分不稳定因素来源于预测boxes位置(x,y)。因此,YOLO v2没有采用直接预测offset的方法,还是沿用了YOLO算法中直接预测相对于grid cell的坐标位置的方式。
每个grid cell最终生成5个bbox,网络需要为每个bbox预测5个offset值:目标检测3 - 图39目标检测3 - 图40类似于YOLO v1中的confidence,目标检测3 - 图41
目标检测3 - 图42是先验框(anchor box,代表先验知识prior)的宽和高;目标检测3 - 图43sigmoid函数将值约束在0~1内,保证了grid cell预测的框位于当前cell内。
image.png

2.8损失函数设计

和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个grid cell内,那么该cell内的5个先验框(prior)所对应的边界框负责预测它(IOU最大的负责),YOLOv2同样需要假定每个cell至多含有一个grounth truth。
YOLOv1中采用的是平方根以降低boxes的大小对误差的影响,而YOLOv2是直接计算,但是根据ground truth的大小对权重系数进行修正,这样对于尺度较小的boxes其权重系数会更大一些,起到和YOLOv1计算平方根相似的效果。
prior:先验框,即anchor box。
b:预测框。
image.png

3.YOLO9000:25 Dec 2016

YOLO9000的主要检测网络是YOLO v2,只是为了限制输出大小,每个grid cell只采用3个bbox,而不是5个。结合分类和检测数据集使得训练得到的检测模型可以检测约9000类物体,YOLO9000从构造数据集和模型训练两方面入手。
提出YOLO9000的原因主要是目前检测的数据集数据量较小,而分类数据集的量较大,因此利用数量较大的分类数据集来帮助训练检测模型。(分类数据集的标签label范围更广,ImageNet上有100多个品种的狗;检测数据集的标签label较粗糙,是通用意义上的,比如:狗、猫、船)

3.1构造数据集:WordTree

ImageNet的标签来自WordNet,WordNet是一个语言数据库,它构造了概念以及概念间的联系,WordNet是一种有向图的结构,而不是树(tree),e.g.“狗”既是“家畜”也是“犬类”。
为了简化问题,YOLO9000对ImageNet中的类别概念构建了一个树:WordTree,树中任意一个节点只属于唯一一个节点。判断一张图片是不是某个类别(e.g. Norfolk terrier),就计算这个类别节点到根节点之间的条件概率的乘积。
image.png
image.png

上下位词,就是具有上下位关系的词。上位词和下位词具有种和属的关系,种和属的关系本质上是一般和个别的关系。上位词的适用对象大于下位词(hyponyms)的适用对象,下位词表示的对象特征比上位词表示的对象特征更为丰富。

使用WordTree将多个数据集组合在一起,并将数据集中的多个类别映射到WordTree中的同义词集。e.g.WordTree组合了COCO和ImageNet中的标签label。
预测时,如果网络模型看到一只狗,但不确定狗的品种,模型会预测为“狗”(“狗”标签的置信度高),但具体某个狗品种标签的置信度低。
image.png
image.png

3.2模型训练:Joint training

训练时使用了COCO检测数据集和top 9000个类别的ImangeNet分类数据集,数量比例是1:4。YOLO9000使用了YOLOv2的模型架构,使用COCO数据集来学习检测,使用ImageNet数据集来学习分类。

4.YOLOv3:8 Apr 2018

4.1 YOLO简单对比

YOLOv1 YOLOv2 YOLOv3
YOLO思想 通过特征提取网络对输入图像提取特征,得到一定size的feature map;
将输入图像划分grid cell(e.g.7x7,13x13);
如果GT某个object的中心坐标落在哪个grid cell中,就由该grid cell来预测该object,而每个grid cell都会预测固定数量的bounding box,只有和ground truth的IOU最大的bounding box才是用来预测该object的。
S 7x7 13x13 13x13
B 2 5 3
C 20 20 80
output FM SxSx(B*5+C) SxSxB*(5+C) SxSxB*(5+C)
YOLOv2 YOLO9000 YOLOv3
bbox预测 引入anchor boxes;
使用维度聚类;
类别预测 单标签多分类 多标签多分类
多尺度预测 passthrough layer upsample,
三个尺度的特征融合
网络结构 DarkNet-19 DarkNet-53
全卷积、residual

4.2YOLOv3的特点

多标签多分类

YOLOv3在网络结构上将原来用于单标签多分类的softmax层换成用于多标签多分类的逻辑回归层。因为一个object可能属于多个类,需要用逻辑回归层来对每个类别做二分类。
Softmax层被替换为一个1x1的卷积层+logistic激活函数的结构。

多尺度预测

在YOLO v3中采用了多个scale(13x13,26x26,5252)的特征融合,获取前两层的feature map并做2倍的上采样(upsample),类似FPN,将三个scale的层拼接合并,再通过添加更多的卷积层来处理拼接合并后的feature map,最终生成预测的张量。在多个scale的feature map上做检测,对于小目标的检测效果提升还是比较明显的。YOLO v3中每个grid cell预测3个bounding box,经过多尺度的特征融合后,(以输入图像为416416为例)预测bbox的数量为:(1313+2626+5252)3;而YOLO v2中每个grid cell预测5个bounding box,一共预测13135个bbox。
image.png
关于bounding box的初始尺寸还是采用YOLO v2中的k-means聚类的方式来做,这种关于box大小的先验信息极大地帮助网络准确的预测每个box的offset/coordinate,从直观上,大小合适的box将会使网络更快速精准地学习。在COCO数据集上得到的9种聚类结果:(1013); (1630); (3323); (3061); (6245); (59119); (11690); (156198); (373*326)。
image.png
如上所述,YOLOv3一共用了三个目标探测层(13x13,26x26,52x52),每个探测层都分别独立进行下面的预测,差异在于其目标物尺寸不同,三个探测层上用9个大小不同的矩形框进行探测,可以更好得识别出图片上大大小小的目标物。image.png

网络结构:特征提取

YOLOv3中使用DarkNet-53作为特征提取层,而YOLOv2中使用DarkNet-19(19个卷积层+5个池化层)。
DarkNet-53使用了全卷积(连续的3x3,1x1卷积),没有FC层,所以可以输入任意大小的图像;引入了residual残差结构,因此训练深层网络的难度更小,网络可以更深。Darknet-53只是特征提取层,因此multi-scale的特征融合和预测支路并没有在该网络结构中体现。
image.png
image.png

4.3损失函数设计

YOLOv3中有三个不同大小的目标探测层(Detection layers),每一层都需要计算loss,每一层都用了85(=4+1+80)个维度计算loss,最后将loss加和进行反向传播。每一层的loss都由四个部分组成:

  • MSE:根据bbox的(x,y,w,h)坐标计算MSE。
  • BCE:计算一个bbox含有目标物(obj)的得分(置信度)。
  • BCE:计算一个bbox不含有目标物(noobj)的得分(置信度)。
  • BCE:计算一个bbox是多个类别的预测。

根据GT(labelled targets),创建Obj Mask,它表明哪些bbox负责预测,也创建Noobj Mask,它表明哪些bbox不负责预测。有了Mask,就可以对比target和prediction,用于计算Loss。
image.png


来源: 1.YOLO论文:https://arxiv.org/abs/1506.02640 2.YOLO算法详解:https://blog.csdn.net/u014380165/article/details/72616238 3.YOLOv2算法详解:https://blog.csdn.net/u014380165/article/details/77961414 4.YOLOv2原理与实现:https://blog.csdn.net/l7H9JA4/article/details/79955903 5.YOLOv3算法详解:https://blog.csdn.net/u014380165/article/details/80202337 6.近距离观察YOLOv3:https://zhuanlan.zhihu.com/p/40332004 7.YOLOv3:https://zhuanlan.zhihu.com/p/93273011 8.Calculating Loss of YOLOv3:https://towardsdatascience.com/calculating-loss-of-yolo-v3-layer-8878bfaaf1ff