【YOLO系列】YOLOv4论文超详细解读1(翻译 +学习笔记)
前言
经过上一期的开篇介绍,我们知道YOLO之父Redmon在twitter正式宣布退出cv界,大家都以为YOLO系列就此终结的时候,天空一声巨响,YOLOv4闪亮登场!v4作者是AlexeyAB大神,虽然换人了,但论文中给出的测试结果依然保留YOLO系列的血统:保持相对较高的mAP的同时,大大降低计算量,可谓是学术成果在工业应用的典范,至于实际使用如何,还需要时间的进一步检验。
YOLOv4的论文是我读文献以来最不“爽”的一篇,YOLOv4像一个“缝合怪”,几乎没有提出什么创新性的东西,其实是一个结合了大量前人研究技术,加以组合并进行适当创新的算法,实现了速度和精度的完美平衡。里面涉及的tricks过多,每读到一点我都要查大量资料。由于篇幅有限,本篇只是对论文进行解读,trick详解请看这篇:【YOLO系列】YOLOv4论文超详细解读2(网络详解)
好了,我们现在开始吧~
学习资料:
论文链接:《YOLOv4:Optimal Speed and Accuracy of Object Detection》
代码链接:mirrors / alexeyab / darknet · GitCode
前期回顾:
【YOLO系列】YOLOv3论文超详细解读(翻译 +学习笔记)【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)
【YOLO系列】YOLOv1论文超详细解读(翻译 +学习笔记)
目录
前言
Abstract—摘要
一、 Introduction—简介
二、Related work—相关工作
2.1 Object detection models—目标检测模型
2.2 Bag of freebies
2.3 Bag of specials
三、Methodology—方法
3.1 Selection of architecture—架构选择
3.2 Selection of BoF and BoS—BoF和BoS的选择
3.3 Additional improvements—进一步改进
3.4 YOLOv4
四、Experiments—实验
4.1 Experimental setup—实验设置
4.2 Influence of different features on Classifier training—不同特征对分类器训练的影响
4.3 Influence of different features on Detector training—不同特征对检测器训练的影响
4.4 Influence of different backbones and pre- trained weightings on Detector training—不同的backbone和预先训练权重对检测器训练的影响
4.5 Influence of different mini-batch size on Detec- tor training—不同的小批尺寸对检测器培训的影响
五、Results—结果
Abstract—摘要
翻译
大量的特征据说可以提高卷积神经网络(CNN)的精度。需要在大数据集上对这些特征的组合进行实际测试,并对结果进行理论证明。有些特性只适用于某些模型,只适用于某些问题,或仅适用于小规模数据集;而一些特性,如批处理标准化和残差连接,适用于大多数模型、任务和数据集。我们假设这些普遍特征包括加权残差连接(WRC)、跨阶段部分连接(CSP)、交叉小批归一化(CmBN)、自我对抗训练(SAT)和Mish激活。我们使用新功能:WRC,CSP,CmBN,SAT,Mish激活,Mosaic数据增强、CmBN,DropBlock正则化和CIoU损失,并结合其中一些实现最先进的结果:43.5%AP,(65.7%AP50)的实时速度∼65FPS Tesla V100。源代码是在https://github.com/AlexeyAB/darknet.。
精读
提高CNN准确性的方法
(1)专用特性: 一些特征只针对某一模型,某一问题,或仅为小规模数据集
(2)通用特性: 一些特性,如批处理规范化和残差连接,则适用于大多数模型、任务和数据集。这些通用特性包括加权剩余连接(WRC)、跨阶段部分连接(CSP)、跨小批标准化(CmBN)、自反训练(SAT)和Mish 激活函数。
YOLOv4使用的技巧
使用新特性:WRC、CSP、CmBN、SAT、Mish 激活函数、Mosaic数据增强、CmBN、DropBlock正则化、CIoU损失,结合这些技巧实现先进的结果。
实现结果
在Tesla V100上,MS COCO数据集以65 FPS的实时速度达到43.5 % AP ( 65.7 % AP50 )。
一、 Introduction—简介
翻译
大多数基于cnn的对象检测器基本上只适用于推荐系统。例如,通过城市摄像机搜索免费停车位是由慢速精确的模型执行的,而汽车碰撞警告与快速不准确的模型有关。为了提高实时目标检测器的精度,不仅可以将它们用于提示生成推荐系统,还可以用于独立的流程管理和减少人工输入。在传统图形处理单元(GPU)上的实时对象检测器操作允许它们以可承受的价格大规模使用。最精确的现代神经网络不能实时运行,需要大量的gpu来进行大的小批量训练。我们通过创建一个在普通的GPU上实时运行的CNN来解决这些问题,而其训练只需要一个普通的GPU。
这项工作的主要目标是在生产系统中设计一个目标检测器的快速运行速度,并优化并行计算,而不是低计算体积理论指标(BFLOP)。我们希望所设计的对象能够方便地训练和使用。例如,任何使用普通的GPU进行训练和测试的人都可以实现实时、高质量和令人信服的目标检测结果,如图1所示的YOLOv4结果所示。我们的贡献总结如下:
1.我们开发了一个高效而强大的目标检测模型。它使每个人都可以使用一个1080 Ti或2080 Ti GPU来训练一个超快和准确的目标探测器。
2.我们验证了state-of-the-art Bag-of Freebies and Bag-of-Specials对目标检测的影响。
3.我们修改了最先进的方法,使其更有效,更适合于单一的GPU训练,包括CBN[89],PAN[49],SAM[85]等。
精读
启发
(1)改进性能: 大多数基于CNN的目标检测器主要只适用于推荐系统,因此需要提高实时目标探测器的准确性。
(2)单GPU训练: 最精确的现代神经网络不能实时运行,需要大量的GPU来进行大规模的小批量训练。我们通过创建一个在常规GPU上实时运行的CNN来解决这些问题,而训练只需要一个常规GPU。
目的
设计生产系统中目标检测器的快速运行速度,优化并行计算,而不是低计算量理论指标 (BFLOP)。
贡献
(1)开发了一个高效、强大的目标检测模型。使用单个1080 Ti或2080 Ti GPU就能训练一个超级快速和精确的目标探测器。
(2)验证了在检测器训练过程中,最先进的Bag-of-Freebies 和Bag-of-Specials对目标检测方法的影响。
(3)修改了最先进的方法,使其更有效,更适合于单GPU训练。
Q: Bag-of-Freebies 和Bag-of-Specials
Bag-of-Freebies: 指不会显著影响模型测试速度和模型复杂度的技巧,主要就是数据增强操作、标签软化等外在训练方法,即不需要改变网络模型。
Bag-of-Specials: 是用最新最先进的方法(网络模块)来魔改检测模型。只增加少量推理成本但能显著提高对象检测精度的插件模块和后处理方法,一般来说,这些插件模块都是为了增强模型中的某些属性,如扩大感受野、引入注意力机制或加强特征整合能力等,而后处理是筛选模型预测结果的一种方法。
二、Related work—相关工作
2.1 Object detection models—目标检测模型
翻译
现代探测器通常由两部分组成,一个是在ImageNet上预先训练的主干,另一个是用于预测物体的类和边界框的头部。对于那些运行在GPU平台上的检测器,它们的主干可以是VGG[68]、ResNet[26]、ResNeXt[86]或DenseNet[30]。对于那些运行在CPU平台上的检测器,它们的主干可以是SqueezeNet [31]、MobileNet[28,66,27,74]或ShufflfleNet[97,53]。对于头部部分,通常可分为一级目标探测器和两级目标探测器两类。最具代表性的两级目标探测器是R-CNN[19]系列,包括Fast R-CNN[18]、Faster R-CNN[64]、R-FCN[9]和Libra R-CNN[58].也可以使一个两级目标检测器成为一个无锚点的目标检测器,如反应点[87]。对于单级目标探测器,最具代表性的模型是YOLO[61,62,63]、SSD[50]和RetinaNet[45]。近年来,无锚的单级目标探测器已经发展起来。这类检测器有CenterNet [13]、CornerNet [37,38]、FCOS[78]等。近年来开发的目标探测器经常在主干和头部之间插入一些层,这些层通常用于收集不同阶段的特征图。我们可以称之为物体探测器的颈部。通常,颈部由几条自下向上的路径和几条自上向下的路径组成。配备这种机制的网络包括特征金字塔网络(FPN)[44]、路径聚合网络(PAN)[49]、BiFPN[77]和NAS-FPN[17]。
除了上述模型外,一些研究人员还强调了直接构建一个新的主干(DetNet[43],DetNAS[7])或一个新的整体模型(SpineNet[12],HitDetector[20])用于目标检测。
综上所述,一个普通的物体探测器由以下几个部分组成:
精读
现代目标检测器组成
(1)主干backbone: 在ImageNet上预先训练的网络用来特征提取。
- 在GPU平台上运行的检测器,主干可以是VGG、ResNet、ResNeXt或DenseNet。
- 在CPU平台上运行的检测器,主干可以是SqueezeNet、MobileNet或ShuffleNet。
(2)头部head: 对图像特征进行预测,生成边界框和并预测类别。通常分为两类即单阶段目标检测器和两阶段目标检测器。
- two stage: R-CNN系列,包括fast R-CNN、faster R-CNN、R-FCN和Libra R-CNN。
- one stage: 最具代表性的模型有YOLO、SSD和RetinaNet。
(3)颈部neck: 近年来发展起来的目标检测器常常在主干和头部之间插入一系列混合和组合图像特征的网络层,并将图像特征传递到预测层。称之为目标检测器的颈部neck。
通常,一个颈部neck由几个自下而上的路径和几个自上而下的路径组成。具有该机制的网络包括特征金字塔网络(FPN)、路径汇聚网络(PAN)、BiFPN和NAS-FPN。
综上所述,一个普通的物体探测器是由“特征输入、骨干网络、颈部和头部”四部分组成的:
2.2 Bag of freebies
翻译
通常,一个传统的目标检测器是离线训练的。因此,研究者总是喜欢利用这一优势,开发出更好的训练方法,使目标检测器在不增加推理成本的情况下获得更好的精度。我们把这些只会改变培训策略或只增加培训成本的方法称为“bag of freebies”。目标检测方法经常采用的、满足bag of freebies.定义的是数据增强。数据增强的目的是为了增加输入图像的可变性,从而使所设计的目标检测模型对在不同环境下获得的图像具有更高的鲁棒性。例如,光度畸变和几何畸变是两种常用的数据增强方法,它们肯定有利于目标检测任务。在处理光度失真时,我们会调整图像的亮度、对比度、色调、饱和度和噪声。对于几何失真,我们添加了随机缩放、裁剪、翻转和旋转。
上述数据增强方法都是像素级调整,并保留调整区域中的所有原始像素信息。此外,一些从事数据增强工作的研究人员将其重点放在了模拟对象遮挡问题上。它们在图像分类和目标检测方面取得了良好的效果。例如,随机擦除[100]和CutOut[11]可以随机选择图像中的矩形区域,并填充一个随机的或互补的零值。对于hide-and-seek[69]和grid mask[6],它们随机或均匀地选择一个图像中的多个矩形区域,并将它们替换为所有的零。如果将类似的概念应用于特征映射,则会有DropOut[71]、Drop连接[80]和DropBlock[16]方法。此外,一些研究者提出了使用多个图像一起进行数据增强的方法。例如,MixUp[92]使用两幅图像用不同的系数比进行乘法和叠加,然后用这些叠加的比率来调整标签。
CutMix[91]是将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。除上述方法外,还采用了样式转移GAN[15]进行数据增强,这种使用可以有效地减少CNN学习到的纹理偏差。
与上面提出的各种方法不同,其他一些bag of freebies都致力于解决数据集中的语义分布可能存在偏差的问题。在处理语义分布偏差问题时,一个非常重要的问题是不同类之间存在数据不平衡的问题,这个问题通常通过两级对象检测器中的硬负例挖掘[72]或在线硬例挖掘[67]来解决。但该示例挖掘方法不适用于单级对象检测器,因为这种检测器属于密集预测体系结构。因此,Lin等人[45]提出了焦点损失来解决不同类之间存在的数据不平衡问题。另一个非常重要的问题是,很难表达不同类别之间的关联程度与单一热硬表示之间的关系。这种表示方案经常用于执行标记。[73]中提出的标签平滑方法是将硬标签转换为软标签进行训练,使模型的鲁棒性更强。为了获得更好的软标签,Islam等人引入了知识精馏的概念来设计标签细化网络
最后bag of freebies是边界盒(BBox)回归的目标函数。传统的对象检测器通常使用均方误差(MSE)直接对BBox的中心点坐标和高度和宽度进行回归,{,w、h}或左上角点和右下角点。对于基于锚的方法,是估计相应的偏移量,例如和,然而,直接估计BBox中每个点的坐标值是要将这些点作为自变量来处理,但实际上并没有考虑对象本身的完整性。为了更好地处理这一问题,一些研究人员最近提出了IoU损失[90],它考虑了预测的BBox区域和地面真实BBox区域的覆盖范围。IoU损失计算过程将通过使用地面真相执行IoU,触发BBox的四个坐标点的计算,然后将生成的结果连接到一个整个代码中。由于IoU是一种尺度不变表示,它可以解决传统方法计算{x、y、w、h}的l1或l2损失时,损失会随着尺度的增加而增加的问题。最近,一些研究人员继续改善IoU的损失。例如,GIoU损失[65]除了包括覆盖区域外,还包括物体的形状和方向。他们提出找到能够同时覆盖预测的BBox和地面真实BBox的最小面积的BBox,并使用该BBox作为分母来代替IoU损失中最初使用的分母。对于DIoU损失[99],它另外考虑了物体中心的距离,而CIoU损失[99]则同时考虑了重叠面积、中心点之间的距离和高宽比。CIoU在BBox回归问题上可以获得更好的收敛速度和精度。
精读
BoF方法一:数据增强
(1)像素级调整
①光度失真: brightness(亮度)、contrast(对比度)、hue(色度)、saturation(饱和度)、noise(噪声)
②几何失真: scaling(缩放尺寸)、cropping(裁剪)、flipping(翻转)、rotating(旋转)
(2)模拟目标遮挡
①erase(擦除)、CutOut(剪切): 随机选择图像的矩形区域,并填充随机或互补的零值
②hide-and-seek和grid mask: 随机或均匀地选择图像中的多个矩形区域,并将它们替换为全零
③将上述方式作用于特征图上: DropOut、DropConnect、DropBlock
(3)将多张图像组合在一起
①MixUp: 使用两个图像以不同的系数比率相乘后叠加,利用叠加比率调整标签
②CutMix: 将裁剪的图像覆盖到其他图像的矩形区域,并根据混合区域大小调整标签
(4)使用style transfer GAN进行数据扩充,有效减少CNN学习到的纹理偏差。
BoF方法二:解决数据集中语义分布偏差问题
①两阶段对象检测器: 使用硬反例挖掘或在线硬例挖掘来解决。不适用于单级目标检测。
②单阶段目标检测器: focal损来处理各个类之间存在的数据不平衡问题。
BoF方法三:边界框(BBox)回归的目标函数
①IoU损失: 将预测BBox区域的区域和真实BBox区域考虑在内。由于IoU是尺度不变的表示,它可以解决传统方法在计算{x, y, w, h}的l1或l2损耗时,损耗会随着尺度的增大而增大的问题。
②GIoU loss: 除了覆盖区域外,还包括了物体的形状和方向。他们提出寻找能够同时覆盖预测BBox和地面真实BBox的最小面积BBox,并以此BBox作为分母来代替IoU损失中原来使用的分母。
③DIoU loss: 它额外考虑了物体中心的距离。
④CIoU loss : 同时考虑了重叠区域、中心点之间的距离和纵横比。对于BBox回归问题,CIoU具有更好的收敛速度和精度。
2.3 Bag of specials
翻译
对于那些只增加少量推理成本但又能显著提高目标检测精度的插件模块和后处理方法,我们称它们为“bag of specials"。一般来说,这些插件模块是用于增强模型中的某些属性,如扩大接受域、引入注意机制或增强特征整合能力等,而后处理是筛选模型预测结果的一种方法。
可用于增强感受野的常见模块是SPP[25]、ASPP[5]和RFB[47]。SPP模块起源于空间金字塔匹配(SPM)[39],SPMs的原始方法是将特征映射分割成几个d×d相等的块,其中d可以是{1,2,3,…},从而形成空间金字塔,然后提取bag-of-word特征。SPP将SPM集成到CNN中,使用最大池化操作,而不是bag-of-word操作。由于He等人[25]提出的SPP模块将输出一维特征向量,因此在全卷积网络(FCN)中应用是不可行的。因此,在YOLOv3[63]的设计中,Redmon和Farhadi将SPP模块改进为核大小为k×k,其中k={1,5,9,13},步幅等于1。在这种设计下,相对较大的最大池有效地增加了主干特征的接受域。 在添加改进版本的SPP模块后,YOLOv3-608在MS COCO目标检测任务上将AP50升级了2.7%,额外计算0.5%。ASPP[5]模块与改进的SPP模块在操作上的差异主要是从原始的k×k核大小,步幅最大池化等于1到多个3×3核大小,扩张比等于k,步幅等于1。RFB模块采用k×k核的多个扩张卷积,扩张比等于k,步幅等于1,以获得比ASPP更全面的空间覆盖。RFB[47]只需要花费7%的额外推理时间,就可以使MS COCO上的SSD的AP50增加5.7%。
目标检测中常用的注意模块主要分为通道式注意和点态注意,这两种注意模型的代表分别是Squeeze-and-Excitation (SE)[29]和空间注意模块(SAM)[85]。虽然SE模块可以提高ResNet50的力量在ImageNet图像分类任务1%top-1精度的只增加2%计算,但在GPU通常将使推理时间增加约10%,所以它更适合用于移动设备。但对于SAM,它只需要额外支付0.1%的计算量,就可以将ResNet50-SE提高到ImageNet图像分类任务的0.5%的top-1精度。最重要的是,它根本不影响GPU上的推理速度。
在特征集成方面,早期的实践是使用skip connection[51]或hyper-column[22]将低级物理特征与高级语义特征进行集成。随着FPN等多尺度预测方法越来越流行,人们提出了许多整合不同特征金字塔的轻量级模块。这类模块包括SFAM[98]、ASFF[48]和BiFPN[77]。SFAM的主要思想是利用SE模块在多尺度连接的特征图上执行信道级重加权。对于ASFF,它使用softmax作为点级重新加权,然后添加不同尺度的特征图。在BiFPN中,提出了多输入加权残差连接来进行尺度水平重加权,然后添加不同尺度的特征图。
在深度学习的研究中,一些人将重点放在寻找良好的激活函数上。一个好的激活函数可以使梯度更有效地传播,同时也不会造成太多的额外计算成本。2010年,Nair和Hinton[56]提出ReLU来实质上解决传统的tanh和s型激活函数中经常遇到的梯度消失问题。随后,提出了LReLU[54]、PReLU[24]、ReLU6[28]、尺度指数线性单位(SELU)[35]、Swish[59]、hard-Swish[27]、Mish[55]等,它们也被用于解决梯度消失问题。LReLU和PReLU的主要目的是解决当输出小于零时,ReLU的梯度为零的问题。对于ReLU6和hard-swish,它们是专门为量化网络设计的。对于神经网络的自归一化,提出了SELU激活函数来满足该目标。需要注意的一点是,Swish和Mish都是连续可区分的激活函数。
在基于深度学习的对象检测中常用的后处理方法是NMS,它可以用于过滤那些预测同一对象不好的预测框,并且只保留响应率较高的候框。NMS试图改进的方法与优化目标函数的方法是一致的。NMS提出的原始方法不考虑上下文信息,因此Girshick等[19]在R-CNN中添加分类置信分数作为参考,根据置信分数的顺序,按照高到低的顺序进行greedy NMS。对于soft NMS[1],它考虑了对象的遮挡在greedy NMS中可能导致置信度分数下降的问题。DIoU NMS[99]开发者的思维方式是在soft NMS的基础上,将中心点距离的信息添加到BBox的筛选过程中。值得一提的是,由于上述所有的后处理方法都没有直接涉及到所捕获的图像特征,因此在后续的无锚定方法的开发中,不再需要后处理。
精读
BoS方法一:插件模块之增强感受野
①改进的SPP模块
②ASPP模块
③RFB模块
BoS方法二:插件模块之注意力机制
①channel-wise注意力: 代表是Squeeze-and-Excitation挤压激励模块(SE)。
②point-wise注意力: 代表是Spatial Attention Module空间注意模块(SAM)。
BoS方法三:插件模块之特征融合
①SFAM: 主要思想是利用SE模块在多尺度的拼接特征图上进行信道级重加权。
②ASFF: 使用softmax对多尺度拼接特征图在点维度进行加权。
③BiFPN: 提出了多输入加权剩余连接来执行按比例的水平重加权,然后添加不同比例的特征图。
BoS方法四:激活函数
①LReLU和PReLU: 主要目的是解决输出小于0时ReLU的梯度为零的问题。
②ReLU6和hard-Swish: 专门为量化网络设计的。
③SELU: 针对神经网络的自归一化问题。
④Swish和Mish: 都是连续可微的激活函数。
BoS方法五:后处理
①NMS: 目标检测中常用的后处理方法是NMS, NMS可以对预测较差的bbox进行过滤,只保留响应较高的候选bbox。NMS试图改进的方法与优化目标函数的方法是一致的。NMS提出的原始方法没有考虑上下文信息,所以在R-CNN中加入了分类的置信分作为参考,按照置信分的顺序,从高到低依次进行贪心NMS。
②soft NMS: 考虑了对象的遮挡可能导致带IoU分数的贪婪NMS的信心分数下降的问题。
③DIoU NMS: 在soft NMS的基础上,将中心点距离信息添加到BBox筛选过程中。值得一提的是,由于以上的后处理方法都没有直接引用捕获的图像特征,因此在后续的无锚方法开发中不再需要后处理。
三、Methodology—方法
3.1 Selection of architecture—架构选择
翻译
我们的目标是在输入网络分辨率、卷积层数、参数数(滤波器大小2*滤波器*通道/组)和层输出数(滤波器)之间找到最优的平衡。例如,我们的大量研究表明,在ILSVRC2012(ImageNet)数据集[10]上,CSPResNext50比CSPDarknet53要好得多。然而,相反地,在检测MS COCO数据集[46]上的对象方面,CSPDarknet53比CSPResNext50更好。
下一个目标是选择额外的块来增加感受野,以及从不同检测器级别的参数聚合的最佳方法:例如FPN、PAN、ASFF、BiFPN。
对于分类最优的参考模型对于探测器来说并不总是最优的。与分类器相比,该探测器需要以下条件:
- 更高的输入网络大小(分辨率)
- 用于检测多个小大小的物体更多的层
- 更高的接受域以覆盖增加的输入网络大小更多的参数
- 模型更大的能力来检测单一图像中多个不同大小的物体
假设来说,我们可以假设应该选择一个具有更大的接受场大小(具有更多的卷积层3×3)和更多的参数的模型作为主干。表1显示了CSPResNeXt50、CSPDarknet53和efficientnetB3的信息。CSPResNext50只包含16个卷积层3×3、一个425×425感受野和20.6 M参数,而CSPDarknet53包含29个卷积层3×3、一个725×725感受野和27.6 M参数。这一理论证明,加上我们进行的大量实验,表明CSPDarknet53神经网络是两者作为探测器主干的最佳模型。
不同大小的感受野的影响总结如下:
- 到对象大小,允许查看整个对象到网络大小
- 允许查看对象周围的上下文
- 增加图像点和最终激活之间的连接数量
我们在CSPDarknet53上添加了SPP块,因为它显著地增加了接受域,分离出了最重要的上下文特征,并且几乎不会导致降低网络运行速度。我们使用PANet作为来自不同检测器级别的不同主干级别的参数聚合的方法,而不是在YOLOv3中使用的FPN。
最后,我们选择CSPDarknet53主干、SPP附加模块、PANet路径聚合颈和YOLOv3(基于锚点)的头作为YOLOv4的体系结构。
未来,我们计划显著扩展检测器的f Bag of Freebies(BoF)的内容,理论上可以解决一些问题,提高检测器的精度,并以实验方式依次检查每个特征的影响。
我们不使用Cross-GPU批处理归一化(CGBN或SyncBN)或昂贵的专用设备。这允许任何人都可以在传统的图形处理器上再现我们最先进的结果,例如GTX 1080Ti或RTX 2080Ti。
精读
架构选择目标
目标一:在输入网络分辨率、卷积层数、参数数(filter size2×filters × channel / groups)和层输出数(filters)之间找到最优平衡。
检测器需要满足以下条件:
①更高的输入网络大小(分辨率): 用于检测多个小型对象
②更多的层: 一个更高的接受域,以覆盖增加的输入网络的大小
③更多的参数: 模型有更强大的能力,以检测单个图像中的多个不同大小的对象。
目标二:选择额外的块来增加感受野
不同大小的感受野的影响总结如下:
①对象大小: 允许查看整个对象
②网络大小: 允许查看对象周围的上下文
③超过网络大小: 增加图像点和最终激活之间的连接数
目标三:选择不同的主干层对不同的检测器层(如FPN、PAN、ASFF、BiFPN)进行参数聚合的最佳方法。
YOLOv4架构
(1)CSPDarknet53主干(backbone): 作者实验对比了CSPResNext50、CSPDarknet53和EfficientNet-B3。从理论与实验角度表明:CSPDarkNet53更适合作为检测模型的Backbone。(还是自家的网络结构好用)
CSP介绍:
CSP是可以增强CNN学习能力的新型backbone,论文发表2019年11月份
主要技巧:CSPNet将底层的特征映射分为两部分,一部分经过密集块和过渡层,另一部分与传输的特征映射结合到下一阶段。
(2)SPP附加模块增加感受野: 在CSPDarknet53上添加了SPP块,SPP来源于何恺明大佬的SPP Net因为它显著增加了接受域,分离出了最重要的上下文特性,并且几乎不会降低网络运行速度。
(3)PANet路径聚合(neck): PANet主要是特征融合的改进,使用PANet作为不同检测层的不同主干层的参数聚合方法。而不是YOLOv3中使用的FPN。
(4)基于锚的YOLOv3头部(head): 因为是anchor-base方法,因此分类、回归分支没有改变。
总结: YOLOv4模型 = CSPDarkNet53 + SPP + PANet(path-aggregation neck) + YOLOv3-head
3.2 Selection of BoF and BoS—BoF和BoS的选择
翻译
为了改进目标检测训练,CNN通常使用以下:
- 激活:ReLU, leaky-ReLU, parametric-ReLU,ReLU6, SELU, Swish, or Mish
- 边界盒回归损失:MSE,IoU、GIoU、CIoU、DIoU
- 数据增强:CutOut, MixUp, CutMix
- 正则化方法:DropOut, DropPath,Spatial DropOut [79], or DropBlock
- 规范化的网络激活(通过均值和方差):批标准化(BN)[32],Cross-GPU Batch Normalization(CGBN或SyncBN)[93],Filter Response Normalization(FRN)[70],或交叉迭代批标准化(CBN)[89]
- Skip-connections:Residual connections,加权Residual connections、多输入加权Residual connections或Cross stage partial连接(CSP)
对于训练激活函数,由于PReLU和SELU更难训练,而且ReLU6是专门为量化网络设计的,因此我们将上述激活函数从候选列表中删除。在需求化方法上,发表DropBlock的人将其方法与其他方法进行了详细的比较,其正则化方法获得了很大的成功。因此,我们毫不犹豫地选择了DropBlock作为我们的正则化方法。至于归一化方法的选择,由于我们关注于只使用一个GPU的训练策略,因此不考虑syncBN。
精读
为了提高目标检测训练,CNN通常使用以上提到的方法(具体在【YOLO系列】YOLOv4论文超详细解读2(网络详解)里详细讲解)
(1)激活函数: 由于PReLU和SELU更难训练,我们选择专门为量化网络设计的ReLU6
(2)正则化: 我们选择DropBlock
(3)归一化: 由于是单GPU,所以没有考虑syncBN
3.3 Additional improvements—进一步改进
翻译
为了使设计的探测器更适合训练单GPU上,我们做了额外的设计和改进如下:
我们引入了一种新的数据增强Mosic,和自我对抗训练(SAT)
我们选择最优超参数而应用遗传算法
我们修改一些现有方法使设计适合有效的训练和检测,modifified SAM,modifified PAN,和交叉小批归一化(CmBN)
Mosaic代表了一种新的数据增强方法,它混合了4个训练图像。因此,混合了4种不同的上下文,而CutMix只混合了2个输入图像。这允许检测其正常上下文之外的对象。此外,批归一化计算每一层上4个不同图像的激活统计信息。这大大减少了对大型小批量处理的需求
自对抗训练(SAT)也代表了一种新的数据增强技术,可以在2个向前向后的阶段运行。在第一阶段,神经网络改变了原始图像,而不是网络的权值。通过这种方式,神经网络对自己进行敌对性攻击,改变原始图像,以制造出图像上没有想要的目标的欺骗。在第二阶段,神经网络被训练以正常的方式检测修改后的图像上的对象。
精读
(1)新的数据增强Mosic和自我对抗训练(SAT)
①Mosaic: Mosaic代表了一种新的数据增强方法,它混合了4幅训练图像。基于现有数据极大的丰富了样本的多样性,极大程度降低了模型对于多样性学习的难度。
②自对抗训练(SAT):
- 在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自己执行一种对抗性攻击,改变原始图像,以制造图像上没有期望对象的假象。
- 在第二阶段,神经网络以正常的方式对这个修改后的图像进行检测。
(2)应用遗传算法选择最优超参数
(3)修改现有的方法,使设计适合于有效的训练和检测
①修改的SAM: 将SAM从空间上的注意修改为点态注意
②修改PAN: 将PAN的快捷连接替换为shortcut 连接
③交叉小批量标准化(CmBN): CmBN表示CBN修改后的版本,如图所示,只在单个批内的小批之间收集统计信息。
3.4 YOLOv4
翻译
在本节中,我们将详细说明YOLOv4的细节。
YOLOv4 consists of :
• Backbone: CSPDarknet53 [ 81 ]
• Neck: SPP [ 25 ], PAN [ 49 ]
• Head: YOLOv3 [ 63 ]
精读
YOLOv4包括
- 主干(backbone): CSPDarknet53
- 颈部(neck): SPP , PAN
- 头(head): YOLOv3
YOLO v4使用
- Bag of Freebies 外在引入技巧: CutMix和Mosaic数据增强,DropBlock正则化,类标签平滑
- Bag of Specials 网络改进技巧: Mish激活、跨级部分连接(CSP)、多输入加权剩余连接(MiWRC)
- Bag of Freebies 外在检测器引入技巧: CIoU loss, CmBN, DropBlock正则化,Mosaic数据增强,自对抗训练,消除网格敏感性,为一个真值使用多个锚,余弦退火调度,最优超参数,随机训练形状
- Bag of Specials检测器网络改进技巧: Mish激活、SPP-block、SAM-block、PAN路径聚合块、DIoU-NMS
四、Experiments—实验
4.1 Experimental setup—实验设置
翻译
在ImageNet图像分类实验中,默认的超参数如下:训练步骤为8000000;批大小和小批量大小分别为128和32;采用多项式衰减学习率调度策略,初始学习率为0.1;预热步骤为1000;动量衰减和权重衰减分别设置为0.9和0.005。我们所有的BoS实验都使用与默认设置相同的超参数,在BoF实验中,我们额外添加了50%的训练步骤。在BoF实验中,我们验证了MixUp、CutMix、Mosaic、模糊数据增强和标签平滑正则化方法。在BoS实验中,我们比较了LReLU、Swish和Mish激活功能的影响。所有实验均采用1080 Ti或2080TiGPU进行训练。
在MS COCO目标检测实验中,默认的超参数如下:训练步长为500,500;采用步长衰减学习率调度策略,初始学习率为0.01,在400000步和450000步时分别乘以0.1倍;动量和权重衰减分别设置为0.9和0.0005。所有架构都使用一个GPU来执行批处理大小为64的多规模训练,而小批处理大小为8或4,这取决于架构和GPU内存限制。除在超参数搜索实验中使用遗传算法外,所有其他实验均使用默认设置。遗传算法使用YOLOv3-SPP对GIoU损失进行训练,并搜索300个时元的最小值5k集。我们采用搜索学习率0.00261,动量0.949,IoU阈值分配地面真值0.213,遗传算法实验采用损失归一化器0.07。我们验证了大量的BoF,包括网格灵敏度消除、Mosaic数据增强、IoU阈值、遗传算法、类标签平滑、交叉小批归一化、自对抗训练、余弦退火调度器、动态小批大小、dropblock、优化锚点、不同类型的IoU损失。我们还在各种BoS上进行了实验,包括Mish、SPP、SAM、RFB、BiFPN和高斯YOLO[8]。对于所有的实验,我们只使用一个GPU来进行训练,因此不使用优化多个GPU的像syncBN这样的技术。
精读
(1)在ImageNet图像分类实验中,默认超参数为:
- 训练步骤: 8,000,000
- 批大小和小批大小分别: 128和32
- 初始学习率: 0.1
- warm-up步长: 1000
- 动量衰减: 0.9
- 权重衰减: 0.005
(2)在MS COCO对象检测实验中,默认的超参数为:
- 训练步骤: 500500
- 初始学习率: 0.01
- warm-up步长: 在400,000步和450,000步分别乘以因子0.1
- 动量衰减: 0.9
- 权重衰减: 0.0005
- GPU数量: 1个
- 批处理大小: 64
4.2 Influence of different features on Classifier training—不同特征对分类器训练的影响
翻译
首先,我们研究了不同特征对分类器训练的影响;具体来说,类标签平滑的影响,不同数据增强技术的影响,bilateral blurring, MixUp, CutMix and Mosaic,如Fugure7所示,以及不同激活的影响,如Leaky-relu(默认)、Swish和Mish。
在我们的实验中,如表2所示,通过引入:CutMix和Mosaic数据增强、类标签平滑和Mish激活等特征,提高了分类器的精度。因此,我们用于分类器训练的BoF backbone(Bag of Freebies)包括以下内容:CutMix和Mosaic数据增强和类标签平滑。此外,我们使用Mish激活作为补充。
精读
研究了不同特征对分类器训练的影响:类标签平滑的影响,不同数据增强技术的影响,不同的激活的影响。
图7:各种数据增强方法
表2:Bof和Mish对Cspresnext - 50 Clas - Sifier准确率的影响
表3:Bof和Mish对Cspdarknet - 53 Classi - Fier精度的影响
结论
(1)通过引入特征如:CutMix和Mosaic数据增强、类标签平滑、Mish激活等,可以提高分类器的准确率。
(2)CutMix和Mosaic数据增强和类标签平滑可用于分类器训练的BoF backbone,此外,还可以使用Mish激活作为补充选项。
4.3 Influence of different features on Detector training—不同特征对检测器训练的影响
翻译
进一步研究了不同的Bag-of Freebies(BoF-detector)对探测器训练精度的影响,如表4所示。通过研究在不影响FPS的情况下提高检测器精度的不同特征,我们显著地扩展了BoF列表:
S:消除网格灵敏度的公式 其中cx和cy总是整数,在YOLOv3中用于计算对象坐标,因此,对于接近cx或cx+1值的bx值,需要极高的tx绝对值。我们通过将s型矩阵乘以一个超过1.0的因子来解决这个问题,从而消除了对象无法检测到的网格的影响。
- M:Mosaic data-在训练期间使用4张图像的马赛克,而不是单一的图像
- IT:IoU阈值-使用多个锚作为单一地面真实IoU(truth, anchor) >IoU阈值
- GA:Genetic algorithms-在前10%的时间段内使用遗传算法选择最优超参数
- LS:类标签平滑-使用类标签平滑的s型符号激活
- CBN:CmBN-使用交叉小批标准化来收集整个批内的统计信息,而不是在单个小批内收集统计数据
- CA:余弦退火调度器-改变正弦波训练过程中的学习速率
- DM:动态小批量大小-在小分辨率训练中,通过使用随机训练形状自动增加小批量大小
- OA:优化的锚-使用优化的锚与512x512网络分辨率进行训练
- GIoU,CIoU,DIoU,MSE-使用不同的损失算法进行边界框回归
进一步研究了不同的Bag-of-Specials (bos-检测器)对检测器训练精度的影响,包括PAN、RFB、SAM、高斯YOLO(G)和ASFF,如表5所示。在我们的实验中,检测器在使用SPP、PAN和SAM时性能最好。
精读
进一步的研究关注不同Bag-of-Freebies免费包 (BoF-detector)对检测器训练精度的影响,通过研究在不影响FPS(帧率:每秒传输的帧数)的情况下提高检测器精度的不同特征,我们显著扩展了BoF列表:
表4:Bag-of-Freebies 的消融研究。( CSPResNeXt50 - PANet - SPP , 512 × 512)。 粗体黑色表示有效
表5:Bag-of-Specials 的消融研究。( 512 × 512 )
结论
当使用SPP、PAN和SAM时,检测器的性能最佳。
4.4 Influence of different backbones and pre- trained weightings on Detector training—不同的backbone和预先训练权重对检测器训练的影响
翻译
进一步研究了不同主干模型对检测器精度的影响,如表6所示。我们注意到,具有最佳分类精度特征的模型在检测器精度方面并不总是最好的。
首先,虽然使用不同特征训练的CSPResNeXt-50模型的分类精度高于CSPDarknet53模型,但CSPDarknet53模型在目标检测方面具有更高的精度。
其次,使用CSPResF和Mish进行50分类器训练可以提高分类精度,但进一步应用这些预先训练的权重用于检测器训练会降低检测器的精度。然而,在CSPDarknet53分类器训练中使用BoF和Mish可以提高分类器和使用该分类器预训练的加权的检测器的准确性。最终的结果是,主干CSPDarknet53比CSPResNeXt50更适合用于检测器。
我们观察到,CSPDarknet53模型由于各种改进,显示出更大的能力来提高探测器的精度。
精读
表6:使用不同的分类器预训练权重进行检测器训练(所有其他训练参数在所有模型中都是相似的)。
结论
- 具有最佳分类精度的模型在检测器精度方面并不总是最佳的。
- 骨干CSPDarknet53比CSPResNeXt50更适合于检测器。
- 由于各种改进,CSPDarknet53模型展示了更大的能力来提高检测器的精度。
4.5 Influence of different mini-batch size on Detec- tor training—不同的小批尺寸对检测器培训的影响
翻译
最后,我们分析了用不同的小批量训练的模型得到的结果,结果如表7所示。从表7所示的结果中,我们发现在添加BoF和BoS训练策略后,小批量大小对检测器的性能几乎没有影响。这一结果表明,在引入BoF和BoS后,不再需要使用昂贵的gpu进行训练。换句话说,任何人都只能使用一个普通的GPU来训练一个优秀的探测器。
精读
表7:使用不同的 mini-batch size 进行检测器训练。
结论
- 加入BoF和BoS训练策略后,小批量大小对检测器的性能几乎没有影响。
- minibatch越大越好,CSPDarknet53对minibatch不敏感,利于单卡训练。
- 在引入BoF和BoS之后,不再需要使用昂贵的GPU进行训练。
五、Results—结果
翻译
与其他最先进的对象检测器所获得的结果的比较如图8所示。我们的YOLOv4位于Pareto最优性曲线上,在速度和精度方面都优于最快和最精确的探测器。
由于不同的方法使用不同架构的gpu进行推理时间验证,我们在通常采用的Maxwell、Pascal和Volta架构的gpu上操作YOLOv4,并将它们与其他最先进的方法进行比较。表8列出了使用MaxwellGPU的帧率比较结果,它可以是GTX TitanX(Maxwell)或TeslaM40GPU。表9列出了使用PascalGPU的帧率比较结果,可以是TitanX(Pascal)、TitanXp、GTX 1080Ti或特斯拉P100GPU。如表10所述,它列出了使用VoltaGPU的帧率比较结果,可以是Titan Volta或Tesla V100GPU。
精读
图8 不同物体探测器的速度和精度比较。(一些文章只针对其中一个GPU : Maxwell / Pascal / Volta ,阐述了它们探测器的FPS)
结论
- 得到的结果与其他最先进的物体探测器的比较如图8所示。我们的YOLOv4位于Pareto最优曲线上,无论是速度还是精度都优于最快最准确的检测器。
- 由于不同的方法使用不同架构的gpu进行推理时间验证,我们在Maxwell架构、Pascal架构和Volta架构常用的gpu上运行YOLOv4,并与其他最先进的方法进行比较。
这篇就是论文的解读,因为涉及到太多tricks我目前理解的也不够深,以后再慢慢补充吧~
相关文章:
【YOLO系列】YOLOv4论文超详细解读1(翻译 +学习笔记)
前言 经过上一期的开篇介绍,我们知道YOLO之父Redmon在twitter正式宣布退出cv界,大家都以为YOLO系列就此终结的时候,天空一声巨响,YOLOv4闪亮登场!v4作者是AlexeyAB大神,虽然换人了,但论文中给出…...
【神经网络】Transformer基础问答
1.Transforme与LSTM的区别 transformer和LSTM最大的区别就是LSTM的训练是迭代的,无法并行训练,LSTM单元计算完T时刻信息后,才会处理T1时刻的信息,T 1时刻的计算依赖 T-时刻的隐层计算结果。而transformer的训练是并行了࿰…...
制定防火墙策略的步骤和建议
制定防火墙策略是保护企业网络环境安全的关键一步。下面是一些制定防火墙策略的步骤和建议,供参考: 识别网络资产:确定企业网络环境中所有的网络资产,包括服务器、应用程序、数据库、移动设备和终端用户设备等,并进行…...
新必应(New Bing)国内申请与使用教程
微软的新必应(New Bing)基于GPT4模型,比ChatGPT的GPT3.5模型领先半个世代。并且集成了Edge浏览器的数据资源,功能更加强大。经过不断的踩坑,终于申请到了New Bing的使用权限,且国内网络也能够正常使用&…...
博客系统——项目测试报告
目录 前言 博客系统——项目介绍 1、测试计划 1.1、功能测试 1.1.1、编写测试用例 1.1.2、实际执行步骤 1.2、使用Selenium进行Web自动化测试 1.2.1、引入依赖 1.2.2、提取共性,实现代码复用 1.2.3、创建测试套件类 1.2.4、博客登录页自动化测试 1.2.5、…...
Macbook M1 安装PDI(Kettle) 9.3
Macbook M1 安装PDI(Kettle) 9.3 当前 PDI(Kettle)最新版为9.3,依赖Java JDK 11。因为没有专门用于 M1的程序,需要下载并安装x86_64架构的JDK及依赖软件,并 “强制在Intel模式下运行shell” 的方式来实现 Kettle 的正…...
机器学习——模型评估
在学习得到的模型投放使用之前,通常需要对其进行性能评估。为此,需使用一个“测试集”(testing set)来测试模型对新样本的泛化能力,然后以测试集上的“测试误差( tootino error)作为泛化误差的近似。我们假设测试集是从样本真实分…...
react react-redux学习记录
react react-redux学习记录1.原理2.怎么用呢2.1 容器组件2.2UI组件2.3 App.jsx3.简化3.1简写mapDispatch3.2 Provider组件的使用3.3整合UI组件和容器组件1.原理 UI组件:不能使用任何redux的api,只负责页面的呈现、交互等。 容器组件:负责和redux通信&…...
nodejs环境配置
啥是node.js 简单理解就是js运行环境 啥是npm 简单理解就是nodejs包管理工具,全称Node Package Manager 啥是cnpm npm的开源镜像,在国内使用cnpm替代npm可以起到加速的效果 https://npmmirror.com/ ①安装node.js https://nodejs.org/en/download/ 下载…...
数据治理之元数据管理Atlas
数据治理之元数据管理的利器——Atlas 一、数据治理与元数据管理 1.1 背景 为什么要做数据治理? 业务繁多,数据繁多,业务数据不断迭代。人员流动,文档不全,逻辑不清楚,对于数据很难直观理解,…...
15 Nacos客户端实例注册源码分析
Nacos客户端实例注册源码分析 实例客户端注册入口 流程图: 实际上我们在真实的生产环境中,我们要让某一个服务注册到Nacos中,我们首先要引入一个依赖: <dependency><groupId>com.alibaba.cloud</groupId>&l…...
C++将派生类赋值给基类(向上转型)
1.将派生类对象赋值给基类对象 #include <iostream> using namespace std;//基类 class A{ public:A(int a); public:void display(); public:int m_a; }; A::A(int a): m_a(a){ } void A::display(){cout<<"Class A: m_a"<<m_a<<endl; }//…...
使用Platform Designer创建Nios II 最小系统
Nios II简介 Nios II 软核处理器十多年前就有了,它和xilinx的MicroBlaze类似,性能相比硬核处理器要差得多,工程应用也不是很多,那还有必须学习一下吗?我个人认为了解一下Nios II开发流程,对intel FPGA开…...
CD销售管理系统
技术:Java、JSP等摘要:二十一世纪是一个集数字化,网络化,信息化的,以网络为核心的社会。中国的网民充分领略到“畅游天地间,网络无极限” 所带来的畅快。随着Internet的飞速发展,使得网络的应用…...
华为OD机试模拟题 用 C++ 实现 - 玩牌高手(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明玩牌高手题目输入输出描述示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为…...
Hive 的Stage如何划分?
Hive 的Stage如何划分,也是Hive SQL需要优化的一个点,这个问题,我也是在实际的工作中遇到的。所以我查询了网络的解答并记录下来,以便日后复习。以下是主要内容,enjoy~~~ 一个 Hive 任务会包含一个或多个 stage&#…...
《嵌入式应用开发》实验一、开发环境搭建与布局(上)
1. 搭建开发环境 去官网(https://developer.android.google.cn/studio)下载 Android Studio。 安装SDK(默认Android 7.0即可) 全局 gradle 镜像配置 在用户主目录下的 .gradle 文件夹下面新建文件 init.gradle,内容为…...
电子科技大学软件工程期末复习笔记(五):生产率和工作度量
目录 前言 重点一览 软件产品度量 测量软件生产率的两种方法 基于LOC测量 例题: 优点 缺点 基于功能点测量 例题: 本章小结 前言 本复习笔记基于王玉林老师的课堂PPT与复习大纲,供自己期末复习与学弟学妹参考用。 重点一览 这一部分内…...
400G光模块知识大全
400G光模块是目前高速传输领域中的一种先进产品,被广泛应用于高性能数据中心、通信网络、大规模计算、云计算等领域。本文将从400G光模块的定义、技术、产品型号、应用场景以及未来发展方向进行详细介绍。一、什么是400G光模块?400G光模块是指传输速率达…...
【Linux】零成本在家搭建自己的私人服务器解决方案
我这个人自小时候以来就特喜欢永久且免费的东西,也因此被骗过(花巨款买了永久超级会员最后就十几天)。 长大后骨子里也是喜欢永久且免费的东西,所以我不买服务器,用GitHubPage或者GiteePage搭建自己的静态私人博客&…...
Python 多线程、多进程和协程
一、多线程 threading 模块 threading 模块对象 对象描述Thread表示一个执行线程的对象Lock锁原语对象(与 thread 模块中的锁一样)RLock可重入锁对象,使单一线程可以(再次)获得已持有的锁(递归锁&#x…...
Xml 注解
文章目录XmlRootElement(name"MyRootElement")XmlAccessorType(XmlAccessType.FIELD)XmlElementXmlAttributeXmlValueXmlElementRefXmlRootElement(name“MyRootElement”) XmlRootElement(name"MyRootElement") public class AccessorType {public Strin…...
【CSS文字滚动】CSS实现文字横向循环无缝滚动,鼠标移入暂停移出继续(附实测源码)
CSS如何实现文字横向滚动滚动效果1、垃圾liMarquee(最好别用)2、css实现文字滚动,且鼠标移入移出暂停和继续HTML源码如下:CSS源码如下:JS源码如下:3、片尾彩蛋CSS实现文字横向循环无缝滚动,鼠标…...
不使用implements关键字实现实现类(类似于mapper)
首先,说明一下功能需求,平时定义一个接口,就要使用implements关键字来实现接口。那么,当不使用此关键字的时候,是否也能使相关接口也能够绑定实现类呢? 答案是肯定的。 此篇文章的主要功能有两个…...
antd4里table的滚动是如何实现的?
rc-table里Header、Footer、TableBody实现保持同频滚动的方法 场景:Header、Footer都有,Table设置了scrollX,才关注同频滚动 那么是如何实现的? 监听onScroll方法获取到滚动条向左的滚动的距离scrollLeft;同时给三个…...
抓取namenode 50070 jmx的指标信息
在生产实践过程中,需要把data退役之后需要停机下线,在下线之前需要确认机器是否已下线完成,要去namenode的50070界面上查看显然效率低,为了能够快速拿到节点信息,写了简单的脚本。jmx/50070还有很多信息可以获取&#…...
aspnetcore-browser-refresh.js和Visual Studio Browser Link
我在调试ASP.NET Core web应用时,发现请求的页面文档底部多了一部分文件,而在我的页面中却没有包含,故查询资料,在此记录: 图中,可以看到红框部分是多出来了2个脚本 1.aspnetcore-browser-refresh.js 这里…...
hadoop 集群常用命令(学习笔记) —— 筑梦之路
概念介绍 #HDFS 概述Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。(1)NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性&…...
ARC142D Deterministic Placing
ARC142D Deterministic Placing 题目大意 有一棵nnn个顶点的树,每个点上最多放一张卡片,你可以做如下操作: 同时将所有的卡片移到它所在顶点的相邻的一个顶点上 一个操作我们说它是好的,当下列条件满足: 每条边最…...
阶段八:服务框架高级(第二章:分布式事务)
阶段八:服务框架高级(第二章:分布式事务)Day-分布式事务0.学习目标1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾2.2.BASE理论2.3.解…...
wordpress 乱码/推广软文300字范文
硬件系统设计硬件平台基于ARM920T的处理器AT91RM9200,该处理器不仅有丰富的片上资源和标准接口,而且有低功耗、低成本、高性能、支持多种主要的嵌入式操作系统等特点,其采用5级整数流水线结构,性能高达200此方案的硬件系统结构设计…...
大连金州代做网站公众号/快速排名教程
马哲包括5大部分即唯物论,辩证法,认识论,历史唯物论,资本主义本质论。 其中辩证法又包括: 1.两大特征:(1)普遍联系(2)永恒发展。 2.三大规律:&…...
德阳哪里有做网站的/广州seo关键字推广
Easy-表格数据1CodeNamePrice001name12323002name24612003name34612通过数据请求创建表格看到URL:属性 在背后解析时就是一个AJAX $.GET(XXXX)定义表格,并且通过url访问json数据, fitColumns:true表示自动适应,singleSelect:true 表示选中单个…...
建立一个网站平台需要多少钱/东莞seo外包平台
转自:https://www.jizhuba.com/zhichanglicai/20180119/5705.html 方法/步骤1、例如我们想删除桌面上的“123”文件夹,发现无法删除。2、可以这样解决:3、在任务栏上右击,然后选择“任务管理器”。4、打开“任务管理器”ÿ…...
青岛网站建设找/网站优化外包推荐
首先确保机器上安装了openssl和openssl-devel #yum install openssl #yum install openssl-devel 然后就是自己颁发证书给自己 #cd /usr/local/nginx/conf #openssl genrsa -des3 -out server.key 1024 #生成私钥,需要输入密码,记住就…...
做网站买服务器大概多少钱/线上营销推广公司
导出excel时,xls格式只能导出不超过255行或列的文件,超过之后只能使用xlsx,为避免客户选择xls按钮,建议去掉xls按钮 找到jar包,复制一份,注意做好备份。 解压,找到弹出框的文件 ,注释掉相应的按…...