YOLOV4知识点分析(一)

简 介

yolov4论文:YOLOv4: Optimal Speed and Accuracy of Object Detection

arxiv:https://arxiv.org/abs/2004.10934

github源码https://github.com/AlexeyAB/darknet

YOLOV4的发布,可以想象到大家的激动,但是论文其实是一个结合了大量前人研究技术,加以组合并进行适当创新的高水平论文,实现了速度和精度的完美平衡。很多yolov4的分析文章都会说其中应用了哪些技术?但是暂时没有看到对其中用到的各种技术进行详细分析的文章,本文的目的就是如此,希望通过YOLOV4提到的各种新技术进行分析,明白YOLOV4后面的功臣算法。

文中将前人的工作主要分为Bag of freebies和Bag
of specials,前者是指不会显著影响模型测试速度和模型复杂度的技巧,主要就是数据增强操作,对应的Bag
of specials就是会稍微增加模型复杂度和速度的技巧,但是如果不大幅增加复杂度且精度有明显提升,那也是不错的技巧。本文按照论文讲的顺序进行分析。由于每篇论文其实内容非常多,主要是分析思想和一些核心细节。

本篇文章分析如下技术:random erasing、cutout、hide-and-seek、grid mask、Adversarial Erasing、mixup、cutmix、mosaic、Stylized-ImageNet、label smooth、dropout和dropblock

   1. 数据增强相关-Random erasing data augmentation

论文名称:Random
erasing data augmentation

论文地址:https://arxiv.org/pdf/1708.04896v2.pdf

github: https://github.com/zhunzhong07/Random-Erasing

随机擦除增强,非常容易理解。作者提出的目的主要是模拟遮挡,从而提高模型泛化能力,这种操作其实非常make sense,因为把物体遮挡一部分后依然能够分类正确,那么肯定会迫使网络利用局部未遮挡的数据进行识别,加大了训练难度,一定程度会提高泛化能力。其也可以被视为add noise的一种,并且与随机裁剪、随机水平翻转具有一定的互补性,综合应用他们,可以取得更好的模型表现,尤其是对噪声和遮挡具有更好的鲁棒性。具体操作就是:随机选择一个区域,然后采用随机值进行覆盖,模拟遮挡场景

在细节上,可以通过参数控制擦除的面积比例和宽高比,如果随机到指定数目还无法满足设置条件,则强制返回。

一些可视化效果如下:

对于目标检测,作者还实现了3种做法,如下图所示(开源代码,只实现了分类的随机擦除)。

当然随机擦除可以和其他数据增强联合使用,如下所示。

torchvision已经实现了:

https://pytorch.org/docs/master/_modules/torchvision/transforms/transforms.html#RandomErasing

注意:torchvision的实现仅仅针对分类而言,如果想用于检测,还需要自己改造。调用如下所示:

torchvision.transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)

2. 数据增强相关-Cutout

论文名称:Improved Regularization of
Convolutional Neural Networks with Cutout

论文地址:https://arxiv.org/abs/1708.04552v2

github: https://github.com/uoguelph-mlrg/Cutout

出发点和随机擦除一样,也是模拟遮挡,目的是提高泛化能力,实现上比random erasing简单,随机选择一个固定大小的正方形区域,然后采用全0填充就OK了,当然为了避免填充0值对训练的影响,应该要对数据进行中心归一化操作,norm到0。

本文和随机擦除几乎同时发表,难分高下(不同场景下谁好难说),区别在于在cutout中,擦除矩形区域存在一定概率不完全在原图像中的。而在Random
Erasing中,擦除矩形区域一定在原图像内。Cutout变相的实现了任意大小的擦除,以及保留更多重要区域

需要注意的是作者发现cutout区域的大小比形状重要,所以cutout只要是正方形就行,非常简单。具体操作是利用固定大小的矩形对图像进行遮挡,在矩形范围内,所有的值都被设置为0,或者其他纯色值。而且擦除矩形区域存在一定概率不完全在原图像中的(文中设置为50%)

论文中有一个细节可以看看:作者其实开发了一个早期做法,具体是:在训练的每个epoch过程中,保存每张图片对应的最大激活特征图(以resnet为例,可以是layer4层特征图),在下一个训练回合,对每张图片的最大激活图进行上采样到和原图一样大,然后使用阈值切分为二值图,盖在原图上再输入到cnn中进行训练,有点自适应的意味。但是有个小疑问:训练的时候不是有数据增强吗?下一个回合再用前一次增强后的数据有啥用?我不太清楚作者的实现细节。如果是验证模式下进行到是可以。

这种做法效果蛮好的,但是最后发现这种方法和随机选一个区域遮挡效果差别不大,而且带来了额外的计算量,得不偿失,便舍去。就变成了现在的cutout了。

可能和任务有关吧,按照我的理解,早期做法非常make sense,效果居然和cutout一样,比较奇怪。并且实际上考虑目标检测和语义分割,应该还需要具体考虑,不能照搬实现。

学习这类论文我觉得最重要的是思想,能不能推广到不同领域上面?是否可以在训练中自适应改变?是否可以结合特征图联合操作?

3. 数据增强相关-Hide-and-Seek

论文名称:Hide-and-Seek: A Data
Augmentation Technique for Weakly-Supervised Localization and Beyond

论文地址:https://arxiv.org/abs/1811.02545

github地址:https://github.com/kkanshul/Hide-and-Seek

可以认为是random earsing的推广。核心思想就是去掉一些区域,使得其他区域也可以识别出物体,增加特征可判别能力。和大部分细粒度论文思想类型,如下所示:

数据增强仅仅用于训练阶段,测试还是整图,不遮挡,如下所示。

做法是将图片切分为sxs个网格,每个网格采用一定概率进行遮挡,可以模拟出随机擦除和cutout效果

至于隐藏值设置为何值,作者认为比较关键,因为可能会改变训练数据的分布。如果暴力填黑,认为会出现训练和测试数据分布不一致问题,可能不好,特别是对于第一层卷积而言。作者采用了一些理论计算,最后得到采用整个数据集的均值来填充造成的影响最小(如果采用均值,那么输入网络前,数据预处理减掉均值,那其实还是接近0)。

4. 数据增强相关-GridMask Data Augmentation

论文名称:GridMask Data
Augmentation

论文地址:https://arxiv.org/abs/2001.04086v2

本文可以认为是前面3篇文章的改进版本。本文的出发点是:删除信息和保留信息之间要做一个平衡,而随机擦除、cutout和hide-seek方法都可能会出现可判别区域全部删除或者全部保留,引入噪声,可能不好。如下所示:

要实现上述平衡,作者发现非常简单,只需要结构化drop操作,例如均匀分布似的删除正方形区域即可。并且可以通过密度和size参数控制,达到平衡。如下所示:

其包括4个超参,如下所示:

首先定义k,即图像信息的保留比例,其中H和W分别是原图的高和宽,M是保留下来的像素数,保留比例k如下,该参数k和上述的4个参数无直接关系,但是该参数间接定义了r:

d决定了一个dropped
square的大小, 参数 x和 y的取值有一定随机性.

其实看起来,就是两个参数: r和d,r通过k计算而来,用于计算保留比例(核心参数),d用了控制每个块的大小。d越大,每个黑色块面积就越大,黑色块的个数就越少,d越小,黑色块越小,个数就越多。xy仅仅用于控制第一个黑色块的偏移而已。

对于应用概率的选择,可以采用固定值或者线性增加操作,作者表示线性增加会更好,例如首先选择r = 0.6,然后随着训练epoch的增加,概率从0增加到0.8,达到240th epoch后固定,这种操作也是非常make sense,为了模拟更多场景,在应用于图片前,还可以对mask进行旋转。这种策略当然也可以应用于前3种数据增强策略上。

5. 数据增强相关-object
Region Mining with Adversarial Erasin

论文地址:https://arxiv.org/pdf/1703.08448.pdf

   本文在yolov4中仅仅是提了一下,不是重点,但是觉得思想不错,所以还是写一下。

本文要解决的问题是使用分类做法来做分割任务(弱监督分割),思想比较有趣。如下所示:

通过迭代训练的方式不断挖掘不同的可判别区域,最终组合得到完整的分割结果。第t次训练迭代(一次迭代就是指的一次完整的训练过程),对于每张图片都可以得到cam图(类别激活图),将cam图二值化然后盖在原图上,进行下一次迭代训练,每次迭代都是学习一个不同的可判别区域,迭代结束条件就是分类性能不行了,因为可判别区域全部被盖住了(由于该参数其实很难设置,故实验直接取3)。最后的分割结果就是多次迭代的cam图叠加起来即可。

本文是cvpr2017的论文,放在现在来看,做法其实超级麻烦,现在而言我肯定直接采用细粒度方法,采用特征擦除技术,端到端训练,学习出所有可判别区域。应该不会比这种做法效果差,但是在当时还是不错的思想。

但是其也提供了一种思路:是否可以采用分类预测出来的cam,结合弱监督做法,把cam的输出也引入某种监督,在提升分类性能的同时,提升可判别学习能力。

最新文章

  1. (十)Maven依赖详解
  2. jQuery 人脸识别插件,支持图片和视频
  3. PPP协议
  4. ssl证书生成:cer&jks文件生成摘录
  5. CentOS6.8 MySQL 5.6实现主从复制
  6. The trash has reached its maximum size
  7. HttpURL
  8. 引用、return
  9. 移动应用产品开发-android开发(一)
  10. Silverlight Visifire控件 后台设置颜色
  11. UI进阶 XML解析适配 引入GDataXML文件时候 'libxml/tree.h'file not found 错误解决办法
  12. python代码零散知识点
  13. java中String类学习笔记
  14. java参数可变方法
  15. python文档-基本API命令翻译及使用方法!
  16. Python Redis 常用操作
  17. SpringMVC 搭建
  18. 為什麼gnome-terminal中不能使用ctrl_shift_f來進行查找? 是因為 跟输入法的全局设置衝突了!
  19. SDN 第五次上机作业
  20. JS图片滚动代码(无缝、平滑)

热门文章

  1. JavaScript动态设置div的样式的方法
  2. hdu1337 水题
  3. TCP的三次握手和四次挥手和UDP协议
  4. 逆向 stdio.h 函数库 fseek 函数(调试版本)
  5. 关于终端设备的设备唯一性的那些事之IMEI(转)
  6. Redis—简单动态字符串(SDS)
  7. xml数据解析和生成
  8. Log4j讲解
  9. 初步了解web
  10. Spring Cloud Gateway + Nacos(1)简单配置