YOLOv4:目标检测的最佳速度和精度

2023-11-12

YOLOv4:目标检测的最佳速度和精度

摘要

随着深度学习的发展,目前已经出现了很多算法(或者训练技巧,tricks)来提升神经网络的准确率。在实际测试中评价一个算法的好坏优劣主要看两点,一是能否在大规模的数据集中起作用(work),二是是否有理论依据。一些算法仅能在某些特定的模型上或者某类特定的问题上运行,亦或是适用于一些小规模的数据集。然而,还有一些算法,例如batch normalization(BN)或者残差连接(residual-connections)已经被用在了不同的模型,任务以及不同的数据集中,已经被充分的证明了这些算法的普适性,是一个general的算法。我们假设这样的general(or universal)的算法包括Weighted-residual-connection(WRC),cross-stage-partial-connections(SCP),cross mini-batch Normalization(CmBN),self-adversarial-training(SAT)以及mish-activation。此外,我们还加了一些其余的tricks,包括Mosaic data augmentation,DropBlock regularization,CIoU loss,设计了一个YOLO-V4,并且在MS coco数据集中取得了新的state-of-the-art的结果:在Tesla V100显卡能达到43.5% AP(65.7% AP)的精度,且达到~65FPS的速度。

1 介绍

Yolo-V4的主要目的在于设计一个能够应用于实际工作环境中的快速目标检测系统,且能够被并行优化,并没有很刻意的去追求理论上的低计算量(BFLOP)。同时,Yolo-V4的作者希望算法能够很轻易的被训练,也就是说拥有一块常规了GTX-2080ti或者Titan-XP GPU就能够训练Yolo-V4, 同时能够得到一个较好的结果(Yolo-V4 结果如上图)。整个introduction可以总结为以下几点:

  • 研究设计了一个简单且高效的目标检测算法,该算法降低了训练门槛,使得普通人员在拥有一块1080TI或者2080TI的情况下就能够训练一个super fast and accurate 的目标检测器
    研究设计了一个简单且高效的目标检测算法,该算法降低了训练门槛,使得普通人员在拥有一块1080TI或者2080TI的情况下就能够训练一个super fast and accurate 的目标检测器
  • 在训练过程中,验证了最新的Bag-of-Freebies和Bag-of-Specials对Yolo-V4的影响
  • 简化以及优化了一些最新提出的算法,包括(CBN,PAN,SAM),从而使Yolo-V4能够在一块GPU上就可以训练起来。

2 相关工作

2.1 目标检测模型

检测器通常由两部分组成:backbone和head。前者在ImageNet上进行预训练,后者用来预测类别信息和目标物体的边界框。在GPU平台上运行的检测器,它们的backbone可能是VGG, ResNet, ResNetXt,或者是DenseNet。在CPU平台上运行的检测器,它们的backbone可能是SqueezeNet,MobileNet或者是ShuffleNet。对于head部分,通常分为两类:one-stage和two-stage的目标检测器。Two-stage的目标检测器的代表是R-CNN系列,包括:fast R-CNN, faster R-CNN,R-FCN和Libra R-CNN. 还有基于anchor-free的Two-stage的目标检测器,比如RepPoints。One-stage目标检测器的代表模型是YOLO, SSD和RetinaNet。在最近几年,出现了基于anchor-free的one-stage的算法,比如CenterNet, CornerNet, FCOS等等。在最近几年,目标检测器在backbone和head之间会插入一些网络层,这些网络层通常用来收集不同的特征图。我们将其称之为目标检测器的neck。通常,一个neck由多个bottom-up路径和top-down路径组成。使用这种机制的网络包括Feature Pyramid Network(FPN),Path Aggregation Network(PAN),BiFPN和NAS-FPN。

除了上面的这些模型,一些学者将重点放在为目标检测器构建新的backbone(DetNet, DetNASNet)或者是一整个新的模型(SpinNet, HitDetector)。

综上所述,一个普通的目标检测器由下面四个部分组成:
在这里插入图片描述

2.2 Bag of freebies

通常来说,目标检测器都是进行离线训练的(训练的时候对GPU数量和规格不限制)。因此,研究者总是喜欢扬长避短,使用最好的训练手段,因此可以在不增加推理成本的情况下,获得最好的检测精度。我们将只改变训练策略或者只增加训练成本的方法称之为“bag of freebies"。在目标检测中经常使用并且满足bag of freebies的定义的算法称是①数据增广。数据增广的目的是增加输入图片的可变性,因此目标检测模型对从不同场景下获取的图片有着更高的鲁棒性。举例来说,photometric distoitions和geometric distortions是用来数据增强方法的两个常用的手段。在处理photometric distortion中,我们会调整图像的亮度,对比度,色调,饱和度以及噪声。对于geometric distortion,我们会随机增加尺度变化,裁剪,翻转以及旋转。

上面提及的数据增广的手段都是像素级别的调整,它保留了调整区域的所有原始像素信息。此外,一些研究者将数据增广的重点放在了②模拟目标物体遮挡问题上。他们在图像分类和目标检测上已经取得了不错的结果。具体来说,random erase和CutOut可以随机选择图像上的矩形区域,然后进行随机融合或者使用零像素值来进行融合。对于hide-and-seek和grid mask,他们随机地或者均匀地在一幅图像中选择多个矩形区域,并且使用零来代替矩形区域中的像素值。如果将相似的概念用来特征图中,出现了DropOut, DropConnect和DropBlock方法。此外,一些研究者提出一起使用多张图像进行数据增强的方法。举例来说,MixUp使用两张图片进行相乘并且使用不同的系数比进行叠加,然后使用它们的叠加比来调整标签。对于CutMix,它将裁剪的图片覆盖到其他图片的矩形区域,然后根据混合区域的大小调整标签。除了上面提及的方法,style transfer GAN也用来数据增广,CNN可以学习如何有效的减少纹理偏差。

一些和上面所提及的不同的方法用来解决数据集中的语义分布可能存在偏差的问题。处理语义分布偏差的问题,一个非常重要的问题就是在不同类别之间存在数据不平衡,并且这个问题在two-stage目标检测器中,通常使用hard negative example mining或者online hard example mining来解决。但是example mining 方法并不适用于one-stage的目标检测器,因为这种类型的检测器属于dense prediction架构。因此focal loss算法用来解决不同类别之间数据不均衡的问题。③另外一个非常重要的问题就是使用one-hot很难描述不同类别之间关联度的关系。Label smothing提出在训练的时候,将hard label转换成soft label,这个方法可以使得模型更加的鲁棒性。为了得到一个最好的soft label, Islam引入了知识蒸馏的概念来设计标签细化网络。

最后一个bag of freebies是④设计边界框回归的目标函数。传统的目标检测器通常使用均方根误差(MSE)在Bbox的中心坐标以及宽高上进行直接的回归预测,即{xcenter, ycenter, w, h},或者左上角和右下角的两个点,即
{xtop lef t, ytop lef t, xbottom right, ybottom right}。对于anchor-based方法,去预测相应的offset,比如
{xcenter of f set, ycenter of f set, wof f set, hof f set}和
{xtop lef t of f set, ytop lef t of f set, xbottom right of f set, ybottom right of f set}。但是,预测Bbox每个点的坐标值是将这些点作为独立的变量,但是实际上并没有将目标物体当成一个整体进行预测。为了更好的解决这个问题,一些研究者最近提出了IoU损失函数,它能够将Bbox区域和ground truth的BBox区域的作为整体进行考虑。IoU损失函数需要计算BBox四个坐标点以及ground truth的IoU。因为IoU具有尺度不变性,它可以解决传统算法比如l1,l2范数计算
{x, y, w, h}存在的问题,这个损失函数会随着尺度的变化而发生变化。最近,一些研究者继续提高IoU损失函数的性能。举例来说,除了覆盖范围,GIoU还包括目标物体的形状和坐标。他们提出寻找同时包括预测的BBox和ground truth的BBox的封闭区域BBox,然后使用这个BBox作为分母去代替原来Iou损失函数中的分母。DIoU损失函数额外考虑了目标物体的中心距离,CIoU另一方面同时将覆盖区域,中心点距离和纵横比考虑在内。CIoU在BBox回归问题上可以获得最好的收敛速度和准确率。

2.3 Bag of specials

对于那些插件模块和后处理方法,它们仅仅稍微的增加了推理成本,但是可以极大地提高目标检测的准确度,我们将其称之为“bag of specials”。一般来说,这些插件模块用来提高一个模型中特定的属性,比如增加感受野,引入注意力机制或者提高特征整合的能力等等;后处理方法是用来抑制模型预测结果的一种方法。

可以用来提升感受野的常规的方法是SPP, ASPP和RFB。SPP模型来源于空间金字塔匹配(SPM),而且SPMs原始的方法将特征图划分成很多dd个相等的块,其中d可以是{1,2,3,…},因此可以形成空间金字塔,然后提取bag-of-word的特征。SPP将SPM应用在CNN中,然后使用max-pooling代替bag-of-word运算。因为SPP输出的是一维的特征向量,因此它不能应用在全卷积网络(FCN)中。在YOLOv3中,Redmon和Farhadi改进了SPP模块,将max-pooling输出和内核尺寸kk连接起来,其中k={1,5,8,13},stride=1。基于这个设计,一个相对较大的kk的max-pooling有效地提高了backbone特征的感受野。在添加了改进后的SPP模型之后,YOLO-v3-608在COCO数据集上,虽然增加了0.5%的额外计算量,但是提高了2.7%的AP50。ASPP模块和改进的SPP模块的区别主要在:原始的kk过滤器尺寸,从stride=1到33内核尺寸的max-pooling,在stride=1的碰撞卷积运算中膨胀比为k。RFB模块使用一些kk的内核,膨胀比为k,步长为1的碰撞卷积,它比ASPP获得了更全面的空间覆盖率。RFB在MS COCO数据集上仅仅增加了7%的额外推理时间,但是得到了5.7%的AP50提升。

目标检测上经常使用的注意力模块主要分成channel-wise注意力模块和point-wise注意力模块,这两个注意力模块主要的代表分别是Squeeze-and-Excitation(SE)和Spatial Attention Module(SAM)。尽管SE模块在ImageNet图像分类工作上仅仅增加了2%的计算量而提高了1%的top-1准确率,但是在GPU上提高了10%的推理时间,因此SE模块更适合在移动设备上使用。但是对于SAM模块来说,在ImageNet图像分类任务中,它仅仅需要0.1%的额外计算量却能够提升ResNet-SE 0.5%的top-1准确率。它在GPU上并没有有效地影响推理速度。

关于特征融合,早期的是使用skip connection或者是hyper-column将低级的特征和高级的语义特征进行融合。因为多尺度预测方法比如FPN逐渐受到追捧,因此提出了很多将不同特征金字塔融合的轻量级模型。这类别的模型包括SFAM, ASFF和BiFPN。SFAM的主要思想是在多尺度连接特征图上使用channel-wise级别的调整。对于ASFF,它使用softmax作为point-wise级别的调整,然后将不同尺度的特征图加在一起。在BiFPN中,提出使用多输入权重残差连接去执行scale-wise级别的调整,然后将不同尺度的特征图加在一起。

在深度学习的研究中,一些人重点关心去寻找一个优秀的激活函数。一个优秀的激活函数可以让梯度更有效的进行传播,与此同时它不会增加额外的计算量。在2010年,Nair和Hinton提出了ReLU激活函数充分地解决了梯度消失的问题,这个问题在传统的tanh和sigmoid激活函数中会经常遇到。随后,LReLU,PReLU,ReLU6,Scaled Exponential Linear Unit(SELU),Swish,hard-Swish和Mish等等相继提出,它们也用来解决梯度消失的问题。LReLU和PReLU主要用来解决当输出小于零的时候,ReLU的梯度为零的问题。ReLU6和hard-Swish主要为量化网络而设计。对于神经网络的自归一化,提出SELU激活函数去实现这个目的。需要注意的是Swish和Mish都是连续可导的激活函数。

在基于深度学习的目标检测中使用的后处理方法是NMS,它可以用来过滤那些预测统一物体、但是效果不好的BBoxes,然后仅仅保留较好的BBoxes。优化NMS和优化目标方程的方法异曲同工。NMS提出的最初的方法并没有将上下文信息考虑在内,因此Girshick在R-CNN中添加了分类置信度作为参考,然后根据置信度得分的顺序,由高到低执行greedy NMS。对于soft NMS来说,它考虑了这样一个问题:在greedy NMS使用IoU的时候,目标遮挡可能会造成置信度得分的退化。在soft NMS基础上,DIoU NMS将重心坐标的距离信息添加到Bbox的筛选处理中了。值得一提的是,上面提到的后处理方法中都不直接引用捕获的图像特征,后续的anchor-free方法开发中不再需要后处理。

3 方法

我们工作基本的目标就是在生产系统和优化并行预算中加快神经网络的速度,而非降低计算量理论指标(BFLOP)。我们提供了两个实时神经网络的选择:

(1)GPU 在卷积层中,我们使用少量的组(1-8): CSPResNeXt50 / CSPDarknet53

(2)VPU 我们使用分组卷积,但是我们不使用Squeeze-and-excitement(SE)模块,具体包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3

3.1 网络架构的选择

我们的目标是寻找输入网络的分辨率、卷积层的个数、参数的数量
(filter size^2 * filters * channel / groups),以及输出层的个数(filters)之间的最优的平衡。举例来说,大量的研究表明:在ILSVRC2012(ImageNet)的目标检测上,CSPResNext50比CSPDarket53的效果更好,但是在MS COCO的目标检测中,两个的效果恰好相反。

下一个目标就是选择额外的模块去增加感受野以及为不同检测器不同的backbone选择参数聚合的最佳方法。比如:FPN, PAN, ASFF, BiFPN。

在分类任务上最优的模型在检测上未必就是最优的。和分类任务相比,检测器需要以下要求:

(1)更好的输入尺寸(分辨率)- 为了检测多个小物体

(2)更多网路层 - 为了获得更大的感受野去覆盖不断增大的输入尺寸

(3)更多的参数 - 提高模型的能力从而能够在一张图片上检测到不同尺寸的多个物体。

假设来说,我们可以认为具有更大感受野(有大量的33的卷积层)和具有大量参数的模型应当作为检测器的backbone。表格1展示了CSPResNetXt50, CSPDarkent53以及EfficientNet B3的相关信息。CSPResNetXt50仅仅只有16个33的卷积层,一个425425的感受野和20.6M个参数,然而CSPDarkent53有29个33的卷积层,725*725的感受野和27.6M个参数。从理论证明和大量的实验表明在这两个模型中,CSPDarkent53是作为检测器的backbone最优的选择。
在这里插入图片描述
不同尺寸的感受野的影响总结如下:

(1)等于目标物体的大小时:能够看到整个物体

(2)等于网络的尺寸:能够看到目标物体周围的上下文信息

(3)大于网络的尺寸:增加图像点和最终激活之间连接的数量

我们将SPP模块添加到CSPDarknet53中,因为它极大提高了感受野,能够分离出最重要的上下文特征而且没有降低网络运行的速度。我们使用PANet作为不同检测器不同backbone训练阶段聚集参数的方法,而非YOLOv3的FPN模块。

最后,我们选择CSPDarknet53作为backbone, SPP作为附加的模块,PANet 作为neck,使用YOLOv3作为YOLOv4架构的head。

未来,我们计划扩展检测器的Bag of freebies,它们在理论上可以解决某些问题并且能够提高检测器的精度,后续会以实验的形式探究每个算法对检测器的影响。

我们没有使用Cross-GPU Batch Normalization(CGBN 或者 SyncBN) 或者昂贵的定制设备。这能够使得任何人在一个GPU上就可以得到最先进的结果,比如在GTX 1080Ti或者RTX 2080Ti。

3.2 BoF 和 BoS的选择

为了提高目标检测的训练,CNN通常使用下面一些技巧:
在这里插入图片描述
对于训练激活函数,因为PReLU和SELU难以训练,并且RELU6是专门为量化网络设计的,我们因此不考虑这这三个激活函数。在正则化方法中,提出DropBlok的学者将其算法和其他算法进行了比较,然后DropBolck效果更好。因此我们毫不犹豫的选择DropBlock作为我们的正则化方法。在归一化方法的选择中,因为我们关注在一块GPU上的训练策略,因此我们不考虑syncBN。

3.3 额外的改进

为了让检测器更适合在单个GPU上进行训练,我们做了以下额外的设计和改进:

(1)我们提出了数据增广的新的方法:Mosaic和Self-Adversarial Training(SAT)

(2)在应用遗传算法去选择最优的超参数

(3)我们改进了一些现有的算法,让我们的设计更适合高效的训练和检测 - 改进SAM, 改进PAN以及Cross mini-Batch Normalization(CmBN)
在这里插入图片描述

Mosaic是一种新型的数据增广的算法,它混合了四张训练图片。因此有四种不同的上下文进行融合,然而CutMix仅仅将两张图片进行融合。此外,batch normalization在每个网络层中计算四张不同图片的激活统计。这极大减少了一个大的mini-batch尺寸的需求。

自适应对抗训练(SAT)也表示了一个新的数据增广的技巧,它在前后两阶段上进行操作。在第一阶段,神经网络代替原始的图片而非网络的权重。用这种方式,神经网络自己进行对抗训练,代替原始的图片去创建图片中此处没有期望物体的描述。在第二阶段,神经网络使用常规的方法进行训练,在修改之后的图片上进检测物体。
在这里插入图片描述

正如图4中显示,CmBN(Cross mini-Batch Normalization)代表CBN改进的版本。它只收集了一个批次中的mini-batches之间的统计数据。

我们将SAM的spatial-wise注意力变成了point-wise注意力机制,然后将PAN中的shortcut连接变成了concatenation连接,正如图5和图6所表示的那样。
在这里插入图片描述

3.4 YOLOv4

在这个部分,我们会详细介绍YOLOv4的细节:
在这里插入图片描述

4 实验

我们测试了不同训练提升技巧在ImageNet(ILSVRC2012 val)数据集上的精度影响,然后又验证了检测器在MS COCO(test-val 2017)数据集的准确率。

4.1 实验参数配置

在ImageNet图像分类实验中,默认的超参数如下:训练步长为8,000,000;batch size和mini-batch size分别为128和32;polynominal decay learning rate scheduling strategy初始的学习率为0.1;warm-up步长为1000;momentum和weight decay分别设置为0.9和0.005。所有的BoS实验使用相同的、默认的超参数,在BoF实验中,我们增加了一半的训练步长。在BoF实验中,我们验证了MixUp, CutMix, Mosaic, Bluring数据增加一节label smoothing regularization方法。在BoS实验中,我们比较了LReLU,Swish和Mish激活函数的影响。所有的实验都在1080Ti或者2080Ti GPU上进行训练。

在MS COCO目标检测实验中,默认的超参数如下:训练步长为500,500;the step decay learning rate scheduling strategy初始化学习率为0.01在步长为400,000和450,000的时候乘以0.1;momentum和weight decay分别设置为0.9和0.0005。所有的架构在一块GPU进行多尺度训练,它的batch size为64,然而它的mini-batch为8还是4取决于网络架构和GPU的内存限制。除了对寻找最优的超参数使用遗传算法之外,其他所有的实验都使用默认的设置。遗传算法和GIoU使用YOLOv3-SPP进行训练,并且为5k个min-val进行300个epochs。对我们采用搜索的学习率为0.00261,momentum为0.949,IoU阈值为设置为0.213,遗传算法实验的损失标准化为0.07。我们还验证了大量的BoF算法,包括grid sensitivity elimination, mosaic数据增广,IoU阈值化,遗传算法,class label smoothing, cross mini-batch normalization,self-adversarial training,cosine anneling scheduler, dynamic mini-batch size, DropBlock, Optimized Anchors, 不同的IoU损失函数。我们也在不同BoS算法上进行了实验,包括Mish,SPP,SAM,RFB,BiFBN以及Gaussiian YOLO。所有的实验我们仅仅使用一个GPU进行训练,因此比如syncBN的优化多个GPU的技巧我们并没有使用。

4.2 不同算法在分类器训练上的影响

首先,我们研究了不同算法在分类器训练上的影响;具体来说,Class label smoothing的影响,不同数据增广技巧,bilateral blurring,MixUp, CutMix和Mosaic的印象在图7中显示,以及不同激活函数的影响,比如Leaky-ReLU(默认的),Swish和Mish。
在这里插入图片描述

在表2中所示,在我们的实验中,通过引入一些算法,分类器的准确率得到了提升,这些算法包括:CutMix和Mosaic数据增广,Class label smoothing和Mish激活函数。结果,我们的用于分类器训练的BoF-backbone(Bag of Freebies)包括:Cutmix 和Mosaic数据增广算法以及Class labelsmoothing。正如表2和表3所示,我们将Mish激活函数作为补充的选项。
在这里插入图片描述

4.3 不同算法在检测器训练上的影响

进一步的研究关注不同Bag-of-Freebies(BoF-detector)在检测器训练准确度的影响,正如表4所示。通过研究能够提高检测器准确度的算法,我们极大地扩展了BoF的算法选项,而且并没有影响FPS:

S:消除栅格的敏感度 这个方程在YOLOv3中用于评估目标物体的坐标,自重cx和cy通常是整数,因此,当bx的值非常接近cx或者cx+1的时候,tx的绝对值会非常大。我们通过给sigmoid函数乘以一个大于1的因子来解决这个问题,因此,这样就消除了栅格对不可检测物体的影响。
M:Mosaic数据增广 - 在训练过程中,使用四张图片而非一张进行增广处理
IT:IoU阈值 - 为一个ground truth的IoU使用多个anchors,ground truth IoU(truth, anchor) > IoU 阈值
GA:遗传算法 - 在前10%的训练时间内使用遗传算法选择最优的超参数
LS:Class label smoothing - 为sigmoid激活函数使用class label smoothing。
CBN:CmBN - 在整个批次中通过使用Cross mini-Batch Normalization收集统计数据,而非在单独的mini-batch中收集统计数据。
CA:Cosine annealing scheduler - 在sinusoid训练中改变学习率
DM:动态的mini-batch尺寸 - 在低分辨率的训练过程中,通过随机训练形状自动的改提高mini-batch的尺寸。
OA: 优化Anchors - 使用优化的anchors进行训练,网络的分辨率为512*512
GIoU, CIoU, DIoU, MSE - 为边界框回归使用不同的损失函数。

下一步的研究关心在检测器训练准确度上,不同Bag-of-Specials(BoS-detector)的影响,包括PAN, RFB, SAM, Gaussian YOLO(G),以及ASFF,正如表5所示。在我们的实验中,当使用SPP, PAN和SAM的时候,检测器得到了最好的性能。
在这里插入图片描述
在这里插入图片描述

4.4 不同backbones和预训练权重在检测器训练中的影响

下一步我们研究不同backbones模型在检测器准确率上的影响,正如表6所示。我们注意到拥有最佳分类准确率的模型,检测器的准确度未必是最佳的。

首先,尽管使用不同算法训练得到的CSPResNeXt-50模型的分类精度比CSPDarknet53模型的要高,但是CSPDarknet53模型的检测精度更高。

再者,CSPResNeXt-50分类器训练使用BoF和Mish提高了它的分类准确率,但是检测器训练使用的预训练权重的进一步使用减少了检测器的精度。但是,CSPDarknet53分类器训练使用BoF和Mish提高了分类器和检测器的准确率,它使用分类器预训练权重。这表示CSPDarknet53比CSPResNeXt-50更适合作为检测器。

我们观察到,由于各种改进,CSPDarknet53模型显示出了更大的提高的检测器精度的能力。
在这里插入图片描述

4.5 不同mini-batch尺寸在检测器训练上的影响

最后,我们分析了不同mini-batch尺寸的训练的模型的结果,并且结果在表7中显示出来。从表7中我们发现在添加了BoF和BoS训练策略之后,mini-batch尺寸几乎对检测器的性能没有影响。结果显示在引入了BoF和BoS之后,就不需要使用昂贵的GPUs进行训练。换句话说,任何人可以仅仅使用一个GPU去训练一个优秀的检测器。
在这里插入图片描述

5 结果

使用最先进的目标检测器得到的对比结果在图8中显示(具体请看原文)。我们的YOLOv4坐落在帕累托最优曲线上,而且在精度和速度上都优于目前最快的和最准确的检测器。
在这里插入图片描述

6 结论

我们提出了一个最先进的目标检测器,它比所有检测器都要快而且更准确。这个检测器可以仅在一块8-16GB的GPU上进行训练,这使得它可以广泛的使用。One-stage的anchor-based的检测器的原始概念证明是可行的。我们已经验证了大量的特征,并且其用于提高分类器和检测器的精度。这些算法可以作为未来研究和发展的最佳实践。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLOv4:目标检测的最佳速度和精度 的相关文章

随机推荐

  • 第十八章 Post-Processing

    第十八章 Post Processing Post processing是指在场景渲染之后 使用一些图形技术对场景进行处理 比如 把整个场景转换为grayscale 灰度 样式或使场景中明亮的区域发光 本章将编写一些post process
  • 项目开发的前期准备(二)

    项目开发的前期准备 二 时序图用于描述对象之间的传递消息的时间顺序 即用例中的行为顺序 当执行一个用例时 时序图中的每条消息对应了一个类操作或者引起转换的触发事件 在 UML 中 时序图表示为一个二维的关系图 其中 纵轴是时间轴 时间延竖线
  • Selenium clear()方法无法清掉数据

    今天遇到了Selenium clear 方法无法清掉数据的问题 问题描述 页面看着清空了数据 保存时候还是存在 解决方法 WebElement ballast browser getWebDriver findElement By xpat
  • Qt之界面样式

    1 窗口 最小化 最大化 关闭按钮 显示状态自定义 setWindowFlags Qt CustomizeWindowHint setWindowFlags Qt WindowCloseButtonHint 只要关闭按钮 setWindow
  • NeuralNLP-NeuralClassifier的使用记录(一),训练预测自己的【英文文本多分类】

    NeuralNLP NeuralClassifier的使用记录 训练预测自己的英文文本多分类 NeuralNLP NeuralClassifier是腾讯开发的一个多层多分类应用工具 支持的任务包括 文本分类中的二分类 多分类 多标签 以及层
  • 存档&改造【01】模板导入&租户登录

    app101改造之前 想搞一个设备导入功能 想象中 实际上 再改改样式 关于数据的导入导出 可见博客 APEX数据源加载实现Excel表数据导入及自定义存储过程 王小小鸭的博客 CSDN博客https blog csdn net clove
  • swagger免token鉴权

    使用swagger很简单 但是在引入项目里面是由于 项目使用了Spring Security OAuth实现鉴权体系 所以浏览器访问swagger的时候一直报401 说没权限 网上的很多方案主要是两种方法 1 鉴权时过滤指定请求 但是我没弄
  • JUC(2): 阻塞队列+线程池(重点)+新时代程序员必会

    一 阻塞队列 ArrayBlockingQueue 一个由数组结构组成的有界阻塞队列 LinkedBlockingQueue 一个由链表结构组成的有界阻塞队列 PriorityBlockingQueue 一个支持优先级排序的无界阻塞队列 D
  • 数据库设计--三大范式

    1 第一范式 确保每列保持原子性 第一范式是最基本的范式 如果数据库表中的所有字段值都是不可分解的原子值 就说明该数据库表满足了第一范式 第一范式的合理遵循需要根据系统的实际需求来定 比如某些数据库系统中需要用到 地址 这个属性 本来直接将
  • Anaconda简单理解

    1 定义 Ancconda是一个开源的软件包管理系统和环境管理系统 用于安装多个版本的软件包及其依赖关系 并在它们之间轻松切换 2 最重要的作用 创建虚拟环境 方法 conda create n 虚拟环境名字 python 版本 可以在一台
  • 小程序报错:Invalid attempt to destructure non-iterable instance

    TypeError Invalid attempt to destructure non iterable instance In order to be iterable non array objects must have a Sym
  • Distributed Database System —— Mysql Binlog不止是主从同步

    文章目录 引入 Binlog应用场景 读写分离 数据恢复 保证数据最终一致性 异地多活 引入 Mysql 5 0以后 支持通过binary log 二进制日志 以支持主从复制 复制允许将来自一个MySQL数据库服务器 master 的数据复
  • Spring Boot 大型线上商城项目实战

    你会学到什么 Spring Boot 技术栈的基础使用和开发技巧 掌握 Spring Boot 项目实践 如果你在发愁毕业设计 这个项目也可以给你很多思路 Thymeleaf 模板引擎整合及运用 AdminLTE3 Bootstrap 4
  • windows10 搜索不起作用,搜索框按了没反应

    第一步在win10系统上按win R键打开运行 输入regedit 如下图所示 2 第二步打开注册表之后 点击HKEY LOCAL MACHINE 如下图所示 3 第三步然后依次点击 HKEY LOCAL MACHINE gt SOFTWA
  • 大数据——Java面向对象知识点总结

    面向对象 what when where why whom how 类与对象的关系 类是对象的抽象 对象是类实现 类是由属性和方法构成 它的每一个对象都有对应的属性和方法 方法 方法的重载 目的 针对同一个行为的多种表现 对应相同方法名的多
  • Linux发布Spring Boot项目

    文章目录 Linux发布Spring Boot项目 一 CentOS7虚拟机环境 1 清理后打包项目 2 上传jar到Linux中 3 查看IP 4 关闭防火墙 5 运行jar包 6 浏览器访问 二 真实服务器环境 4 需要开启端口 三 后
  • linux sed -i replace text/sed 跟expression替换文本

    1 生成测试文本 peng peng cat gt aa txt aa bb cc dd ee C 2 原本的方案 用vi替换文本 aa替换成abc s aa abc 3 用sed命令替换文本 replace aa with abc at
  • 交换两个变量的值(包括字符串的交换)

    例 交换两个变量的值 输入两个整型变量a和b 设计一个交换函数将其交换后再输出 注意 不能直接输出b和a 错误代码 include
  • 适配任何数据结构的异步Excel生成(企业级开发)

    文章目录 前言 一 Java操作Excel的基础知识 二 测试准备 三 实现源码 四 功能测试 总结 源码 前言 背景 由于公司的excel生成过于缓慢 有时生成一个excel文件需要等待几十秒甚至几分钟 在等待的时候用户不能跳转其他页面
  • YOLOv4:目标检测的最佳速度和精度

    YOLOv4 目标检测的最佳速度和精度 摘要 随着深度学习的发展 目前已经出现了很多算法 或者训练技巧 tricks 来提升神经网络的准确率 在实际测试中评价一个算法的好坏优劣主要看两点 一是能否在大规模的数据集中起作用 work 二是是否