YOLO以及YOLOv2综述以及对比

YOLO及YOLOv2综述

最近在阅读yolo系列的文章,以下将对yolo以及yolov2做个综述

YOLO

YOLO核心思想:从R-CNN到Fast R-CNN一直采用的思路是proposal+分类 (proposal 提供位置信息, 分类提供类别信息)精度已经很高,但是速度还不行。 YOLO提供了另一种更为直接的思路: 直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。

先复习一下faster-rcnn中的proposal+分类的过程:

YOLO以及YOLOv2综述以及对比_第1张图片
首先是常规的conv layers操作:conv+relu+pooling层,生成的feature maps是共享的,一路经过RPN生成proposal,一路到ROIPooling层,结合proposal进入全连接层。全连接层有两路输出,一个为bbox的第二次回归结果,一个是被预测的bbox中物体的分类。YOLO以及YOLOv2综述以及对比_第2张图片

YOLO的主要特点

  • 速度快
  • 使用全图作为环境信息,把背景错认为物体的错误比较少。
  • 泛化能力强

大致流程

  • Resize成448*448,图片分割成7*7的cell

  • CNN提取特征和预测: 卷积负责提取特征,全连接层负责预测。(和faster-rcnn有些不同:RPN中卷积层后输出anchor,每个anchor都有4个用于回归的变换量

  • bbox的坐标:xywh

  • 是否有物体的confidence

  • 预测物体的概率

  • 筛除bbox(nms)

网络结构

YOLO以及YOLOv2综述以及对比_第3张图片
(模型中采用1x1的卷积层减少运算量)
模型最后输出7x7x30的张量,可以看到输出的channel为30。在一个cell中,前20是类别概率值,然后是两个边界框的confidence,最后八个是两个边界框的(x,y,w,h)。由此可以看出,一个cell预测两个bbox,一个预测值包含confidence和(x,y,w,h)。这两个predictor只能预测同一个目标。所以,一个cell无法预测多个目标。

  • 为何一个cell不能预测多个目标呢:

    两个predictor不知道自己该负责那个目标。

  • 为何要有两个predictor呢:

    在训练的时候会在线地计算每个predictor预测的bounding box和ground truth的IOU,计算出来的IOU大的那个predictor负责预测这个物体,另外一个则不预测。这样做的话,实际上有两个predictor来一起进行预测,然后网络会在线选择预测得好的那个predictor(也就是IOU大)来进行预测。

训练过程:

预训练分类网络: 使用模型中前20个conv+maxpooling+fc 在这里输入是224×224
训练检测网络: 4个conv+2个fc ;由于检查需要细粒度的视觉信息,所以输入resize成448×448

  • 一个模型被分成了7×7个网格(cell),物体的中心落入了哪个cell,哪个cell就对这个物体做出预测。最后输出7×7×30,其中每个1×1×30都对于一个cell的输出结果。30为channel输出通道YOLO以及YOLOv2综述以及对比_第4张图片
    首先计算confidence:
    confidence
    当物体的中心落入cell,Pr(Object)=1,confidence变成1xIOU,当物体中心没有落入cell,Pr(Object)=0,confidence=0。
    bbox预测:
    x,y表示bbox中心到cell左上角坐标的偏移量,w,h则是相对于整张图片的宽高进行归一化。x,y,w,h的区间在[0,1].通常回归问题都要做归一化,否则可能导致各个输出维度取值范围差距很大,网络会关注较大的误差。
    类别预测:

    对于物体中心落在的cell,计算概率。

训练细节

  • 最后一层和其他层的激活函数:
    在这里插入图片描述

  • 损失函数:
    YOLO以及YOLOv2综述以及对比_第5张图片
    平方差损失函数很容易优化,但是不能把localization和classify等同对待,并且有部分网格不包含Object,它们的confidence为0(这一块的平方差会非常大),这样算出的loss会使模型不稳定。所以增加了权重,用于localization的xywh的权重置为5,没有Object的bbox在计算confidence时,权重置为0.5。
    为了减小取值大的w和h的影响,采取了开方的办法,这样小数值的w和h开方之后,数值变化的幅度会增大,大数值的相对就会小一点。

  • 训练参数:在VOC2007和VOC2012上训练了135个epoch,batchsize=64,decay=0.0005. 关于学习率,如果在一开始使用高学习率,模型会不稳定,第一个epoch,lr=10-3,然后升至10-2,30个epoch后将至10-3,30epoch之后再将至10-4。为了避免过拟合,使用了dropout和数据增强。第一个全连接层之后使用dropout,rate=0.5。

测试过程:

每个网格预测的class信息和bbox的confidence相乘,得到每个bounding box的class-specific confidence score。
在这里插入图片描述
得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
关于测试阶段的confidence怎么计算,有知乎大佬说:测试阶段,网络只是输出了confidece这个值,但它已经包含了 Pr(Object)×IOU,并不需要分别计算Pr(object)和IOU(也没办法算)。因为你在训练阶段你给confidence打label的时候,给的是Pr(Object)×IOU这个值,测试的时候,网络吐出来也是这个值。

局限性

  • YOLO对边界框预测施加了强烈的空间约束,因为每个网格单元格只能预测两个框,并且只能有一个类。这种空间约束限制了我们的模型能够预测的物体数量。我们的模型在处理以群体形式出现的小物体时遇到了困难,比如成群的鸟。
  • 由于我们的模型学会了从数据中预测边界框,所以它很难推广到新的或不常见的边界框。
  • 损失函数对于小bbox和大bbox中的loss的处理是一样的。大bbox里的小错误通常是可以忽略的,但小bbox里的小错误对IOU的影响要大得多。错误是因为不正确的localizations。

YOLOv2

为了增加localization的准确性,检测的召回率,可检测类别的数量和检测的速度。该论文提出了一种联合训练算法:检测图像用于训练localization,分类图像用于增加词汇量和鲁棒性。该论文首先介绍了YOLOv2,然后使用了ImageNet中的9000多个类和COCO的检测数据进行模型训练,得到的模型是YOLO9000。
YOLOv2没有扩大模型的深度,也没有做多模型融合来提高recall和localization,为了增加检测速度,YOLO做了模型的精简。
YOLO以及YOLOv2综述以及对比_第6张图片
以上的举措除了convolutional和anchor boxes之外都能使mAP显著增加。在使用new network情况下,使用anchor boxes在不改变mAP的情况下增加了recall,同时减少了33%的计算量。

Better

  • Batch Normalization:YOLO那时候还没有BN层,现在加上BN层可以起到正则化的作用。荣誉感模型中没有出现过拟合,则可以删去dropout。

  • High Resolution Classifier:从Alexnet开始,大多数的分类器输入都是256×256,YOLO在训练分类器时输入为224×224,在检测时输入448×448,网络存在一个切换过程,在YOLOv2中,增加了用448×448来finetune分类器的过程(10epoch)。

  • Convolutional With Anchor Boxes:YOLO使用全连接层来预测bbox的坐标信息,faster-RCNN使用卷积层(上文有提到过)。该论文摒弃了全连接层,使用卷积层和anchor boxes来预测bbox。首先,模型去掉了一个Pooling层来获得更高的分辨率,同时缩小了输入的分辨率:416×416. 模型有32层,最后输出为13×13。因为个数为奇数的特征图一定有一个中心单元格,一般大的物体都倾向于占据图像的中心,所以最后在中心有一个单独的cell来预测这个物体。在YOLO中每个cell都预测两个bbox,这两个bbox都预测同一类物体。在YOLOv2中,使用了anchor boxes,每个cell的各个anchor都单独预测一套分类概率值。

  • Dimension Cluster :为了预测anchor boxes,论文用了聚类的方法。在训练集的bbox上使用K-means,来找到好的先验。但是如果使用欧式距离(标准的K-means),大的bbox会比小的bbox出现更多的错误。最好的聚类是对IOU的聚类,所以对于聚类的“距离”计算,论文使用如下公式:在这里插入图片描述
    取不同的K值测试:YOLO以及YOLOv2综述以及对比_第7张图片
    发现K=5时,对于recall和模型复杂度有最好的折中。YOLO以及YOLOv2综述以及对比_第8张图片

  • Direct location prediction:在使用anchor boxes中会出现模型不稳定,尤其是在早期的迭代,不稳定的原因是对于box的location的预测。预测值是坐标偏移值(tx,ty),先验框尺寸(Wa,ha),中心坐标(Xa,Ya)。bbox的实际中心坐标为(X,Y)。则以下计算公式:
    在这里插入图片描述
    但是这种计算公式是无约束的,预测的bbox可以向任意方向偏移,如当 时边界框将向右偏移先验框的一个宽度大小,而当 时边界框将向左偏移先验框的一个宽度大小,因此每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的offsets。所以,YOLOv2弃用了这种预测方式,而是沿用YOLOv1的方法,是预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。总结来看,根据边界框预测的4个offsets(tx,ty,tw,th,to),可以按如下公式计算出边界框实际位置和大小:
    YOLO以及YOLOv2综述以及对比_第9张图片
    (Cx,Cy)是cell的左上角坐标,由于每个cell的尺度为1,而tx,ty经过sigmoid处理后的范围为(0~1),故预测的bbox的中心只能在当前cell内移动。,(Pw,Ph)是先验框具有的长度和宽度。它们的值也是相对于特征图大小的。这里记特征图的大小为 (W,H)(论文中是13×13)。这样可以将bbox相对于整张图片的位置和大小计算出来(4个值均在0和1之间):
    YOLO以及YOLOv2综述以及对比_第10张图片
    如果再将上面的4个值分别乘以图片的宽度和长度(像素点值)就可以得到bbox的最终位置和大小了。这就是YOLOv2边界框的整个解码过程。约束了边界框的位置预测值使得模型更容易稳定训练。YOLO以及YOLOv2综述以及对比_第11张图片

  • Fine-Grained Features:对于较小的物体来说,需要更细粒度的特征。为了采集到更细粒度的特征,论文里添加了一个passthrough层,这一层是26×26的特征图,也就是最后一个MaxPooling之前的特征。这种操作和Resnet很像,它把前面高分辨率的特征和后面低分辨率的特征合并在一起,为了保持合并时shape的一致性,passthrough层将该特征张量向后展开。26×26×512–>13×13×2048,这样就能和下一层的低分辨率的特征连接。

  • Multi-Scale Training:YOLOv2的模型只使用了卷积层和池化层,他可以处理不同尺寸的输入。我们希望YOLOv2可以在不同大小的图像上运行,所以我们不固定输入图像的大小,每过几个epoch就改变输入尺寸。由于采样系数是32,所以输入的尺寸都是32的倍数:{320,……,608}。这样可以使网络适应不同输入维度的检测。在较小尺寸的输入下,运行的更快。YOLO以及YOLOv2综述以及对比_第12张图片

Faster

  • Darknet-19:使用3×3的filter,每个Pooling层后将channel加倍,在network in network之后使用global average pooling,最后使用1×1的filter压缩特征。模型中使用了BN层。在最终的模型中,使用了19个卷积层和5个Pooling层YOLO以及YOLOv2综述以及对比_第13张图片

  • Training for classification:使用标准的ImageNet1000,训练160epoch,使用随机梯度下降,初始学习率为0.1,多项式速率衰减为4,权重衰减为0.0005,动量为0.9。数据处理使用了标准的数据增强。再用448的size微调的时候,学习率为10-3,训练10epoch.

  • Training for detection:删除最后一个卷积层,增加3×3×1024个filters+1×1×检测的类别数量的filters。VOC数据集,预测5 boxes×(5 coordinate+20classes),所以VOC数据集最后一层卷积层filters有125个。

Stronger

在训练过程中,我们混合了检测和分类数据集的图像。当我们的网络看到标记为检测的图像时,我们可以基于完整的YOLOv2损失函数进行反向传播。当它看到一个分类图像时,我们只从架构的特定分类部分反向传播。
用于分类和检测的数据集的粒度不相同。分类数据集粒度更细,比如一只狗狗可以分为不同的品种,但是检测的数据集对于狗狗的标签并没有这么细。在softmax分类中,各个标签是互相独立的。这就会导致在检测和分类中不同的标签不一定是互相独立的(分类中互相独立的狗狗标签在检测中统一标为狗狗)。所以使用一种多标签的model来混合数据集,假设一个图片可以有多个分类信息,并假定分类信息必须是相互独立的规则可以被忽略。
主要思路是根据WordNet中各个类别的从属关系,建立树形结构物——WordTreeYOLO以及YOLOv2综述以及对比_第14张图片
WordTree中的根节点为"physical object",每个节点的子节点都属于同一子类,可以对它们进行softmax处理。在给出某个类别的预测概率时,需要找到其所在的位置,遍历这个path,然后计算path上各个节点的概率之积。
YOLO以及YOLOv2综述以及对比_第15张图片
在训练时,如果是检测样本,按照YOLOv2的loss计算误差,而对于分类样本,只计算分类误差。在预测时,YOLOv2给出的置信度就是 ,同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径,当达到某一个阈值时停止,就用当前节点表示预测的类别。YOLO以及YOLOv2综述以及对比_第16张图片
ImageNet的分类是对所有标签做softmax,现在WordTree只需要对同一类近义词做softmax,它能对于近义词有更好的分辨性。当遇见未知的物体时,性能就会降低的很gracefully。当它无法细分到某一个label的时候,由于一个物体会有多标签,它会分到一个比较粗略的标签。

总结

  • YOLOv2比其他检测系统在各种检测数据集的速度更快。此外,它可以适应各种图像大小,以提供速度和精度之间的权衡。
  • YOLO9000是一个实时框架,通过合并优化检测和分类,检测超过9000个对象类别。它使用WordTree将来自不同来源的数据与模型相结合,在ImageNet和COCO上同步训练。
  • ImageNet的WordTree表示为图像分类提供了更丰富、更详细的输出空间。使用层次分类的数据集组合将有助于分类和分割领域。
  • 像多尺度训练这样的训练技巧可以提升模型训练结果。

你可能感兴趣的:(CV大白菜)