文章目录

  • 1.YOLOv2简介
  • 2.YOLOv2的精度改进(Better)
    • 1)Batch Normalization
    • 2)High Resolution Classifier
    • 3)Convolutional With Anchor Boxes
    • 4)Dimension Clusters
    • 5)Direct location prediction
    • 6)Fine-Grained Features
    • 7)Multi-Scale Training
  • 3.YOLOv2的速度改进(Faster)
    • 1)Darknet-19
    • 2)Training for classification
    • 3)Training for detection
  • 4.YOLOv2的分类改进(Stronger)——YOLO9000
    • 1)Hierarchical classification
    • 2)Dataset combination with WordTree
    • 3)Joint classification and detection

1.YOLOv2简介

yolov2全称:YOLO9000:Better, Faster, Stronger,论文链接

2017年,作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上,进行了大量改进,提出了 YOLOv2 和 YOLO9000。重点解决YOLOv1召回率和定位精度方面的不足。

YOLOv2 是一个先进的目标检测算法,比其它的检测器检测速度更快。除此之外,该网络可以适应多种尺寸的图片输入,并且能在检测精度和速度之间进行很好的权衡。

相比于YOLOv1是利用全连接层直接预测Bounding Box的坐标,YOLOv2借鉴了Faster R-CNN的思想,引入Anchor机制。利用K-means聚类的方法在训练集中聚类计算出更好的Anchor模板,大大提高了算法的召回率。同时结合图像细粒度特征,将浅层特征与深层特征相连,有助于对小尺寸目标的检测

YOLO9000 使用 WorldTree 来混合来自不同资源的训练数据,并使用联合优化技术同时在ImageNet和COCO数据集上进行训练,能够实时地检测超过9000种物体。

本文重点在意yolov2的结构与改进,有关yolo9000的详细内容可以查看我的另一篇笔记:一种联合分类与检测训练的方法——YOLO9000

2.YOLOv2的精度改进(Better)

在yolov1的基础上,yolov2作了一系列的技巧尝试,大致上有七种,下面分别对其进行说明:

1)Batch Normalization

CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,但可以通过normalize每层的输入解决这个问题。

BN 对数据进行预处理(统一格式、均衡化、去噪等)能够大大提高训练速度,提升训练效果。基于此,YOLOv2 对每一层输入的数据都进行批量标准化,这样网络就不需要每层都去学数据的分布,收敛会变得更快。

通过这一方法,mAP获得了2%的提升。batch normalization 也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。

2)High Resolution Classifier

对于yolov1中的backbone,作者是采用224x224去训练分类网络的,而在yolov2中,新的YOLO网络把分辨率直接提升到了448 * 448,虽然解决了分辨率不高给检测带来的困难,但这也意味之原有的网络模型必须进行某种调整以适应新的分辨率输入。

对于YOLOv2,作者首先对分类网络(自定义的darknet)进行了fine tune,分辨率改成448 * 448,在ImageNet数据集上训练10轮(10 epochs),训练后的网络就可以适应高分辨率的输入了。然后,作者对检测网络部分(也就是后半部分)也进行fine tune。这样通过提升输入的分辨率,mAP获得了4%的提升。

3)Convolutional With Anchor Boxes

YOLO直接使用卷积特征提取器上的完全连接层来预测bounding boxes的坐标。Faster R-CNN使用手工选择的先验来预测bounding boxes,而不是直接预测坐标。Faster R-CNN中的RPN网络仅使用卷积层来预测anchor boxes的偏移量和置信度。由于预测层是卷积的,RPN在feature map的每个位置预测这些偏移量。预测偏移量而不是坐标简化了问题,使网络更容易学习。

既之前的YOLO利用全连接层的数据完成边框的预测,导致丢失较多的空间信息,定位不准。作者在这一版本中借鉴了Faster R-CNN中的anchor思想,回顾一下,anchor是RPN网络中的一个关键步骤,说的是在卷积特征图上进行滑窗操作,每一个中心可以预测9种不同大小的建议框。

为了引入anchor boxes来预测bounding boxes,作者在网络中果断去掉了全连接层。剩下的具体怎么操作呢?首先,作者去掉了后面的一个池化层以确保输出的卷积特征图有更高的分辨率(因为池化会降低图像尺寸)。然后,还缩小了网络,以操作416个输入图像,而不是448×448。这样做是因为我们想在 feature map中有奇数个位置,所以只有一个中心单元格。物体尤其是大型物体,倾向于占据图像的中心,所以最好在中心有一个位置来预测这些物体,而不是四个都在附近的位置。这个技巧可稍稍提升效率。最后,YOLOv2使用了卷积层下采样(factor为32),使得输入卷积网络的416 * 416图片最终得到13 * 13的卷积特征图(416/32=13)。

加入了anchor boxes后,可以预料到的结果是召回率上升,准确率下降。我们来计算一下,假设每个cell预测9个建议框,那么总共会预测13 * 13 * 9 = 1521个boxes,而之前的网络仅仅预测7 * 7 * 2 = 98个boxes。具体数据为:没有anchor boxes,模型recall为81%,mAP为69.5%;加入anchor boxes,模型recall为88%,mAP为69.2%。这样看来,准确率只有小幅度的下降,而召回率则提升了7%,说明可以通过进一步的工作来加强准确率,的确有改进空间。

4)Dimension Clusters

作者在使用anchor的时候遇到了两个问题,第一个是anchor boxes的宽高维度往往是精选的先验框(hand-picked priors),虽说在训练过程中网络也会学习调整boxes的宽高维度,最终得到准确的bounding boxes。但是,如果一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就更容易学到准确的预测位置。

和以前的精选boxes维度不同,作者使用了K-means聚类方法类训练bounding boxes,可以自动找到更好的boxes宽高维度。传统的K-means聚类方法使用的是欧氏距离函数,也就意味着较大的boxes会比较小的boxes产生更多的error,聚类结果可能会偏离。为此,作者采用的评判标准是IOU得分(也就是boxes之间的交集除以并集),这样的话,error就和box的尺度无关了,最终的距离函数为:

作者通过改进的K-means对训练集中的boxes进行了聚类,判别标准是平均IOU得分,聚类结果如下图:

可以看到,平衡复杂度和IOU之后,最终得到k值为5,意味着作者选择了5种大小的box维度来进行定位预测,这与手动精选的box维度不同。结果中扁长的框较少,而瘦高的框更多(这符合行人的特征),这种结论如不通过聚类实验恐怕是发现不了的。

当然,作者也做了实验来对比两种策略的优劣,如下图,使用聚类方法,仅仅5种boxes的召回率就和Faster R-CNN的9种相当。说明K-means方法的引入使得生成的boxes更具有代表性,为后面的检测任务提供了便利。

具体的聚类方法这里不作介绍,有兴趣可以看看之前的一篇文章:机器学习——聚类算法

5)Direct location prediction

当在YOLO中使用anchor boxes时,作者遇到第二个问题:模型不稳定性,特别是在早期迭代期间。大部分的不稳定性来自于对anchor boxes (x, y)位置的预测。在RPN网络中,预测 (x,y) 以及 tx,ty 使用的是如下公式:

这个公式的理解为:当预测 tx=1,就会把box向右边移动一定距离(具体为anchor box的宽度),预测 tx=−1,就会把box向左边移动相同的距离。

这个公式没有任何限制,使得无论在什么位置进行预测,任何anchor boxes可以在图像中任意一点结束(我的理解是,tx 没有数值限定,可能会出现anchor检测很远的目标box的情况,效率比较低。正确做法应该是每一个anchor只负责检测周围正负一个单位以内的目标box)。模型随机初始化后,需要花很长一段时间才能稳定预测敏感的物体位置。

在此,作者就没有采用预测直接的offset的方法,而使用了预测相对于grid cell的坐标位置的办法,作者又把ground truth限制在了0到1之间,利用logistic回归函数来进行这一限制。

现在,神经网络在特征图(13 *13 )的每个cell上预测5个bounding boxes(聚类得出的值)同时每一个bounding box预测5个坐值,分别为 tx,ty,tw,th,to其中前四个是坐标,to是置信度。如果这个cell距离图像左上角的边距为 (cx,cy)以及该cell对应box(bounding box prior )的长和宽分别为 (pw,ph),那么预测值可以表示为:

这几个公式参考上面Faster-RCNN和YOLOv1的公式以及下图就比较容易理解。tx,ty 经sigmod函数处理过,取值限定在了0~1,实际意义就是使anchor只负责周围的box,有利于提升效率和网络收敛。σ函数的意义没有给,但估计是把归一化值转化为图中真实值,使用 e的幂函数是因为前面做了 ln计算,因此,σ(tx)是bounding box的中心相对栅格左上角的横坐标,σ(ty)是纵坐标,σ(to)是bounding box的confidence score。

定位预测值被归一化后,参数就更容易得到学习,模型就更稳定。作者使用Dimension Clusters和Direct location prediction这两项anchor boxes改进方法,mAP获得了5%的提升。

6)Fine-Grained Features

上述网络上的修改使YOLO最终在13 * 13的特征图上进行预测,虽然这足以胜任大尺度物体的检测,但是用上细粒度特征的话,这可能对小尺度的物体检测有帮助。Faser R-CNN和SSD都在不同层次的特征图上产生区域建议(SSD直接就可看得出来这一点),获得了多尺度的适应性。这里使用了一种不同的方法,简单添加了一个转移层( passthrough layer),这一层要把浅层特征图(分辨率为26 * 26,是底层分辨率4倍)连接到深层特征图。大致如下图所示:

(注意:图中Pass Through Layer上一层会先进行一个1x1的卷积层进行处理,这个是在源码中体现到的,但是原论文是没有提及的)

这个转移层也就是把高低两种分辨率的特征图做了一次连结,连接方式是叠加特征到不同的通道而不是空间位置,类似于Resnet中的identity mappings。这个方法把26 * 26 * 512的特征图连接到了13 * 13 * 2048的特征图,这个特征图与原来的特征相连接。如下图所示,类似以下的特征图1x4x4 变成了 4x2x2的过程。

所以,如上上一图所示,将passthrough Layer处理后得到的特征矩阵13x13x256,直接与原网络结构的输出13x13x1024进行一个拼接,得到了13x13x1280的特征矩阵。此时的特征矩阵便融合了底层与高层的信息了。

YOLO的检测器使用的就是经过扩张的特征图,它可以拥有更好的细粒度特征,使得模型的性能获得了1%的提升。

7)Multi-Scale Training

原来的YOLO网络使用固定的448 * 448的图片作为输入,现在加入anchor boxes后,输入变成了416 * 416。目前的网络只用到了卷积层和池化层,那么就可以进行动态调整(意思是可检测任意大小图片)。作者希望YOLOv2具有不同尺寸图片的鲁棒性,因此在训练的时候也考虑了这一点。

不同于固定输入网络的图片尺寸的方法,作者在每10次迭代后就会微调网络,随机选择新的图片尺寸。YOLO网络使用的降采样参数为32,那么就使用32的倍数进行尺度池化{320,352,…,608}。最终最小的尺寸为320 * 320,最大的尺寸为608 * 608。接着按照输入尺寸调整网络进行训练。

这种机制迫使网络学会在不同的输入维度上进行良好的预测。这意味着同一个网络可以预测不同分辨率下的检测结果。网络在较小的规模下运行更快,所以YOLOv2在速度和准确性之间提供了一个简单的权衡。

在低分辨率的情况下,YOLOv2是一种便宜、相当准确的探测器。在288×288,它的运行速度超过90 FPS, mAP几乎和Fast R-CNN一样好。这使得它非常适合较小的gpu、高帧率视频或多个视频流。在高分辨率YOLOv2是一个最先进的检测器,在VOC 2007上78.6 mAP,而仍然运行在实时速度之上。

3.YOLOv2的速度改进(Faster)

YOLO一向是速度和精度并重,作者为了改善检测速度,也作了一些相关工作。

大多数检测网络有赖于VGG-16作为特征提取部分,VGG-16的确是一个强大而准确的分类网络,但是复杂度有些冗余。224 * 224的图片进行一次前向传播,其卷积层就需要多达306.9亿次浮点数运算。

YOLO框架使用了一个基于Googlenet架构的自定义网络。这个网络比VGG-16快,仅使用85.2亿次操作进行向前传递。然而,它的准确性略低于VGG16。对于单一作物,前5位精度为224 × 224, YOLO的定制模型得到88.0%的ImageNet,而vgg -16的ImageNet得到90.0%

1)Darknet-19

YOLOv2使用了一个新的分类网络作为特征提取部分,参考了前人的先进经验,比如类似于VGG,作者使用了较多的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling),把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。也用了batch normalization(前面介绍过)稳定模型训练。

最终得出的基础模型就是Darknet-19,如下图,其包含19个卷积层、5个最大值池化层(maxpooling 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),包括随机作物,旋转,色调,饱和度和曝光变化。

初始的224 * 224训练后,作者把分辨率上调到了448 * 448,然后又训练了10次,学习率调整到了0.001。高分辨率下训练的分类网络在top-1准确率76.5%,top-5准确率93.3%。

3)Training for detection

分类网络训练完后,就该训练检测网络了,作者去掉了原网络最后一个卷积层,转而增加了三个3 * 3 * 1024的卷积层,并且在每一个上述卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需的数量。对于VOC数据集,预测5种boxes大小,每个box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。同时也添加了转移层(passthrough layer ),从最后那个3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。

大概的模型如下所示:

作者的检测模型以0.001的初始学习率训练了160次,在60次和90次的时候,学习率减为原来的十分之一。其他的方面,weight decay为0.0005,momentum为0.9,依然使用了类似于Faster-RCNN和SSD的数据扩充(data augmentation)策略。

最后,在论文中,关于一些论文的训练细节是没有提到的:
1)如何匹配正负样本
2)如何计算误差
以上两点都是没有提到的,具体细节需要查看源码

4.YOLOv2的分类改进(Stronger)——YOLO9000

当时写着一部分的是时候看得比较云里雾里,后来重新做了一个总结:详细可查看:一种联合分类与检测训练的方法——YOLO9000

作者提出了将分类数据和检测数据综合的联合训练机制。该机制使用目标检测标签的数据训练模型学习定位目标和检测部分类别的目标;再使用分类标签的数据取扩展模型对多类别的识别能力。在训练的过程中,混合目标检测和分类的数据集。当网络接受目标检测的训练数据,反馈网络采用YOLOv2 loss函数;当网络接受分类训练数据,反馈网络只更新部分网络参数。

这类训练方法有一定的难度。目标识别数据集仅包含常见目标和标签(比如狗,船);分类数据集包含更广和更深的标签。比如狗,ImageNet上包含超过100种的狗的类别。如果要联合训练,需要将这些标签进行合并。

大部分分类方法采用softmax输出所有类别的概率。采用softmax的前提假设是类别之间不相互包含(比如,犬和牧羊犬就是相互包含)。因此,我们需要一个多标签的模型来综合数据集,使类别之间不相互包含。

1)Hierarchical classification

ImageNet的标签的来源是WordNet(一个语言数据库)。WordNet是由directed struct组成,但是directed struct较为复杂,这里采用另一个方式表示WordTree。WordTree是一种多层级的Tree结构,数据来源于WordNet。在ImageNet中一个类别的标签在WordNet中到根节点的路径,如果存在多条则选择最短的一条。遍历将所有的类别标签都提取,最终得到WordTree,使用链式法则计算任意节点的概率值。

创建层次树的步骤是:

  • 遍历ImageNet的所有视觉名词
  • 对每一个名词,在WordNet上找到从它所在位置到根节点(“physical
    object”)的路径。 许多同义词集只有一条路径。所以先把这些路径加入层次树结构。
  • 然后迭代检查剩下的名词,得到路径,逐个加入到层次树。路径选择办法是:如果一个名词有两条路径到根节点,其中一条需要添加3个边到层次树,另一条仅需添加一条边,那么就选择添加边数少的那条路径。

最终可以得到下图所示的分类树:

至于分类时的概率计算,大家应该可以很容易看出需要采用条件概率,即某个节点的概率值应当等于该节点到根节点的所有条件概率之积。而且,softmax操作也同时应该采用分组操作,如下图:

2)Dataset combination with WordTree

我们可以使用WordTree以一种合理的方式将多个数据集组合在一起。我们只是将数据集中的类别映射到树中的同义词集。图6显示了一个使用WordTree组合来自ImageNet和COCO的标签的示例。WordNet非常多样化,所以我们可以对大多数数据集使用这种技术。

3)Joint classification and detection

最终制作了一个9418分类的WordTree,并且通过重采样保证Imagenet和COCO的数据比例为4:1。

对于检测数据集中的图片计算完整的Loss并反方向传播,对于分类数据集图片,则只计算分类的loss,同时假设IOU最少为 .3,最后根据这些假设进行反向传播。

参考链接:

  1. https://blog.csdn.net/wjinjie/article/details/107509243
  2. https://blog.csdn.net/Jesse_Mx/article/details/53925356
  3. https://www.bilibili.com/video/BV1yi4y1g7ro?p=2
  4. https://blog.csdn.net/shuzfan/article/details/54018736
  5. https://blog.csdn.net/weixin_40400177/article/details/103449042
  6. https://arxiv.org/abs/1612.08242
  7. https://blog.csdn.net/weixin_44751294/article/details/117873152

目标检测算法——YOLOv2相关推荐

  1. 目标检测算法YOLO-V2详解

    ❝ 上期我们一起学习了YOLO-V1算法的框架原来和损失函数等知识,如下: 目标检测算法YOLO-V1算法详解 目标检测模型YOLO-V1损失函数详解 [文末领福利] ❞ 今天,我们一起学习下YOLO ...

  2. 论文阅读笔记 | 目标检测算法——PP-YOLO

    如有错误,恳请指出. 文章目录 1. Introduction 2. Related Work 3. PP-YOLO 3.1 Architecture 3.1.1 Backbone 3.1.2 Det ...

  3. 目标检测算法——YOLOv4

    以下内容如有错误,恳请指出. 而且查阅参考的资料也有点多,参考链接若有遗落,也恳请指出,会立刻补上 文章目录 1.YOLOv4简介 2.YOLOv4相关工作 1)对象检测模型 2)Bag of fre ...

  4. Yolov1目标检测算法详细分析

    Yolov1目标检测算法详细分析 Yolov1介绍 这是继RCNN,fast-RCNN 和 faster-RCNN之后,rbg(Ross Girshick)大神挂名的又一大作,起了一个很娱乐化的名字: ...

  5. 病虫害模型算法_基于深度学习的目标检测算法综述

    sigai 基于深度学习的目标检测算法综述 导言 目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一.由于各类物体有不同的外观,形状,姿态,加上成像 ...

  6. 综述 | 基于深度学习的目标检测算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:计算机视觉life 导读:目标检测(Object Det ...

  7. 大盘点|YOLO 系目标检测算法总览

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 YOLO目标检测算法诞生于2015年6月,从出生的那一天起就是"高精度.高效率.高实用性&q ...

  8. AI综述专栏 | 基于深度学习的目标检测算法综述

    https://www.toutiao.com/a6685618909275488780/ 2019-04-30 17:35:53 关注微信公众号:人工智能前沿讲习, 重磅干货,第一时间送达 AI综述 ...

  9. ECCV 2018 | CornerNet:目标检测算法新思路

    本文为极市平台原创文章,转载请附原文链接: https://blog.csdn.net/Extremevision/article/details/82799308 ----------------- ...

最新文章

  1. Datawhale组队学习 Task02:顺序表和链表(2天)
  2. ggplot2可视化分面图(faceting)使用label_wrap_gen函数设置每个分面图的子图标题自动换行为多行文本(基于设定的当行宽度进行标题文本自动换行)
  3. Hystrix概述(二)
  4. 小程序 video 控制器外观调整_最好的Nintendo Switch控制器
  5. ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
  6. cad导出pdf_通过CAD导出的文件或者由CAD导出的PDF文件打印慢
  7. 机房系统(五)——【Excel表导出】
  8. px是什么意思计算机二级,px是什么意思?照片中的px是什么的缩写?
  9. IBM软件服务创新运用 提升市民生活质量
  10. 云环境下大规模分布式计算数据感知的调度系统
  11. MOSS 2007 系列学习之安装篇(一)
  12. 不是明年年初?苹果明年三季度才会推出AirPods Pro 2
  13. Mysql删除数据时出现执行很慢并且删除失败--线程堵塞
  14. 根据一览,自动生成Sheet页
  15. MIT App Inventor使用与入门教程
  16. vsan双主机配置_5千右预算,兼顾Pr剪辑、Ps修图、CAD制图的高性价比DIY主机配置...
  17. 微型计算机原理及应用是啥,微型计算机原理及应用(第2版)
  18. C语言选择题(含答案)
  19. Drools-决策表
  20. mysql情况数据库表数据函数_mysql数据库表单查询和函数的使用

热门文章

  1. 老王赛马!!!(题目有漏洞哦)
  2. 【面试重点系列】操作系统常见面试重点题(万字图解)
  3. 基于fpga的sobel边缘检测
  4. 如何修改嵌入式服务器的端口号,Ai聘网之如何修改Spring Boot应用启动的嵌入式Tomcat的默认端口8080...
  5. IDEA的setting介绍
  6. 请求的流只能读取1次的问题
  7. vue+xlsx插件实现table表格的简单导出——技能提升
  8. 20230720今天youtube上的中文字幕自动翻译成为英文的功能失效!
  9. Arduino 趣味口算计算器
  10. 快速禁止Chrome浏览器缓存