美文网首页
AI入门基础笔记- 5.3:YOLOv3相关算法的原理及实现(下

AI入门基础笔记- 5.3:YOLOv3相关算法的原理及实现(下

作者: 薛东弗斯 | 来源:发表于2023-04-23 08:32 被阅读0次

    将原始图片经过多次卷积、下采样操作,最好得到3*3*8的特征图。我们也可以将原始图片划分成3*3的区域,这样原图与特征图就对应起来了。

    上面 红色的框为物体的实际框,bx by是目标框中心点到单元格两边的距离,设定物体的类别还是三类,根据bx、by、bh、bw我们可以得到目标标签y的8维向量,即Pc、bx、by、bh、bw、c1、c2、c3.  但实际上为了便于计算,会将bx by进行延长,由到单元格两端的距离变为到图像两边的距离。

    再原来bx、by基础上,加上两侧的单元格数量即可,如bx加上2个单元格的距离 +2,by加上一个单元格的距离 +1。

    在Yolo v3中,除了物体的实际框之外,还有两个框

    黄色框是这个网格所对应的锚框,蓝色框是检测网络基于这个网络所预测的框。 

    将蓝色预测框的信息画出来,可以看到bx’、by’、bh’、bw’,根据这些信息,我们也可以描绘预测框的8维向量,此时训练就比较简单。 实际框信息已有,网络预测框信息也有,虽然预测不一定精准,但检测网络就是在训练过程中不断计算预测框的y’与实际标签y的距离,从而不断梯度下降,更新网络参数,减少两者之间的差距。

    在这三个框中,红色的框是人工标注的,是已知的;黄色的锚框也是提前设置好的,也是已知的;只有蓝色的预测框是不断变化的,预测框的信息是如何计算得到的?

    先将红色框的信息去掉,只保留预测框和锚框。其实本质上,黄色的锚框是蓝色的预测框和红色的实际框之间的桥梁。预测框在锚框的基础上,和红色的实际框进行IOU关连,并且在锚框大小的基础上,预测出目标框的大小,并进行修正。这也是Yolov3锚框机制的关键

    在预测y’的8个参数中,其中Pc’是前景和背景的概率,c1’、c2’、c3’是类别的概率

    现在的中点是计算出预测框的bx’、by’、bh’、bw’,从而同实际的框进行比较。这是就用到黄色的初始锚框了。不过在网络预测的时候,并不是直接预测bx’、by’、bh’、bw’,而是基于这个单元格的tx、ty、th、tw。 这里的tx ty表示预测框中心点的坐标偏移量,距离单元格左边和上边的距离。

    但是网络直接预测的值有可能大于1,所以通常在tx和t的外面使用sigmoid激活函数进行处理,把他们约束到0-1之间,这样就可单元格的尺度相符了。因为单元格的区间也是0-1

    另外两个变量,tw和th是预测框的宽度和高度的尺度缩放变量。因为锚框的宽和高已知,非Ph和Pw,因此理论上讲Ph*th,就可以得到预测框的宽,Pw*tw就可以得到预测框的高。现在网络预测的参数我们就知道了。

    将bx、by、bh、bw对应转换成bx’、by’、bh’、bw’。

    这里的单元格距离左边界以及上边界的距离我们也知道,我们设置为cx、cy。cx是两个单元格距离,因此cx=2;cy是1个单元格距离,即cy=1; 所以我们就可以通过上面的四个公式进行转换。

    bx’ = tx的激活函数 + cx

    by’ = ty的激活函数 + cy

    而在锚框的高Ph、锚框的宽Pw的基础上,和 e 的 th 次方 进行相乘,就可以得到预测框的高和预测框的宽。需要注意的是这里添加了指数e,而不是直接用th、tw进行相乘。一方面是因为对数空间转换的原因,比较复杂,这里不做过多描述;另一方面确保这里的值是大于0的,训练更加稳定

    到此,检测网络预测的tx、ty、th、tw在锚框的基础上计算可以得到bx’、by’、bh’、bw’以及一系列的信息。 在通过计算和实际框之间的损失函数从而更新调整网络参数,使得目标检测网络预测的越来越准。

    在了解锚框的计算机制之后,后面了解锚框的对应机制

    对416*416的图片使用13*13的网格进行划分,划分之后每个单元格的宽和高都是416/13=32,即32*32个像素,我们将模特的目标框画出来,可以看到,目标的中心点在第6行第8列这个网格中。

    Yolov3算法对每个网格都会使用3个形状不同的anchor box锚框,我们将中心点这个网格所对应的3个锚框画出来(当然其它的网格区域也都会生成相同形状的三个锚框),我们对每个网格都生成3个锚框,可以看到很多锚框堆叠在一起,虽然看起来比较凌乱,但可以覆盖原图中的各种区域。

    神经网络对目标检测预测的值是tx、ty、th、tw,因为用3个固定的锚框,所以我们可以在锚框的基础上,得到三个预测框,为了便于观察,我们将图片提取出来

    上图红色的框就是实际框,红点的单元格就是模特中心点所在单元格,通过网络预测的tx、ty、th、tw,使用前面讲到的锚框计算机制,就可以生成对应的预测框。比如使用最大的锚框我们可以生成一个蓝色的预测框,

    再使用中间尺寸的锚框,也可以生成一个预测框,

    再使用最小的黄色锚框,也可以是生成一个预测框。 蓝色的预测框都是目标的候选区域,当然候选区域刚开始并不是很精准,所以训练时网络要计算红色的实际框,和蓝色的预测框之间的差距,对蓝侧框不断调整,修正位置,让它回归的越来越准。但是讲到这里又出来一个问题,模特红色实际框只有一个,但蓝色的预测框却有3个,那么训练时到底选择哪一个预测框,来进行调整呢?

    因为预测框和锚框是意义对应的,所以也可以转换成应该使用哪个锚框来进行计算呢?

    我们没有必要对三个预测框都进行调整,所以这里就用到anchor box的对应机制

    我们将三个锚框抽取出来,用这三个不同形状的黄色锚框,和真实的红色框计算IOU,比如第一个黄框和真是红框之间的IOU是0.48,第二个锚框的IOU=0.43,第三个锚框的IOU=0.32, 因为第一个锚框的IOU值最大,因此网络训练时可以直接选择这个锚框产生的蓝色预测框来进行计算及修正。

    这就是使用anchor box的对应机制来训练调整yolov3网络的方法。

    下面从整体上看yolov3的网络结构,还是以多尺度融合的图为例

    我们使用13*13,26*26,52*52三种特征图进行输出,中间的部分,即红色框的部分,是Yolov3的backbone主干网络,作者构建主干网络的时候借鉴了残差网络Resnet的做法,在Yolov2的基础上,重新设计了darknet-53的特征提取网络结构

    我们先看darknet-53网络结构的细节。中间的这张图就是整体网络的分布。

    第一列,是每一层的类型

    第二列,是每一层卷积核的数量

    第三列,表示卷积核的尺寸

    最后一列,表示输入输出矩阵的大小

    从第一列网络类型可以看出,大多数是卷积层,但整体看起来,层数还是有点多,所以我们对整个网络再进行拆解,从而看的更清晰一些。

    首先看卷积核尺寸,带 /2 表示步长为 2 的卷积操作。可以将前面特征图的长宽都缩小一半,采用卷积的方式进行下采样,从而替换前面讲的最大池化的方式进行降维。 在减少特征信息损失的情况下,又能起到降维的效果。

    输入是416*416,输出是208*208,利用卷积公式的内容来计算,得到输出尺寸是208  向下取整。

    darknet-53网络结构中,很多地方都是步长为2的卷积操作,我们将他们都用蓝色标识出来,总共有5层,而在所有的卷积层中,卷积核后面没有带 /2 的,都是步长为1的卷积操作

    步长为1的卷积操作,就是绿色标出的这些。

    为了便于查看,网络旁边的1、2、8、8、4表示重复连接的组件,比如中间的 2* 表示2个卷积层核1个残差层后面再接上完全相同的2个卷积层和1个残差层。即重复2次 

    我们来统计一下步长为1的卷积层的数量, 1 + 1*2 + 2*2 + 8*2 + 8*2 + 4*2 = 47

    整体网络中,最后的全连接层,网络中也是有参数的,所以总层数是52+1 = 53

    红色的是残差层,表示跨层连接,和全连接层前面的下采样层一样,都是没有网络参数的。所以不参与层数的统计

    刚开始,作者构建了darknet-53,在ImageNet数据集上进行分类测试,发现分类精度和Resnet-101,甚至Resnet-152精度都差不多,但是计算的速度比两者快很多,而且网络层数少很多,因此将darknet网络用到了yolov3的设计上。

    从整体的网络结构可以看出,网络主要是由Convolution卷积层 和 Residual 残差层组成,红色残差曾参照Resnet 网络进行设计,从而缓解由于网络加深带来的梯度爆炸、梯度消失等问题

    在darknet-53网络结构中,两个卷积层和一个残差层 可以组成一个残差组件

    为了后面方便表示,我们将残差组件,前面用于降维的1个卷积层也加进来,变成一个大的Resblock组件,我们这里用ResX表示。

    比如Res1表示darknet-53 紫色方框中的这个部分,即只有一个残差组件

    比如Res2表示darknet-53 紫色方框中的这个部分,即有2个残差组件

    比如Res8表示darknet-53 紫色方框中的这个部分,即有8个残差组件

    下面还有一个Res8

    最后还有Res4,表示darknet-53 紫色方框中的这个部分,即有4个残差组件

    因此我们可以将darknet-53中间的网络,拆解成这样的5个部分更便于理解。

    此外还需要注意,网络结构中的卷积层,虽然写的是Convolution,但实际是简写,实际上都是由一个卷积层 + BN层 + Leakyrelu激活函数 组成的

    这里的卷积层,也是darknet-53网络的最小组件。

    我们将卷积层 + BN层 + Leakyrelu 画成图标的方式,再取每个层的开头字母,简写成CBL。不过为了更好理解,也可以将darknet-53网络进一步改写,变成下面这种方式

    网络的输入是416*416*3的彩色图像,再经过一个CBL卷积层,后面再接上前面讲的Res1、Res2、Res8、Res8、Res4 五个组件,最后经过一个平均池化层,一个全连接层,以及一个softmax层,就可以得到网络预测的图像的类别,这也是darknet-53用于图像分类的网络结构。

    前面讲过,Yolov3网络结构并不仅仅是为了分类,此外还有目标定位的任务,因此可以将后面的池化层,全连接层,以及softmax层砍掉,再接上前面说的三种特征图,这样就可以得到完整的yolov3网络结构图

    第一眼看上去与之前相比多了很多结构,但我们还可以进一步拆分,将整个网络分成四个部分。输入端、Backbone主干网络,以及Neck结构和输出层。

    最前面的输入层不用说。二中间的主干网络我们前面也分析过,有三个基本组件,第一个是CBL卷积层,第二个是2个卷积层和1个跨层连接构成一个残差组件,第三个是1个卷积层和X个残差组件共同构成一个ResX结构。

    主干网络中,有5个步长为2的卷积层,因此在主干网络的不同阶段我们可以看到特征图尺寸下降的变化。当然在主干网络提取出图像特征之后,为了更好的融合提取的特征,还使用了Neck结构,不过因为组后的输出层有3种特征图,13*13、26*26、52*52,而主干网络之后矩阵的尺寸是13*13,所以要经过Neck结构中的FPN结构,和前面的26*26、52*52特征图,进行多尺度融合。

    因此先将13*13的特征图经过一次上采样变成26*26大小

    前面说过下采样可以将输入的特征图尺寸缩小,而这里的上采样则将输入的特征图尺寸扩充放大一倍,变成26*26,再和前面主干网络中的 26*26特征图进行Concat操作,得到的特征图仍然是26*26大小。

    这里的Concat操作是什么意思?比如两个26*26的特征图进行Concat操作,输入和输出的尺寸不变,但是通道的数量进行连接,变成26*26*512大小。

    到了这里仍然是26*26大小,一方面继续传播得到26*26*21这里,另一部分分支再进行上采样操作,尺寸变成52*52,再与前面主干网络中的52*52的特征图进行Concat操作,得到的特征图还是52*52大小,并输入第三个特征图52*52*21这里,这就是darknet-53平面视角的网络结构图。

    再以立体视角看一下Yolov3的网络结构。

    首先输入是416*416的彩色图像,经过主干网络提取特征,可以得到不同阶段的52*52、26*26、13*13 特征图信息,而网络最后的输出层也是52*52、26*26、13*13的矩阵。 需要注意的是,这里的21是(1+4+2)*3得到的,其中2表示预测类别数。

    再主干网络与输出层之间,为了更好的融合主干网络提取的特征,所以中间的Neck结构中采用FPN结构。

    在主干网络是不断的自底向上进行下采样,而FPN结构是不断的自顶向下进行上采样

    和前面的特征图进行concat操作,并将三个特征图传入到输出层中。

    这些结构就构成了Yolov3完整的网络。 Yolov3是通用的目标识别检测算法。入门AI Yolo必学,因为很多项目中都会用到。

    比如人脸识别项目,需要将画面中的人脸先定位出来,此时就可以采用Yolo目标检测算法。

    输入416*416*3,经过darknet-53 主干卷积网络,以及Neck中的FPN结构,可以得到输出层P0、P1、P2三个特征图,特征图上面每个特征向量都可以对应416*416图像的一个感受野区域,而每个区域都会生成3个初始锚框。 

    因此网络输出的tx/ty/th/tw可以利用锚框,计算得到预测框,再加上前景背景的概率obj,以及类别的概率cls,就可以汇总得到目标检测网络输出的预测信息。

    但是从监督学习的角度,我们会对训练的样本进行标注,因此可以得到图片上每一个物体它实际框的位置和类别,所以可以根据前面讲的锚框的对应机制,分别对应到各自的锚框上,并打上类别的标签,到了这里,就可以将真实框和预测框的信息对应关联起来

    从P0 P1 P2三个特征图的角度,对前景和背景的概率,以及location位置信息,class类别信息,从这三个方面,来计算预测框和真实框之间的偏差,即损失函数。

    而总体的损失函数等于三个特征图损失函数之和,当有了损失函数,就可以利用网络的梯度更新方式,来进行反向传播了,从而不断迭代,更新网络中的参数,使得损失函数的值越来越小,从而越来越准确。

    实际使用中,输入一张图片,就可以直接得到检测以及分类的结果,所以并没有右上角人工标注的这个部分,当然也没有计算损失函数这个部分

    在实际使用中,测试过程主要分为两步,

    1- 先通过网络的tx、ty、th、tw等输出向量计算出预测框的位置和所属类别等信息。 需要注意的是,预测框的得分不是简单的用前景和背景的概率,或者class 类别的得分,而是将两者相乘,并且设置阈值分数比如0.3,将预测框分数大于0.3的都保留下来,分数比较低的都过滤掉。这样有个好处,保留下来的框即是前景,同时也是类别分数比较大的目标。此时就得到三个特征图预测框所需信息,但现在的框可能还是太多了,因此我们需要在一个标准的基础上再评判这些目标框信息

    2- 将三个特征图上的结果,全部映射回416*416输入图上,此时在416*416输入图片上就会有多种类别的很多的框,因此还需要针对每个类别,做一个NMS 非极大值抑制处理,消除重叠度很高的框,这样到了最后,我们就可以得到最终的预测框的信息,以及得分。从而完成目标的检测以及定位

    相关文章

      网友评论

          本文标题:AI入门基础笔记- 5.3:YOLOv3相关算法的原理及实现(下

          本文链接:https://www.haomeiwen.com/subject/avmnhdtx.html