目标检测算法——YOLOv4

简介: 目标检测算法——YOLOv4

以下先回顾一下之前的笔记总结:


YOLOv1:目标检测算法——YOLOv1

YOLOv2:目标检测算法——YOLOv2

YOLOv3:目标检测算法——YOLOv3


在前面的目标检测算法笔记中,已经介绍了YOLOv1,v2,v3的版本,其中本来还想记录一下YOLOv3的一些改进版本的,比如:YOLOv3-SPP,SlimYOLOv3-SPP, YOLOv3-SPP-Ultralytics。通过学习了一些b站的相关讲解视频与一些相关的博客,也知道了这些版本的一点区别。


以下对YOLOv3的几个版本进行简要概括:


  • YOLOv3-SPP版本:实际上只是增加了SPP 模块,也就是对于backbone作了适当的改变,添加了一个多尺寸的特征融合。(相关的SPP结构可以参考:Spatial Pyramid Pooling)
  • SlimYOLOv3-SPP版本:《SlimYOLOv3: Narrower, Faster and Better for Real-Time UAV Applications》是arXiv, 25 Jul 2019的论文,好像是用于无人机的目标检测算法,不太了解。(相关的内容可以参考:SlimYOLOv3)
  • YOLOv3-SPP-Ultralytics版本:YOLOv3-SPP-Ultralytics好像也通常称为u版的yolov3,其是一个github上的开源项目。在原本yolov3的基础上,使用了一些tricks,比如Mosaic图像增强,spp模块,clou loss,focal loss等等。(focal loss好像没有被使用)然后提升了比较高的mAP。关于u版的yolov3我好像没怎么查到相关的讲解资料,想了解的话只能自己看代码了。(具体代码可以参考github内容:yolov3-spp-Ultralytics)


下图是一些版本之间的对比:

YOLOv3-SPP与YOLOv3-SPP-Ultralytics的对比

image.png

YOLOv3-SPP与SlimYOLOv3-SPP的对比

image.png


后来在寻找资料的过程中,发现了YOLOv4中对深度学习中一些常用Tricks进行了大量的测试,然后这些tricks本身就包含了刚刚提及版本所使用的tricks。然后我就觉得没有必要记录yolov3的其他版本了,然后本人就打算直接通过yolov4来学习这些常用的tricks,以下内容开始正题。


1.YOLOv4简介


在深度学习中,有很多技巧可以提高卷积神经网络的检测精度。有些技巧只能针对特定的模型,而有些技巧适用于大多数模型、任务和数据集,比如batch-normalization、residual-connections等。


所有的这些技巧只有通过实际的实验,才能证明其有效性。YOLOv4就对其中的一些常用技巧进行了大量的测试,最终选择了一些有用的tricks。


关于Bag of Freebies与Bag of Specials的概念下面会进行概括


  • Bag of Freebies (BoF) for backbone:

CutMix and Mosaic data augmentation, DropBlock regularization,Class label smoothing


  • Bag of Specials (BoS) for backbone:

Mish activation, Cross-stage partial connections (CSP), Multiinput weighted residual connections (MiWRC)


  • Bag of Freebies (BoF) for detector:

CIoU-loss, CmBN, DropBlock regularization, Mosaic data augmentation, Self-Adversarial Training, Eliminate grid sensitivity, Using multiple anchors for a single ground truth, Cosine annealing scheduler, Optimal hyperparameters, Random training shapes


  • Bag of Specials (BoS) for detector:

Mish activation, SPP-block, SAM-block, PAN path-aggregation block, DIoU-NMS


YOLOv4在传统的YOLO基础上,加入了这些实用的技巧,实现了检测速度和精度的最佳权衡。实验表明,在Tesla V100上,对MS COCO数据集的实时检测速度达到65 FPS,精度达到43.5%AP。

image.png

YOLOv4的主要贡献:


  1. 我们开发了一个高效而强大的目标检测模型。它使每个人都可以使用1080ti或2080ti GPU来训练一个超级快速和准确的物体探测器。
  2. 我们验证了最先进的Bag-ofFreebies和Bag-of-Specials目标检测方法在检测器训练过程中的影响。
  3. 我们修改了最先进的方法,使它们更有效,适合于单个GPU训练,包括CBN, PAN , SAM等


2.YOLOv4相关工作


1)对象检测模型

yolov4概括性地提出了一个目标检测的模型一般包含哪几种方面:一个是特征提取的backbone,还有一个是用于分类与预测边界框的head。而在backbone与head之间,为了更好的从不同层次的特征图中采集特征,会添加一些形如FPN的额外结构,yolov4中将其称之为neck。(很形象的就是头与躯干之间的内容就是靠颈来连接)


  • backbone

一般来说,如果是GPU跑的backbone主要是:VGG,ResNet,ResNeXt,DenseNet;而如果是CPU跑的backbone,需要的是轻量级网络,所以主要是:SqueezeNet,MobileNet,ShuffleNet


其中:对于VGG,ResNet,ResNeXt,MobileNet,ShuffleNet在我之前的博客有介绍过。


  • head

对与head部分,一般也分两个部分,一个用于one-step的目标检测,另外的two-step的目标检测。比较有代表性的two-step的网络有:RCNN系列(RCNN,Fast RCNN,Faster RCNN),还有R-FCN,Libra R-CNN。同时two-step网络中还有anchor-free 结构的网络。而one-stage的目标检测网络有:SSD,YOLO,RetinaNet。同样的,one-step网络也有anchor-free 结构的网络。


其中:对于RCNN,Fast RCNN,Faster RCNN,SSD,YOLO在我之前的博客也有介绍过。


  • neck

近年来发展起来的目标探测器通常在主干和头部之间插入一些层,这些层通常用于收集不同阶段的特征图。我们可以称它为目标检测的颈部。通常,一个颈是由几个自底向上的路径和几个自顶向下的路径组成。比如有FPN,BiFPN等等。


综上所述,一个普通的目标探测器由以下几个部分组成:

image.png

下面内容会介绍yolov4的两个重要概念:Bag of freebies与Bag of specials,它将一些tricks都总归类成了这两类


2)Bag of freebies(免费包)

我们把这些只会改变培训策略或只会增加培训成本的方法称为“bag of freebies”。


详细的“bag of freebies”概念总结,见链接:YOLOv4中的tricks概念总结——Bag of freebies


3)Bag of specials(特价包)

对于那些只增加少量推理成本,却能显著提高目标检测准确率的插件模块和后处理方法,我们称之为“Bag of specials”。


详细的“bag of specials”概念总结,见链接:YOLOv4中的tricks概念总结——Bag of specials


3.YOLOv4网络结构


YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)


完整的网络结构图如下:

image.png

YOLOv4的网络结构是由 CSPDarknet53、 SPP、 PANet、YOLOv3头部等组成,下面对各部分逐一讲解:


1)CSPDarknet53

CSP结构就是将输出的特征图按channels均分两半,感觉理解了这个其他就没什么好说的了。下面贴两张图,对比去看就知道怎么回事了。


一共有5个CSP结构,所以每次输出的特征图在这里都会进行均分两份。


参考链接:https://www.cnblogs.com/yymn/articles/13672236.html

image.png

参考链接:https://blog.csdn.net/nan355655600/article/details/106246422

这张图片比较长,就不放在这里了。


2)SPP

在YOLOv4中的tricks概念总结——Bag of specials中有介绍

image.png

SPP在YOLOv4中的结构为:

image.png


3)PANet

双塔结构

image.png


  • FPN发表于CVPR2017,主要是通过融合高低层特征提升目标检测的效果,尤其可以提高小尺寸目标的检测效果。
  • Bottom-up Path Augmentation的引入主要是考虑网络浅层特征信息对于实例分割非常重要,因为浅层特征一般是边缘形状等特征。
  • Adaptive Feature Pooling用来特征融合。也就是用每个ROI提取不同层的特征来做融合,这对于提升模型效果显然是有利无害。
  • Fully-connected Fusion是针对原有的分割支路(FCN)引入一个前背景二分类的全连接支路,通过融合这两条支路的输出得到更加精确的分割结果。


在YOLOv4中,作者使用PANet代替YOLOv3中的FPN作为参数聚合的方法,针对不同的检测器级别从不同的主干层进行参数聚合。并且对原PANet方法进行了修改, 使用张量连接(concat)代替了原来的捷径连接(shortcut connection)。


4)YOLOv3 Head

详细见:目标检测算法——YOLOv3


在YOLOv4中,继承了YOLOv3的Head进行多尺度预测,提高了对不同size目标的检测性能。

image.png

image.png


4.YOLOv4创新点


1)Mosaic

其他的一些数据增强的方法:见YOLOv4中的tricks概念总结——Bag of freebies


借鉴了CutMix数据增强方式的思想。CutMix数据增强方式利用两张图片进行拼接,但是Mosaic使利用四张图片进行拼接

image.png

Mosaic数据增强方法有一个优点:拥有丰富检测目标的背景,并且在BN计算的时候一次性会处理四张图片


2)Self Adversarial Training

SAT是一种自对抗训练数据增强方法,这一种新的对抗性训练方式。在第一阶段,神经网络改变原始图像而不改变网络权值。以这种方式,神经网络对自身进行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,用正常的方法训练神经网络去检测目标。

image.png


也就是利用了对抗攻击模型来实现数据增强,关于这方面我后面会出一个关于李宏毅课上的一个笔记。


3)CmBN

CmBN的全称是Cross mini-Batch Normalization,定义为跨小批量标准化(CmBN)。CmBN 是 CBN 的改进版本,它用来收集一个batch内多个mini-batch内的统计数据。BN、CBN和CmBN之间的区别具体如下图所示:

image.png

CBN Cross-Iteration Bach Normalization 通过泰勒多项式去估计几个连续batch的统计参数:为了适配单GPU,低batch也可以有好结果


4)modified SAM

image.png


5)modified PANet

image.png


6)DIOU_NMS

参考:https://www.cnblogs.com/yymn/articles/13672236.html


Nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式,Yolov4则借鉴D/CIOU loss的论文


将其中计算IOU的部分替换成DIOU的方式:再来看下实际的案例

image.png

在上图重叠的摩托车检测中,中间的摩托车因为考虑边界框中心点的位置信息,也可以回归出来。因此在重叠目标的检测中,DIOU_nms的效果优于传统的nms。


问题:这里为什么不用CIOU_nms,而用DIOU_nms?


因为前面讲到的CIOU_loss,是在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可。


5.YOLOv4使用的一些其他方案


到最后,yolov4使用了如下的技巧与结构:

image.png


  • CutMix
  • Mosaic data augmentation
  • DropBlock regularization
  • Class label smoothing
  • Mish activation
  • Cross-stage partial connections (CSP)
  • Multiinput weighted residual connections (MiWRC)
  • CIoU-loss
  • CmBN
  • Self-Adversarial Training
  • Eliminate grid sensitivity
  • Using multiple anchors for a single ground truth
  • Cosine annealing scheduler
  • ptimal hyperparameters
  • Random training shapes
  • SPP-block
  • SAM-block
  • PAN path-aggregation block
  • DIoU-NMS

以上大多数已有概括,现在简要讲述一些没有提及的tricks


1)Class label smoothing

[0,0,1]–>[0.01,0.01,0.98]

[…] (1-a)+a/n[1,1…](这里a=0.03 n=3)


2)Multiinput weighted residual connections

在BiFPN中,提出了多输入加权剩余连接来进行尺度级重加权,然后添加不同尺度的特征映射。

image.png


3)Eliminate grid sensitivity

为了在网格线上的相对值同样可以被检测到


原本:

image.png


简单的就是通过sigmoid乘上一个>1.0的因子,这样就不用处于无限大的时候值才等于1.现在乘上一个因子,相当于可以用一个小数也可以使得sigmoid值为1.


4)Using multiple anchors for a single ground truth

为单ground truth做多个锚点


5)Cosine annealing scheduler

一种改变学习率的方式

image.png


6)ptimal hyperparameters

通过遗传算法找到最优参数


总结:


  • 与其它先进的检测器相比,对于同样的精度,YOLOv4更快(FPS);对于同样的速度,YOLOv4更准(AP)。
  • YOLOv4能在普通的GPU上训练和使用,比如GTX 1080Ti和GTX 2080Ti等。
  • 论文中总结了各种Tricks(包括各种BoF和BoS),给我们启示,选择合适的Tricks来提高自己的检测器性能。


参考资料:

https://blog.csdn.net/weixin_44751294/article/details/117844557

https://blog.csdn.net/weixin_44751294/article/details/117851548

https://blog.csdn.net/weixin_44751294/article/details/117882906

https://www.bilibili.com/video/BV1yi4y1g7ro?p=4

https://blog.csdn.net/wjinjie/article/details/107509243

https://blog.csdn.net/wjinjie/article/details/107445791

https://blog.csdn.net/yzf0011/article/details/75212513

https://github.com/ultralytics/yolov3

https://www.cnblogs.com/yymn/articles/13672236.html

https://www.bilibili.com/video/BV1aK4y1k73n

https://www.bilibili.com/video/BV1pv411V7kR

https://blog.csdn.net/nan355655600/article/details/106246422

https://www.cnblogs.com/sddai/p/14760055.html


附录:

最后参考了一幅图


相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
1月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
63 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
19天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA-PSO-SVM算法的混沌背景下微弱信号检测matlab仿真
本项目基于MATLAB 2022a,展示了SVM、PSO、GA-PSO-SVM在混沌背景下微弱信号检测中的性能对比。核心程序包含详细中文注释和操作步骤视频。GA-PSO-SVM算法通过遗传算法和粒子群优化算法优化SVM参数,提高信号检测的准确性和鲁棒性,尤其适用于低信噪比环境。
|
1月前
|
算法 安全
分别使用OVP-UVP和OFP-UFP算法以及AFD检测算法实现反孤岛检测simulink建模与仿真
本课题通过Simulink建模与仿真,实现OVP-UVP、OFP-UFP算法及AFD检测算法的反孤岛检测。OVP-UVP基于电压幅值变化,OFP-UFP基于频率变化,而AFD则通过注入频率偏移信号来检测孤岛效应,确保电力系统安全稳定运行。系统使用MATLAB 2013b进行建模与仿真验证。
|
24天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
30 0
|
1月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
71 0
|
3月前
|
机器学习/深度学习 监控 算法
目标检测算法技术
8月更文挑战第11天
|
3月前
|
机器学习/深度学习 监控 算法
目标检测算法
8月更文挑战第5天
|
3月前
|
机器学习/深度学习 监控 算法
目标检测算法
8月更文挑战第8天