目标检测系列4——yolov3原理与实现

YOLOv3是在YOLOv2的基础上进行改进,没什么大的改动和创新点,而是融合借鉴了很多在其他的方案,最后效果还是很好的,文章中自己也提到了:“We made a bunch of little design changes to make it better”,YOLOv3的论文是《YOLOv3: An Incremental Improvement》,真的是个很低调的题目,没有Better, Faster和Stronger。╮( ̄▽  ̄)╭而且论文的篇幅比较短,一共只有6页。

前提

在了解YOLOv3之前,强烈要求先了解YOLOv1和YOLOv2
YOLOv1:
https://blog.csdn.net/xiaotiig/article/details/111772945
YOLOv2:
https://blog.csdn.net/xiaotiig/article/details/111834918

1 先看看效果

1.1 定量实验

YOLOv3给了两套评价标准下的结果,一个是按照IOU=0.5算出来的mAP-50,一个是按照COCO标准算出来的mAP,**COCO要计算IOU从0.5到0.95之间间隔为0.05的10个平均值。**在第一个标准上,YOLOv3表现很惊艳,只用1/4的耗时,就取得了RetinaNet-101-800的效果,但是按照第二个标准,YOLOv3就要差一些。最后YOLOv3论文吐槽说“ humans have a hard time distinguishing an IOU of .3 from .5!”

inference time是推理时间
YOLOv3-608、YOLOv3-416后面的608、416指的是输入为608或416,输入不同时网络的性能。
速度快,同时mAP也比较高
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 定性实验

在这里插入图片描述
YOLOv3为什么对小目标检测效果有提升?

1、YOLOv3换了性能更强的主干网络;
2、YOLOv3拉取了多层分支,而且最大的特征图达到了52 × 52 ,这让小目标更容易被检测到(感受野越小越能检测小目标);
3、YOLOv3的多层分支存在上一层的特征融合,用upsample替换了reshape,让特征在channel上没有形变;
4、YOLOv3的多层分支后还有多层卷积,缓解了特征图尺寸足够,但是语义信息不足的情况;
5、YOLOv3的archor输出达到了10647个。

2 改进

相比于YOLOv2,YOLOv3主要有4个方面的改动:

2.1 主干网络

YOLOv3的主干网络又变了,设计了基础网络结构Darknet-53;
Darknet-53一共有53个卷积层,不包括Residual中的卷积层,最后的Connected是全连接层也算卷积层,一共53个。
在这里插入图片描述
在这里插入图片描述
其中的Convolutional和Residual结构如上图所示
在这里插入图片描述
上面的就是残差结构,当然里面的激活函数可以变化等。

这是一个引入了残差直连的主干网络,最左侧的一列数字是残差单元的个数,最右侧的output是特征图的尺寸,这个结构和ResNet50很像,但是它没有用瓶颈层设计,也不是朴素的残差单元设计,而是每个残差单元里有2个卷积,不是三个,第一个卷积层是一个1 × 1 的卷积,第二个是3 × 3 的卷积,每进一次残差单元,第一个卷积总是会把通道先降下来,然后第二个再负责升上去,以降低网络的计算量。此外,这个网络除了最后的全局平均池化外,再没有别的池化层,下采样都靠stride=2的卷积来完成。
注意:只有一个池化层,stride=2的卷积来完成。

下面的这幅图是YOLOv2采用的Darknet-19,可以看出来,它其实是加了1 × 1 1\times11×1卷积的VGG结构。这是两版YOLO的backbone的区别。
在这里插入图片描述

在这里插入图片描述
上图是各个主干网络在准确率和效率方面的对比,首先准确率没啥说的就是Top-1和Top-5,这两个指标上Darknet-53都是优于ResNet-101的,并非常接近于ResNet-152,奇怪的是在后面,YOLOv3用了三个指标说明Darknet-53好,分别是Bn Ops,BFLOP/s和FPS,一般情况下分类网络都只用一个指标说明网络的计算量那就是FLOPs或MFLOPs,但是YOLOv3用了三个。
下面分别说明一下,在论文中Bn Ops和BFLOP/s的解释分别是“billions of operations”和“billion floating point operations per second”,分别代表着网络一个需要多少个10亿次的计算以及这个结构在同一平台下每秒可以跑多少次10亿次计算,这两个值就决定了FPS,这个硬件平台是Titan x。
而且,这里的Bn Ops的计算方式和常规操作不一样,一般情况下网络去统计FLOPs是不算加操作的,所以在ResNet的原始论文中,ResNet-101和ResNet-152的算力分别是7.6 × 10^9
FLOPs和11.3 × 10^9
FLOPs,折算到Bn Ops应该分别是7.6Bn Ops和11.3Bn Ops,但是上表中给出的是19.7Bn Ops和29.4Bn Ops,这是因为计算的时候包含了加操作,而Darknet-53是18.7Bn Ops。
这还不算完,YOLOv3还统计了BFLOP/s,就是这结构实际跑在平台上效率如何,因为ResNet-101和ResNet-152的层很多,数据在层之间需要传输,所以实际跑出来ResNet-101和ResNet-152的BFLOP/s要低Darknet-53很多。
最后,FPS实际体现了这个结构的速度,Darknet-53与ResNet-101的计算量是相似的,但是由于BFLOP/s更高,所以Darknet-53比ResNet-101快1.5倍,Darknet-53计算量本来就比ResNet-152低,BFLOP/s还要更高,所以快了2倍。
论文最后提到,“ResNets have just way too many layers and aren’t very efficient”,说出了ResNets的低效。

2.2 多层分支

Yolo_v3使用了darknet-53的前面的52层(没有全连接层),yolo_v3这个网络是一个全卷积网络,大量使用残差的跳层连接,并且为了降低池化带来的梯度负面效果,
下面以输入为416×416来分析:

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

上图来自:https://blog.csdn.net/dz4543/article/details/90049377

上面的两张图够不够?
不够的话再来一张:
在这里插入图片描述
上图来自:https://blog.csdn.net/chaipp0607/article/details/99700184

上面这张图就是YOLOv3的结构图,其中ResX代表着残差组内单元的个数是X,ConvBA是卷积+BN+激活,BN在YOLOv2的时候就有了。YOLOv3的分支有三个,分别是第三个残差组后面的卷积输出,第四个残差组后面的卷积输出和最后的卷积输出,当输入时416时,它们的特征图尺寸分别是52×52×256,26×26×512和13×13×1024。

YOLOv3终于加入多层分支了,一共拉取了三层:分别在52×52,26×26,13×13,13×13这个尺度输出用于检测大型目标,对应的26×26为中型的,52×52用于检测小型目标。

多层拉去分支的策略终于在YOLOv3中用到了,其实在YOLOv2中,多层特征就已经被使用了,但是使用的方式并不直接,它是一种不同层的特征图拼接,让最后一层具有不同的特征,具体可以参考之前的文章。可以理解为它是一种特征的融合,而不是多层分支。
那么这种多层特征融合的方式和多层拉取分支的方式冲突吗?显然是不冲突的,它们可以并存,于是YOLOv3就这样做了,可以说YOLOv3在这方面结合了YOLOv2和SSD。

这样一来,分支有了,那么怎么做融合,YOLOv2采用的奇怪的reshape方式,就是维度不匹配就硬凑,这会造成特征图的空间信息被破坏掉了,所以YOLOv3使用的是Upsamlpe,不在用reshape,后面的分支输出特征图,会上采样2倍,刚好可以匹配前一层的维度,然后同样是做拼接操作。
在这以后,几层卷积进一步提取特征,然后控制通道数到255(255=3×(80+4+1)),三层分支都是255。255这个数又和之前不同了,YOLO是30,YOLOv2是125。
首先的区别是数据集换了,现在的目标检测任务主流数据集不再是VOC,而是COCO,COCO有80个类别,其次由于YOLOv3有三层,所以每一层的参考框变少了,从5个变成了3个,根据之前的计算方式:255=3×(80+4+1)
每一个cell(每个栅格)包括3个框,每个框包括:80个类,4为x,y,w,h,1为c置信度。

2.3 更多的archor box先验

anchor box有两部分内容,分别是:

(1)先验框怎么编码ground truth
(2)先验框怎么选取
编码的方式,YOLOv3和YOLOv2是一致的,这里不再重复了,剩下的先验框的选取,YOLOv3采用了和SSD一致的策略,不同的分支有不同的尺度,随着网络的加深,特征图逐渐变小,负责预测的先验框尺度逐渐变大,因为小目标在大的特征图上更容易体现,同时先验框的选择还是使用的k-means来获得:
在这里插入图片描述
最终,通过三个分支和每个分支上三个archor box,YOLOv3一共可以产生的预测个数为:
3×13×13+3×26×26+3×52×52=10647

而YOLO最终总共只有49个类别结果和98个预测框,YOLOv2有845个,SDD有8732个,YOLOv3比它们都要多。

2.4 损失函数

YOLOv3类别损失换了,由SoftMax换成了Logistic。
YOLOv3的另一个关键的改动是在损失函数,类别损失由Softmax换成了Logistic,这个改变其实个人感觉很牵强,论文给出的两点解释:
(1)对于一个好的结果,softmax不是必须的,用logistic也行;
(2)很多其他的任务和数据集,存在多标签的情况,比如Open Image,类别的标注有层次结构,比如“Person”和“Wonmen”是一个多标签。
怎么说呢,首先COCO列表标注没有多标签,softmax和logistic的在COCO上的消融实验论文没给,怎么说它们结果相当呢?其次,YOLOv3在Open Image的实验并没有做,这样一来,上面两个理由站不住脚啊。
但是,既然用都用了,就顺便解释下多标签的分类问题,多标签顾名思义就是一张图有多种属性,比如人脸属性问题,有性别,年龄,种族,眼镜,口罩等,每个属性是独立的,也就是一张脸这五个属性都要预测。
处理这个问题的时候,一个最简单粗暴的方法就是,有几个标签就拉几个分支,分支独立计算损失,最后把损失加起来并乘上权重一起训练。
但是多标签分类还有特殊的情况,我们先把年龄和种族移出去,剩下的性别只预测男女,眼镜只预测戴不戴,口罩也只预测戴不戴,那这个三个任务就都变成了2分类,所有的标签都是二分类标签,是多标签分类中的一个特例。这个情况有一个最经典的数据集是CelebA。由于都是2分类问题,Logistic回归就能排上用场了,因为可以用一个维度的输出是否大于0.5,决定类别应该属于哪一类。
此外,输出层的每一个维度都应该经过sigmoid函数做压缩,把输出控制在(0,1)之间,然后就可以用二值交叉熵做loss了,这个loss应该是所以的标签类别都做一次,然后加起来。所以,对于COCO的话,YOLOv3是把80类的单标签分类问题硬生生的转化成了80个二分类标签。
剩下的东西就和YOLOv2一样了。

3 代码实现(未完成)

黑马推荐的一个tf2.0实现的YOLOv3代码
https://github.com/qqwweee/keras-yolo3

4 知识扩展

4.1 扩展1:Mosaic图像增强

YOLO的Mosaic图像增强:就是随机将多张图像拼接在一起,比如把4张拼接成1张
在这里插入图片描述

4.2 扩展2:Iou损失的4种算法

在这里插入图片描述
GIoU:
在这里插入图片描述
GIoU的缺点
在这里插入图片描述
DIoU:
在这里插入图片描述

在这里插入图片描述
CIoU:
在这里插入图片描述
从下面图片看出CIoU效果确实很好
在这里插入图片描述
在这里插入图片描述

5 参考文献

论文下载地址:
https://zhuanlan.zhihu.com/p/136382095

视频链接2个:
看了第一个:
https://www.bilibili.com/video/BV1yi4y1g7ro?p=3
下面这个时间有点长:
https://www.bilibili.com/video/BV1KK411s7cd?p=1

博客:
本文大部分参考下面的网址:
https://blog.csdn.net/chaipp0607/article/details/99700184

代码:
https://www.bilibili.com/video/BV1Jt4y1e7ro?p=4
https://github.com/YunYang1994/tensorflow-yolov3
https://www.bilibili.com/video/BV1NT4y137YF?from=search&seid=4628795428953675413
keras的实现:
https://blog.csdn.net/weixin_44791964/article/details/103276106

对本文所用到资料的作者表示感谢!
谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓码bigdata

如果文章给您带来帮助,感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值