赞
踩
目录
论文地址:https://arxiv.org/abs/1804.02767
代码:https://github.com/ultralytics/yolov3
如左上图所示,Darknet-53是论文中提出的一种网络模型结构,可以作为检测模型的backbone,相较于 Darknet-19加深了网络层数,引入了Resnet中的跨层加和操作。如右上图所示,Darknet在ImageNet上的准确率比Darknet-19高近3个点,与ResNet-101和ResNet-152准确率相当,但计算复杂度和FPS要明显比这两者好很多。
上图YOLOV3的Backbone部分采用的是Darknet-53结构,在Neck部分进行了高层特征与底层特征的融合,融合时采用了上采样的方法将高层特征图的长宽各增加一倍,高层特征获得了与底层特征图相同的尺寸,这样就可以concat到一起了。输出层输出三个尺寸的特征,小尺寸特征图用于检测大尺寸的物体,大尺寸特征图检测小尺寸物体。特征的输出维度为NxNx[3x(4+1+80)],NxN为输出特征图grid cell的数目,一共3个框,每个框有4维预测框数值,,,,1维预测框置信度,80维物体类别数(COCO数据集一共80个类别)。
anchor box其实就是从训练集的所有ground truth box中统计(使用k-means)出来的在训练集中最经常出现的几个box形状和尺寸。比如,在某个训练集中最常出现的box形状有扁长的、瘦高的和宽高比例差不多的正方形这三种形状。我们可以预先将这些统计上的先验(或来自人类的)经验加入到模型中,这样模型在学习的时候,瞎找的可能性就更小了些,当然就有助于模型快速收敛了。以前面提到的训练数据集中的ground truth box最常出现的三个形状为例,当模型在训练的时候我们可以告诉它,你要在grid cell 1附件找出的对象的形状要么是扁长的、要么是瘦高的、要么是长高比例差不多的正方形,你就不要再瞎试其他的形状了。anchor box其实就是对预测的对象范围进行约束,并加入了尺寸先验经验,从而实现多尺度学习的目的。
前提需要知道,
和的坐标是(0,0) (0,1),(0,2),(0,3)…(0,13),(1,0),(1,1),(1,2),(1,3)…(1,13)等等;bouding box的输出应当为:,,,;
而真实的预测box应当是:,(中心坐标),,(宽高);
每个格子grid cell是以1为一个范围,每个grid cell的大小实际是1 ∗ 1
上图中的几个关系式拆开分析:
其中,为sigmoid函数;
和分别为grid cell方格左上角点相对整张图片的坐标。
式子中使用sigmoid主要目的是将和压缩到(0,1)区间内,可以加速模型在训练前期的收敛。另外,用sigmoid将和压缩到[0,1]区间內,可以有效的确保目标中心处于执行预测的网格单元中,防止偏移过多。 sigmoid的结果再加上和即中心落入的grid cell坐标就能得到该物体在feature map上的中心坐标了。
对于:
其中,和为anchor box的宽和高;
和为bounding box直接预测出的宽和高;
和为转换后预测的实际宽和高。
这也就是最终预测中输出的宽和高。公式中包含了和项,首先它没有像中心坐标点那样被限制到0-1之间说明它与anchor box的宽高相乘是一个比较自由的值,对预测的框的宽高没有限制,因为实际情况也是宽高可以很大也可以很小。其次,在求导的时候和项便于求导。
1.预测框一共分为三种情况:正例(positive)、负例(negative)、忽略样例(ignore)。
2.正例:任取一个ground truth,与4032个框全部计算IOU,IOU最大的预测框,即为正例。并且一个预测框,只能分配给一个ground truth。例如第一个ground truth已经匹配了一个正例检测框,那么下一个ground truth,就在余下的4031个检测框中,寻找IOU最大的检测框作为正例。ground truth的先后顺序可忽略。正例产生置信度loss、检测框loss、类别loss。预测框为对应的ground truth box标签(需要反向编码,使用真实的x、y、w、h计算出);类别标签对应类别为1,其余为0;置信度标签为1。
3.忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5),则为忽略样例。忽略样例不产生任何loss。
4.负例:正例除外(与ground truth计算后IOU最大的检测框,但是IOU小于阈值,仍为正例),与全部ground truth的IOU都小于阈值(0.5),则为负例。负例只有置信度产生loss,置信度标签为0。
关于box参数的转换还有一点值得一提,作者在训练中并不是将,,,转换为,,,后与ground truth box的对应参数求误差,而是使用上述公式的逆运算将ground truth box的参数转换为与,,,对应,,,,然后再计算误差。
也就是说,我们训练的输出是,,,,那么计算误差的时候,也是利用真实框的,,,这几个值计算误差。
根据预测框的公式我们可以推出实际框的公式:
计算中由于sigmoid函数的反函数那计算,所以并没有计算sigmoid的反函数,而是计算输出对应的sigmoid函数值。得到,,:
这样,我们就可以根据训练的输出,,,与真实框 ,,求出误差了。
Loss函数
第一个特征图的损失抽象表达:
总的Loss表示:
1.为权重常数,控制检测框Loss、obj置信度Loss、noobj置信度Loss之间的比例,通常负例的个数是正例的几十倍以上,可以通过权重超参控制检测效果。
2.若是正例则输出1,否则为0; 若是负例则输出1,否则为0;忽略样例都输出0。
3.x、y、w、h使用MSE作为损失函数,也可以使用smooth L1 loss(出自Faster R-CNN)作为损失函数。smooth L1可以使训练更加平滑。置信度、类别标签由于是0,1二分类,所以使用交叉熵作为损失函数。
还存在一个很关键的问题:在训练中我们挑选哪个bounding box的准则是选择预测的box与ground truth box的IOU最大的bounding box做为最优的box,但是在预测中并没有ground truth box,怎么才能挑选最优的bounding box呢?这就需要另外的参数了,那就是下面要说到的置信度。
表示一种自信程度:框出的box内确实有物体的自信程度和框出的box将整个物体的所有特征都包括进来的自信程度。经过以上的解释,其实我们也就可以用数学形式表示置信度的定义了:
其中表示当前box是否有对象,该对象表示除背景以外的所有待检测物体。IOU表示预测的框与真实框可能的IOU值,表达自己框出了物体的自信程度。
如何训练?
训练中,表示真实值,的取值是由grid cell的bounding box有没有负责预测某个对象决定的。如果负责,那么=1,否则,=0。
负责预测某个对象的anchor box与该对象的ground truth box的IOU在所有的anchor box 与ground truth box的IOU中最大,那它就负责预测这个对象。
对象条件类别概率是一组概率的数组,数组的长度为当前模型检测的类别种类数量,它的意义是当bounding box认为当前box中有对象时,要检测的所有类别中每种类别的概率。
欢迎大家加群讨论
【论文理解】理解yolov3的anchor、置信度和类别概率_DLUT_yan的博客-CSDN博客_yolo置信度
【论文理解】yolov3损失函数_DLUT_yan的博客-CSDN博客_yolov3损失函数
【精读AI论文】YOLO V3目标检测(附YOLOV3代码复现)_哔哩哔哩_bilibili
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。