赞
踩
WongKinYiu/PyTorch_YOLOv4
maudzung/3D-YOLOv4
Tianxiaomo/pytorch-YOLOv4
YOLOv4 on TensorFlow 2.0 / TFlite / Andriod:
YOLOv4 on TensorRT+tkDNN:
For YOLOv3 (-70% faster inference): Yolo is natively supported in DeepStream 4.0 read PDF. wang-xinyu/tensorrtx implemented yolov3-spp, yolov4, etc.
the fastest implementation of YOLOv4 for CPU (x86/ARM-Android), OpenCV can be compiled with OpenVINO-backend for running on (Myriad X / USB Neural Compute Stick / Arria FPGA), use yolov4.weights/cfg with: C++ example or Python example
yolo原始作者Joseph Redmon 2020.2已经退出CV界,来自俄罗斯大神AlexeyAB接棒蓄力、在darknet的基础上汇集state-of-art的各种tricks、力压群雄、在2020.4推出yolov4。这也许是一种技术上的传承和继任吧。
Paper Yolo v4: https://arxiv.org/abs/2004.10934
More details: medium link
Manual: [https://github.com/AlexeyAB/darknet/wiki]
darknet(github)原始的readme也已经由Alexey更新
单单从论文中来看,yolo系列已经由明显掺杂着私人观点和语言浮夸,转向用大量详实的数据和归纳总结来讲技术创新了,对比yolov4和yolov3(但就论文而言),你会觉得TMD终于写的像授人以鱼的论文了!!!
拖了好长时间,这个今天必须要分享和归纳总结分享一波~~~
论文主要由以下几个部分组成:
论文综述 |
Object detection models综述(achor-based/achor-free结构和常见组件) |
模型提高方法(Bag of freebies(Bof)/ Bag of specials(Bos)) |
Methodology(选型标准; artechiture、Bof/Bos、其他提高的对比;yolov4最终选择等) |
Experiment(classyfier/detector不同选型结果对比、training中不同选型对比等) |
最后对比归纳,并且附上了各个情况的对比表。 |
yolov4作者的目的就是能让所有的有单块GPU(甚至是只有cpu)的读者能够在自己的电脑上训练、并且得到比较好的obj-detect效果(所以这个模型就不像google系列一样会使用一些多显卡和设备交叉训练等大厂作风):
真的是良心,并且他真的做到了。
性能、准确率对比图(AP/FPS)如下所示:
tips:
1.YOLOv4 有inpust size = 320/ 416/ 512/ 608, 4中不同模型; YOLOv3 有320/416/608, 3种;
2. YOLOv4(inputsize=608) : 43.5%AP 【1】(65.7% AP50 【2】) for the MS COCO dataset
at a real-time speed of 65 FPS on Tesla V100
3. 此表是在tesla V100
的显卡下的结果。YOLO4不是100%的AP, FPS都最强的。但是算是性能和准确率的集大成者了,在处理性能非常流畅的情况下,还能有非常高的准确率。
4. 个人经验,如果fps<10左右的话,视频流处理就会有非常明显的卡顿了。如果视频处理是基于rtsp流处理的话,fps > 15这个应该是比较好的。(当然在显卡比较好的情况下)。
5. V100
可能不是每个人都舍得买的,所以官方的github上也有1080TI
的对比图(AP50/FPS),如下所示:
现阶段的obj-detect,主要有anchor-base、anchor-free、两者融合。【3】
论文中主要给出了两者的一个通用模式的结构图:
Input:算法的输入,包括整个图像,一个patch,或者是image pyramid
Backbone:可以理解为是提取图像特征的部分,由于图像中的浅层特征(low-level)是比较类似的,例如提取边缘,颜色,纹理这些。因此这部分可以很好的借鉴一些设计好并且已经训练好的网络,例如GPU选型(VGG16,19,ResNet-50, ResNeXt-101, Darknet53), 同时还有一些轻量级的backbone --CPU选型(MobilenetV1,2,3 ShuffleNet1,2)。
Neck:这部分的作用就是收集和处理feature map。前面的backbone已经提取到了一些相关的feature map,由这部分对backbone提取到的浅层特征(low-level feature)进行收集和处理,从而使得模型学到高位度特征。这部分典型的有(SPP,ASPP in deeplabV3+,RFB,SAM),还有一些(FPN, PAN, NAS-FPN, BiFPN, ASFF, SFAM)。
Head:检测头。这部分就到了算法最关键的部分,就是来输出你想要的结果,例如想得到一个heatmap,(如在centernet中),那就增加一些反卷积层来一层一层反卷积回去。如果想直接得到bbox,那就可以接conv来输出结果,例如Yolo,ssd这些。亦或是想输出多任务(mask-RCNN)那就输出三个head:classification,regression,segmentation(就是mask那部分)。
tips:
细心的读者可以发现这个小框里面有one-stage / two-stage【4】。
这是典型的obj-base的两种不同的模式。可以简单理解two-stage,就是one-stage作为RPN
(Region proposal Network)输出ROI
(Region of interest)到sparse prediction中在进行计算。当然这个应该是主要指anchor-base,而不是anchor-free结构
因此,一个检测算法可以理解为:
Object Detection = Backbone + Neck + Head
有了通用的model结构,如何提高检测的性能和准确率?现阶段的主流的方法或者训练的技巧又有那些?
作者又进行了归纳总结各种tricks以及plugins models:
(参见前人的思维导向图,以便于更加方便的梳理论文精华:)
Bof是指,在文中是指那些能够提高精度或者泛化能力(改变训练策略或者略微增加训练成本),而不增加推断时间的技术
data augmentation |
目的: has a higher robustness to the images obtained from different environments
根本途径:increase the variability of the input images
具体方法:photometric distortions and geometric distortions(就是改变光、地理扭曲程度)、 simulating object occlusion issues(遮挡问题)、using multiple images together(多张组合形成新图片)、style transfer GAN(这个能有效改变CNN读取图片的纹理特征)
solve problems of the bias of semantic distribution in dataset |
目的:dealing with the problem of semantic distribution bias
主要存在问题:
主要解决方法:
two-stage obj-detector
:one-stage obj - detector
:label smoothing
【6】:convert hard label into soft label for training, which can make model more robust;knowledge distillation
【7】: a better soft labelBounding Box (BBox) regression optimization |
Smooth loss -> IOU loss -> GIOU -> DIOU - > CIOU
【8】
BBox loss发展的历史结论: CIoU can achieve better convergence speed and accuracy on the BBox regression problem.
Bos是指, 那些增加稍许推断代价,但可以提高模型精度的方法
作用:these plugin modules are for enhancing certain attributes in a model
enlarging receptive field |
可以用来增强接收域的通用模块是SPP ,ASPP 和 RFB.
SPP
: < Spatial pyramid pooling in deep convolutional networks forvisual recognition. >【10】
ASPP,
:<DeepLab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected CRFs.>
RFB
:<Receptive field block net for accurate and fast object detection.>
SPP 模块起源于空间金字塔匹配(Spatial Pyramid Matching, SPM
),SPM的原始方法是将特征图(feature map
)分割成若干d x d 个相等的块,其中d 可以等于{1,2,3,…}(其中之一),从而形成空间金字塔。然后提取词袋特征(bag-of-word features
)。
SPP将SPM集成到CNN中,并使用最大池操作(max-pooling operation
)而不是词袋运算。
由于He等人提出的SPP模块,是输出一维特征向量,在全卷积网络(FCN)中应用是不可行的。因此,在YOLOv3的设计中,Redmon和Farhadi将SPP模块改进为内核大小为 k×k 的最大池输出的串联,其中k = {1,5,9,13},步长等于1。
在这种设计下,相对较大的kenel为 k×k 的池化操作(max pooling)有效地增加了骨干特征的接受范围。在添加了改进版本的SPP模块之后,YOLOv3-608在MS COCO object
检测任务上将AP50升级了2.7%,而额外的计算消耗仅仅增加了0.5%。
ASPP模块和改进的SPP模块之间的操作差异主要是:
原来的:k× k kernel_size,最大卷积步长(max pooling stride)等于1 ----> 改进的: 3×3 kernel_size,膨胀比(dilated ratio)等于k,空洞卷积(dilated convolution【11】)操作的步长等于1。
RFB模块将使用k×k kernel的几个空洞卷积,扩张比率等于k和步幅等于1来获得比ASPP更全面的空间覆盖范围。RFB仅花费7%的额外推断时间即可将MS COCO上SS的AP50提高5.7%
introducing attention mechanism |
注意力机制主要分为:
channels-wise
: 典型代表模型结构Squeeze-and-Excitation (SE)
point-wise
:典型代表模型结构Spatial Attention Module (SAM)
虽然SE模块【13】在ImageNet图像分类任务中可以提高1%的TOP-1 accuracy【12】,但是在GPU上通常会增加10%左右的推理(inference)时间,因此更适合在移动设备上使用,虽然SE模块在ImageNet图像分类任务中可以提高1%的TOP-1 accuracy,但是在GPU上通常会增加10%左右的推理时间。
而对于SAM【14】,它只需要额外支付0.1%的计算量,在ImageNet图像分类任务上可以提高ResNet50-SE 0.5%的TOP-1 accuracy。最棒的是,它完全不影响GPU上的推理速度.
【个人补充说明】
注意力机制(Attention Mechanism)是机器学习中的一种数据处理方法,广泛应用在自然语言处理、图像识别及语音识别等各种不同类型的机器学习任务中。
通俗来讲:注意力机制就是希望网络能够自动学出来图片或者文字序列中的需要注意的地方。比如人眼在看一幅画的时候,不会将注意力平等地分配给画中的所有像素,而是将更多注意力分配给人们关注的地方。
从实现的角度来讲:注意力机制通过神经网络的操作生成一个掩码mask, mask上的值一个打分,评价当前需要关注的点的评分。
注意力机制可以分为:
通道注意力机制:对通道生成掩码mask,进行打分,代表是senet, Channel Attention Module
空间注意力机制:对空间进行掩码的生成,进行打分,代表是Spatial Attention Module
混合域注意力机制:同时对通道注意力和空间注意力进行评价打分,代表的有BAM, CBAM
strengthening feature integration capability |
在特征集成方面,早期的实践是使用skip connection
或hyper-column
将浅级物理特征集成到高级语义特征。
随着multi-scale prediction methods(such as FPN)
普及,人们提出了许多集成不同特征金字塔的轻量级模块。
这种类型的模块包括
SfAM(< M2det: A single-shot
object detector based on multi-level feature pyramid network>)、
ASFF (<:Learning spatial fusion for single-shot object detection>)
BiFPN(<EfficientDet: Scalable and efficient object detection> )
SfAM
的主要思想是使用SE模块对多比例尺拼接的特征地图进行通道级的加权。
ASFF
采用Softmax作为逐点层次加权,然后添加不同尺度的特征地图;
BiFPN
采用多输入加权残差连接进行尺度层次重新加权,再添加不同尺度的特征地图。
good activation function |
在深度学习的研究中,有些人专注于寻找良好的激活函数。良好的激活函数可以使梯度更有效地传播,同时不会引起过多的计算成本。
在2010年,Nair和Hin-ton提出了ReLU
,以基本上解决传统tanh
和sigmoid
激活函数中经常遇到的梯度消失问题。
随后,进一步延伸发展出LReLU , PReLU , ReLU6 , Scaled Exponential Linear Unit (SELU) , Swish , hard-Swishand Mish , etc
,它们也是已经提出的、用于解决梯度消失问题的方法。
LReLU
和PReLU
的主要目的是解决当输出小于零时ReLU
的梯度为零的问题。
至于ReLU6
和hard-Swish
,它们是专门为量化网络设计的。
为了对神经网络进行自归一化,提出了SELU
激活函数来满足这一目标。
值得注意的是,Swish
和Mishare
都是全值域连续、可导的激活功能。
post-processing |
在基于深度学习的对象检测中通常使用的后处理方法是NMS
【16】,它可以用于过重复重叠的BBox,并仅保留具有较高response的候选BBox。NMS尝试改进的方法与优化目标函数的方法一致。NMS提出的原始方法没有考虑上下文信息,因此Girshicket等人在R-CNN中添加了分类置信度得分(confidence score
)作为参考。
根据置信度得分的顺序, greedy NMS
从高分到低分的顺序执行。
soft NMS
,在greedy NMS基础上还解决一个重要问题:即物体的遮挡可能会导致带有IoU评分的greedy NMS的置信度得分下降。
DIoU NMS
开发人员的思维方式是在soft NMS的基础上将中心距离的信息添加到BBox筛选过程中。
值得一提的是,由于上述后处理方法均未直接涉及捕获的image features,因此在随后的anchor-free
开发中不再需要后处理。
基本目标是在生产系统中对神经网络进行快速操作,并针对并行计算进行优化,而不是低计算量理论指示器(BFLOP)。我们提供了实时神经网络的两种选择:
GPU,使用少量的组(1-8)卷积层:CSPResNeXt50 / CSPDarknet53
VPU, 使用grouped-convolution
, 特别是包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3,但是不再使用Squeeze-and-excitement (SE) blocks
注意:并没有使用CGBN等大厂作风去用硬件刷分
architecture要求
detector要求
结论: 需要backbone参数数量越大、感受野越广、对于不同level参数的聚合越强的结构
(1) Backbone选择: CSPResNeXt50 vs CSPDarknet53 ----> CSPDarknet53
识别效果研究:
通过对比可知,CSPDarknet53 拥有更大的感受野、更多的参数、略快的速度。backbone最终选择CSPDarknet53
(2) 增加了SPP block
研究者在 CSPDarknet53 上添加了 SPP 块,因为它能够极大地增加感受野,分离出最显著的上下文特征,并且几乎没有降低网络运行速度。
(3) Neck选择 : FPN vs PANet ----> PANet
他们针对不同级别的检测器从不同骨干层中挑选 PANet 作为参数聚合方法,而放弃了 YOLOv3 中使用的 FPN 网络。
(4) Head选择:YOLOv3 (anchor based) head
YOLO v4 Architecture |
Backbone:CSPDarknet53
Neck:SPP、PAN
Head:YOLOv3
贴上一张input size = 608 x 608 的结构
激活函数中,由于PReLU
和SELU
更难训练,并且ReLU6
是专门为量化网络设计的,因此从候选列表中删除了上述激活功能。
在正则化方法中,发布Drop-Block
的人们将自己的方法与其他方法进行了详细的比较,而其正则化方法力压群雄。因此,选择了DropBlock作为yolov4正则化方法。
至于标准化方法的选择,由于v4专注于仅使用一个GPU的训练策略,因此不考虑syncBN
。
YOLOv4 BoF & BoS |
用于骨干网络的 Bag of Freebies(BoF)
:CutMix 和 Mosaic 数据增强、DropBlock 正则化和类标签平滑;
用于骨干网络的 Bag of Specials(BoS)
:Mish 激活、CSP 和多输入加权残差连接(MiWRC);
用于检测器的 Bag of Freebies(BoF)
:CIoU-loss、CmBN、DropBlock 正则化、Mosaic 数据增强、自对抗训练、消除网格敏感性(Eliminate grid sensitivity)、针对一个真值使用多个锚、余弦退火调度器、优化超参数和随机训练形状;
用于检测器的 Bag of Specials(BoS)
:Mish 激活、SPP 块、SAM 块、PAN 路径聚合块和 DIoU-NMS。
Mosaic是一种新的混合4幅训练图像的数据增强方法。所以四个不同的上下文信息被混合,而CutMix只混合了2种。
这允许检测其正常上下文之外的对象。此外,批量归一化从每层上的4个不同的图像计算激活统计。这极大地减少了对large mini-batch-size的需求。
自对抗训练(SAT)也代表了一种新的数据增强技术,它在两个前向后向阶段运行。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对其自身执行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,训练神经网络,以正常的方式在修改后的图像上检测目标
CmBN表示CBN的修改版本,如下图所示,定义为交叉小批量规范化(Cross mini-Batch Normalization,CMBN)。这仅在单个批次内的小批次之间收集统计信息。
我们将SAM从空间注意修改为点注意,并将PAN的addition
连接分别替换为concatention
,如下图所示:
这个里面有对于选型不同model的比较,就是对于4.3中选型结果的数据说明
但是限于篇幅不做进一步的展开了。有兴趣的同学可以去自行查看一下。
最后附上一张YOLOv4在不同显卡上的AP-FPS
图以便于做性能和准确率对比:
tips:
由于不同的方法使用不同体系结构的GPU进行推理时间验证,我们在常用的Maxwell、Pascal和VoltaArchitecture体系结构的GPU上运行YOLOv4,并将它们与其他先进的方法进行了比较。
表8列出了使用Maxwell GPU
的帧率比较结果,可以是GTX Titan X(Maxwell)或Tesla M40 GPU
。
表9列出了使用Pascal GPU
的帧率比较结果,它可以是Titan X(Pascal)、Titan XP、GTX 1080 Ti或Tesla P100 GPU
。
表10列出了使用VoltaGPU
的帧率对比结果,可以是Titan Volta
,也可以是Tesla V100 GPU
。
(表8-10相关图形化显示,参见上图)
yolov4整体架构方面,可以与yolov3-spp进行对比,有几个不同点:
结构方面就这些不同,不过训练过程确实引入了很多特性比如:
官方:
Paper Yolo v4: https://arxiv.org/abs/2004.10934
More details: medium link
Manual: https://github.com/AlexeyAB/darknet/wiki
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。