YOLOv2论文解读/总结
Posted 耿鬼喝椰汁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YOLOv2论文解读/总结相关的知识,希望对你有一定的参考价值。
本章论文:
YOLOv2论文(YOLO9000: Better, Faster, Stronger)(原文+解读/总结+翻译)
系列论文:
YOLOv1论文解读/总结_yolo论文原文_耿鬼喝椰汁的博客-CSDN博客
前言
在YOLOv1推出一年以后,YOLOv2诞生了,新的YOLO版本论文叫《YOLO9000: Better, Faster, Stronger》,作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上,进行了改进,不仅提出了 YOLOv2 ,还提出了YOLO9000,一种实时的目标检测系统,可以检测9000多个目标类别,重点解决YOLOv1召回率和定位精度方面的不足。
论文原文:YOLO9000: Better, Faster, Stronger
论文翻译:YOLOv2论文翻译(已校正)_耿鬼喝椰汁的博客-CSDN博客
Yolov2 的主要工作
这篇论文的主要工作有:
1. 使用一系列的方法对YOLOv1进行了改进,在保持原有检测速度的同时提升精度得到YOLOv2;
2. 提出了一种目标分类与检测的联合训练方法,同时在COCO和ImageNet数据集中进行训练得到YOLO9000,实现9000多种物体的实时检测。
这篇文章包含两个模型:YOLOv2和YOLO9000,不过后者是在前者基础上提出的,两者模型的主体结构是一致的。
同yolov1论文题目一样,yolov2论文题目也体现了它改进后的三个优点:Better、Faster、Stronger。之前提出的YOLO v1虽然检测速度快,但在定位方面不够准确,并且召回率较低。为了解决这些问题,YOLO v2在YOLO v1的基础上提出了几种改进策略,如下图所示,一些改进方法能有效提高模型的mAP。
Yolov2 改进策略
1. Batch Normalization(批次归一化)
Batch Normalization有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,可以提升模型收敛速度,而且可以起到一定正则化效果,降低模型的过拟合。 YOLO v2中在每个卷积层后加Batch Normalization(BN)层,去掉了dropout层。 Batch Normalization层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合。
YOLO v2通过使用BN层使得mAP提高了2%。
2. High Resolution Classifier(高分辨率分类器)
图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以YOLO v1使用ImageNet的图像分类样本采用 224*224 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448×448 的图像作为输入。但这样切换对模型性能有一定影响。
所以YOLO2在采用 224×224 图像进行分类模型预训练后,再采用 448×448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448×448 的分辨率。然后再使用 448×448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。
YOLO v2通过使用高分辨率分类器使得mAP提升了3.7。
3.Convolutional With Anchor Boxes(带有锚框的卷积)
在yolov1中使用全连接层来预测box的坐标,并不像Faster R-CNN中RPN生成预选框,RPN只需预测偏移量,而不是整个坐标,这样简化了网络学习。yolov2模型有几点改进:
1、移除最后一层的全连接层,并使用anchor boxes来预测
2、移除一层pooling层,为了使得有不错分辨率
3、将输入448 x 448改为416 x 416,论文中提到因为416除32等于奇数,就会有单个单元格对应。
yolov1只有7 x 7 x 2个box,而yolov2有13 x 13 x 9个box,在结果对比起来,yolov2的准确率只降低0.4map,但recall上升了7%,可见有效。
4.Dimension Clusters(维度聚类)
在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析,以寻找尽可能匹配样本的边框尺寸。
聚类算法最重要的是选择如何计算两个边框之间的“距离”,对于常用的欧式距离,大边框会产生更大的误差。而且设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”。IOU越大,“距离”越近。YOLO2给出的聚类分析结果如下图所示:
上图左边是选择不同的聚类k值情况下,得到的k个centroid边框,计算样本中标注的边框与各centroid的Avg IOU。显然,边框数k越多,Avg IOU越大。YOLO2选择k=5作为边框数量与IOU的折中。对比手工选择的先验框,使用5个聚类框即可达到61 Avg IOU,相当于9个手工设置的先验框60.9 Avg IOU。
上图右边显示了5种聚类得到的先验框,VOC和COCO数据集略有差异,不过都有较多的瘦高形边框。
5.Direct location prediction(直接的位置预测)
Faster R-CNN使用anchor boxes预测边界框相对先验框的偏移量,由于没有对偏移量进行约束,每个位置预测的边界框可以落在图片任何位置,会导致模型不稳定,加长训练时间。 YOLO v2沿用 YOLO v1的方法,根据所在网格单元的位置来预测坐标,则Ground Truth的值介于0到1之间。网络中将得到的网络预测结果再输入sigmoid函数中,让输出结果介于0到1之间。设一个网格相对于图片左上角的偏移量是 c x , c y cx,cy cx,cy。先验框的宽度和高度分别是 p w 和 p h pw和ph pw和ph,则预测的边界框相对于特征图的中心坐标 ( b x , b y ) (bx,by) (bx,by)和宽高 b w 、 b h bw、bh bw、bh的计算公式如下图所示。
YOLO v2结合Dimention Clusters, 通过对边界框的位置预测进行约束,使模型更容易稳定训练,这种方式使得模型的mAP值提升了约5%。
6.Fine-Grained Features(细粒度的特征)
YOLO v2借鉴SSD使用多尺度的特征图做检测,提出pass through层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测。 YOLO v2提取Darknet-19最后一个max pool层的输入,得到 26 × 26 × 512 26×26×512 26×26×512的特征图。经过 1 × 1 × 64 1×1×64 1×1×64的卷积以降低特征图的维度,得到 26 × 26 × 64 26×26×64 26×26×64的特征图,然后经过pass through层的处理变成13x13x256的特征图(抽取原特征图每个2x2的局部区域组成新的channel,即原特征图大小降低4倍,channel增加4倍),再与 13 × 13 × 1024 13×13×1024 13×13×1024大小的特征图连接,变成 13 × 13 × 1280 13×13×1280 13×13×1280的特征图,最后在这些特征图上做预测。使用Fine-Grained Features, YOLO v2的性能提升了1%.
7.Multi-Scale Training(多尺寸训练)
YOLO v2中使用的Darknet-19网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。 YOLO v2采用多尺度输入的方式训练,在训练过程中每隔10个batches,重新随机选择输入图片的尺寸,由于Darknet-19下采样总步长为32,输入图片的尺寸一般选择 32 32 32的倍数320,352,…,608。采用Multi-Scale Training, 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高mAP值,但速度有所下降。
YOLO v2借鉴了很多其它目标检测方法的一些技巧,如Faster R-CNN的anchor boxes, SSD中的多尺度检测。除此之外, YOLO v2在网络设计上做了很多tricks,使它能在保证速度的同时提高检测准确率,Multi-Scale Training更使得同一个模型适应不同大小的输入,从而可以在速度和精度上进行自由权衡。
8.New Network:Darknet-19
YOLO v2采用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%。
采用 YOLO v2,模型的mAP值没有显著提升,但计算量减少了。以下是网络结构图:
YOLOv2训练
(1)在ImageNet训练Draknet-19,模型输入为224×224,共160个epochs
(2)将网络的输入调整为448×448,继续在ImageNet数据集上finetune分类模型,训练10 个epochs。参数除了epoch和learning rate改变外,其他都没变,这里learning rate改为0.001。
(3)修改Darknet-16分类模型为检测模型(看上面的网络微调部分),并在监测数据集上继续finetune模型
YOLO 9000
YOLO 9000 是什么?
YOLO 9000 是一种实时的目标检测系统,可以检测9000多个目标类别。其主要检测网络是YOLO v2,同时使用WordTree来混合来自不同的资源的训练数据,并使用联合优化技术同时在ImageNet和COCO数据集上进行训练,目的是利用数量较大的分类数据集来帮助训练检测模型,因此,YOLO9000的网络结构允许实时地检测超过9000种物体分类,进一步缩小了检测数据集与分类数据集之间的大小代沟。
小结
YOLO-V2是一个先进的实时检测系统,提升速度与精度上提出了很多新奇有效的方法,可以运行在不同尺寸大小图片的上,也使得可以很好地权衡速度与精度。同时YOLO9000使用WordTree来结合来自不同来源的数据,并使用联合优化技术在ImageNet和COCO上同时进行训练。YOLO-v2的很多技巧都可以很好地运用在其他场合任务中。
这篇论文的学习和总结到这里就结束啦,如果有什么问题可以在评论区留言呀~
如果帮助到大家,可以一键三连支持下~
YOLO系列YOLOv4论文超详细解读2(网络详解)
上一篇我们一起读了YOLOv4的论文《YOLOv4:Optimal Speed and Accuracy of Object Detection》(直通车→【YOLO系列】YOLOv4论文超详细解读1(翻译 +学习笔记)),有了初步的印象,论文里面涉及到很多tricks,上一篇介绍的比较简略,我们这篇来详细介绍一下。
目录
一、YOLOv4的简介
YOLOv4一共有如下三点贡献:
(1)开发了一个高效、强大的目标检测模型。它使每个人都可以使用1080ti或2080ti GPU来训练一个非常快速和准确的目标检测器。
(2)验证了最先进的 Bag-of-Freebies和 Bag-of-Specials对象检测在检测器训练时的影响。
(3)对现有的方法进行了改进,使其更加高效,更适合于单个GPU的训练,包括CBN,PAN,SAM等。
二、YOLOv4的网络结构
YOLOv4的整体原理图如下:和v3还是比较接近的
可以看到由以下四个部分组成:
输入端: 训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练
BackBone主干网络: 各种方法技巧结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock
Neck: 目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如YOLOv4中的SPP模块、FPN+PAN、SAM结构
Head: 输出层的锚框机制和YOLOv3相同,主要改进的是训练时的回归框位置损失函数CIOU Loss,以及预测框筛选的nms变为DIOU nms
下面我们就按着这个顺序来介绍~
三、输入端
Yolov4对训练时的输入端进行改进,使得训练时在单张GPU上跑的结果也蛮好的。比如数据增强Mosaic、cmBN、SAT自对抗训练。
数据增强①CutMix
数据增强的原因:在平时项目训练时,小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。Coco数据集中小目标占比达到41.4%,数量比中目标和大目标都要多。但在所有的训练集图片中,只有52.3%的图片有小目标,而中目标和大目标的分布相对来说更加均匀一些。
核心思想:将一部分区域cut掉但不填充0像素,而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配。
处理方式:对一对图片做操作,随机生成一个裁剪框Box,裁剪掉A图的相应位置,然后用B图片相应位置的ROI放到A图中被裁剪的区域形成新的样本,ground truth标签会根据patch的面积按比例进行调整。
另外两种数据增强的方式:
(1)Mixup: 将随机的两张样本按比例混合,分类的结果按比例分配
(2)Cutout: 随机的将样本中的部分区域Cut掉,并且填充0像素值,分类的结果不变
数据增强②Mosaic
Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。
优点:
(1)丰富数据集: 随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
(2)batch不需要很大: Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。
SAT自对抗训练
自对抗训练(SAT)也代表了一种新的数据增加技术,在两个前后阶段操作。
(1)在第一阶段: 神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自己执行一种对抗性攻击,改变原始图像,以制造图像上没有期望对象的假象。
(2)在第二阶段: 神经网络以正常的方式对这个修改后的图像进行检测。
通过引入噪音点进行数据增强
cmBN
BN: 无论每个batch被分割为多少个mini batch,其算法就是在每个mini batch前向传播后统计当前的BN数据(即每个神经元的期望和方差)并进行Nomalization,BN数据与其他mini batch的数据无关。
CBN: 每次iteration中的BN数据是其之前n次数据和当前数据的和(对非当前batch统计的数据进行了补偿再参与计算),用该累加值对当前的batch进行Nomalization。好处在于每个batch可以设置较小的size。
CmBN: 只在每个Batch内部使用CBN的方法,若每个Batch被分割为一个mini batch,则其效果与BN一致;若分割为多个mini batch,则与CBN类似,只是把mini batch当作batch进行计算,其区别在于权重更新时间点不同,同一个batch内权重参数一样,因此计算不需要进行补偿。
Label Smoothing类标签平滑
原因:对预测有100%的信心可能表明模型是在记忆数据,而不是在学习。如果训练样本中会出现少量的错误样本,而模型过于相信训练样本,在训练过程中调整参数极力去逼近样本,这就导致了这些错误样本的负面影响变大。
具体做法:标签平滑调整预测的目标上限为一个较低的值,比如0.9。它将使用这个值而不是1.0来计算损失。这样就缓解了过度拟合。说白了,这个平滑就是一定程度缩小label中min和max的差距,label平滑可以减小过拟合。所以,适当调整label,让两端的极值往中间凑凑,可以增加泛化性能。
四、主干网络BackBone
CSPDarknet53
简介:CSPNet(Cross Stage Partial Networks),也就是跨阶段局部网络。CSPNet解决了其他大型卷积神经网络框架Backbone中网络优化的梯度信息重复问题,CSPNet的主要目的是使网络架构能够实现获取更丰富的梯度融合信息并降低计算量。
具体做法:CSPNet实际上是基于Densnet的思想,即首先将数据划分成Part 1和Part 2两部分,Part 2通过dense block发送副本到下一个阶段,接着将两个分支的信息在通道方向进行Concat拼接,最后再通过Transition层进一步融合。CSPNet思想可以和ResNet、ResNeXt和DenseNet结合,目前主流的有CSPResNext50 和CSPDarknet53两种改造Backbone网络。
具体改进点:
①用 Concat 代替 Add,提取更丰富的特征。
②引入 transition layer (1 * 1conv + 2 * 2pooling),提取特征,降低计算量,提升速度。
③将 Base layer 分为两部分进行融合,提取更丰富的特征。
Mish激活函数
简介:Mish是一个平滑的曲线,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化;在负值的时候并不是完全截断,允许比较小的负梯度流入。Mish是一个与ReLU和Swish非常相似的激活函数,但是Relu在小于0时完全杀死了梯度,不太符合实际情况,所以可以在不同数据集的许多深度网络中胜过它们。
公式:y=x∗tanh(ln(1+ex))
Mish图像:
Mish和Leaky_relu激活函数的图形对比如下:
优点:
(1)从图中可以看出该激活函数,在负值时并不是完全截断,而允许比较小的负梯度流入从而保证了信息的流动
(2)Mish激活函数无边界,这让他避免了饱和(有下界,无上界)且每一点连续平滑且非单调性,从而使得梯度下降更好。
Dropblock正则化
传统的Dropout:随机删除减少神经元的数量,使网络变得更简单。
Dropblock:DropBlock技术在称为块的相邻相关区域中丢弃特征。Dropblock方法的引入是为了克服Dropout随机丢弃特征的主要缺点,Dropout主要作用在全连接层,而Dropblock可以作用在任何卷积层之上。这样既可以实现生成更简单模型的目的,又可以在每次训练迭代中引入学习部分网络权值的概念,对权值矩阵进行补偿,从而减少过拟合。
之前的Dropout是随机选择点(b),现在随机选择一个区域
Q:全连接层上效果很好的Dropout在卷积层上效果并不好?
中间Dropout的方式会随机的删减丢弃一些信息,但Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感,因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。
而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。所以右图Dropblock的研究者则干脆整个局部区域进行删减丢弃。
五、Neck
SPP
简介:SPP-Net全称Spatial Pyramid Pooling Networks,是何恺明大佬提出的,主要是用来解决不同尺寸的特征图如何进入全连接层的,在网络的最后一层concat所有特征图,后面能够继续接CNN模块。
如下图所示,下图中对任意尺寸的特征图直接进行固定尺寸的池化,来得到固定数量的特征。
具体结构如下:
PAN
YOLOv3中的neck只有自顶向下的FPN,对特征图进行特征融合,而YOLOv4中则是FPN+PAN的方式对特征进一步的融合。引入了自底向上的路径,使得底层信息更容易传到顶部
下面是YOLOv3的neck中的FPN,如图所示:
FPN是自顶向下的,将高层的特征信息通过上采样的方式进行传递融合,得到进行预测的特征图。
YOLOv4中的neck如下:
YOLOv4在原始PAN结构上进行了一点改进,原本的PANet网络的PAN结构中,特征层之间融合时是直接通过addition的方式进行融合的,而Yolov4中则采用在通道方向concat拼接操作融合的,如下图所示。
Q:为什么要把add改为concat?
add: 将两个特征图直接相加,是resnet中的融合方法,基于这种残差堆叠相加,可以有效地减小因为网络层数加深而导致的cnn网络退化问题。add改变特征图像素值,并没有完全保留原本特征图信息,更多的可以看作对原特征图信息的一种补充,深层特征图在卷积过程中丢失了许多细节信息,通过add的方式得以补全,是在二维的平面上对特征图的增强。因此add在进行图像特征增强时使用最佳。
concat: 将两个特征图在通道数方向叠加在一起,原特征图信息完全保留下来,再对原特征图增加一些我们认为是较好的特征图,丰富了特征图的多样性,是在空间上对原特征图的增强,这样在下一次卷积的过程中我们能得到更好的特征图。
SAM
SAM源自于论文CBAM(Convolutional Block Attention Module)的论文,提出了两种注意力机制的技巧。
先来介绍一下CBAM
如下图所示,输入一个特征F,先进行Channel attention module后得到权重系数和原来的特征F相乘,然后在进行Spatial attention module后得到权重系数和原来的特征F相乘,最后就可以得到缩放后的新特征。不仅每个通道有注意力,而且特征图每个位置有注意力。
接着我们来介绍Channel attention module(通道注意力模块)
该模块就是将输入的特征F分别进行全局的Maxpooling与Averagepooling,接着将这两个输入到一个权重共享的MLP,再将这两个进行element-wise summation操作后经过Sigmoid函数会得到权重系数Mc,再将这个权重系数与原来的特征F相乘,就可以得到缩放后的新特征。
我们再看看Spatial attention module(空间注意力模块)
首先对不同的feature map上相同位置的像素值进行全局的Maxpooling与Average pooling,接着将这两个spatial attention map 进行concat,再利用一个7X7的卷积后经过Sigmoid函数会得到权重系数Ms,在将这个权重系数与原来的特征F相乘,就可以得到缩放后的新特征,如下所示:
YOLOv4将SAM从空间注意修改为点注意,不应用最大值池化和平均池化,而是直接接一个7X7的卷积层,这样使速度相对快一些。
六、Head
Loss
经典IoU loss
IoU算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。
不足:没有相交则IOU=0无法梯度计算,相同的IOU却反映不出实际情况
GIOU(Generalized IoU)损失
GIoU考虑到,当检测框和真实框没有出现重叠的时候IoU的loss都是一样的,因此GIoU就引入了最小封闭形状C(C可以把A,B包含在内),在不重叠情况下能让预测框尽可能朝着真实框前进,这样就可以解决检测框和真实框没有重叠的问题。
公式:
不足:但是在两个预测框完全重叠的情况下,不能反映出实际情况
DIOU(Distance IoU)损失
DIoU考虑到GIoU的缺点,也是增加了C检测框,将真实框和预测框都包含了进来,但是DIoU计算的不是框之间的交并,而是计算的每个检测框之间的欧氏距离,这样就可以解决GIoU包含出现的问题。
公式:其中分子计算预测框与真实框的中心点欧式距离d 分母是能覆盖预测框与真实框的最小BOX的对角线长度c
CIOU(Complete IoU)损失
CIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,这样预测框就会更加的符合真实框。
公式:损失函数必须考虑三个几何因素:重叠面积,中心点距离,长宽比 其中α可以当做权重参数
NMS
DIOU-NMS
DIOU-NMS不仅考虑IOU的值,还考虑两个框的中心点的距离。如果两个框之间的IOU比较大,但是他们中心点之间的距离比较远,则会被认为是不同物体的检测框而不会被过滤掉。
公式: 不仅考虑了IoU的值,还考虑了两个Box中心点之间的距离 其中M表示高置信度候选框,Bi就是遍历各个框跟置信度高的重合情况
SOFT-NMS
对于重合度较大的不是直接剔除,而是施加惩罚。
本文参考:
以上是关于YOLOv2论文解读/总结的主要内容,如果未能解决你的问题,请参考以下文章