1. YOLOv2理论篇
  2. YOLOv2实践篇

背景介绍:

YOLOv1和同时期的SSD属于两个单阶段检测模型,以速度快著称。但是YOLOv1的诸多缺陷导致精准度较差、召回率低。估计YOLOv2参考了SSD或者Faster RCNN引入了anchor机制,同时加入Batch Normalization层,多尺度融合等手段提升了性能,改进方法如下:

网络模型:

YOLOv2采用Darknet19进行特征提取,类似于VGG,使用了较多的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化,把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。也用了batch normalization稳定模型训练。如下图,其包含19个卷积层、5个最大值池化层、以及新增的passthrough层,融入更精细的特征图:

YOLOv2版本引入passthrough层类似于隔行隔列获取数据,将高低分辨率的特征图做连结,叠加相邻特征到不同通道:

网络中将26 * 26 * 512的特征图通过passthrough层采样到13*13*256与原本卷积得到的13*13*1024的特征图做concat,输出13 * 13 * (256+1024)的特征图,最后经过3*3卷积输出13 * 13 * 1024的特征图,如下图所示:

YOLOv2版本去掉了dropout层,使用Batch normalization。如果每批训练数据的分布各不相同,那么网络就要在每次迭代都去学习适应不同的分布,这样会大大降低网络的训练速度。而batch normalization的作用就是将每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,极大的改善收敛速度同时减少了对其它正则化方法的依赖。

YOLOv2版本取消了全连接层,保留了空间信息并且极大降低了参数量(全连接层把1470*1的向量reshape为7*7*30的特征图,会丢失较多的空间信息导致定位不准)。引入anchor机制,为卷积特征图上进行滑窗采样,每个中心包含5种不同大小和比例的建议框,每个建议框预测4个位置属性和1个置信度。由于都是卷积不需要reshape,很好的保留的空间信息,最终特征图的每个特征点和原图的每个cell相对应;用预测相对偏移(offset)取代直接预测坐标。与v1的差别如下图所示:

网络中的anchors通过聚类的方式获取,如果采用传统的欧式距离聚类方式,我们发现相同偏差的情况下,大boxes比小boxes产生更多error,所以我们采用IOU作为聚类的度量标准:

损失函数:

先验框匹配策略:

  • 对5个anchor进行IOU判断,大于设定值的称为匹配上;
  • 计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与GT的中心点都偏移到同一位置(原点),然后计算出对应的IOU值;
  • 在匹配上的先验框中选中IOU最大的一个负责该cell中物体的预测;
  • 未匹配上的先验框中IOU小于设定阈值0.6的当作背景处理,对于IOU大于设定值,但是不是最大IOU的直接忽略不做任何处理;

损失计算方法:

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

如上图所示对中心点x,y的回归加入sigmoid函数约束到每个网格(0,1)之间的偏移,使得预测框的中心坐标总位于格子内部;长宽w,h的表示成对数形式相对于anchor的偏移;从而减少模型的不稳定性。同时针对大目标和小目标对损失的贡献不同,采用面积差的方式,即box_scale = (2 - w * h),即对于尺度较小的预测框其权重系数会更大一些,起到和v1版本计算平方根相似的效果。

训练流程:

官方的训练对预训练分类模型采用了更高分辨率的图片,使用Darknet-19在标准1000类的ImageNet的224 * 224尺寸上训练了160次,用的随机梯度下降法,初始学习率为0.1,采用分段学习率衰减的方式,weight decay为0.0005 ,momentum 为0.9。在训练的过程中加入了random crops, rotations, and hue, saturation, and exposure shifts等数据增广。然后的10个epoch将ImageNet数据集的尺寸放大为448x448的输入来finetune分类网络这一中间过程,此时学习率调整成1e-3,这一方法使得模型在检测数据集上finetune之前已经适用高分辨率输入。

之后在检测网络训练阶段采用多种不同尺寸进行训练,增加模型的鲁棒性。在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。由于YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值:{320,352,384,...,608}。在训练过程,每隔10个iterations随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。采用Multi-Scale Training策略,YOLOv2可以适应不同大小的图片,并且预测出很好的结果。

模型缺点:

其一:YOLOv2的Darknet19还是基于VGG的串行堆叠模式,但是此类模型在反向传播存在梯度弥散、特征提取上存在信息确实等问题,新增的passthrough层虽然融合了两个尺度特征但是对上下文描述任不足。所以后续模型大多在特征提取阶段集成残差模块及注意力机制,在neck阶段采用FPN或者PAN等形式综合各个尺度的特征。

其二:YOLOv2的损失函数依然把中心点和长宽分开计算,但是位置信息应该作为整体看待,所以后续模型大多采用iou及其变体更替,类别和置信度损失也建议使用交叉熵损失而不是平方差损失。

相关问题:

关于多尺度检测这块感觉存在一点点小问题,因为YOLOv2会进行5次下采样,所以如果训练图片是320*320,最后生成的特征图为10*10,这样一来图像中心点是4个点,就会导致在图像中心的物体的中心点落在4个Grid Cell中,不方便分配。

YOLO系列专题——YOLOv2理论篇相关推荐

  1. YOLO系列专题——YOLOv1理论篇

    近期工作上基于YOLOv3做项目并且需要测试TI开发板对OD模型的友好程度,所以想写个YOLO系列的专题,本文就从2015年的v1版本<You Only Look Once: Unified, ...

  2. YOLO系列专题——YOLOv3理论篇

    YOLOv3理论篇 YOLOv3实践篇 背景介绍: YOLOv3的基本思想与YOLOv2大致相同,过程如下: 将输入图像分成S*S个格子,每个格子负责预测中心在此格子中的物体: 每个格子预测B个bou ...

  3. YOLO系列专题——YOLOv2实践篇

    YOLOv2理论篇 YOLOv2实践篇 工程框架: YOLOv2引入anchor机制后,在目标的回归上比v1版本效果好了很多.下面是一些代码实现,因为自己建的工程,所以这个系列的整体代码结构会比较相似 ...

  4. YOLO系列专题——Complex-YOLO

    Complex-YOLO是2018年的一篇点云目标检测的文章,发表于arXiv[cs.CV]. 文章链接:An Euler-Region-Proposal for Real-time 3D Objec ...

  5. YOLO系列专题——YOLOv1实践篇

    YOLOv1理论篇 YOLOv1实践篇 工程框架: 在YOLOv1理论篇中我们简要介绍了YOLO的基本原理,本篇从代码角度进一步给出解析.工程结构如下: config作为参数文件用于保存训练参数.测试 ...

  6. YOLO系列专题——YOLOv3实践篇

    YOLOv3理论篇 YOLOv3实践篇 工程框架: 本文基于YOLOv3大体结构进行实现,采用VOC2028数据集进行测试,一份安全帽和人两个类别的检测数据集,数据总共7581帧图片.工程框架结构如下 ...

  7. 时间管理专题_理论篇

    本文属非商业用途,文中借鉴他人处均已注明出处,若侵犯原作权益,请联系删除,谢谢 简介 总感觉时间不够用,一方面确实没闲着,另一方面又找不到有那方面的巨大收获.之前接触过时间管理,但是不曾认真的总结过. ...

  8. 死磕YOLO系列,YOLOv1 的大脑、躯干和手脚

    系列文章: 死磕YOLO系列,YOLOv2的自我修养 YOLO 是我非常喜欢的目标检测算法,堪称工业级的目标检测,能够达到实时的要求,它帮我解决了许多实际问题. 这就是 YOLO 的目标检测效果.它定 ...

  9. 【YOLO系列】--YOLOv1超详细解读/总结

    文章目录 前言 摘要 一.Introduction-介绍 二. Unified Detection-统一检测 三.Comparison to Other Detection Systems-与其他目标 ...

最新文章

  1. css3中实现摘取金币_用css3实现抽奖转盘里的扇形图
  2. iOS: 转载CoreData数据库框架
  3. 如何简单形象又有趣地讲解神经网络是什么?
  4. python from numpy import,python zeros()使用(from numpy import *)-Go语言中文社区
  5. Java 数组获取最大值和最小值
  6. mysql8.0版本的服务器名称_Linux服务器配置-VSFTP服务配置(六)
  7. SpringBoot—JPA: javax.persistence.TransactionRequiredException
  8. 用 GDI 操作 EMF 文件(转)
  9. vc listview 大图标间距设置
  10. awk 输出到多个文件 多路输出
  11. 有趣的人工智能项目合集,如老婆生成器
  12. 汉宁窗+matlab,m汉宁窗hanning汉明窗hamming矩形窗-read.ppt
  13. 2015中国大学排行榜100强新鲜出炉(校友会版)-[转]
  14. python删除csv某一行_python删除csv行
  15. pycharm print 显示红色下划线
  16. 微信接口第三方php原理,微信第三方登录原理
  17. PrimeNG之FileUpload
  18. 年薪40W的程序员,需要有哪些技能傍身?
  19. Linux 4.19.111 供电(power supply )子系统
  20. 如何在iOS 6 时代的App Store中推广

热门文章

  1. 2018 CodeM复赛:C. 边的染色
  2. matlab实现直方图均衡化
  3. dp动态规划_最长上升子序列问题
  4. python机器学习库sklearn——BIRCH聚类
  5. AttributeError: module 'labelme.utils' has no attribute 'draw_label'
  6. 调整DOSBOX窗口大小
  7. linux服务器查看系统装到哪个盘,查看linux安装了什么服务器地址
  8. linux mysql修改数据表结构语法
  9. Matlab基本数学应用
  10. datalist 的用法。也是增删改查,但是比较智能。用数据绑定的方式,可以有不同的显示方法,下面是对一个表的增删改查的参考代码...