YOLO系列整理之YOLOV2

YOLOV2

  • 网络结构
  • 网络输出/数据标注(这里以VOC2012数据集(20个类别)为例)
  • 损失函数(每一项参数详细讲解)

注:这里面有些图片是自己画的,有些图片来源请看水印哈,在此特别感谢CSDN以及CSDN之外的所有大佬

这是YOLO系列的第二篇YOLOV2。我们仍然按照网络结构、网络输出/数据标注、损失函数的结构进行讲解。接下来会一边讲解一边与YOLOV1对比,看看YOLOV1原先在这个地方怎么做,存在什么缺点,然后YOLOV2在这个地方是怎么改进的,并在其中穿插自己的想法。
’ ’ ’
标注一下文章中的英文说明:
bbox表示网络生成的bounding box。
cell表示最终特征图的每个像素点,由于感受野的存在,映射回原图像也就是一个个区域网格grid。 cell==grid
GT表示真实框。
’ ’ ’

网络结构

在这里插入图片描述

如上图为YOLOV2的网络结构,与YOLOV1相比作者做了如下改变:
1、设计了一个新的网络结构DarkNet
2、加入BatchNorm层(关于归一化还有好几种方式,这里需要专门写一篇来讲一下)
3、移除DarkNet最后一个卷积层、global avgpooling层(global avgpooling层通常被用来代替全连接层,因为该层没有参数,可以大大减少过拟合)以及softmax层,换成3个卷积层、其之后的输出与passthrough层的输出concat起来、接入1x1卷积层转成13x13x [ 5x (5+20) ]的通道,这使得网络可以接受任意尺寸的输入(yolov1是不可以的)。
4、加入passthrough层,考虑小目标。以416x416为例,DarkNet具有5个max pool,第五个max pool输出也是网络最后的输出尺寸是13x13。具体做法:passthrough层对第5个max pool的输入 (26x26)每一个通道的特征图隔行隔列采样,隔行采样有两种结果,隔列采样也有两种结果,所以组合起来,一张大小26x26的特征图可以转化为4张大小为13x13的特征图。得到的结果与第五个max pool的输出经过3个卷积层之后的结果concat起来。在这里为什么不采用add而是concat呢?答:对于后续的卷积操作,add其实是特殊情况下的concat,add是(A+B)xC,即对应通道的特征图共享参数,concat是AxC1+BxC2。显然采用add可以节省参数量,但add需要有一个前提就是对应通道的语义相似,虽然经过passthrough层之后,特征图尺寸由26x26到13x13,但此时每个点的感受野并没有变化(这些点只是重新排列而已),也就是语义信息还是有差别的,所以我们需要使用concat,而且个人觉得add的方式会限制网络的多样性
5、改进网络训练方式,YOLOV1是224x224训练分类,然后直接转成448x448并训练检测,图片尺寸与训练目标一起改变,会导致网络突然适应不了。细分网络任务可以使网络更加容易训练,YOLOV2的做法是先以224x224的尺寸训练分类,然后将224x224改成448x448微调网络,最后再改成416x416训练检测网络(在这里其实是个多尺度训练)。从看过一些深度学习算法的经验来看,将网络任务细分确实是有道理的,比如我们的VGG结构将一次到位的5x5卷积核分解成两个3x3的卷积核,PSPNet将图像分割细分为分类 (辅助损失) 与定位,而且定位还从多尺度 (目标的大小) 再次细分,英伟达的一篇分割论文GSCNN将分割分解为边缘检测与常规检测。所以在分割网络训练中,我们是不是可以先训练二分类分割(前景和背景),然后在训练多分割(前景之间)?

网络输出/数据标注(这里以VOC2012数据集(20个类别)为例)

1、输出13x13x [ 5x (5+20) ]的张量
首先说一个与YOLOV1输出的不同,YOLOV1需要经过全连接层,然后在reshape成7x7x30。但YOLOV2是直接输出13x13x [ 5x (5+20) ]。
13x13:表示特征图的尺寸,即有169个像素点cell,也就是将原图像划分成了169个网格grid,而YOLOV1只有7x7=49个网格。
[ 5x (5+20) ]:YOLOV2对于每个网格的设定与YOLOV1不一样,YOLOV1是1个网格2个bbox共享1套类别(20类)。而YOLOV2是1个网格5个bbox各自有1套类别(20类),每个bbox有5个数值:bbox中心点坐标2个、bbox高宽2个、置信度1个。
上面是网络的输出,所以我们也要制作对应的标签才能去做损失:
由于YOLOV2的每一个bbox都有一套类别,所以这需要根据匹配,对于能匹配到物体真实框的bbox,就将对应真实框的中心坐标与形状高宽写入,然后将置信度置为1,在20类类别中将对应的类别置1。
2、两个bbox与GT匹配
讲匹配之前我们需要说一下关于YOLOV1存在的问题。
对于YOLOV1,我们匹配是看网络训练时生成的两个bbox哪一个与中心落在该cell出的真实框的IOU比较大,然后就选这个bbox负责预测该物体。YOLOV1这样做有两个缺点:
第一:YOLOV1的匹配需要通过训练来确定,这具有随机性,假如生成的两个bbox都与真实框的IOU很低,但还是得选一个来匹配,那么网络后续的训练就会变得很困难。
第二:YOLOV1一个cell里面存在两个bbox,但只有一套类别,也就意味着一个cell只能负责预测一个物体,假如一个cell出现两个物体,那么就需要丢弃一个。
针对YOLOV1的缺点,YOLOV2就引入了Ancher box。具体来说,YOLOV2是这样做的:
第一:YOLOV2对训练集的真实框进行K-means聚类,聚成5类,K=5。因为是根据形状聚类,所以采用计算IOU的方式来衡量距离,距离越短代表两个真实框更加相似,而IOU是越大代表形状越相似,所以真正衡量距离的公式是(1-IOU),最后聚成的这5类不同形状的真实框就被称为Ancher box。关于K-means在之后有空也会写文章介绍。
第二:5类Ancher box被安排与5个bbox相绑定(通过下面的第3点中对高宽的设置与下面损失函数即将讲到的前12800轮的训练绑定)
第三:举个例子就比较清晰了:每个cell有5个ancher box(A B C D E)(对应绑定的bbox为a b c d e)。计算某个GT映射到最终输出时(13x13)是在哪个cell中。假设映射到(6,6)中,然后接下来对于该GT,分别与5个Ancher box计算IOU,取IOU最大的那个Ancher box(假设是B)对应绑定的bbox(假设是b)负责预测它。那么在最终输出时,就是13x13中的6,6中的bbox中的b负责预测它。
被匹配到的bbox每次就拿它的中心点坐标和形状高宽来与真实框作差,并将该bbox的置信度置为1,在对应类别上标注为1。
注意:匹配时,包括YOLOV2、V3、SSD这些都是只看高宽形状不看中心位置的 (即计算IOU之前先把中心坐标移到同一位置),但预测时的IOU既看高宽形状也看中心位置。
3、以VOC2012数据集为例讲解真实框中心点坐标与形状高宽的标注
VOC2012数据集文件格式为xml文件,文件中保存真实框的左上角坐标与右下角坐标。
中心点坐标标注:如下为公式为Faster RCNN中心点坐标标注:
在这里插入图片描述
网络预测目标是tx与ty,(xa,ya)是特征图映射回原图像每个位置的中心点坐标,wa与ha是ancher box的宽与高。该标注公式存在问题:假设tx预测为1,那么预测出来的bbox位置就是特征图中心点位置偏移了一个ancher box宽度。即训练中的bbox位置可以在整张图片中任何位置出现,导致网络训练不稳定(这个也是YOLOV1中基于单个网格归一化而不是整张图像归一化的原因)。于是YOLOV2延续YOLOV1的思想:将bbox中心位置限制在对其负责的网格中。标注公式如下:
在这里插入图片描述
函数σ()表示sigmoid函数,值域为 (0,1)。cx与cy表示真实框中心点所落网格的左上角坐标, 如下图所示:网络输出预测的tx与ty,经过sigmoid函数,然后加上左上角坐标得到的bbox位置就被限制在对其负责的网格之内。
YOLO系列整理之YOLOV2_第1张图片
形状高宽标注:YOLOV1的形状高宽标注是拿整张图像来作参考的,由于YOLOV2引入了ancher box,所以是拿ancher box来作参考的(具体原因前面说了:可以使网络易于训练),公式如下所示:pw与ph是ancher box的宽与高,tw与th是网络输出的预测,bw与bh是最终的bbox形状。
在这里插入图片描述

损失函数(每一项参数详细讲解)

YOLO系列整理之YOLOV2_第2张图片
YOLOV2论文中没有给出损失函数,以上损失函数来自别的大佬画。根据满足条件的不同,每个网格中的5个bbox具有不同的执行模式:如下图所示:
YOLO系列整理之YOLOV2_第3张图片
YOLOV1的损失函数只有两种情况:1、对于没有匹配到物体的bbox只计算置信度误差(让置信度降为0)。2、对于匹配到物体的bbox有置信度、类别、位置、形状误差。
YOLOV2的损失函数有三种情况:
1、匹配到物体(Yes.1支路)
第一行:在网络前期训练生成的bbox形状与ancher box相同,将每个bbox与其对应的ancher box相绑定,
第二行:参数1在这里插入图片描述与YOLOV1对应同名参数同样道理,防止正负样本失衡,后面跟着位置形状均方误差。
第三行:参数2
在这里插入图片描述
等于1时表示该bbox匹配到物体,等于0时表示该bbox没有匹配到物体。该参数与Yes.2支路中的第一行中的λnoobj是λnoobj = λobj -1 的关系。这里的分析与YOLOV1中的同名参数是一样的,后面跟着置信度误差。
第四行:类别误差,由于现在是每一个bbox分配一套类别,所以类别误差也存在类别失衡的情况了,于是加上调节参数:
在这里插入图片描述
2、当前网格有真实框中心点落入,其与bbox的IOU小于阈值(Yes.2支路)
第一行置信度误差。参数λnoobj已经分析了。
第二行同样算形状误差,与Yes.1支路一样。
3、A: 当前网格有真实框中心点落入,其与bbox的IOU大于阈值但不是取得最大。
B:当前网格没有真实框中心点落入

这一部分不做处理,我觉得是为了避免正负样本失衡过于严重。
其实YOLO系列就是置信度损失、类别损失、bbox损失

你可能感兴趣的:(目标检测,深度学习,机器学习,神经网络)