美文网首页目标检测与识别
YOLO v1--v2--9000:you only look

YOLO v1--v2--9000:you only look

作者: cv老顽童 | 来源:发表于2017-08-02 21:06 被阅读19次

    YOLO_V1

    用单一的网络对整张图做一次评估就可得到目标边界框和类别

    算法过程:

    1.将图片分成S XS个格子,

    2.将整个图片送入深度神经网络,预测每个格子是否存在目标、目标的边界框、目标的类别

    3.将预测的边界框做非最大抑制(NMS)筛选出最好的边界框,从而得到最好的结果。如下图所示

    训练时每次运行整个模型需要用到的数据包括图片img,图片中目标的类别c,目标边界坐标(x,y,w,h)x,y是正式目标中心坐标,w,h为目标宽高。如上图S=7,那么要判断49个区域是否存在目标及其位置,显然比基于区域建议的方法判断成百上千的区域便利多。最后对整张图的目标位置类别的预测可以用一个SxS(Bx5+C)的张量来表示,B表示图中每个格子要预测的目标边界框数量如上文中B=2,表示一次预测两个边界框,每个网格要预测B个boundingbox,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。 这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:

    其中如果有object落在一个grid cell里,第一项取1,否则取0。第二项是预测的bounding box和实际的groundtruth之间的IoU值。每个bounding box要预测目标边界框(X,Y,W,H)和这个格子对于目标的置信分数conf,共5个参数,C表示数据集的目标的类别数量。在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。

    在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:

    等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。

    整个网络结构如下图所示

    包含24层CNN,2层FC

    YOLO的实现细节:

    每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。其中坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。

    这种做法存在以下几个问题:

    第一,8维的localization error和20维的classification error同等重要显然是不合理的;

    第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。

    解决办法:

    更重视8维的坐标预测,给这些损失前面赋予更大的loss weight,记为

    在pascal VOC训练中取5。对没有object的box的confidence loss,赋予小的loss weight,记为在

    pascal VOC训练中取0.5。有object的box的confidence loss和类别的loss的loss weight正常取1。对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。

    一个网格预测多个box,希望的是每个box predictor专门负责预测某个object。具体做法就是看当前预测的box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization。

    损失函数如下所示

    这个损失函数中:

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

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

    其他细节:

    使用激活函数使用leak RELU,模型用ImageNet1000类的数据集预训练,然后再用目标检测的数据集来微调整个网络并训练最后的预测器。

    优点:

    # 快,能学习到目标的概括性表示,当前检测和识别自然界的人时,同样可以检测识别艺术品中的人。

    缺点:

    # 定位精度差,没有基于区域建议的高,是由于只对图像做简单回归导致

    # 对小目标和目标之间的距离很近时效果不好,这是由于该算法只是对固定大小和位置的图像块做回归。

    YOLO_9000  _V2

    总体:

    1.在yolo基础上提升提出yolo v2

    2.提出了一种充分利用当前大规模分类数据集扩展当前系统的检测范围。其方法就是从层级的视角来进行目标分类,这样就可以使我们将数据资源集合使用;提出了一种联合训练算法使我们可以训练的时候同时训练检测和识别。其方法就是在使用标记好的检测图片学习目标精确的位置同时使用其类别信息提高类别的识别广度和鲁棒性-->yolo9000

    提升:

    yolo与fast rcnn 和其他region proposal方法相比有不少localization error和低recall的问题,因此主要的提高主要集中在这些方面。虽然更好的性能意味着更大更深的network或者ensemble不同模型together。然而我们依旧希望accurate but fast。

    1.Batch normalization

    神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度。解决办法之一是对数据都要做一个归一化预处理。YOLOv2网络通过在每一个卷积层后添加batch normalization,极大的改善了收敛速度同时减少了对其它regularization方法的依赖(舍弃了dropout优化后依然没有过拟合),使得mAP获得了2%的提升。

    2.High resolution classifier

    大多数的分类器的输入小于256x256,yolo的分类器是224x224,detection为448。在yolo v2中分类器finetune在全图448x448的imagenet 10个epoch。 0.4map提升

    3.Convolution with anchor boxes

    yolo直接通过在卷积提取层的顶端的全连接层预测bbox的坐标而不是像faster rcnn直接使用手预动先验选定好的并每个anchor只使用rpn的卷积提取层来预测offset和confidence,降低了问题难度,使得网络更好学习。在v2中取消了全连接层,使用anchor boxes预测bboxes.

    ①减少了一个pooling层使得卷积层输出为更高的像素。②输入从448x448降到416X416为了使得feature map为奇数,这样就有唯一的中心,yolo卷积层的downsample为32,所以最后输出为13X13,这样就极大提高了预测的bbox数量 13X13X9=1521.对recall提升很大。

    4.Dimension cluster

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

    如果按照标准k-means使用欧式距离函数,大boxes比小boxes产生更多error。但是,我们真正想要的是产生好的IOU得分的boxes(与box的大小无关)。因此采用了如下距离度量:

    聚类结果如下图:

    上面左图: 随着k的增大,IOU也在增大(高召回率),但是复杂度也在增加。所以平衡复杂度和IOU之后,最终得到k值为5。上面右图:5聚类的中心与手动精选的boxes是完全不同的,扁长的框较少瘦高的框较多(这就是统计规律的力量)。

    作者做了对比实验,5种boxes的Avg IOU(61.0)就和Faster R-CNN的9种Avg IOU(60.9)相当。 说明K-means方法的生成的boxes更具有代表性,使得检测任务更好学习。

    5.Direct location prediction

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

    在区域建议网络(RPN)中会预测坐标就是预测tx,ty。对应的中心点(x,y)按如下公式计算:

    可见预测tx=1就会把box向右移动anchor box的宽度,预测tx=-1就会把box向左移动相同的距离。

    PS: YOLOv2论文中写的是个人觉得这是错误的,因为Faster-RCNN论文里写的是下图:

    这个公式没有任何限制,无论在什么位置进行预测,任何anchor boxes可以在图像中任意一点。模型随机初始化之后将需要很长一段时间才能稳定预测敏感的物体偏移。因此作者没有采用这种方法,而是预测相对于grid cell的坐标位置,同时把ground truth限制在0到1之间(利用logistic激活函数约束网络的预测值来达到此限制)。

    最终,网络在特征图(13 *13 )的每个cell上预测5个bounding boxes,每一个bounding box预测5个坐标值:tx,ty,tw,th,to。如果这个cell距离图像左上角的边距为(cx,cy)以及该cell对应的box维度(bounding box prior)的长和宽分别为(pw,ph),那么对应的box为:

    约束了位置预测的范围,参数就更容易学习,模型就更稳定。使用Dimension Clusters和Direct location prediction这两项anchor boxes改进方法,mAP获得了5%的提升。

    6.Fine-Grained Features细粒度特征

    修改后的网络最终在13 * 13的特征图上进行预测,虽然这足以胜任大尺度物体的检测,如果用上细粒度特征的话可能对小尺度的物体检测有帮助。Faser R-CNN和SSD都在不同层次的特征图上产生区域建议以获得多尺度的适应性。YOLOv2使用了一种不同的方法,简单添加一个 passthrough layer,把浅层特征图(分辨率为26 * 26)连接到深层特征图。passthroughlaye把高低分辨率的特征图做连结,叠加相邻特征到不同通道(而非空间位置),类似于Resnet中的identity mappings。这个方法把26 * 26 * 512的特征图叠加成13 * 13 * 2048的特征图,与原生的深层特征图相连接。YOLOv2的检测器使用的就是经过扩展后的的特征图,它可以使用细粒度特征,使得模型的性能获得了1%的提升。

    7.Multi-ScaleTraining

    原始YOLO网络使用固定的448 * 448的图片作为输入,加入anchor boxes后输入变成416 * 416,由于网络只用到了卷积层和池化层,就可以进行动态调整(检测任意大小图片)。为了让YOLOv2对不同尺寸图片的具有鲁棒性,在训练的时候也考虑了这一点。不同于固定网络输入图片尺寸的方法,每经过10批训练(10 batches)就会随机选择新的图片尺寸。网络使用的降采样参数为32,于是使用32的倍数{320,352,…,608},最小的尺寸为320 * 320,最大的尺寸为608 * 608。 调整网络到相应维度然后继续进行训练。这种机制使得网络可以更好地预测不同尺寸的图片,同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。在低分辨率图片检测中,YOLOv2是检测速度快(计算消耗低),精度较高的检测器。输入为228 * 228的时候,帧率达到90FPS,mAP几乎和Faster R-CNN的水准相同。使得其更加适用于低性能GPU、高帧率视频和多路视频场景。在高分辨率图片检测中,YOLOv2达到了先进水平(state-of-the-art),VOC2007 上mAP为78.6%,而且超过实时速度要求。下图是YOLOv2和其他网络在VOC2007上的对比:

    faster

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

    1.Darknet-19

    YOLOv2使用了一个新的分类网络作为特征提取部分,参考了前人的工作经验。类似于VGG,网络使用了较多的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling)做预测,把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。使用batch normalization稳定模型训练,加速收敛,正则化模型。最终得出的基础模型就是Darknet-19,包含19个卷积层、5个最大值池化层(max pooling layers )。Darknet-19处理一张照片需要55.8亿次运算,imagenet的top-1准确率为72.9%,top-5准确率为91.2%。

    2.Training for classification

    作者使用Darknet-19在标准1000类的ImageNet上训练了160次,用随机梯度下降法,starting learning rate 为0.1,polynomial rate decay 为4,weight decay为0.0005 ,momentum 为0.9。训练的时候仍然使用了很多常见的数据扩充方法(data augmentation),包括random crops, rotations, and hue, saturation, and exposure shifts。(参数都是基于作者的darknet框架)初始的224 * 224训练后把分辨率上调到了448 * 448,使用同样的参数又训练了10次,学习率调整到了10^-3。高分辨率下训练的分类网络top-1准确率76.5%,top-5准确率93.3%。

    3.Training for detection

    为了把分类网络改成检测网络,去掉原网络最后一个卷积层,增加了三个 3 * 3 (1024 filters)的卷积层,并且在每一个卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需数量。对于VOC数据集,预测5种boxes,每个box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。

    也添加了passthrough layer,从最后3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。学习策略是:先以10^-3的初始学习率训练了160次,在第60次和第90次的时候学习率减为原来的十分之一。weight decay为0.0005,momentum为0.9,以及类似于Faster-RCNN和SSD的数据扩充(data augmentation)策略: random crops, color shifting, etc。使用相同的策略在 COCO 和VOC上训练。

    stronger

    作者提出了一种在分类数据集和检测数据集上联合训练的机制。使用检测数据集的图片去学习检测相关的信息,例如bounding box 坐标预测,是否包含物体以及属于各个物体的概率。使用仅有类别标签的分类数据集图片去扩展可以检测的种类。训练过程中把监测数据和分类数据混合在一起。当网络遇到一张属于检测数据集的图片就基于YOLOv2的全部损失函数(包含分类部分和检测部分)做反向传播。当网络遇到一张属于分类数据集的图片就仅基于分类部分的损失函数做反向传播。这种方法有一些难点需要解决。检测数据集只有常见物体和抽象标签(不具体),例如 “狗”,“船”。分类数据集拥有广而深的标签范围(例如ImageNet就有一百多类狗的品种,包括 “Norfolk terrier”, “Yorkshire terrier”, and “Bedlington terrier”等. )。必须按照某种一致的方式来整合两类标签。大多数分类的方法采用softmax层,考虑所有可能的种类计算最终的概率分布。但是softmax假设类别之间互不包含,但是整合之后的数据是类别是有包含关系的,例如 “Norfolk terrier” 和 “dog”。 所以整合数据集没法使用这种方式(softmax 模型),作者最后采用一种不要求互不包含的多标签模型(multi-label model)来整合数据集。这种方法忽略了数据集的结构(例如 COCO数据集的所有类别之间是互不包含的)

    Hierarchical classification(层次式分类)

    ImageNet的标签参考WordNet(一种结构化概念及概念之间关系的语言数据库)。例如:很多分类数据集采用扁平化的标签。而整合数据集则需要结构化标签。

    WordNet是一个有向图结构(而非树结构),因为语言是复杂的(例如“dog”既是“canine”又是“domestic animal”),为了简化问题,作者从ImageNet的概念中构建了一个层次树结构(hierarchical tree)来代替图结构方案。

    创建层次树的步骤是:

    遍历ImageNet的所有视觉名词对每一个名词,在WordNet上找到从它所在位置到根节点(“physical object”)的路径。 许多同义词集只有一条路径。所以先把这些路径加入层次树结构。然后迭代检查剩下的名词,得到路径,逐个加入到层次树。路径选择办法是:如果一个名词有两条路径到根节点,其中一条需要添加3个边到层次树,另一条仅需添加一条边,那么就选择添加边数少的那条路径。最终结果是一颗 WordTree (视觉名词组成的层次结构模型)。用WordTree执行分类时,预测每个节点的条件概率。例如: 在“terrier”节点会预测:

    如果想求得特定节点的绝对概率,只需要沿着路径做连续乘积。例如 如果想知道一张图片是不是“Norfolk terrier ”需要计算:分类时假设 图片包含物体:Pr(physical object) = 1.

    为了验证这种方法作者在WordTree(用1000类别的ImageNet创建)上训练了Darknet-19模型。为了创建WordTree1k作者天添加了很多中间节点,把标签由1000扩展到1369。训练过程中ground truth标签要顺着向根节点的路径传播:例如 如果一张图片被标记为“Norfolk terrier”它也被标记为“dog” 和“mammal”等。为了计算条件概率,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算softmax,其中“同义词集”是同一概念的下位词。

    使用相同的训练参数,层次式Darknet-19获得71.9%的top-1精度和90.4%top-5精度。尽管添加了369个额外概念,且让网络去预测树形结构,精度只有略微降低。按照这种方式执行分类有一些好处,当遇到新的或未知物体类别,预测精确度降低的很温和(没有突然巨幅下降)。例如:如果网络看到一张狗的图片,但是不确定狗的类别,网络预测为狗的置信度依然很高,但是,狗的下位词(“xx狗”)的置信度就比较低。这个策略野同样可用于检测。不在假设每一张图片都包含物体,取而代之使用YOLOv2的物体预测器(objectness predictor)得到Pr(physical object)的值。检测器预测一个bounding box和概率树(WordTree)。沿着根节点向下每次都走置信度最高的分支直到达到某个阈值,最终预测物体的类别为最后的节点类别。

    Dataset combination with WordTree

    可以使用WordTree把多个数据集整合在一起。只需要把数据集中的类别映射到树结构中的同义词集合(synsets)。使用WordTree整合ImageNet和COCO的标签如下图:

    joint classification and detection(联合训练分类和检测)

    使用WordTree整合了数据集之后就可以在数据集(分类-检测数据)上训练联合模型。我们想要训练一个检测类别很大的检测器所以使用COCO检测数据集和全部ImageNet的前9000类创造一个联合数据集。为了评估我们使用的方法,也从ImageNet detection challenge 中向整合数据集添加一些还没有存在于整合数据集的类别。相应的WordTree有9418个类别。由于ImageNet是一个非常大的数据集,所以通过oversampling COCO数据集来保持平衡,使ImageNet:COCO = 4:1。使用上面的数据集训练YOLO9000。采用基本YOLOv2的结构,anchor box数量由5调整为3用以限制输出大小。当网络遇到一张检测图片就正常反向传播。其中对于分类损失只在当前及其路径以上对应的节点类别上进行反向传播。当网络遇到一张分类图片仅反向传播分类损失。在该类别对应的所有bounding box中找到一个置信度最高的(作为预测坐标),同样只反向传播该类及其路径以上对应节点的类别损失。反向传播objectness损失基于如下假设:预测box与ground truth box的重叠度至少0.31IOU。

    采用这种联合训练,YOLO9000从COCO检测数据集中学习如何在图片中寻找物体,从ImageNet数据集中学习更广泛的物体分类。作者在ImageNet detection task上评估YOLO9000。ImageNet detection task和COCO有44个物体类别是相同的。这意味着YOLO9000只从大多数测试数据集中看到过分类数据而非检测数据。最终整体精度为19.7mAP,在从未见过的156个物体检测数据类别上精度为16.0mAP。这个结果高于DPM,但是YOLO9000是在不同数据集上进行半监督训练。而且YOLO9000可以同时实时检测9000多种其它物体类别。作者也分析了YOLO9000在ImageNet上的性能,发现可以学习新的动物表现很好,但是学习衣服和设备这类物体则不行。因为从COCO数据集上动物类别那里学习到的物体预测泛化性很好。但是COCO数据集并没有任何衣服类别的标签数据(只有"人"类别),所以YOLO9000很难对“太阳镜”,“游泳裤”这些类别建模。

    相关文章

      网友评论

        本文标题:YOLO v1--v2--9000:you only look

        本文链接:https://www.haomeiwen.com/subject/gdtdlxtx.html