Yolo v3的学习

目录

一、Backbone:Darknet53

二、Neck:FPN

三、Prediction:Yolo head

四、训练策略

4.1、正负样本与忽略样本

4.2、正样本匹配

4.2.1、IOU匹配

4.2.2、采用长宽比匹配

4.3、预测框的回归

4.4、LOSS

五、改进


Yolo v3算是Yolo系列里面较早一点的经典之作了。

Yolo v3的structure由三部分构成:Backbone、Neck、Predcition。

一、Backbone:Darknet53

Darknet53的每一个卷积部分使用了特有的DarknetConv2D结构,每一次卷积的时候进行l2正则化,完成卷积后进行BatchNormalization标准化与LeakyReLU普通的ReLU是将所有的负值都设为零,Leaky ReLU则是给所有负值赋予一个非零斜率

Darknet53具有一个重要特点是使用了残差网络Residual,Darknet53中的残差卷积就是首先进行一次卷积核大小为3X3、步长为2的卷积,该卷积会压缩输入进来的特征层的宽和高,实现下采样,将得到的特征层命名为layer,再对该特征层进行一次1X1的卷积和一次3X3的卷积,并把这个结果加上layer,构成一个Resblock模块。一个Resblock_body模块是由一次下采样+多个残差块堆叠而成。由于Backbone中含有五个残差结构,故一共完成5次的下采样操作,进行了五次的长宽收缩。通过不断的1X1卷积和3X3卷积以及残差边的叠加,大幅度的加深了网络,残差块堆叠构成了残差网络。

这里简单说下残差网络:

残差块(residual block)中的网络可以是全连接层,也可以是卷积层。 如果我们使用标准优化算法训练一个普通网络,比如说梯度下降法,如果没有残差,没有这些捷径或者跳跃连接,凭经验会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。也就是说,理论上网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。残差网络内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。残差结构可以不通过卷积直接从前一个特征层映射到后面的特征层,有助于训练和特征提取,容易优化,并且能够通过增加相当的深度来提高准确率。

在整个v3结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长都缩小了一半(即面积缩小到原来的1/4)。yolo v3也和yolo v2一样,backbone都会将输出特征图缩小到输入的1/32(进行了五次下采样,所以是2的5次方,32),所以通常都要求输入图片是32的倍数。

DBL模块代表的是卷积+Batch Normalization+LeakyReLU结构,Res unit代表的就是残差块了,Resn代表的就是残差网络了。

二、Neck:FPN

Yolo v3构建FPN特征金字塔进行加强特征提取。

FPN的思想是:把高层的特征传下来,补充低层的语义,这样就可以获得高分辨率、强语义的特征,有利于小目标的检测。

对于深度卷积网络而言,从一个特征层卷积到另一个特征层,无论步长是1还是2还是更多,卷积核都要遍布整个图片进行卷积,大的目标所占的像素点比小目多,所以大的目标被经过卷积核的次数远比小的目标多,所以大目标的特点更容易得到保留,小目标的特征点容易被跳过。因此,经过很多层的卷积之后,小目标的特点会越来越少,越小越小。FPN结构借鉴了语义分割的思想,当特征点经过不断的下采样之后得到了高层加强的语义信息(自底向上的路线),为了能够检测到小目标,增加了一条自顶向下的路线(重新进行上采样,使得特征层的长宽重新变大,用大尺寸的特征图去检测小目标)和横向连接(将下采样中,与上采样中长宽相同的特征层进行堆叠,这样可以保证小目标的特征与信息,采用1×1的卷积核进行连接)。

三、Prediction:Yolo head

Yolo v3可以多尺度预测,拥有三个特征层,可以预测不同大小的物体。Yolo Head本质上是一次3x3卷积加上一次1x1卷积,3x3卷积的作用是特征整合,1x1卷积的作用是调整通道数。

将图片输入Darknet53获得三个有效特征层后,利用这三个有效特征层进行FPN层的构建:

(1)13x13x1024的特征层进行5次卷积处理之后的结果,一部分用于进行上采样UmSampling2d后与26x26x512特征层进行结合,得到26x26x768的特征层;另一部分利用YoloHead获得预测结果((13,13,75))。

(2)将(1)中得到的26x26x768的特征层再进行5次卷积处理,利用YoloHead获得预测结果((26,26,75));另一部分用于进行上采样UmSampling2d后与52x52x256特征层进行结合,得到52x52x384的特征层。
(3)将(2)中得到的52x52x384的特征层再进行5次卷积处理,利用YoloHead获得预测结果((52,52,75))。

对三个特征层分别进行处理,假设我们预测是的VOC数据集,输出层的shape分别为(13,13,75),(26,26,75),(52,52,75)。最后一个维度75是基于voc数据集的,它的类为20种。Yolo v3针对每一个特征层的每一个特征点都存在3个anchor,所以预测结果的通道数为3x25;如果使用的是coco训练集,类则为80种,最后的维度应该为255 = 3x85,三个特征层的shape为(13,13,255),(26,26,255),(52,52,255)。其实际情况就是,输入N张416x416的图片,在经过多层的运算后,会输出三个shape分别为(N,13,13,255),(N,26,26,255),(N,52,52,255)的数据,对应每个图分为13x13、26x26、52x52的网格上3个先验框的位置。

在获得了三个特征层的预测结果之后,还进行一步解码操作和NMS(非极大抑制)操作才能得到最终预测框的位置信息。利用Yolo v3网络结构提取到三个特征层之后,不同尺度下每个网格点上均有先验框,网络训练过程会对先验框的参数进行调整,继而得到预测框,从不同尺度下预测框还原到原图输入图像上,同时包括该框内目标预测的结果情况(预测框位置、类别概率、置信度分数),这个过程称之为解码。

解码过程如下(以13×13特征层为例):
(1)网格产生4+1+20的参数。其中的4代表先验框的调整参数:x_offest,y_offest,w,h;1代表置信度,20代表的是这个先验框的种类,由于voc分了20类,所以这里是20。
(2)利用(1)中的4确定预测框位置,通过x_offest,y_offest对网格点进行偏移,得到框的中心点的坐标,再经过图像尺寸(scale = input_shape/13)的缩放,就可以得到真实图片上预测框的中心点的坐标(x,y)。通过w和h对先验框(anchor)进行微调,得到框的实际宽高,再根据图像尺寸(scale = input_shape/13)的缩放,就可以得到真实图片上预测框的实际宽和高(w,h)。至此得到了实际预测框的位置信息(x,y,w,h)。 
(3)利用20得到预测框的得分,即预测框的得分=预测框的置信度×类别置信度。
(4)得到三个特征层上所有的预测框,一共13x13x3+26x26x3+52x52x3个预测框,进行NMS。

为了方便理解,这里举个25的参数的形式例子,假设一个预测框的形式为:

(0.3, 0.4, 0.5, 0.5, 0.75,  0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

前四位分别是x_offest,y_offest,w,h;第五位代表的是预测框的置信度,后面的类似二进制编码形式的代表的就是预测框物体的种类,假设预测的是狗,种类的形式就是01000000000000000000,如果是猫,那可能就变成了10000000000000000000(举例而已)。

四、训练策略

4.1、正负样本与忽略样本

三个特征图一共可以解码出 13 × 13 × 3 + 26 × 26 × 3 + 52 × 52 × 3 = 10647个box以及相应的类别、置信度。这里置信度标签是一个二分类,正样本,即包含物体的置信度标签为1;负样本,即不包含物体的置信度标签为0。
正样本:任取一个真实框和10647个预测框分别计算IOU,IOU最大的预测框就是正样本。正样本产生置信度loss、检测框loss、类别loss。类别标签对应类别为1,其余为0;置信度标签为1。
负样本:正样本除外(与真实框计算后IOU最大的检测框,如果IOU小于阈值,仍为正样本),与全部真实框的IOU都小于阈值(0.5),则为负样本。负样本只有置信度产生loss,置信度标签为0。
忽略样本:除了正样本,预测框与任意一个真实框的IOU大于阈值(0.5),则为忽略样本。忽略样本不产生任何loss。

4.2、正样本匹配

yolo v3原先论文中的正样本匹配还是利用IOU,更新之后有用长宽匹配。

4.2.1、IOU匹配

训练时会先筛选所有存在的先验框(设定阈值),剩下的先验框才与每一个真实框计算IOU,IOU最高的先验框才分配给那个真实框,此时这个先验框是正样本,产生置信度loss、检测框loss、类别loss;如果有其他的先验框与这个真实框的IOU也很大,并且超过一定的阈值(设定),那么这个先验框就是忽略样例,不产生任何的loss;如果一个先验框与真实框的最大IOU也小于阈值,那么这个先验框也是正例,除了这个正例,其他小于阈值的先验框都是负例,此时产生置信度loss。

4.2.2、采用长宽比匹配

以13×13特征层为例,先将特征图划分为13×13的网格,如果物体的真实中心点落在某个网格内,则该网格的左上角的点则作为锚点,有3个对应的anchor(Yolo v3中是通过聚类方法得到的九个不同尺寸的anchor,每个特征层对应三个anchor),(此时锚点的坐标是归一化之前的坐标)筛选出更为合适尺寸的anchor负责预测框,也就是anchor与gt的匹配机制。其匹配过程为:将gt归一化之后的w,h坐标分别与三个尺寸的anchor做宽高比的计算。先计算gt/anchor的宽高比,记为r,再计算anchor/gt的宽高比,记为1/r,取出其中的最大值,与阈值(这里设为2)比较,若大于2则舍弃;若小于2,则保留,认为其是正样本。

4.3、预测框的回归

预测框的回归过程:

通过K-means聚类方法得到9个尺寸的anchor。网格预测的预测信息与先验框信息经过公式计算得到最后的检测框信息。其中cx,cy是anchor中心点距离最左上角的距离(向前取整),也是网格的坐标偏移量,pw,ph是预设的anchor的边长,最终得到的边框坐标值是bx,by,bw,bh,而网络学习目标是tx,ty,tw,th,经过sigmoid函数与指数转换之后得到最终结果。最后,使用sigmoid对Objectness和Classes confidence进行sigmoid,得到0~1之间的概率,之所以用sigmoid取代之前版本的softmax,原因是softmax会扩大最大类别概率值而抑制其他类别概率值 。

Pr(Class|Object)*Pr(Object)*IOU(pred&groundtruth)=Pr(Class)**IOU(pred&groundtruth)

此过程会涉及解码,将真实框转化为yolov3输出的形式(基于网格点和anchor表达真实框的位置),方便计算loss。

编码的过程:

(1)从标签中获得真实框的中心以及宽和高,除去input_shape变成比例模式。

(2)创建包含三种特征层的全0列表,与yolov3的输出tensor的维度一致:(m,13,13,3,4+1+num_class)

(3)计算每一个真实框与先验框(9个尺寸)的IOU,IOU最大的先验框负责那一个真实框的表达,同时根据先验框的尺寸和真实框中心点坐标得到所属特征层以及特征层上网格点的位置。至此我们明确了所有真实框用哪一个anchor表达,确定了这个先验框的所属特征层和网格点,得到形如(m,13,13,1)的tensor。

(4)明确表达真实框的先验框(先验框内有目标),下面就是求出相应的调参系数x_offest,y_offest,w,h,用网格点和anchor表示真实框。负责表达真实框的先验框置信度为1(为计算loss时的正样本,先验框内有目标),不负责表达真实框的位置全为0。并将有目标的先验框内目标类别转化为num_class维度,得到形如(m,13,13,1,4+1+num_class)的tensor——y_true;
将全部的真实框转化为了不同特征图上的用先验框和网格点表达的形式。并且有目标的先验框置信度为1,是loss中的正样本,得到了最终的y_true。

4.4、LOSS

loss的组成:预测框的loss+置信度的loss+类别预测的loss。公式如下:

五、改进

  • Leaky ReLU

ReLU是将所有的负值都设为零,相反,Leaky ReLU是给所有负值赋予一个非零斜率。

  • 构建FPN结构
  • 采用多尺度预测(拥有三个不同尺度的特征层)
  • 正负样本匹配

参考:

还有一些忘了是在哪看的了··········

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值