YOLO v3YOLOYOLO v2之后的 YOLO 系列的又一篇目标检测算法,是基于 YOLO v2 的一个改进,速度更快,精度更高!

1、YOLO v3 的网络结构图

YOLO v3详解_kk123k的博客-CSDN博客 - 图1

其中:

DBL:如图 1 左下角所示,也就是代码中的 Darknetconv2d_BN_Leaky,是 yolo_v3 的基本组件。就是卷积 + BN+Leaky relu。对于 v3 来说,BN 和 leaky relu 已经是和卷积层不可分离的部分了 (最后一层卷积除外),共同构成了最小组件。

resn:n 代表数字,有 res1,res2, … ,res8 等等,表示这个res_block残缺块)里含有多少个res_unit残缺单元)。这是 yolo_v3 的大组件,yolo_v3 开始借鉴了ResNet 的残缺结构,使用这种结构可以让网络结构更深(从 v2 的 darknet-19 上升到 v3 的 darknet-53,前者没有残差结构)。对于 res_block 的解释,可以在图 1 的右下角直观看到,其基本组件也是 DBL。

concat:张量拼接。将 darknet 中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层 add 的操作是不一样的,拼接会扩充张量的维度,而 add 只是直接相加不会导致张量维度的改变。

整个 YOLO v3 网络总共 252 层,组成如下:

YOLO v3详解_kk123k的博客-CSDN博客 - 图2

上表可以看出 add 层 23 层 (主要用于 res_block 的构成,每个 res_unit 需要一个 add 层,一共有 1+2+8+8+4=23 层),BN 层和 LeakyReLU 层数量完全一样 (72 层),在网络结构中的表现为:每一层 BN 后面都会接一层 LeakyReLU。卷积层一共有 75 层,其中有 72 层后面都会接 BN+LeakyReLU 的组合构成基本组件 DBL。看结构图,可以发现上采样和 concat 都有 2 次,和表格分析中对应上。每个 res_block 都会用上一个零填充,一共有 5 个 res_block。

2、backbone(主干网)

整个 v3 结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如 stride=(2, 2),这就等于将图像边长缩小了一半 (即面积缩小到原来的 1/4)。在 yolo_v2 中,要经历 5 次缩小,会将特征图缩小到原输入尺寸的 1/2^5,即 1/32。输入为 416x416,则输出为 13x13(416/32=13)。
yolo_v3 也和 v2 一样,backbone 都会将输出特征图缩小到输入的 1/32。所以,通常都要求输入图片是 32 的倍数。可以对比 v2 和 v3 的 backbone 看看:(DarkNet-19 与 DarkNet-53)

YOLO v3详解_kk123k的博客-CSDN博客 - 图3

yolo_v2 中对于前向过程中张量尺寸变换,都是通过最大池化来进行,一共有 5 次。而 v3 是通过卷积核增大步长来进行,也是 5 次。(darknet-53 最后面有一个全局平均池化,在 yolo-v3 里面没有这一层,所以张量维度变化只考虑前面那 5 次)。
这也是 416x416 输入得到 13x13 输出的原因。从图 2 可以看出,darknet-19 是不存在残缺结构(resblock) 的,和 VGG 是同类型的 backbone(属于上一代 CNN 结构),而 darknet-53 是可以和 resnet-152 正面刚的 backbone,看下表:

YOLO v3详解_kk123k的博客-CSDN博客 - 图4

从上表也可以看出,darknet-19 在速度上仍然占据很大的优势。其实在其他细节也可以看出 (比如 bounding box prior 采用 k=9),yolo_v3 并没有那么追求速度,而是在保证实时性(fps>60) 的基础上追求精度。另外,YOLO v3 还有个轻量级的版本 tiny-darknet 作为 backbone 替代 darknet-53,其速度超快,在官方代码里用一行代码就可以实现切换 backbone。其高速和轻量的特点详情见下表:

YOLO v3详解_kk123k的博客-CSDN博客 - 图5

3、bounding box 的数量变化

还记得每个 grid cell 都会预测固定数量的 bounding box(YOLO v1 中是 2 个,YOLO v2 中是 5 个,YOLO v3 中是 3 个),这几个 bounding box 的初始 size 是不一样的,这几个 bounding box 中只有和 ground truth 的 IOU 最大的 bounding box 才是用来预测该 object 的。可以看出预测得到的输出 feature map 有两个维度是提取到的特征的维度,比如 1313,还有一个维度(深度)是 B(5+C),注:YOLO v1 中是(B*5+C),其中 B 表示每个 grid cell 预测的 bounding box 的数量,比如 YOLO v1 中是 2 个,YOLO v2 中是 5 个,YOLO v3 中是 3 个,C 表示 bounding box 的类别数(没有背景类,所以对于 VOC 数据集是 20),5 表示 4 个坐标信息和一个置信度(objectness score)。

4、bounding box 的坐标预测方式

bounding box 的坐标预测方式还是延续了 YOLO v2 的做法。简单讲就是下面这个截图的公式,tx、ty、tw、th 就是模型的预测输出。cx 和 cy 表示 grid cell 的坐标,比如某层的 feature map 大小是 1313,那么 grid cell 就有 1313 个,第 0 行第 1 列的 grid cell 的坐标 cx 就是 0,cy 就是 1。pw 和 ph 表示预测前 bounding box 的 size。bx、by。bw 和 bh 就是预测得到的 bounding box 的中心的坐标和 size。坐标的损失采用的是平方误差损失。

YOLO v3详解_kk123k的博客-CSDN博客 - 图6

5、类别预测方面

类别预测方面主要是将原来的单标签分类改进为多标签分类。因此网络结构上就将原来用于单标签多分类的 softmax 层换成用于多标签多分类的逻辑回归层。首先说明一下为什么要做这样的修改,原来分类网络中的 softmax 层都是假设一张图像或一个 object 只属于一个类别,但是在一些复杂场景下,一个 object 可能属于多个类,比如你的类别中有 woman 和 person 这两个类,那么如果一张图像中有一个 woman,那么你检测的结果中类别标签就要同时有 woman 和 person 两个类,这就是多标签分类需要用逻辑回归层来对每个类别做二分类。逻辑回归层主要用到 sigmoid 函数,该函数可以将输入约束在 0 到 1 的范围内,因此当一张图像经过特征提取后的某一类输出经过 sigmoid 函数约束后如果大于 0.5,就表示属于该类。

6、采用多个 scale 融合的方式做预测

YOLO v3 采用多个 scale 融合的方式做预测。原来的 YOLO v2 有一个层叫:passthrough layer,假设最后提取的 feature map 的 size 是 1313,那么这个层的作用就是将前面一层的 2626 的 feature map 和本层的 1313 的 feature map 进行连接,有点像 ResNet。当时这么操作也是为了加强 YOLO 算法对小目标检测的精确度。这个思想在 YOLO v3 中得到了进一步加强,在 YOLO v3 中采用类似 FPN 的上采样和融合做法(最后融合了 3 个 scale,其他两个 scale 的大小分别是 2626 和 52*52),在多个 scale 的 feature map 上做检测,

对于小目标的检测效果提升还是比较明显的。前面提到过在 YOLO v3 中每个 grid cell 预测 3 个 bounding box,看起来比 YOLO v2 中每个 grid cell 预测 5 个 bounding box 要少,其实不是!因为YOLO v3 采用了多个 scale 的特征融合,所以 boundign box 的数量要比之前多很多,以输入图像为 416416 为例:(1313+2626+5252)3 和 1313*5 相比哪个更多应该很清晰了

7、关于 bounding box 的初始尺寸

关于 bounding box 的初始尺寸还是采用 YOLO v2 中的 k-means 聚类的方式来做,这种先验知识对于 bounding box 的初始化帮助还是很大的,毕竟过多的 bounding box 虽然对于效果来说有保障,但是对于算法速度影响还是比较大的。作者在 COCO 数据集上得到的 9 种聚类结果:(1013); (1630); (3323); (3061); (6245); (59119); (11690); (156198); (373326),这应该是按照输入图像的尺寸是 416416 计算得到的。

8、loss function

在 YOLO v1 中使用了一种叫 sum-square error 的损失计算方法,就是简单的差方相加而已。但在 v3 的论文里没有明确提所用的损失函数。其实也是跟 YOLO v1 类似,只是做了一些小调整。即损失还是四个特性((x,y)、(w,h)、分类和 confidence)的损失累加起来,也就是一个 loss_function 搞定端到端的训练。

9、实验结果

YOLO v3 的实验结果对比可以看 Table3。原来 YOLO v2 对于小目标的检测效果是比较差的,通过引入多尺度特征融合的方式,可以看出 YOLO v3 的 APS 要比 YOLO v2 的 APS 高出不少。

YOLO v3详解_kk123k的博客-CSDN博客 - 图7

最后这张图非常有意思,直接用 All the other slow ones 来代表其他算法,实实在在展现了本篇文章随性的风格。

YOLO v3详解_kk123k的博客-CSDN博客 - 图8

参考:

https://blog.csdn.net/u014380165/article/details/80202337

https://blog.csdn.net/leviopku/article/details/82660381
https://blog.csdn.net/kk123k/article/details/86696354