YOLOV3网络模型

目录

资料

网络模型原理

网络框架

先验框

先验框计算 

训练

置信度

对象条件类别概率

讨论

Reference


资料

论文地址: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维预测框数值t_{x},t_{y},t_{w},t_{h},1维预测框置信度,80维物体类别数(COCO数据集一共80个类别)。

先验框

anchor box其实就是从训练集的所有ground truth box中统计(使用k-means)出来的在训练集中最经常出现的几个box形状和尺寸。比如,在某个训练集中最常出现的box形状有扁长的、瘦高的和宽高比例差不多的正方形这三种形状。我们可以预先将这些统计上的先验(或来自人类的)经验加入到模型中,这样模型在学习的时候,瞎找的可能性就更小了些,当然就有助于模型快速收敛了。以前面提到的训练数据集中的ground truth box最常出现的三个形状为例,当模型在训练的时候我们可以告诉它,你要在grid cell 1附件找出的对象的形状要么是扁长的、要么是瘦高的、要么是长高比例差不多的正方形,你就不要再瞎试其他的形状了。anchor box其实就是对预测的对象范围进行约束,并加入了尺寸先验经验,从而实现多尺度学习的目的。

先验框计算 

前提需要知道,
c_{x}c_{y}​的坐标是(0,0) (0,1),(0,2),(0,3)…(0,13),(1,0),(1,1),(1,2),(1,3)…(1,13)等等;

bouding box的输出应当为:t_{x},t_{y},t_{w},t_{h};

而真实的预测box应当是:b_{x},b_{y}(中心坐标),b_{w},b_{h}(宽高);

每个格子grid cell是以1为一个范围,每个grid cell的大小实际是1 ∗ 1 

上图中的几个关系式拆开分析:

b_{x}=\sigma (t_{x}) + c_{x}

b_{y}=\sigma (t_{y}) + c_{y} 

其中,\sigma (t_{x})为sigmoid函数;
c_{x}c_{y}分别为grid cell方格左上角点相对整张图片的坐标。

式子中使用sigmoid主要目的是将t_{x}t_{y}压缩到(0,1)区间内,可以加速模型在训练前期的收敛。另外,用sigmoid将t_{x}t_{y}压缩到[0,1]区间內,可以有效的确保目标中心处于执行预测的网格单元中,防止偏移过多。 sigmoid的结果再加上c_{x}​和c_{y}​即中心落入的grid cell坐标就能得到该物体在feature map上的中心坐标了。

对于:

b_{w}=p_{w}e^{t_{w}}

b_{h} = p_{h}e^{t_{h}}

其中,​p_{w}p_{h}为anchor box的宽和高;
t_{w}t_{h}为bounding box直接预测出的宽和高;
b_{w}b_{h}​为转换后预测的实际宽和高。

这也就是最终预测中输出的宽和高。公式中包含了e^{t_{w}}e^{t_{h}}项,首先它没有像中心坐标点那样被限制到0-1之间说明它与anchor box的宽高相乘是一个比较自由的值,对预测的框的宽高没有限制,因为实际情况也是宽高可以很大也可以很小。其次,在求导的时候e^{t_{w}}e^{t_{h}}项便于求导。

训练

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计算出\hat{t_{x}},\hat{t_{y}},\hat{t_{w}},\hat{t_{h}});类别标签对应类别为1,其余为0;置信度标签为1。

3.忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5),则为忽略样例。忽略样例不产生任何loss。

4.负例:正例除外(与ground truth计算后IOU最大的检测框,但是IOU小于阈值,仍为正例),与全部ground truth的IOU都小于阈值(0.5),则为负例。负例只有置信度产生loss,置信度标签为0。

关于box参数的转换还有一点值得一提,作者在训练中并不是将t_{x},t_{y},t_{w},t_{h}转换为b_{x},b_{y},b_{w},b_{h}后与ground truth box的对应参数求误差,而是使用上述公式的逆运算将ground truth box的参数转换为与t_{x},t_{y},t_{w},t_{h}对应g_{x},g_{y},g_{w},g_{h},然后再计算误差。

也就是说,我们训练的输出是t_{x},t_{y},t_{w},t_{h},那么计算误差的时候,也是利用真实框的\hat{t}_{x},\hat{t}_{y},\hat{t}_{w},\hat{t}_{h}这几个值计算误差。

 根据预测框的公式我们可以推出实际框的公式:

g_{x}= \sigma (t_{x}) + c_{x}

g_{y}= \sigma (t_{y}) + c_{y}

g_{w}= p_{w}e^{t_{w}} 

g_{h}= p_{h}e^{t_{h}}

计算中由于sigmoid函数的反函数那计算,所以并没有计算sigmoid的反函数,而是计算输出对应的sigmoid函数值。得到\sigma (\hat{t_{x}}),\sigma (\hat{t_{y}})\hat{t}_{w},\hat{t}_{h}:

\sigma (\hat{t_{x}}) = g_{x} - c_{x}

\sigma (\hat{t_{y}}) = g_{y} - c_{y}

\hat{t_{w}} = log(g_{w}/p_{w})

\hat{t_{h}} = log(g_{h}/p_{h}) 

这样,我们就可以根据训练的输出\sigma (t_{x}),\sigma (t_{y}),t_{w},t_{h}与真实框 \sigma (\hat{t_{x}}),\sigma (\hat{t_{y}})\hat{t}_{w},\hat{t}_{h}求出误差了。

Loss函数

第一个特征图的损失抽象表达:

 总的Loss表示:

1.\lambda为权重常数,控制检测框Loss、obj置信度Loss、noobj置信度Loss之间的比例,通常负例的个数是正例的几十倍以上,可以通过权重超参控制检测效果。

2.l_{ij}^{obj}若是正例则输出1,否则为0; l_{ij}^{noobj}若是负例则输出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将整个物体的所有特征都包括进来的自信程度。经过以上的解释,其实我们也就可以用数学形式表示置信度的定义了:

C_{i}^{j} = Pr(Object) *IOU_{pred}^{truth} 

其中Pr(Object)表示当前box是否有对象,该对象表示除背景以外的所有待检测物体。IOU表示预测的框与真实框可能的IOU值,表达自己框出了物体的自信程度。

如何训练C_{i}^{j}?

训练中,\hat{C_{i}^{j}}表示真实值,\hat{C_{i}^{j}}的取值是由grid cell的bounding box有没有负责预测某个对象决定的。如果负责,那么\hat{C_{i}^{j}}=1,否则,​​​​​​​\hat{C_{i}^{j}}=0。

负责预测某个对象的anchor box与该对象的ground truth box的IOU在所有的anchor box 与ground truth box的IOU中最大,那它就负责预测这个对象。

对象条件类别概率

对象条件类别概率是一组概率的数组,数组的长度为当前模型检测的类别种类数量,它的意义是当bounding box认为当前box中有对象时,要检测的所有类别中每种类别的概率。

讨论

欢迎大家加群讨论

Reference

【论文理解】理解yolov3的anchor、置信度和类别概率_DLUT_yan的博客-CSDN博客_yolo置信度

【论文解读】Yolo三部曲解读——Yolov3 - 知乎 

【论文理解】yolov3损失函数_DLUT_yan的博客-CSDN博客_yolov3损失函数 

【精读AI论文】YOLO V3目标检测(附YOLOV3代码复现)_哔哩哔哩_bilibili 

猜你喜欢

转载自blog.csdn.net/qq_36076233/article/details/123136896