yolov3 论文笔记

原始论文中废话太多,文章主要参考csdn以及知乎上等博主的优秀博文总结得到
参考:
https://blog.csdn.net/qq_37541097/article/details/81214953
https://zhuanlan.zhihu.com/p/76802514
https://zhuanlan.zhihu.com/p/337383661

backbone

yolo v3的backbone 使用的是darknet53,如下图:
yolov3 论文笔记其中每个convolutional层是由 conv + bn + leakyRelu组成;Residual由一个1×1的conv和一个3×3的conv组成,并对1×1conv的前一层的输出进行残差连接。
可以看到上面的convolutional提供的结构中,存在5个stride为2的结构,目的是为了进行下采样,使得最后输出特征图是32倍原输入尺寸的大小。

性能:
yolo 系列一直追求高性能,原论文中提供下面的表。
yolov3 论文笔记表中列上有五个参数,其中top1表示按照最后分类结果与预测概率最高相对应得到的准确率;top5表示最后分类结构在预测概率前5高相对应的准确率;bn ops,billions of operations per second,指每秒钟以十亿为单位的操作次数;BFLOP/s, billion floating point operations per second,指每秒以十亿为单位有多少个浮点数运算;FPS指的是每秒处理数据的数量。

可以看到darknet53在FPS和准确上的指标还是很不错的。

预测目标:
用知乎上一位博主的图片
yolov3 论文笔记最后有三个feature map,大小分别为8×8,16×16以及32×32分别用来预测大,中,小三种目标。
三种尺寸的特征图的特征会互相融合,提升检测小目标的能力。

在设置先验框尺寸上,作者沿用了yolov2的策略,使用k-means算法,计算出9种大小的先验框尺寸,按照大小顺序分成3组,最小的前三个先验框分配到feature map3上,同理其余两组的先验框。在每个feature maps的cell上设置3个不同尺寸的先验框。
作者给出在COCO数据集上聚类得到的的先验框的尺寸如下:
(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116 × 90),(156 × 198),(373 × 326).
如下图
yolov3 论文笔记框的编解码:
其它博主重新绘制的一张图解释
yolov3 论文笔记对比原始论文上的图,作者在这个图上进行了一些改动,使其更加明确。
虚线的部分表示设置的先验框,其中心位置在 c x , x y c_x, x_y cx​,xy​上,先验框的高度和宽度为 p w , p h p_w, p_h pw​,ph​。
网络需要学习先验框到ground truth之间的偏移量 t x , t y , t w , t h t_x,t_y,t_w,t_h tx​,ty​,tw​,th​,分别表示框中心位置偏移,以及尺寸大小的偏移。

对 t x , t y t_x,t_y tx​,ty​使用sigmoid函数,将位置偏移的量设置的在[0,1],防止出现 c e l l i cell_i celli​中预测的框经过偏移以后跑到 c e l l j cell_j cellj​中的情况。

目标置信度与分类:
可以看到上面feature map1到3的channel数都是255,因为特征图上的每个cell的设置的anchor数是3,每个anchor负责预测4个位置信息,一个目标置信度以及一个分类信息。在COCO中有80个目标,所以3×(4+1+80)=255。

目标置信度直接由sigmoid输出。

分类函数作者不使用softmax,而使用sigmoid输出每个类别的的概率信息。因为在COCO数据集存在类似yolov2中类别的继承关系(比如狗和哈士奇两个类别)。

loss计算

Loss的计算由三部分组成,而且对比之前的yolov2和yolov1有不少改动。

损失由三部分组成,分类损失,置信度损失以及定位损失。
原论文里面没有详细的公式描述,在网上找了个。
yolov3 论文笔记 λ b o x , λ o b j , λ n o o b j , λ c l a s s λ_{box},λ_{obj},λ_{noobj},λ_{class} λbox​,λobj​,λnoobj​,λclass​表示分类的权重信息,因为负例(背景)和正例(目标)的比例信息差别非常大,需要用超参数调节。

1.中心位置损失和尺寸损失
其中 t ′ t' t′为表示ground truth的位置和尺寸, 1 i , j o b j 1_{i,j}^{obj} 1i,jobj​表示在第特征图的第i个cell,第j个anchor中是否存在目标,如果存在目标则为1,否则为0。同理 1 i , j n o o b j 1_{i,j}^{noobj} 1i,jnoobj​表示是没有目标的情况。
在位置的预测过程中,都是先验框对目标的偏移量,即 t t t表示的预测目标框与ground truth之间的偏移量, t ′ t' t′为ground truth与设置的先验框之间的偏移量。如下图,参考

yolov3 论文笔记 g ^ i x {\hat g}^x_i g^​ix​表示第i个anchor上,ground truth在x轴上的中心位置与先验框在x轴上中心位置的差,其它同理

2.置信度损失
使用sigmoid加上二值交叉熵计算损失,其中 c i , j c_{i,j} ci,j​为经过simoid后得到的输出。
此外,有其它博主对上面计算置信度的损失给出了另一种形式(包括代码部分),即公式中的 1 i , j o b j 1_{i,j}^{obj} 1i,jobj​以及 1 i , j n o o b j 1_{i,j}^{noobj} 1i,jnoobj​不使用简单的0或1这两种数值计算,而是使用ground truth与预测框的IOU计算。
即1_{i,j}^{obj}$改成IOU, 1 i , j n o o b j 1_{i,j}^{noobj} 1i,jnoobj​改成1-IOU

3.类别损失
同样使用二值交叉熵,其中 p i , j ( c ) p_{i,j}(c) pi,j​(c)表示第i个cell中第j个anchor预测目标为类别c的概率,这个值是经过sigmoid得到的。
p i , j ′ ( c ) p'_{i,j}(c) pi,j′​(c)表示该anchor是否存在目标c,如果存在目标c,则值为1,不存在目标c则值为0。(网上对这个部分有好多种说法)

训练过程

在训练的过程中,每个ground truth都会分配一个正例进行匹配,正例的选择是寻找与ground truth的IOU最大的先验框,用该先验框去适配ground truth,同时计算loss。

如果某个先验框与ground truth之间的IOU也很大,而且超过了一定的阈值,则该先验框直接抛弃不用。否则,将这些低于阈值的先验框作为负例去计算loss,负例不参与位置的loss以及分类的损失计算,仅计算置信度的loss。

这里借用,知乎上一篇文章关于正例的详细说明:

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计算出 t x , t y , t w , t h t_x, t_y,t_w,t_h tx​,ty​,tw​,th​,类别标签对应类别为1,其余为0;置信度标签为1。

上一篇:使用 python 实现 wc 命令程序的基本功能


下一篇:BTS5210G价格,哪家供应商有现货?