本周学习小结:本周学习了yolo v2,yolo v2基于yolo v1改进而来,与上一版本对比:better、faster、stronger,极大改善了yolo v1对图像定位不准确、召回率低的缺点。


论文名称:《YOLO9000:Better, Faster, Stronger》

论文来源:http://pjreddie.com/yolo9000/


一、YOLO 9000介绍

YOLO 9000是YOLO的改进版本,通常也将YOLO 9000称作YOLO v2,它可以实时检测9000个对象类别,而且利用目标检测和图像分类进行联合训练。在保持原有速度的优势之下,精度上得以提升,在67FPS下,YOLO v2在VOC 2007数据集上取得76.8mAP;在40FPS下,YOLO v2在VOC 2007数据集上取得78.6mAP。YOLO v1检测速度很快,但在定位方面不够准确,召回率也较低。为了提升定位准确度,改善召回率,YOLO v2在YOLO v1的基础上做了多种改进策略。

图1 yolo改进后FPS与mAP效果图(论文截图)

二、Better

(1)、Batch Normalization(批归一化)

批归一化可以显著提高收敛性,减少了所需正则化的处理。YOLO v2通过在原YOLO v1网络的每个卷积层后添加Batch Normalization(BN层),去掉了dropout层,将mAP提高了2%


  • BN层:

BN层就是对网络的每一层的输入都做了归一化,使整个神经网络在各层的中间输出的数值更稳定,从而使深层神经网络加快收敛速度而且降低模型过拟合的风险。

  • 正则化:

通俗说就是给损失函数加上一些限制,通过这种规则去约束它们在接下来的循环迭代中保持稳定,正则化能在训练模型过程中防止模型过拟合。

  • 过拟合:

泛化能力差,训练样本集准确率高,测试样本集准确率低。(泛化能力:模型或者分类器对未知新样本的分类能力,简单理解就是模型训练之后,对没有进行训练的数据集的分类能力)

  • dropout层:

指深度学习训练过程中,对于神经网络训练单元,暂时按照一定的概率将其从网络中移除,以减少过拟合情况,提高模型泛化能力。


(2)、High Resolution Classifier(高分辨率预训练分类器)

很多先进的检测模型都是在ImageNet上预训练分类网络,大多数都是用小于224x224的图片作为输入图像,低分辨率影响模型分类效果。YOLO v1预训练分类网络也是采用的224x224图片,在进行检测任务时则是采用448x448的图片作为输入。YOLO v2是直接在ImageNet上预训练448x448分辨率的分类网络,并且做了10个epoch的微调,这个高分辨率分类网络将mAP提高了4%。


  • epoch:

将完整的数据集通过一次神经网络并且返回一次,这个过程称为一个epoch。多个epoch能够优化分类网络的学习过程,提高网络的分类能力。


(3)、Convolutional With Anchor Boxes(带有anchor box的卷积)

YOLO v1使用分类网络中的全连接层直接预测坐标位置,这种方法缺乏背景筛选,定位不准确。为了提高网络分类能力,YOLO v2借鉴Faster R-CNN的思想引入anchor,做了以下几个调整:1、移除YOLO v1中的全连接层2、使用anchor box预测边界框;3、移除一个池化层,得到高分辨率的特征图。然后缩小网络,将原网络448x448的输入图片缩减成416x416。416大小的输入图片在经过卷积得到的特征图的宽高都是奇数,奇数大小的宽高会使得每个特征图在划分grid cell(网格单元时)时就只有一个center cell(中心单元格,比如一张图片可以划分成7x7或9x9个grid cell,center cell只有一个,如果划分成8x8或10x10的,center cell就有4个)。一般大物体会占据图像的中心,所以可以只用一个center cell去预测,而不是用4个center cell去预测。YOLO v2通过缩减网络,将416x416的图片作为输入,使用32步长去采样,得到13x13(32x13=416)大小的特征图输出,13x13即为奇数特征图,有中心单元格。

YOLO v1之前是将输入图片划分为7x7个grid cell,每个cell预测2个bounding box,也就是要预测7x7x2=98个框。而YOLO v2引入anchor box后要预测13x13x5=845个(在Better中的第四点说到,yolo v2中每个grid cell预测5个anchor box),模型的召回率由原来的81%提升到88%,mAP由原来的69.5%降低到69.2%。YOLO v2引入anchor后,召回率提升了7%,准确率下降了0.3%。

(4)、Dimension Clusters(维度聚类)

在引入anchor的过程中遇到两个问题,第一个问题就是:anchor的尺寸是人工设定的,具有主观性,虽然网络可以通过学习来调整,但是如果一开始就设置合理的尺寸无疑能使网络加快学习速度。YOLO v2采用k-means聚类算法对训练集的bounding box做了聚类分析,作者发现如果采用标准的k-means(利用欧式距离来衡量差异),大的边界框比小的误差大,但我们希望误差和框的大小无关。所以作者利用IOU定义了如下函数:


  • 对于这个距离公式:

因为作者发现用欧氏距离来衡量差异会导致大的边界框比小的误差大(下文会详细解释),而且我们希望误差和框的大小无关。所以自己设置了距离公式来定义聚类中心与标注框的距离,这个公式表示标注框与聚类中心的IOU越大,框与聚类中心的距离越小,所以聚类的效果越好。


如图2.1中,左边图就展示在两个不同数据集中k值与平均IOU值的变化关系,右图则是在权衡召回率和模型复杂性下选择k=5,展现这5个框在两个不同数据集中的形状大小。

图2.1 论文截图

可以看出聚类出来的先验框大多是瘦高的,又短又宽的较少。通过论文中的对比实验(表2.1),发现用聚类分析得到的先验框比手动选择的先验框有更高的平均IOU值,这使得模型更容易训练学习。

表2.1 论文截图


  • k-means算法:

k-means算法又称k均值聚类算法,作为无监督聚类算法中的代表,该算法的主要作用是将相似的样本自动归到一个类别中。k-means算法中的k表示的是聚类为k个簇(每个子集称为一个簇),means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。

算法具体思想:先从样本集中随机选取 k个样本作为簇中心,并计算所有样本与这 k个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中。所有点划分完后,再按照新划分类簇,重新计算每个类簇的中心点(取平均值),重复进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小。

  • 对于作者发现用欧氏距离来衡量差异会导致大的边界框比小的误差大的个人理解:

可以从欧氏距离的计算公式入手

这里公式中的x、y是anchor boxes的宽和高,由于anchor boxes位置不固定,所以没有(x,y)的坐标,只有宽和高。对于大框,宽高(x、y)都是大值计算欧氏距离的结果较大;而小框的宽高较小,计算得出欧氏距离较小,所以用欧式距离来衡量差异会导致框的大小影响聚类结果。


(5)、Direct location prediction(绝对位置预测)

这是在引入anchor的过程中遇到第二个问题:模型不稳定,特别是在早期迭代时,大多数不稳定性出现在对(x,y)坐标的预测上。在RPN网络(区域建议网络)中,对于(x,y)坐标的计算公式如下:

图2.2 论文截图

但经过Faster R-CNN的论文学习和查阅其他博主的资料,上面的公式中减号应该是加号,论文作者有误。


  • 提出错误的理由,因为在Faster R-CNN中对anchor的坐标预测计算公式如下:

图2.3 来源于Faster R-CNN论文

由Faster R-CNN论文描述可知:是坐标预测值,是anchor坐标(预设的固定值),是坐标真实值,同理几个变量和一样,而则是偏移量。由两个公式转换可知:


这个公式表明:预测=1时,的值等于(anchor的预设固定值)加上anchor box的宽度,相对于把box向右边移动一定距离(具体为anchor box的宽度),预测=-1时,同理就是把box向左边移动相同的距离。这个公式没有任何约束,使得无论在什么位置进行预测,任何anchor boxes可以在图像中任意一点结束,这将导致模型需要花很长一段时间才能稳定预测敏感的物体位置。YOLO v2沿用 YOLO v1的方法,根据所在网格单元的位置来预测坐标,使用logistic回归函数将ground truth的值限制于0到1之间。


  • logistic回归函数:

在线性回归模型的基础上,使用Sigmoid函数,将线性模型的结果压缩到[0,1]之间,使其拥有概率意义,它可以将任意输入映射到[0,1]区间,实现值到概率转换。


由前文可知神经网络在输出的特征图(13x13)中的每个网格单元负责预测5个bounding boxes,每个bounding box预测5个坐值,其中四个是坐标(​、),一个是置信度()。如果网格单元距离图像左上角的边距为 (),以及它对应的先验框(bounding box prior)的长和宽分别为(),那么预测的边界框相对于特征图中心坐标()和宽高()可以表示为(是logistic函数,此函数限定 ​、 的取值范围在[0,1]之间):

图2.3 论文截图

YOLO v2结合聚类算法,通过对边界框的位置预测进行约束,更容易稳定训练,mAP值提升了约5%

(6)、Fine-Grained Features(细粒度特征)

前几点改进使得YOLO v2网络在13x13的特征图上进行预测,作者提出使用细粒度特征可能增强对小尺度的物体检测效果。添加passthrough layer(转移层)将高分辨率的特征图低分辨率的特征图连接在一起,从而实现多尺度检测。连接方式是叠加特征到不同的通道而不是空间位置,类似于ResNet中的identity mappings(恒等映射)。具体方法把26x26x512的特征图连接到了13x13x2048的特征图,这个特征图与原来的特征相连接。检测器使用这个扩张后的特征图,拥有更好的细粒度特征,模型mAP提高了1%。


  • ResNet:

图2.4 来源于网络

图中的X(弯的曲线)就是ResNet的恒等映射,把当前输出直接传输给下一层网络(全部是1:1传输,不增加额外的参数),相当于走了一个捷径,跳过了本层运算。


(7)、Multi-Scale Training(多尺度训练)

目前的网络只用到了卷积层和池化层,所以对其输入图片的大小没有限制(意思是可检测任意大小图片)。YOLO v2不固定输入图像大小,使用多尺度训练,每隔几次迭代就微调网络,每隔10个epoch就会重新随机选择输入图片的尺寸。由于网络采样参数为32,输入图片的尺寸一般选择32的倍数{320,352,…,608},最小尺寸为320x320,最大尺寸为608x608。

图2.5 论文截图

由论文中给出的图2.5可知:用低分辨率的图片作输入时,mAP值略有下降,FPS较高;用高分辨率的图片作输入时,mAP值有所提高,但FPS降低

(8)、Further Experiments(进一步实验)

作者使用YOLO v2在VOC 2012上进行检测任务,图2.6展现YOLO v2与其他先进检测系统的性能比较。YOLO v2实现了73.4mAP,而且运行速度远快于其他方法。

图2.6 论文截图

作者还对COCO test-dev2015进行训练,图2.7展现YOLO v2在VOC指标(IOU=0.5)下与其他先进检测系统的分类精度比较。YOLO v2达到了44.0mAP,与Faster R-CNN、SSD相当。

图2.7 论文截图

三、Faster

大多数检测系统使用VGG-16作为特征提取网络,虽然VGG-16是一个功能强大、分类精确的网络,但是复杂度很高,它的卷积层需要多达306.9亿次浮点数运算才能对224x224的图片进行一次前向传播。YOLO v2使用Googlenet的自定义网络,比VGG-16更快,一次前向传播只需85.2亿次运算。但它的精度比VGG16略低,对于一张224x224图片取前5个预测概率,YOLO v2成绩为88.0%,VGG-16为90.0%。

(1)、Darknet-19

YOLO v2采用了Darknet-19作为特征提取网络,包括19个卷积层和5个max pooling层(最大池化层),主要采用3x3、1x1卷积,网络结构如下图3.1所示。

图3.1 论文截图

由图可知,在每一次经过池化操作后,通道数翻倍,而且将1x1的卷积核放置在3x3卷积核间,1x1卷积核可以压缩特征图通道数以降低模型计算量和参数。通过在每个卷积层后添加Batch Normalization(BN层),加快了模型收敛(前文中第二部分第一小点)。Darknet-19只需55.8亿次运算就可以处理一张图片,在 ImageNet图片分类上top-1的准确率达到72.9%、top-5的准确率达到91.2%。

(2)、Training for classification(分类训练)

训练步骤:

1)、使用ImageNet 1000数据集(标签类有1000个)训练Darknet-19,使用随机梯度下降法,输入图像为224x224,训练160次(160epochs)。初始学习率为0.1、权重衰减为0.0005、多项式速率衰减为4、动量为0.9。而且在训练时采用标准数据增强方式,比如随机裁剪、旋转以及色度、亮度的调节。

2)、做完上面训练后,对网络进行微调,将输入图片尺寸改为448x448。学习率改为0.001,epoch改为10,其余参数不变。通过调整输入图像为高分辨率,Darknet-19在ImageNet 1000图片分类上top-1的准确率达到76.5%、top-5的准确率达到93.3%。

(3)、Training for detection(检测训练)

作者训练好448x448分类网络后,就开始基于检测数据进行检测训练并微调网络。

训练步骤:

1)、去掉原网络的最后一个卷积层,用3个连续的3x3卷积层代替,每个3x3卷积层含有1024个卷积核 。每一个3x3卷积层后跟n个1x1卷积层,n是要检测目标的类别数。

2)、对于VOC数据集,每个网格单元要预测5个box,每个box需要预测5个坐标(x、y、w、h、confidence)和20个类别概率,所以一共需要5x25=125个1x1卷积层,每个网格单元输出125维张量。添加passthrough层将最后一个3x3x512的卷积层连到倒数第二层,使模型有了细粒度特征。

3)、将检测模型在数据集上训练160epochs,学习率维0.001,在60次和90次的时候,将学习率除以10,权重衰减为0.0005,动量为0.9。


  • 与YOLO v1相比:

在YOLO v1中,grid cell(网格单元)预测类别概率,grid cell对应的两个box的类别概率是一样的,每个box预测5个坐标,输出张量维度7x7x(2x5+20)。而在YOLO v2中,类别概率是属于box的,每个box对应一个类别概率,而不是由grid cell决定,因此在YOLO v2中每个box对应25个预测值(5个坐标加20个类别值),输出张量为13x13x(5x25)。


四、Stronger

作者提出了分类和检测数据联合训练的机制,用目标检测数据集及其类别标记信息和位置标注信息训练模型学习预测目标定位和分类,用分类数据集及其类别标记信息进一步扩充模型所能识别的物体类别同时能增强模型的鲁棒性。(这一部分内容刚接触目标检测不是太理解,之后的再慢慢学习补充知识。)

周报(1121-1127)相关推荐

  1. RTCM3消息类型大全【1002,1006,1107,1117,1127到底代表了些啥】

    最近用到了RTKLIB中UBX转RTCM3,一直以来发送的消息类型都是别人事先写好的的,不知其所以然.CSDN上RTCM3 消息类型并不是很全,现在找到一份消息类型比较齐全的文档,分享给大家. 翻译基 ...

  2. mysql 函数返回表格_mysql 数据分析如何实现日报、周报、月报和年报?

    推荐阅读: MySQL复习:20道常见面试题(含答案)+21条MySQL性能调优经验 秋招Java面试大纲:Java+并发+spring+数据库+Redis+JVM+Netty等 以天为统计周期,是常 ...

  3. 每天写的叫工作日志,每周写的总结叫周报,每月写的叫月报

    有些时候,老板会突发让您求每天都要写工作周报,什么项目什么任务,完成情况,完成花费的时间等,然后汇总部门周报:也不是写不出,只是不知道有时候重复做一个项目,到底每天有什么好写?不知道大家公司是否写周报 ...

  4. Datawhale组队学习周报(第047周)

    本周报总结了从 2021年01月03日至2022年01月09日,Datawhale组队学习的运行情况,我们一直秉承"与学习者一起成长的理念",希望这个活动能够让更多的学习者受益. ...

  5. Datawhale组队学习周报(第041周)

    本周报总结了从 11月22日至11月28日,Datawhale组队学习的运行情况,我们一直秉承"与学习者一起成长的理念",希望这个活动能够让更多的学习者受益. 第 31 期组队学习 ...

  6. Datawhale组队学习周报(第040周)

    本周报总结了从 11月15日至11月21日,Datawhale组队学习的运行情况,我们一直秉承"与学习者一起成长的理念",希望这个活动能够让更多的学习者受益. 第 31 期组队学习 ...

  7. Datawhale组队学习周报(第038周)

    本周报总结了从 11月01日至11月07日,Datawhale组队学习的运行情况,我们一直秉承"与学习者一起成长的理念",希望这个活动能够让更多的学习者受益. 第 30 期组队学习 ...

  8. Datawhale组队学习周报(第035周)

    希望开设的开源内容 目前Datawhale的开源内容分为两种:第一种是已经囊括在我们的学习路线图内的Datawhale精品课,第二种是暂未囊括在我们的学习路线图内的Datawhale打磨课.我们根据您 ...

  9. Datawhale组队学习周报(第032周)

    希望开设的开源内容 目前Datawhale的开源内容分为两种:第一种是已经囊括在我们的学习路线图内的Datawhale精品课,第二种是暂未囊括在我们的学习路线图内的Datawhale打磨课.我们根据您 ...

  10. Datawhale组队学习周报(第019周)

    本周(06月21日~06月27日),第 25 期组队学习一共有 3 门开源课程,共组建了 3 个学习群,参与的学习者有 292 人,其中 web开发入门教程.数据挖掘实战(异常检测) 已经结营,另外一 ...

最新文章

  1. python networkx绘制图
  2. linux 常用命令20190917
  3. 在URL里传入数组到HTML 里。
  4. mysql查询并设置高亮_慢查询分析调优工具~mysqldumpslow
  5. java虚拟机的内存模型_JVM(Java虚拟机)内存模型(转载/整理)
  6. 做一个vue的todolist列表
  7. Material Design入门(三)
  8. matlab dotchart,MATLAB中如何用对数方式显示图形坐标?
  9. ios 优化html表单提交,iOS 使用AFNetworking的form表单请求
  10. 吴恩达神经网络和深度学习-学习笔记-11-Momentum梯度下降法
  11. 奇异值分解(SVD) 的 几何意义
  12. vue 移动端选择器
  13. 【原创】Java移位运算
  14. 【数字信号处理】基于matlab GUI正选信号时域+频域分析【含Matlab源码 887期】
  15. 计算机编辑文档教程,腾讯TIM在线文档编辑功能使用方法教程
  16. 计算机电池电源转换,整套解决方案:笔记本电脑的外部电源和电池如何实现无缝切换?...
  17. PHP——常用的魔术方法(保姆级教学)
  18. 如何提高自己的工作能力 高效工作方法是绝效
  19. 点餐系统——数据库设计
  20. 经管保研|2022复旦经院推免研究报告

热门文章

  1. 如何从零开始解读产品经理需求分析-需求挖掘
  2. 为什么会信号无服务器,为什么在高铁上会无服务,无信号呢?
  3. Ubuntu系统进去之后黑屏是什么问题,及解决办法【最全】
  4. JAVA11_03学习总结(面向对象!)
  5. CPU多核心和单核心有哪些区别?
  6. markdown使用haroopad导出PDF
  7. 阿里云构筑微软AD域控服务
  8. java多线程案例8-1龟兔赛跑
  9. 蓝牙鼠标连接不上或光标无法移动
  10. 2017年暑期前端开发实习-阿里内推一面