yolov3个人学习笔记

算法核心思想

Yolo算法的核心思想是直接将图片分割成互不重合的小方块,然后通过卷积产生特定大小的特征图,特征图的每个元素是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方块内的目标,达到物体检测的效果。整体来看,Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测,整个算法大体操作如下图所示:首先将输入图片resize到416×416然后送入网络,最后处理网络预测结果得到检测的目标。
在这里插入图片描述
具体来说,Yolo的将输入的图片分割成S×S网格,然后每个单元格负责去检测那些中心点落在该格子内的目标。每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score)。置信度的构成由两个方面,一是边界框含有目标的可能性大小,二是这个边界框的准确度,它是两者的乘积结果。而边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union)即交并比来表示。而对于Yolo中的分类,是对每一个单元格预测出每个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。

网络流程

Yolov3主干网络采用了DarkNet53网络,它是由一个初始卷积层 + 5个Layer 层构成,进入layer层后进行下采样,大小减半,通道增倍。每个Layer 由若干个 Res unit组成。Yolov3在其基础上得到了13×13的特征图乘以其通道数255,再将其上采样并与DarkNet53中间得到的特征图合并得到26×26的特征图,同理再将26×26上采样得到52*52的特征图。 至于通道数255((4+1+80)×3)含义为预测的xywh+是否包含目标+类别数(如coco数据集的80)的总和×3个预测框。算法结构如下图所示。

在这里插入图片描述

输入端:

输入3通道的图像首先经过输入端,Yolov3采用Multi-Scale Training的思想,每隔几次迭代后就会微调网络的输入尺寸,因为Yolov3的网络使用的下采样倍率为32,所以使用32的倍数调整输入图像尺寸{320,352,…,608},训练使用的最小的图像尺寸为320 x 320,最大的图像尺寸为608 x 608,这使得网络可以适应多种不同尺度的输入。

(1)卷积层:

Yolov3网络的输入像素为416×416,通道数为3的图片(Random参数置1时可以自适应以32为基础的变化)。每一个卷积层都会对输入数据进行BN操作。每个卷积层卷积采用32个卷积核,每个卷积核大小为3×3,步长为1。

(2)Res层:

一共选用五种具有不同尺度和深度的Res层,它们只进行不同层输出间的求残差操作。

(3)Darknet-53结构:

从第0层一直到74层,一共有53个卷积层,其余为Res层。作为Yolov3进行特征提取的主要网络结构,Darknet使用一系列的3×3和1×1的卷积的卷积层(这些卷积层是从各主流网络结构选取性能比较好的卷积层进行整合得到。

(4)Yolo层(对应v2中的Region层):

从75层到105层为Yolov3网络的特征融合层,分为三个尺度(13×13、26×26和52×52),每个尺度下先堆积不同尺度的特征图,而后通过卷积核(3×3和1×1)的方式实现不同尺度特征图之间的局部特征融合,(Yolov2中采用FC层实现全局特征融合)。最终输出的是特征图是深度为255的张量(3*(1+4+80)=255),其中80是COCO数据集的类别数。

小尺度Yolo层(13×13):
A.输入:13×13的特征图 ,一共1024个通道;

B.操作:进行一系列卷积操作,特征图大小不变,通道数减少为255个;

C.输出:输出13×13大小的特征图,255个通道,然后在此基础上进行分类和定位回归。

中尺度YOLO层(26×26):
A.输入:对79层的13×13、512通道的特征图进行卷积操作,生成13×13、256通道

的特征图,然后进行上采样,生成26×26、256通道的特征图,然后将其与61层的26×26、512通道的中尺度特征图进行合并;

B.操作:进行一系列卷积操作,特征图大小不变,通道数最后减少为255个。

C.输出:26×26大小的特征图,255个通道,然后在此进行分类和定位回归。

大尺度YOLO层(52×52):
A.输入:对91层的26×26、256通道的特征图进行卷积操作,生成26×26、128通道的特征图,然后进行上采样生成52×52、128通道的特征图,然后将其与36层的52×52、256通道的中尺度特征度合并;

B.操作:进行一系列卷积操作,特征图大小不变,通道数最后减少为255个;

C.输出:52×52大小的特征图,255个通道,然后在此进行分类和位置回归。

Anchor机制

anchor box其实就是从训练集的所有ground truth box中统计(使用k-means聚类)出来的在训练集中最经常出现的几个box形状和尺寸。聚类出多个数量不同anchor box组,分别应用到模型中,最终找出最优的在模型的复杂度和高召回率(high recall)之间折中的那组anchor box。grid cell中的每个bounding box都预测对象,分别对应不同的ground truth。求出每个grid cell中每个anchor box与ground truth box的IOU(交并比),IOU最大的anchor box对应的bounding box就负责预测该ground truth。

计算方法:

b x = s i g m o i d ( t x ) + c x bx = sigmoid(tx) + cx bx=sigmoid(tx)+cx
b y = s i g m o i d ( t y ) + c y by = sigmoid(ty) + cy by=sigmoid(ty)+cy
b w = a w ∗ e t w bw = aw * e ^ {tw} bw=awetw
b h = a h ∗ e t h bh = ah * e ^ {th} bh=aheth

anchor box的宽高:aw、ah
bouding box的输出应当为:tx、ty、tw、th
而真实的预测box应当是:bx、by、bw、bh
cx、cy为grid cell方格左上角点相对整张图片的坐标。
sigmoid是将tx、ty的值归一化至0-1之间,确保目标中心处于执行预测的网格单元中,防止偏移过多。

特征金字塔FPN

在多层网络中,低层的特征语义信息比较少,但是目标位置信息准确;高层的特征语义信息比较丰富,但是目标位置信息比较粗略。而FPN是一种自顶向下的特征融合方法,是一种多尺度的目标检测算法。FPN使用不同分辨率的特征图感知不同大小的物体,并通过连续上采样和跨层融合机制使输出特征兼具底层视觉信息和高层语义信息。这样可以大程度的提高算法对小目标的检测效果,并且在大目标中节省了计算时间。
在这里插入图片描述
yolov3通过上采样和特征融合的方式,将不同层的特征通过concat(维度扩充)张量拼接的方式,输出不同尺度的特征图(图例中以VOC数据集20个类别为例)。在Yolov3中融合了三个尺度(13×13,26×26,52×52)并分别对这三个尺度独立做预测,每一个尺度对应三个anchor box。每个单元格输出(1+4+类别)×3个值,最后分别输出不同尺度的特征张量。

Loss Function

Yolov3的模型损失函数(Loss)为中心坐标误差函数(dict_xy)、宽高坐标误差函数(dict_wh)、置信度误差值(dict_C)与分类误差函数(dict_P)总和的均值,函数公式如下:

在这里插入图片描述

中心坐标误差函数的计算公式为:

在这里插入图片描述

宽高坐标误差函数的计算公式为:

在这里插入图片描述

置信度误差函数的计算公式为:

在这里插入图片描述

分类误差函数的计算公式为:

在这里插入图片描述

x ^ i j \hat x^{j}_{i} x^ij y ^ i j \hat y^{j}_{i} y^ij w ^ i j \hat w^{j}_{i} w^ij h ^ i j \hat h^{j}_{i} h^ij C ^ i j \hat C^{j}_{i} C^ij P ^ i j \hat P^{j}_{i} P^ij为Yolov3模型输出的第i个网格第j个anchor box的预测值; x i j x^{j}_{i} xij y i j y^{j}_{i} yij w i j w^{j}_{i} wij h i j h^{j}_{i} hij C i j C^{j}_{i} Cij P i j P^{j}_{i} Pij为Yolov3模型的第i个网格第j个anchor box的真实标签。其中,宽高坐标的误差函数为平方误差函数,中心坐标、置信度与分类误差函数都是交叉熵损失函数。

​ S:表示Yolov3的卷积模型里输出的张量 y i y_{i} yi(i=1,2,3)的尺寸,并且尺寸各不相同,每个张量yi共有S×S个网格。

​ B:表示张量yi里的每个grid cell生成的anchor box数量。

I i j o b j I^{obj}_{ij} Iijobj:表示第i个grid cell中的第j个anchor box是否负责这个对象(object),如果负责,它的值为1否则为0,而I(noobj)ij表示不负责;其中,负责是指该anchor box中bounding box与某个object的真实方框标签(ground truth box)的交并比(IoU)最大,那么就负责预测那个object,主要是因为bounding box最符合IoU最大的object。

​ λcoord:表示权重,其目的是为了扩大含有的object的grid cell的损失值,以及减少不含object的grid cell的损失值,方便卷积核参数的收敛。

IoU:

IoU算法计算的是bounding box和ground truth box的交集和并集之间的比值。如图所示:

在这里插入图片描述

bounding box与ground truth box之间按照相对位置可能出现的情况有(包含、左下、左上、右上、右下、互不相交)6种,如图1所示;通过分析图1可得:计算两个框的交集可视为计算两个集合交集,因此可以将两个框的交集的计算简化为如图2。

图1:
在这里插入图片描述

图2:
在这里插入图片描述

计算两个框交集的步骤:

  1. 假设图2中A框的横坐标集合为[x1,x2],B框的横坐标集合为[y1,y2];

  2. 计算两个框横坐标交集上界Z1,Z1=max(x1,y1);

  3. 计算两个框横坐标交集下届Z2,Z2=max(x2,y2);

  4. 如果Z2-Z1<=0则两个框没有交集,反之,A和B横坐标有交集;

  5. 同理求出A和B的纵坐标的交集,从而求出A和B的相交面积。

CIoU_Loss:

CIoU将目标与框框anchor之间的距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题,而惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去。

在这里插入图片描述

其公式如下:

在这里插入图片描述

其中,分子部分为预测框和真实框的中心点的欧式距离,c代表的是能够包含预测框和真实框的最小闭包区域的对角线距离。

α和v的公式如下:

在这里插入图片描述

CIoU的loss计算为:

在这里插入图片描述

NMS机制

在目标检测中提取置信度高的目标检测框,而抑制置信度低的误检框。在yolov3中,首先过滤掉obj_score < confidence的行,每一行只取class probability最高的作为预测出来的类别。将所有的预测按照obj_score从大到小排序,循环每一种类别,开始做nms。比较第一个预测框与其后所有预测框的iou,删除iou>threshold的预测框,即剔除所有相似预测框。比较下一个预测框与其后所有预测框的iou,删除所有与该预测框相似的预测框,不断重复上述过程,直至不再有相似预测框。至此,实现了当前处理的类别的多个预测框均是独一无二的预测框。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值