深度剖析目标检测算法YOLOV4

深度剖析目标检测算法YOLOV4

 

目录

 

  • 简述 yolo 的发展历程

  • 介绍 yolov3 算法原理

  • 介绍 yolov4 算法原理(相比于 yolov3,有哪些改进点)

  • YOLOV4 源代码日志解读

 


 

 

 

yolo 发展历程

 

 

采用卷积神经的目标检测算法大体能够分为两个流派,一类是以 R-CNN 为表明的 two-stage,另外一类是以 YOLO 为表明的 one-stage,html

R-CNN 系列的原理:经过 ROI 提取出大约 2000 个候选框,而后每一个候选框经过一个独立的 CNN 通道进行预测输出。git

R-CNN 特色:准确度高,速度慢,因此速度成为它优化的主要方向。github

YOLO 系列的原理:将输入图片做为一个总体,经过 CNN 通道进行预测输出。算法

YOLO 特色:速度快,准确度低,因此准确度成为它优化的主要方向。网络

通过一系列的优化与改进,特别是今年 4 月份推出的 YOLOV4,使得它在准确度方面获得了大幅度的提高,另外,它还能达到实时检测(在 GPU 加持的状况下)。函数

下图是 YOLOV4 源代码的页面,github:  https://github.com/AlexeyAB/darknet测试

 

 

它的 Star 达到 13400,能够说,知名度不是通常的高,在目标检测领域,好像只有 YOLOV3 超过它了,达到了 19000 ,是否是值得你们花点时间精力去探索一下呢 ?优化

这里须要说明一下的是 YOLOV3(美国大神),YOLOV4 (俄罗斯大神)做者不是同一我的,在 19 年的时候,YOLOV3 做者发表了一个声明:有些组织将他的算法用于spa

军事和窥探我的隐私方面,使得他在道德上很难接受,他将再也不进行 CV 的研究与更新。固然,这是一个小插曲了,这里,咱们看到,YOLOV4 做者更新是很是频繁的,.net

commits 达到了 2000 + 。下面咱们看看官方给出的实验结果。

 

这里是以 COCO 做为测试数据集,相比于 YOLOV3,YOLOV4 在精度方面提高了 10%,FPS(frame per second) 提高了 12%。

顺便说一句,YOLOV3 的做者也是承认 YOLOV4 的改进的,在 YOLOV3 的官网 https://github.com/pjreddie/darknet 也是给出了

YOLOV4 的连接。

 

yolov3 算法原理

 

  

这里借用某位大神画的结构图,由于 YOLOV4 是在 YOLOV3 的基础上改进的,因此咱们须要先介绍一下 YOLOV3,

这里可能须要一些神经网络的知识,好比卷积,池化,全链接,前向传播,反向传播,损失函数,梯度计算,权重参数更新,若是对

这些不是很清楚,能够看我以前的博客(卷积神经网络(CNN)详解与代码实现 http://www.javashuo.com/article/p-tuifjaoz-g.html)。

YOLOV3 原理我在上上一篇博客(深度剖析YOLO系列的原理 http://www.javashuo.com/article/p-btcodynk-dr.html)有过介绍,

这里我就介绍一下你们容易忽略,或者是比较难理解的点:

  • 输入图片尺寸可变

输入图片尺寸是 608 * 608,固然,这个尺寸是能够改变的,它只须要知足是 32 的倍数,由于在通过后面的网络结构的时候,图片尺寸缩小的最大倍数是 32 倍,

这能够从它的输出 19 * 19 看出来。

  • 主干网络

采用的是 darknet 53 层网络结构,去掉了全链接层,53 - 1 = 52

52 = 1+(1+2*1)+(1+2*2)+(1+2*8)+(1+2*8)+(1+2*4)

为何要去掉全链接层 ?

解答:全链接的本质是矩阵的乘法运算,会产生固定尺寸的输出,而 YOLOV3 是须要多尺寸的输出的,因此要去掉全链接层。

CBL :表示基础的卷积模块,是由一个 Conv 卷积层 + BN 批量归一化层 + relu 非线性激活函数层组成。

为何在 CBL 里没有池化层 pooling ?

解答:池化层有两种实现方式,最大值池化和平均值池化,他们都有一个缺点,会形成信息的明显丢失(相比于卷积实现池化的功能来讲,改变滑动窗口的步长) 。

Res Unit(残差单元) :表示将上一层的输出一分为二,一部分经过两个基础卷积模块获得输出,与另外一部分进行求和,这样就能使得输出的残差不可能为 0,

                                     从而有效的防止梯度消失或者梯度爆炸。

ResX : 是由不一样的 Res Unit 组成。

多尺寸输出:用到 2 个上采样,注意 Concat 和 Add 的区别。

上采样原理:以特征图相邻像素值来预测中间位置的像素值,而后以这个值插入到中间位置,实现特征图尺寸的翻倍。

Concat : 特征图张量的拼接,拼接后尺寸不变,深度改变。

Add :特征图对应位置像素值的求和,求和后的尺寸和深度不发生改变。

  • 输出

有三个输出,19 * 19 * 255,38 * 38 * 255,76 * 76 * 255

这三个输出有着怎样的物理含义 ?

 

解答:将输入图片网格化,网格化后的大小是 19 *19, 38 * 38,76 * 76,每一个网格化后的小方格,也就是一个 grid cell,将要

          预测 3 个 bounding box,每一个 bounding box = 1 个置信度 + 4 个位置信息 + 类别总数(COCO 数据集就是 80)

为何每一个 grid cell 要预测 3 个 bounding box ?

解答:这样来理解,好比说,一我的站在一辆车的前面,从远处看,这我的和这辆车中心点是彻底重合的,可是咱们可以看清楚

          人和车,可是若是中心点重合的对象超过 3 个,那么咱们颇有可能对第 4 个,第 5 个以及后面的对象就彻底看不清楚了,

          因此,这里的 3 表示对象中心点重叠的最大值。

bounding box 如此之多,如何肯定最佳的 bounding box ?

解答:采用的 NMS(Non Maximum Suppression)非极大值抑制算法来去除重叠。

 

 

NMS 算法原理:> 将预测输出的 bounding boxes 放入到左边的列表中,以置信度来进行降序排列,找到置信度最大的 bounding box ,

                              好比说这里的 dog1,将 dog1 移出左边列表到右边列表中;

                          > 遍历左边列表,求出每一个 bounding box 与 dog1 的交并比(IoU = Intersection over Union 两个框的交集/并集),

                             固然,要提早设定一个阈值(通常是 0.5),大于 0.5表示左边 bounding box 与 dog1 有高度的重叠,将这个 bounding box 去掉;

                          > 重复以前的操做,直至左边列表为空,右边列表获得的 bounding box 就是最佳的结果;

检测匹配问题,为何 19 * 19 => 大对象 ? 38 * 38 => 中等对象 ?  76 * 76 => 小对象 ?

解答:输入图片尺寸是固定的,好比说这里的 608 * 608,将它网格化,网格化就有三种状况:19 * 19,38 * 38,76 * 76,那么是否是 19 * 19 网格化后

          的小方格的宽和高要比其余两种要大,这也就意味着它的感觉视野是最大的,因此它就能检测出大对象,而其余两个的对应关系也是相同的道理。

 

yolov4 算法原理

 

仍是借用某位大神画的结构图,记不清名字了,是在抱歉。

乍一看,是否是跟 YOLOV3 长得很像,只不过比 YOLOV3 更复杂了一些,这里 YOLOV4 的做者将结构划分为如下四个部分:

Input,Backbone,Neck,Head,下面就来看看每一个部分都作了哪些改进。

  • Input 改进点

采用 Mosaic 实现数据加强。

 

 Mosaic 算法原理:在输入图片集中随机选取 4 张图片进行随机缩放,随机裁剪,随机扭曲,而后将他们拼接起来,

                              其目的就是丰富样本数据集。

 

  • Backbone 改进点

采用 CSPNet(Cross Stage Partial Network)网络结构,它实际上是在残差网络的基础上发展起来的。

 

具体改进点:

        > 用 Concat 代替 Add,提取更丰富的特征。

以前介绍过 Concat 操做后,特征图的尺寸不变,深度会增长,而 Add 操做后尺寸和深度都不改变,从这个意义上说,用 Concat 代替 Add,就可以提取更丰富的特征。

       > 引入 transition layer (1 * 1conv + 2 * 2pooling),提取特征,下降计算量,提高速度。

为何引入 1 * 1conv,可以下降计算量,提高速度 ?

 

解答:这里我举一个实例来讲明,输入图片大小是 56 * 56 * 256,要求获得输出大小是 28 * 28 * 512,这里就有两种实现方式:

          一次卷积方式,它的卷积核参数个数是 117 万;另外一种是二次卷积方式,引入了 1 * 1 卷积,它的卷积核参数个数是 62 万,

         相比于一次卷积方式,它的卷积核参数个数下降了一倍。

 

        > 将 Base layer 分为两部分进行融合,提取更丰富的特征。

将 Base layer 一分为二,一部分经过相似残差网络获得的输出与另外一部分进行 Concat 操做,将操做后的结果经过 Transition Layer。

  • Backbone 改进点

用 dropblock 取代 dropout

 

dropout 做用:防止过拟合,

dropout 缺点:每次训练时随机去掉的神经元能够经过相邻的神经元来预测,由于随着网络层数的增长,神经元之间的相关性是愈来愈强。

dropblock:每次训练时随机去掉一整片区域,这样就能组合更多不同的网络,从而表现出更好的泛化做用。

  • Neck 改进点 

FPN(Feature pyramid networks) + PANet(Path Aggregation Network)

 

 

它实际上是在 YOLOV3 的基础上增长了一个自底向上的 PANet 结构,特征图的尺寸是经过下采样获得的,而下采样是经过卷积的方式实现的(改变滑动窗口的步长)。

  • Head 改进点

用 CIoU Loss 取代 Iou Loss

 

 IoU loss 中 IoU 交并比,两个框的交集/并集,有两个缺点:

  > 没法反应两个的距离

例如 状态 1,两个框不相交,不管怎样移动两个框,IoU = 0。

  > 没法区分二者相交的状况

例如 状态 2 和 3,两个框相交的状况彻底不同,可是 IoU 相同。

 

 

 

 CIoU Loss 的思想:第一步,在两个框最外层再画一个最小的矩形框,求出这个框的对角线的距离,这个距离就能衡量两个框的距离;

                               第二步,求出两个框中心点的欧式距离,这欧式距离就能衡量二者的相交状况。

 

CIoU Loss 数学表达式如上,它能有效的解决 IoU Loss 存在的问题。

 

YOLOV4 源代码日志解读

  

 

 

 

  • 网络层数:

 YOLOV4 总共层数有 161 层,YOLOV3 是 106 层,网络层数增长是很是明显的。

从这个图能够看出,YOLOV4 采用了大量的 1 * 1 卷积,以前介绍过,采用 1 * 1 卷积,是能下降计算量,提高速度的。

  • 每列含义

layer : 每层操做名称

filters :卷积核的深度

size/strd(dil):卷积核的尺寸/滑动窗口的步长

input:输入图片的大小

output:输出图片的大小

  • 表明性层的含义(须要注意的是,这里隐藏了一个前提条件 padding = 1)

> 第 0 层 conv 卷积操做,表示 608 * 608 * 3  &  3 * 3 * 32 => 608 * 608 * 32,这里 32(输出特征图尺寸深度)

是由卷积核的深度决定的。

> 第 1 层 conv 仍是卷积操做,表示 608 * 608 * 32  &  3 * 3 * 64 => 304 * 304 * 64,你们发现没有,输出特征图的尺寸

相比于输入特征图的尺寸,下降了一倍,这是由于滑动窗口的步长变成了 2 。

> 第 7 层 Shortcut,它其实等价于 Add 操做,也就是第 6 层的输出与第 4 层的输出进行卷积,

304 * 304 * 64  &  304 * 304 * 64 => 304 * 304 * 64,输出特征图的尺寸和深度都没有改变。

> 第 9 层 route 操做,它其实等价于 Concat 操做,也就是第 8 层的输出与第 2 层的输出进行卷积,

304 * 304 * 64  &  304 * 304 * 64 => 304 * 304 * 128,输出特征图尺寸不变,深度增长,为两个输入特征图深度之和。

相信你们理解了这些层的含义以后,对于后面的其余层的理解,就比较容易了,下面看看它最后的输出:

76 * 76 * 255,  38 * 38 * 255,19 * 19 * 255,这跟以前介绍 YOLOV4 结构图的输出是相一致的。

 

引用

https://bbs.cvmart.net/topics/2365

https://pjreddie.com/media/files/papers/YOLOv3.pdf

https://arxiv.org/pdf/2004.10934.pdf

https://arxiv.org/pdf/1911.11929v1.pdf

https://arxiv.org/pdf/1803.01534.pdf

 

 

 

 

 

 不要让懒惰占据你的大脑,不要让妥协拖垮了你的人生。青春就是一张票,能不能遇上时代的快车,你的步伐就掌握在你的脚下。

相关文章
相关标签/搜索