当前位置: 首页 > news >正文

YOLOv4论文超详细精讲(翻译+学习笔记)

前言

终于轮到 YOLOv4 这个“模块缝合怪”登场啦!读完之后我的第一反应是: “作者这一顿操作猛如虎,最后出来一看,还真不是‘二百五’!”

这篇论文简直可以当成“论文模块缝合教程示范片”,建议各位科研人反复观摩: 如何用别人的轮子组一辆超跑? YOLOv4告诉你:能用的模块一个都不放过!

顺带一提,自打 YOLOv3 之后,原作者 Joseph Redmon 就退圈了,表示自己“不想再让AI被滥用于军工”。于是后来这个系列的接力棒就落到了两位新选手手里:

  • 一位是Alexey Bochkovskiy,一个俄罗斯硬核程序员,Darknet 的继承者。

  • 另一位是来自台湾省的 Chien-Yao Wang,后来他们还联手推出了 YOLOv7(没错,就是那个以后要重点分析的“卷王”)。

说回 YOLOv4,本质上它是 YOLOv3 的“缝合加强版”。主架构基本还是原来那个味儿,但它的内部装修可是豪华升级,一股脑加了各种SOTA模块:什么 CSPDarknet53、Mish激活函数、DropBlock、CIoU loss、PANet、SAM... 看得人头都大了,但作者的操作你真不得不服,一顿缝缝补补,速度和精度竟然真就都提高了!

这篇文章很适合当做“论文创新不会写怎么办”的教科书:把前人干的漂亮活都抄来合理组合一下,你就能整出个能打的系统。

这篇文章涉及的模块过多,我会在B站:智算学术  更新详细的视频教程,给大家讲的透彻!

废话不多说,开整!

资源链接

论文链接:https://arxiv.org/abs/2004.10934

代码链接:https://github.com/AlexeyAB/darknet.

500篇经典深度学习论文+视频讲解+论文写作工具+模块缝合 请关注公众号:智算学术 领取

前期回顾

【Yolo精读+实践+魔改系列】Yolov1论文超详细精讲(翻译+笔记【Yolo精读+实践+魔改系列】Yolov2论文超详细精讲(翻译+笔记【Yolo精读+实践+魔改系列】Yolov3论文超详细精讲(翻译+笔记)

目录

前言

资源链接

前期回顾

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—实验设置

ImageNet图像分类实验超参数

MS COCO目标检测实验超参数

其他总结

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-activation)。我们使用了新的特征: 我们使用了新功能:WRC、CSP、CmBN、SAT、Mish 激活、Mosaic 数据增强、CmBN、DropBlock 正则化和 CIoU 损失,并将其中一些功能结合起来,以达到最先进的效果: 在 Tesla V100 上以 ∼65 FPS 的实时速度处理 MS COCO 数据集时,AP 为 43.5%(AP50 为 65.7%)。

精读

如何评价一个模块的好坏?

是螺子是马出来溜达溜达,就是用消融实验和对比实验来理论论证,因为有些模块只适用于特定的系统。

yolov4使用的模块

加入的新模块:WRC、CSP、CmBN、SAT、Mish 激活、Mosaic 数据增强、CmBN、DropBlock 正则化和 CIoU 损失,并将其中一些功能结合起来,以达到最先进的效果:

“把能想到的好用模块全都上了,拼装成了一台性能怪兽。”

性能总结

在 Tesla V100 上以 ∼65 FPS 的实时速度处理 MS COCO 数据集时,AP 为 43.5%(AP50 为 65.7%)。

一、 Introduction—简介

翻译

大多数基于 CNN 的物体检测器在很大程度上只适用于推荐系统。例如,通过城市视频摄像头搜索空闲停车位是由慢速精确模型执行的,而汽车碰撞预警则与快速不精确模型有关。提高实时物体检测器的准确性,不仅能将其用于生成提示的推荐系统,还能用于独立的流程管理和减少人工输入。在传统图形处理器(GPU)上运行实时物体检测器,可以以合理的价格大规模使用。最精确的现代神经网络无法实时运行,并且需要大量 GPU 进行大容量迷你批量训练。为了解决这些问题,我们创建了一个可在传统 GPU 上实时运行的 CNN,其训练只需要一个传统 GPU。这项工作的主要目标是在生产系统中设计一个快速运行速度的对象检测器,并针对并行计算进行优化,而不是低计算量理论指标(BFLOP)。我们希望所设计的对象可以很容易地训练和使用。例如,任何人使用传统 GPU 进行训练和测试,都能获得实时、高质量和令人信服的物体检测结果,如图 1 所示的 YOLOv4 结果。我们的贡献总结如下: 1. 我们开发了一个高效、强大的物体检测模型。它使每个人都能使用 1080 Ti 或 2080 Ti GPU 训练出超快、超准的物体检测器。 2. 在检测器训练过程中,我们验证了最先进的 “自由包”(Bag-of-Freebies)和 “特殊包”(Bag-of-Specials)物体检测方法的影响。 3. 3. 我们修改了最先进的方法,使其更加高效并适合单 GPU 训练,包括 CBN [89]、PAN [49]、SAM [85] 等。

精读

它在回答两个问题:

 为什么我们还要继续造 YOLO 这个轮子? 🔧 这次我们到底做了什么实事?

背景和需求

目标检测已广泛应用于自动驾驶、智能监控、工业检测等领域。但检测任务面临一项基本矛盾:速度和精度难以兼得 现代最精确的神经网络模型虽然精度高,但普遍体积庞大,训练成本高,无法实时运行,更无法轻松部署。

前人研究的不足之处

1、模型无法实时运行:许多 SOTA 模型都无法在普通 GPU 上实现高帧率推理。

2、训练资源门槛高:需要多个高端 GPU 才能完成训练,训练成本高,迁移性差。

本文的贡献(YOLOv4)

造出了一个人人都能用的强力模型

  • 在 GTX 1080Ti / RTX 2080Ti 上就能训练;

  • 推理速度快,精度也不差。

融合先进方法,实测效果优异

  • 整合了 “Bag-of-Freebies” 和 “Bag-of-Specials” 技术:

    • Freebies(训练时提升但不增加推理计算);

    • Specials(少量计算提升精度,例如注意力机制)。

优化现有模块,适配单 GPU 训练

  • 对以下技术做了适配和优化:

    • CBN(跨小批量归一化)

    • PAN(路径聚合网络)

    • SAM(空间注意力模块)

备注:

缩写含义
CBNCross mini-Batch Normalization(跨小批归一化)
PANPath Aggregation Network(路径聚合网络,用于特征增强)
SAMSpatial Attention Module(空间注意力模块)
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] 或 ShuffleNet [97, 53]。至于头部部分,通常分为两类,即单级物体检测器和两级物体检测器。最有代表性的两阶段物体检测器是 R-CNN [19] 系列,包括 fast R-CNN [18]、faster R-CNN [64]、R-FCN [9] 和 Libra R-CNN [58]。还可以将两阶段物体检测器变成无锚物体检测器,如 RepPoints [87]。至于单级物体检测器,最具代表性的模型有 YOLO [61, 62, 63]、SSD [50] 和 RetinaNet [45]。近年来,无锚单级物体检测器得到了发展。这类检测器有 CenterNet [13]、CornerNet [37, 38]、FCOS [78] 等。近年来开发的物体检测器通常会在主干和头部之间插入一些层,这些层通常用于收集不同阶段的特征图。我们可以称其为物体检测器的颈部。通常,颈部由几条自下而上的路径和几条自上而下的路径组成。除上述模型外,一些研究者还将重点放在直接构建新的骨干网(DetNet [43]、DetNAS [7])或新的整体模型(SpineNet [12]、HitDetector [20])来进行物体检测上。总之,普通的物体检测器由几个部分组成:

• 输入方式(Input)

  • 图像(Image)

  • 图像块(Patches)

  • 图像金字塔(Image Pyramid)

• 主干网络(Backbones)

  • VGG16 [68]

  • ResNet-50 [26]

  • SpineNet [12]

  • EfficientNet-B0/B7 [75]

  • CSPResNeXt50 [81]

  • CSPDarknet53 [81]

• 网络颈部模块(Neck)

  • 额外模块(Additional Blocks):

    • 空间金字塔池化(SPP)[25]

    • 空洞空间金字塔池化(ASPP)[5]

    • 受感野模块(RFB)[47]

    • 注意力模块(SAM)[85]

  • 路径聚合模块(Path-Aggregation Blocks):

    • 特征金字塔网络(FPN)[44]

    • 路径聚合网络(PAN)[49]

    • 神经架构搜索特征金字塔网络(NAS-FPN)[17]

    • 全连接特征金字塔网络(Fully-connected FPN)

    • 双向特征金字塔网络(BiFPN)[77]

    • 自适应特征融合模块(ASFF)[48]

    • 可伸缩特征融合模块(SFAM)[98]

• 检测头(Heads)

  • 密集预测(Dense Prediction,单阶段):

    • RPN(区域建议网络)[64]

    • SSD(单阶段多框检测器)[50]

    • YOLO(你只看一次)[61]

    • RetinaNet [45] (以上为基于锚框的 anchor-based 方法)

    • CornerNet [37]

    • CenterNet [13]

    • MatrixNet [60]

    • FCOS(全卷积目标检测)[78] (以上为无锚框的 anchor-free 方法)

  • 稀疏预测(Sparse Prediction,双阶段):

    • Faster R-CNN [64]

    • R-FCN(区域全卷积网络)[9]

    • Mask R-CNN [23] (以上为基于锚框的 anchor-based 方法)

    • RepPoints [87] (无锚框 anchor-free 方法)

精读

现代物体检测器通常需要高效准确地识别图像中的目标。为了适应不同计算平台(GPU和CPU),以及满足不同应用需求,设计了多种结构和方法。

研究方法及分类: 物体检测器通常由三部分组成:

  • 骨干网络(Backbone),用于提取图像特征;

  • “颈部”(Neck):在骨干网络和检测头之间

  • 检测头(Head),用于预测目标类别和边界框。

骨干网络在GPU平台上多用VGG、ResNet、ResNeXt、DenseNet等大模型,而在CPU平台上多用轻量化网络如SqueezeNet、MobileNet、ShuffleNet。

检测头分为两类:

  • 两阶段检测器(Two-stage detectors),如R-CNN系列(Fast R-CNN、Faster R-CNN、R-FCN、Libra R-CNN),也有无锚框版本如RepPoints;

  • 单阶段检测器(One-stage detectors),代表有YOLO系列、SSD、RetinaNet,以及近年来发展的无锚框单阶段检测器如CenterNet、CornerNet、FCOS。

“颈部”(Neck)模块:这些模块通过自下而上和自上而下路径聚合多尺度特征,常见的有FPN、PAN等。

2.2 Bag of freebies

翻译

通常,传统的物体检测器是离线训练的。因此,研究人员总是希望利用这一优势,开发出更好的训练方法,在不增加推理成本的情况下,使物体检测器获得更高的精度。我们把这些只改变训练策略或只增加训练成本的方法称为 “免费包”。物体检测方法通常采用的、符合 “免费赠品包 ”定义的方法是数据增强。数据增强的目的是增加输入图像的可变性,从而使设计的物体检测模型对不同环境下获得的图像具有更高的鲁棒性。例如,光度畸变和几何畸变是两种常用的数据增强方法,它们无疑对物体检测任务大有裨益。在处理光度失真时,我们会调整图像的亮度、对比度、色调、饱和度和噪点。对于几何失真,我们会添加随机缩放、裁剪、翻转和旋转。上述数据增强方法都是像素级调整,调整区域内的所有原始像素信息都会保留。此外,一些从事数据增强的研究人员将重点放在模拟物体遮挡问题上。他们在图像分类和物体检测方面取得了不错的成果。例如,随机擦除[100]和剪切输出[11]可以随机选择图像中的矩形区域,并填充一个随机值或补零值。至于捉迷藏[69]和网格掩码[6],它们可以随机或均匀地选择图像中的多个矩形区域,并将其替换为全部零。如果将类似的概念应用于特征图,则有 DropOut [71]、DropConnect [80] 和 DropBlock [16] 等方法。此外,一些研究人员还提出了将多幅图像结合在一起进行数据增强的方法。例如,MixUp[92] 使用两幅图像以不同的系数比例相乘叠加,然后根据这些叠加比例调整标签。至于 CutMix [91],则是将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。除上述方法外,样式转移 GAN [15] 也被用于数据增强,这种用法可以有效减少 CNN 学习到的纹理偏差。与上述各种方法不同的是,其他一些福袋方法致力于解决数据集中的语义分布可能存在偏差的问题。在处理语义分布偏差问题时,一个非常重要的问题是不同类之间存在数据不平衡的问题,这个问题通常通过两阶段对象检测器中的硬负示例挖掘[72]或在线硬示例挖掘[67]来解决。但实例挖掘方法不适用于单级对象检测器,因为这种检测器属于密集预测架构。因此,Lin 等人[45]提出了焦点损失(focal loss)来处理不同类别之间存在的数据不平衡问题。另一个非常重要的问题是,一热硬表示法很难表达不同类别之间的关联程度关系。这种表示方案通常在执行标签时使用。文献[73]中提出的标签平滑法是将硬标签转换为软标签进行训练,这样可以使模型更加稳健。为了获得更好的软标签,Islam 等人[33]引入了知识提炼的概念来设计标签细化网络。最后一袋免费赠品是边界盒(BBox)回归的目标函数。传统的物体检测器通常使用均方误差(MSE)直接对边界框的中心点坐标、高度和宽度,即{xcenter, ycenter, w, h},或左上点和右下点,即{xtop left, ytop left, xbottom right, ybottom right}进行回归。至于基于锚点的方法,则是估算相应的偏移量,例如{中心偏移量,中心偏移量,f 集的 w,f 集的 h}和{f 集的左上角,f 集的左上角,x 底部右偏移量,y 底部右偏移量}。然而,直接估算 BBox 各点的坐标值是将这些点视为自变量,实际上并没有考虑对象本身的完整性。为了更好地处理这个问题,一些研究人员最近提出了 IoU loss [90],它将预测 BBox 区域和地面实况 BBox 区域的覆盖率纳入了考虑范围。IoU 损失计算过程将通过执行 IoU 和地面实况触发 BBox 四个坐标点的计算,然后将生成的结果连接成一个完整的代码。由于 IoU 是一种尺度不变的表示法,因此它可以解决传统 BBox 计算中存在的问题。

精读

免费赠品(Freebies)定义

  • 指只在训练阶段增加成本或策略,推理阶段不增加开销的方法。

数据增强(Data Augmentation)

  • 光度畸变:调整图像的亮度、对比度、色调、饱和度、噪点。

  • 几何畸变:随机缩放、裁剪、翻转、旋转。

  • 遮挡模拟:随机擦除(Random Erasing)、剪切输出(Cutout)、捉迷藏(Hide-and-Seek)、网格掩码(GridMask)

  • 特征层的遮挡:DropOut、DropConnect、DropBlock

  • 多图像融合增强:MixUp(图像加权叠加与标签调整)、CutMix(图像部分裁剪覆盖与标签调整)

  • 风格迁移 GAN:减少纹理偏差,提高泛化。

语义分布偏差与类别不平衡

  • 硬负样本挖掘(Hard Negative Mining):专门挑出那些模型容易搞错的“难背景”(比如长得像目标但其实不是)来训练,而不是一股脑用所有背景样本

  • 在线硬负样本挖掘(OHEM):硬负样本挖掘的一个自动化版本,训练时模型会自动找出当前最难区分的“负样本”,重点用这些“难负样本”来训练

  • 焦点损失(Focal Loss):给训练时的“简单样本”减少权重,给“难样本”加大权重,让模型更多关注那些容易出错的样本,这样模型才能更准确地识别目标,解决类别不平衡的问题。

标签处理

  • 标签平滑(Label Smoothing):标签平滑就是给标签“降降温”,把【猫=1,狗=0,鸟=0】变成类似【猫=0.9,狗=0.05,鸟=0.05】这样“软软的”标签,告诉模型“虽然这是猫,但也允许有点不确定性”

  • 知识蒸馏与标签细化网络:进一步优化软标签,增强训练效果。

边界框(BBox)回归目标函数

IoU损失:该损失函数通过计算预测边界框与真实边界框的交并比(IoU),将两者的重叠区域纳入考量。由于IoU本身是尺度不变的指标,这一特性避免了传统基于坐标的L1或L2损失随着目标大小变化而产生的偏差问题。

GIoU损失:在考虑预测框与真实框重叠的基础上,GIoU进一步引入了一个覆盖两者的最小闭合边界框。该最小边界框的面积作为新的归一化因子,有效地反映了边界框之间的相对位置和形状差异,从而提升了定位的准确性。

DIoU损失:该方法在IoU的基础上额外引入了预测框和真实框中心点之间的距离度量,鼓励边界框中心更快地靠近目标中心,从而改善收敛速度和定位性能。

CIoU损失:综合考虑了重叠区域大小、中心点距离以及边界框的宽高比,CIoU更全面地评估了边界框的匹配质量,通常能带来更优的收敛速度和回归精度。

2.3 Bag of specials

翻译

对于那些只会使推理开销增加很少,但却能显著提升目标检测准确率的插件模块和后处理方法,我们称之为“bag of specials”(特殊组合包)。一般来说,这些插件模块用于增强模型的某些属性,比如扩大感受野、引入注意力机制、或者增强特征融合能力等,而后处理则是用于筛选模型预测结果的方法。常用来增强感受野的模块有SPP [25]、ASPP [5]和RFB [47]。

SPP模块起源于空间金字塔匹配(Spatial Pyramid Matching, SPM)[39],SPM最初的方法是将特征图分割成多个d × d的等大小块,其中d可以是{1, 2, 3, …},从而形成空间金字塔,然后提取词袋特征。SPP将SPM集成进卷积神经网络,并用最大池化操作代替词袋操作。由于He等人提出的SPP模块[25]会输出一维特征向量,因此无法应用于全卷积网络(Fully Convolutional Network, FCN)。因此,在YOLOv3 [63]的设计中,Redmon和Farhadi改进了SPP模块,使其输出为多个最大池化结果的拼接,最大池化核大小为k × k,k ∈ {1, 5, 9, 13},步长为1。在这种设计下,较大的k × k最大池化有效地扩大了主干网络特征的感受野。加入改进后的SPP模块后,YOLOv3-608在MS COCO目标检测任务中AP50提升了2.7%,而计算量仅增加了0.5%。

ASPP模块[5]与改进版SPP模块操作上的主要区别在于,ASPP采用多个3 × 3大小的卷积核,使用膨胀率为k的膨胀卷积,步长为1,而改进的SPP是使用k × k大小的最大池化,步长为1。

RFB模块使用多个k × k卷积核、膨胀率为k且步长为1的膨胀卷积,以获得比ASPP更全面的空间覆盖。RFB [47]仅增加7%的推理时间,却使SSD在MS COCO上的AP50提升了5.7%。

目标检测中常用的注意力模块主要分为通道注意力和空间注意力,代表分别是Squeeze-and-Excitation(SE)[29]和Spatial Attention Module(SAM)[85]。虽然SE模块能使ResNet50在ImageNet图像分类任务上的top-1准确率提升1%,且计算量仅增加2%,但在GPU上通常会使推理时间增加约10%,因此更适合移动设备使用。相比之下,SAM仅增加0.1%的计算量,能够使ResNet50-SE在ImageNet上top-1准确率提升0.5%,且几乎不影响GPU上的推理速度。

在特征融合方面,早期的做法是使用跳跃连接(skip connection)[51]或超列(hyper-column)[22]将低层的物理特征与高层的语义特征进行融合。随着像FPN这样的多尺度预测方法变得流行,许多轻量级的特征金字塔融合模块被提出。这类模块包括SFAM [98]、ASFF [48]和BiFPN [77]。SFAM的主要思想是利用SE模块对多尺度拼接的特征图执行通道级别的重加权。ASFF则使用softmax作为逐点(point-wise)级别的重加权,然后将不同尺度的特征图相加。而在BiFPN中,提出了多输入加权残差连接,用于执行尺度级别的重加权,然后将不同尺度的特征图相加。

在深度学习的研究中,有些人关注寻找良好的激活函数。一个好的激活函数可以更高效地传递梯度,同时不会带来过多额外计算开销。2010年,Nair和Hinton [56]提出了ReLU,实质性地解决了传统tanh和sigmoid激活函数中常见的梯度消失问题。随后,LReLU [54]、PReLU [24]、ReLU6 [28]、Scaled Exponential Linear Unit(SELU)[35]、Swish [59]、hard-Swish [27]和Mish [55]等激活函数也被提出,目的同样是为了解决梯度消失问题。LReLU和PReLU的主要目的是解决ReLU在输出小于零时梯度为零的问题。ReLU6和hard-Swish则是专门为量化网络设计的。SELU激活函数被提出以实现神经网络的自归一化目标。值得注意的是,Swish和Mish都是连续可导的激活函数。

深度学习目标检测中常用的后处理方法是非极大值抑制(NMS),它用于过滤那些错误预测同一目标的边界框(BBox),只保留响应较高的候选框。NMS试图改进的方法与优化目标函数的方法一致。原始的NMS方法没有考虑上下文信息,因此Girshick等人[19]在R-CNN中加入了分类置信度分数作为参考,并根据置信度分数的高低顺序进行贪婪NMS。对于soft NMS [1],它考虑了遮挡导致置信度下降的问题,通过IoU分数对置信度进行软化处理。DIoU NMS [99]的设计思路是在soft NMS的基础上,将中心点距离信息加入边界框筛选过程中。值得一提的是,由于上述后处理方法均未直接参考捕获的图像特征,基于anchor-free的方法在后续发展中不再需要后处理步骤。

精读

这部分涉及的模块过多,请关注B站【智算学术】观看详细的讲解yolov4的模块内容

1、 “bag of specials”概念:指的是那些仅增加少量计算开销,但能显著提升目标检测准确率的插件模块和后处理方法。

增强感受野的模块

  • SPP(Spatial Pyramid Pooling):通过不同大小的最大池化层扩大感受野,改进版本用于YOLOv3,提升AP50约2.7%,计算成本仅增加0.5%。

  • ASPP(Atrous Spatial Pyramid Pooling):用不同膨胀率的卷积核替代大尺寸最大池化,扩展空间覆盖。

  • RFB(Receptive Field Block):利用膨胀卷积获得比ASPP更广的空间感受野,提升精度同时计算增加约7%。

注意力机制模块

  • SE(Squeeze-and-Excitation):通道注意力,能提升模型准确率但在GPU上推理时间增加较多,适合移动端。

  • SAM(Spatial Attention Module):空间注意力,计算开销极低,几乎不影响GPU推理速度。

特征融合方法

  • 早期用跳跃连接和超列方法融合低层物理特征与高层语义特征。

  • 多尺度融合模块包括SFAM(利用SE进行通道重加权)、ASFF(使用softmax进行点级重加权)和BiFPN(多输入加权残差连接,实现尺度级重加权)。

激活函数的发展

  • ReLU提出解决梯度消失问题,后续出现LReLU、PReLU解决ReLU在负区间梯度为零的问题。

  • ReLU6和hard-Swish为量化网络特别设计。

  • SELU实现神经网络的自归一化。

  • Swish和Mish是连续可导的激活函数,提升训练稳定性和性能。

后处理的演进

  • 传统NMS用于过滤重叠的边界框。

  • 改进版包括基于置信度排序的贪婪NMS、软NMS(soft NMS)解决遮挡导致置信度下降问题。

  • DIoU NMS结合中心点距离信息进一步提升筛选效果。

  • Anchor-free方法后来发展,逐渐减少对后处理的依赖。

三、Methodology—方法

3.1 Selection of architecture—架构选择

翻译

我们的目标是在输入网络分辨率、卷积层数量、参数数量(滤波器大小² × 滤波器数 × 通道数 / 组数)以及层输出数量(滤波器数)之间找到最佳平衡。例如,我们大量研究表明,CSPResNeXt50 在 ILSVRC2012(ImageNet)数据集上的物体分类性能明显优于 CSPDarknet53。然而,反过来,CSPDarknet53 在 MS COCO 数据集上的物体检测表现优于 CSPResNeXt50。

接下来的目标是选择额外的模块来增加感受野,以及选择不同骨干网络层级之间参数融合的最佳方法,以适应不同的检测器层级,例如 FPN、PAN、ASFF、BiFPN。一个对分类任务最优的参考模型,并不一定对检测任务最优。与分类器相比,检测器需要:

  • 更高的输入网络尺寸(分辨率),以检测多个小尺寸物体

  • 更多的层数,以获得更大的感受野来覆盖更大的输入尺寸

  • 更多的参数,以增强模型对单张图像中多尺寸物体检测的能力

理论上,我们可以假设应选择感受野较大(具有更多3×3卷积层)且参数更多的模型作为骨干网络。表1展示了 CSPResNeXt50、CSPDarknet53 和 EfficientNet B3 的信息。CSPResNeXt50 仅包含16个3×3卷积层,感受野为425×425,参数量为2060万;而 CSPDarknet53 包含29个3×3卷积层,感受野为725×725,参数量为2760万。

这些理论依据结合大量实验表明,CSPDarknet53 是两者中作为检测器骨干网络的最优模型。

不同大小感受野的影响总结如下:

  • 达到物体尺寸:能够完整看到整个物体

  • 达到网络尺寸:能够看到物体周围的上下文信息

  • 超过网络尺寸:增加图像点与最终激活之间的连接数

我们在 CSPDarknet53 上添加了 SPP 模块,因为它显著增加了感受野,提取出最重要的上下文特征,同时几乎不降低网络的运行速度。我们使用 PANet 作为不同骨干层到检测器不同层的参数融合方法,替代了 YOLOv3 中的 FPN。

最终,我们选择了 CSPDarknet53 作为骨干网络,SPP 作为附加模块,PANet 作为路径聚合颈部,YOLOv3(基于锚点)作为检测头,构成 YOLOv4 的架构。

未来我们计划大幅扩展“免费礼包”(Bag of Freebies,BoF)内容,这理论上可以解决一些问题并提升检测器精度,并通过实验逐步验证每个特征的影响。

我们不使用跨GPU批归一化(CGBN 或 SyncBN)或昂贵的专用设备,这使得任何人都可以在常规GPU(如 GTX 1080Ti 或 RTX 2080Ti)上复现我们的先进成果。

精读

目标与平衡点

  • 寻找输入网络分辨率、卷积层数量、参数数量和层输出数量之间的最佳平衡。

  • 不同任务(分类 vs 检测)对模型的需求不同,最优模型也不同。

分类模型与检测模型的差异

  • CSPResNeXt50在ImageNet分类上表现更好。

  • CSPDarknet53在MS COCO检测任务上表现更优。

检测模型的特殊需求

  • 更高的输入分辨率,便于检测小目标。

  • 更多卷积层,带来更大的感受野覆盖更大输入。

  • 更多参数,提高模型对多尺度目标的检测能力。

感受野的重要性

  • 感受野大小应至少覆盖目标大小,以完整捕获目标。

  • 达到网络尺寸则能包含目标的上下文信息。

  • 超过网络尺寸则增加像素与激活之间的连接,提高特征表达能力。

具体模型对比

  • CSPResNeXt50:16层3×3卷积,425×425感受野,2060万参数。

  • CSPDarknet53:29层3×3卷积,725×725感受野,2760万参数。

  • 实验和理论均支持CSPDarknet53更适合作为检测骨干。

模块与架构设计选择

  • 加入SPP模块,显著扩展感受野且几乎不降低速度。

  • 用PANet替代FPN做多层特征融合,提高特征融合效果。

  • 构成YOLOv4架构:CSPDarknet53骨干 + SPP模块 + PANet颈部 + YOLOv3检测头。

未来方向

  • 扩展“Bag of Freebies”(免费礼包)技术以提升检测器精度。

  • 计划实验验证每个特征的具体效果。

实际可复现性

  • 不依赖跨GPU批归一化或高端硬件,方便在普通GPU(如GTX 1080Ti)上复现。

3.2 Selection of BoF and BoS—BoF和BoS的选择

翻译

为了提升目标检测的训练效果,卷积神经网络(CNN)通常会采用以下方法:

  • 激活函数:ReLU、leaky-ReLU、parametric-ReLU、ReLU6、SELU、Swish 或 Mish

  • 边界框回归损失函数:MSE、IoU、GIoU、CIoU、DIoU

  • 数据增强:CutOut、MixUp、CutMix

  • 正则化方法:DropOut、DropPath [36]、Spatial DropOut [79] 或 DropBlock

  • 通过均值和方差对网络激活进行归一化:Batch Normalization(BN)[32]、跨GPU批量归一化(CGBN 或 SyncBN)[93]、Filter Response Normalization(FRN)[70] 或跨迭代批量归一化(CBN)[89]

  • 跳跃连接:残差连接、加权残差连接、多输入加权残差连接,或跨阶段部分连接(CSP)

关于训练时激活函数的选择,由于PReLU和SELU训练较为困难,且ReLU6专门为量化网络设计,因此我们将上述激活函数从候选列表中剔除。

在正则化方法中,DropBlock的提出者对比了多种方法,且DropBlock的效果显著优于其他方法,因此我们毫不犹豫地选择DropBlock作为正则化手段。

关于归一化方法的选择,由于我们重点关注只使用单GPU的训练策略,因此不考虑SyncBN。

精读

作者采用了以下技术:

  • 激活函数:使用ReLU、leaky-ReLU、Swish和Mish,排除了训练较难的PReLU和SELU,以及专门为量化设计的ReLU6。

    边界框回归损失函数:采用IoU及其改进版本(GIoU、DIoU、CIoU),提升定位精度。

    数据增强:使用CutOut、MixUp、CutMix,增强模型的泛化能力。

    正则化方法:选择效果最佳的DropBlock,提升训练稳定性和模型泛化。

    归一化方法:采用Batch Normalization(BN)及Filter Response Normalization(FRN),放弃了跨GPU同步归一化(SyncBN),适合单GPU训练。

    跳跃连接:采用残差连接、多输入加权残差连接和跨阶段部分连接(CSP),改善梯度流动和特征融合。

3.3 Additional improvements—进一步改进

翻译

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

  • 引入了一种新的数据增强方法 Mosaic 和自对抗训练(Self-Adversarial Training,SAT)

  • 在应用遗传算法的同时选择最优超参数

  • 修改了一些现有方法,使我们的设计适合高效训练和检测——修改了SAM、修改了PAN,以及跨小批量归一化(Cross mini-Batch Normalization,CmBN)

Mosaic 是一种新的数据增强方法,它将4张训练图片混合在一起。这样就混合了4种不同的上下文,而CutMix只混合2张输入图像。这使得检测器能够检测在其正常上下文之外的物体。此外,批量归一化会在每一层上计算4张不同图像的激活统计,这显著减少了对大批量大小的需求。

自对抗训练(SAT)也是一种新的数据增强技术,分为两个正向-反向阶段。第一阶段中,神经网络修改原始图像而非网络权重。这样神经网络对自身执行了一次对抗攻击,改变原始图像,制造出图像中不存在目标的“欺骗”。第二阶段,神经网络用正常方式训练以检测该修改后的图像中的目标。

CmBN 是CBN的一种修改版本,如图4所示,称为跨小批量归一化(Cross mini-Batch Normalization,CmBN),它仅在单个批次中的小批量之间收集统计信息。

我们将SAM从空间注意力修改为点注意力,并将PAN的捷径连接改为拼接连接,分别如图5和图6所示。

精读

目标:使检测器更适合在单GPU环境下高效训练。

新引入的数据增强方法

  • Mosaic:将4张训练图片混合,提供更多上下文信息,提升检测多样性。

  • Self-Adversarial Training (SAT):神经网络通过修改输入图像进行自我对抗训练,提高鲁棒性。

超参数优化:通过遗传算法选择最优超参数组合。

现有方法的改进

  • SAM(注意力机制):从空间注意力改为点注意力。

  • PAN(路径聚合网络):将原有的捷径连接改为拼接连接。

  • Cross mini-Batch Normalization (CmBN):改进的跨小批量归一化,只在单批次内部小批量间统计,适合单GPU训练。

Mosaic对批量归一化的影响:混合多张图像使得激活统计更丰富,减少了对大批量训练的依赖。

SAT训练流程:分两阶段,第一阶段通过修改图像制造对抗样本,第二阶段训练网络识别被修改的图像中的目标。

3.4 YOLOv4

翻译

本节将详细介绍 YOLOv4。

YOLOv4 由以下部分组成: • 主干网络(Backbone):CSPDarknet53 [81] • 颈部(Neck):SPP [25],PAN [49] • 头部(Head):YOLOv3 [63]

YOLOv4 使用的技术包括: • 主干网络的免费增强包(Bag of Freebies,BoF):CutMix 和 Mosaic 数据增强、DropBlock 正则化、类别标签平滑 • 主干网络的特殊增强包(Bag of Specials,BoS):Mish 激活函数、跨阶段部分连接(CSP)、多输入加权残差连接(MiWRC) • 检测器的免费增强包(BoF):CIoU 损失函数、Cross mini-Batch Normalization(CmBN)、DropBlock 正则化、Mosaic 数据增强、自对抗训练(Self-Adversarial Training)、消除网格敏感性、使用多个锚点对应单个真实框、余弦退火学习率调度器、最优超参数、随机训练形状 • 检测器的特殊增强包(BoS):Mish 激活函数、SPP 模块、SAM 模块、PAN 路径聚合模块、DIoU-NMS

精读

网络架构

  • Backbone(主干网络):采用CSPDarknet53

  • Neck(颈部):采用SPP和PAN模块

  • Head(头部):基于YOLOv3设计

增强技术分为两大类

  • Bag of Freebies(BoF):不增加推理计算成本的训练技巧

  • Bag of Specials(BoS):提升模型性能但可能增加计算成本的特殊模块

主干网络使用的技术

  • BoF:CutMix、Mosaic数据增强,DropBlock正则化,类别标签平滑

  • BoS:Mish激活函数,跨阶段部分连接(CSP),多输入加权残差连接(MiWRC)

检测器使用的技术

  • BoF:CIoU损失、Cross mini-Batch Normalization、DropBlock正则化、Mosaic、自对抗训练、消除网格敏感性、多锚点匹配、余弦退火学习率调度、最优超参数、随机训练尺寸

  • BoS:Mish激活、SPP模块、SAM模块、PAN路径聚合模块、DIoU-NMS

四、Experiments—实验

4.1 Experimental setup—实验设置

翻译

在ImageNet图像分类实验中,默认的超参数如下:

  • 训练步数为8,000,000步;

  • 批量大小(batch size)为128,迷你批量大小(mini-batch size)为32;

  • 采用多项式衰减(polynomial decay)学习率调度策略,初始学习率为0.1;

  • 预热步数(warm-up steps)为1000;

  • 动量(momentum)和权重衰减(weight decay)分别设为0.9和0.005。

所有的Bag of Specials(BoS)实验均采用上述默认超参数设置,而Bag of Freebies(BoF)实验则增加了50%的训练步数。在BoF实验中,验证了MixUp、CutMix、Mosaic、模糊(Bluring)数据增强和标签平滑正则化方法。在BoS实验中,比较了LReLU、Swish和Mish激活函数的效果。所有实验均使用1080 Ti或2080 Ti GPU进行训练。

在MS COCO目标检测实验中,默认超参数如下:

  • 训练步数为500,500步;

  • 采用阶梯衰减(step decay)学习率调度策略,初始学习率为0.01,分别在400,000步和450,000步时乘以0.1的衰减系数;

  • 动量和权重衰减分别设为0.9和0.0005;

  • 所有架构均使用单GPU进行多尺度训练,批量大小为64,迷你批量大小根据架构和GPU显存限制为8或4;

  • 除了用于超参数搜索的遗传算法实验外,其他实验均采用默认设置。

遗传算法实验中,使用YOLOv3-SPP训练,采用GIoU损失,搜索了300个epoch以在min-val 5k数据集上获得最佳结果。遗传算法搜索出的学习率为0.00261,动量为0.949,分配真实框的IoU阈值为0.213,损失归一化因子为0.07。

我们验证了大量的BoF技术,包括消除网格敏感性、Mosaic数据增强、IoU阈值、遗传算法、类别标签平滑、交叉迷你批量归一化、自对抗训练、余弦退火学习率调度、动态迷你批量大小、DropBlock、优化锚点和不同种类的IoU损失。还对多种BoS技术进行了实验验证,包括Mish激活函数、SPP、SAM、RFB、BiFPN和Gaussian YOLO。

所有实验均仅使用单GPU训练,因此未使用多GPU优化技术如同步批量归一化(syncBN)。

精读

ImageNet图像分类实验超参数

  • 训练步数:8,000,000步(BoF实验增加50%)

  • 批量大小(batch size):128

  • 迷你批量大小(mini-batch size):32

  • 学习率调度:多项式衰减(polynomial decay)

  • 初始学习率:0.1

  • 预热步数(warm-up steps):1000

  • 动量(momentum):0.9

  • 权重衰减(weight decay):0.005

  • 硬件:NVIDIA GTX 1080 Ti 或 RTX 2080 Ti GPU

  • BoF验证:MixUp、CutMix、Mosaic、模糊数据增强、标签平滑

  • BoS验证:LReLU、Swish、Mish激活函数


MS COCO目标检测实验超参数

  • 训练步数:500,500步

  • 批量大小(batch size):64

  • 迷你批量大小(mini-batch size):4或8(根据架构和显存限制)

  • 学习率调度:阶梯衰减(step decay),在400,000步和450,000步时分别乘以0.1

  • 初始学习率:0.01

  • 动量(momentum):0.9

  • 权重衰减(weight decay):0.0005

  • 硬件:单GPU训练

  • 遗传算法调优参数(使用YOLOv3-SPP和GIoU损失):

    • 学习率:0.00261

    • 动量:0.949

    • IoU阈值(分配真实框):0.213

    • 损失归一化因子:0.07


其他总结

  • 主要采用单GPU训练,未使用多GPU同步批量归一化(syncBN)等技术。

  • 大量验证了Bag of Freebies(BoF)和Bag of Specials(BoS)技术,涵盖数据增强、正则化、激活函数、网络结构等方面。

4.2 Influence of different features on Classifier training—不同特征对分类器训练的影响

翻译

首先,我们研究了不同特征对分类器训练的影响;具体包括类别标签平滑的影响、不同数据增强技术的影响(双边模糊、MixUp、CutMix 和 Mosaic,如图7所示),以及不同激活函数的影响,如默认的Leaky-ReLU、Swish和Mish。在我们的实验中,如表2所示,引入CutMix和Mosaic数据增强、类别标签平滑以及Mish激活函数后,分类器的准确率得到了提升。因此,我们的分类器训练中的BoF(Bag of Freebies)包括:CutMix和Mosaic数据增强以及类别标签平滑。另外,Mish激活函数作为一种补充选项,如表2和表3所示。

精读

研究了多种技术对分类器性能的影响,包括类别标签平滑、不同数据增强方法(双边模糊、MixUp、CutMix、Mosaic)和激活函数(Leaky-ReLU、Swish、Mish)。

实验证明,引入CutMix和Mosaic两种数据增强方式、类别标签平滑,以及Mish激活函数,能显著提升分类器准确率。

因此,分类器训练中采用的BoF(Bag of Freebies)包括CutMix、Mosaic数据增强和类别标签平滑,Mish激活函数作为补充选择。

4.3 Influence of different features on Detector training—不同特征对检测器训练的影响

翻译

进一步的研究关注不同“Bag of Freebies”(BoF-检测器)对检测器训练准确率的影响,如表4所示。通过研究不同能够提升检测准确率且不影响FPS的特性,我们大幅扩展了BoF列表:

  • S:消除网格敏感性。YOLOv3中用于评估目标坐标的公式是 bx = σ(tx) + cx,by = σ(ty) + cy,其中cx和cy总是整数,因此当bx接近cx或cx+1时,tx的绝对值需要非常大。我们通过将sigmoid函数乘以大于1的因子,解决了这个问题,从而消除了网格对目标不可检测的影响。

  • M:Mosaic数据增强——训练时使用由4张图像拼接而成的Mosaic代替单张图像。

  • IT:IoU阈值——为单个真实框使用多个锚框,满足IoU(真实框,锚框)> IoU阈值。

  • GA:遗传算法——在训练的前10%时间内,使用遗传算法选择最优超参数。

  • LS:类别标签平滑——针对sigmoid激活使用类别标签平滑。

  • CBN:Cross mini-Batch Normalization——在整个批次内收集统计数据,而非单个小批次内。

  • CA:余弦退火调度器——在训练中按正弦曲线调整学习率。

  • DM:动态小批次大小——通过随机训练形状,在低分辨率训练时自动增加小批次大小。

  • OA:优化锚框——针对512×512网络分辨率使用优化锚框。

  • GIoU、CIoU、DIoU、MSE——使用不同的边界框回归损失算法。

进一步研究了不同“Bag of Specials”(BoS-检测器)对检测器训练准确率的影响,包括PAN、RFB、SAM、高斯YOLO(G)和ASFF,如表5所示。实验表明,检测器在使用SPP、PAN和SAM时表现最佳。

精读

研究了多种“Bag of Freebies”(BoF)技术对检测器训练准确率的提升,这些技术不会影响帧率(FPS),包括消除网格敏感性、Mosaic数据增强、多锚框IoU阈值、遗传算法超参优化、标签平滑、Cross mini-Batch Normalization、余弦退火学习率调度、动态小批量大小、优化锚框以及多种边界框回归损失函数。

消除网格敏感性通过调整sigmoid函数解决了YOLOv3中目标坐标估计的限制,提高了检测的稳定性。

Mosaic数据增强利用4张图像拼接丰富训练样本的上下文信息。

遗传算法用于自动搜索训练超参数,提升模型性能。

研究了多种“Bag of Specials”(BoS)模块对检测器性能的影响,实验结果显示SPP、PAN和SAM模块能够带来最佳性能提升。

4.4 Influence of different backbones and pre- trained weightings on Detector training—不同的backbone和预先训练权重对检测器训练的影响

翻译

进一步研究了不同骨干网络模型对检测器准确率的影响,如表6所示。我们注意到,分类准确率最高的模型不一定是检测器准确率最高的模型。

首先,虽然使用不同特征训练的CSPResNeXt50模型的分类准确率高于CSPDarknet53模型,但CSPDarknet53模型在目标检测准确率方面表现更好。

其次,在CSPResNeXt50分类器训练中使用BoF和Mish能够提升其分类准确率,但将这些预训练权重应用于检测器训练时,检测器准确率反而下降。而在CSPDarknet53分类器训练中使用BoF和Mish,不仅提升了分类器准确率,也提高了基于该分类器预训练权重的检测器准确率。

综上,骨干网络CSPDarknet53比CSPResNeXt50更适合用作检测器骨干网络。我们观察到,CSPDarknet53模型由于各种改进,表现出更强的提升检测器准确率的能力。

精读

不同骨干网络对检测器准确率影响不同,分类准确率最高的模型不一定检测效果最好。

CSPResNeXt50的分类准确率高于CSPDarknet53,但CSPDarknet53在目标检测准确率上更优。

使用BoF和Mish提升了CSPResNeXt50分类器的准确率,但用其预训练权重训练检测器时,检测准确率下降。

而对CSPDarknet53,BoF和Mish不仅提升分类器准确率,也提升检测器准确率。

因此,CSPDarknet53更适合作为检测器的骨干网络,且改进效果更明显。

4.5 Influence of different mini-batch size on Detec- tor training—不同的小批尺寸对检测器培训的影响

翻译

最后,我们分析了使用不同小批量(mini-batch)大小训练的模型结果,结果如表7所示。从表7的结果来看,我们发现加入BoF和BoS训练策略后,小批量大小对检测器性能几乎没有影响。这个结果表明,引入BoF和BoS后,训练不再依赖昂贵的GPU。换句话说,任何人只用普通GPU就能训练出优秀的检测器。

精读

研究表明,加入BoF(Bag of Freebies)和BoS(Bag of Specials)训练策略后,检测器性能对小批量大小(mini-batch size)几乎不受影响。

这意味着训练优秀的目标检测模型不再依赖于高性能昂贵的GPU。

普通的GPU设备也能用这些策略训练出高性能的检测器,降低了训练门槛和硬件成本。

五、Results—结果

翻译

与其他先进目标检测器获得的结果对比如图8所示。我们的YOLOv4位于帕累托最优曲线上,在速度和精度方面均优于最快和最准确的检测器。

由于不同方法在验证推理时间时使用了不同架构的GPU,我们分别在常用的Maxwell、Pascal和Volta架构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列出了使用Volta GPU(如Titan Volta或Tesla V100 GPU)时的帧率对比结果。

精读

  • YOLOv4在速度和准确率方面均优于当前最快和最准确的目标检测器,表现处于帕累托最优曲线上。

  • 为了公平比较,作者分别在三种主流GPU架构(Maxwell、Pascal、Volta)上测试YOLOv4的推理速度。

  • 具体帧率对比数据分别在表8(Maxwell GPU)、表9(Pascal GPU)、表10(Volta GPU)中展示,涵盖了对应架构下常见的多款GPU型号。

总结来看,YOLOv4在多种硬件环境下都表现出色,兼顾高效与准确。

六、结论

该检测器在速度(FPS)和准确率(MS COCO AP指标)方面都优于现有的所有其他检测器。

该检测器可以在普通的8-16GB显存的GPU上训练和使用,具有较强的普适性和实用性。

传统的单阶段基于锚点的检测器设计依然有效且可行。

通过验证大量特性,筛选出一批能提升分类器和检测器准确率的关键技术。

这些技术可作为未来目标检测研究和开发的最佳实践参考。

http://www.xdnf.cn/news/618409.html

相关文章:

  • 文章记单词 | 第112篇(六级)
  • Flask框架全方位深度解析
  • Python |GIF 解析与构建(2):状态机解析
  • 2000-2023年各地级市进出口总额/地级市对外经济贸易数据
  • queue和priority_queue及其函数
  • ld: cpu type/subtype in slice (arm64e.old) does not match fat header (arm64e)
  • mysql连接池druid监控配置
  • 2025年工会考试题库及答案
  • MyBatis 中 parameterType 属性
  • AutoCAD Electrical 自定义多极元件
  • 反本能---如何对抗你的习以为常
  • 二分算法(灵神边界处理复习)
  • 电子电路:能认为电抗也是在做功吗?
  • 软件测试(4) 白盒测试
  • 归一化与标准化
  • 频率分布直方图
  • halcon初始
  • 深度剖析并发I/O模型select、poll、epoll与IOCP核心机制
  • 计算机组成原理-基本运算部件定点数的运算
  • 【安全攻防与漏洞​】​​Heartbleed漏洞复现与修复
  • 【JS】vue3具名导出与默认导出
  • [Asp.Net]GridView导出Excel长数字显示成科学计数
  • Spring Boot 项目多数据源配置【dynamic datasource】
  • C++进阶--c++11(02)
  • 【算法】: 前缀和算法(利用o(1)的时间复杂度快速求区间和)
  • 全球复合铁路枕木市场深度分析:技术革新与区域增长潜力(2024-2031)
  • IIS部署微信支付模块问题
  • 欧拉公式的历史脉络、数学证明和现代意义
  • 信息学奥赛及各种程序设计竞赛中常见的名词解释
  • Android四大组件学习总结