yolo系列总结(自用)

目录

1 yolov1

1.1 概述

1.2 统一检测

1.3 网络设计

1.4 训练

1.4.1 损失函数

1.4.2 NMS非极大值抑制

2 yolov2

2.1 概述

2.2 Better

2.2.1 BN层

2.2.2 高分辨率分类器(High Resolution Classifier)

2.2.3 先验框(Anchor Boxes)

​编辑

2.2.4 维度聚类(Dimension Clusters)

2.2.5 直接位置预测(Direct location predict)

2.2.6 细粒度特征(Fine-Grained Features)

​编辑

2.2.7 多尺度训练(Multi-Scale Training)

2.3 Faster

2.3.1 Darknet-19

​编辑

2.3.2 训练分类

2.3.3 训练检测

2.4 stronger

3 yolov3

3.1 改进之处

3.1.1 Darknet-53

3.1.2 多尺度预测(Predictions Across Scale)

3.1.3 多标签分类

4 yolov4

4.1 概述

4.1.1 目标检测模型

4.1.2 Bag of freebies(BOF)

4.1.3 Bag of specials(BOS)

4.2 方法选择

4.2.1 架构选择

4.2.2 BoF与BoS

4.2.3 进一步改进

4.2.4 不同特征对检测器训练的影响

5 yolov5

5.1 整体结构

5.2 输入端

5.2.1 Mosaic数据增强

5.2.2 自适应锚框计算

5.2.3 自适应图片缩放

5.3 backbone

5.3.1 Focus结构

5.3.2 CSP结构

5.4 Neck

5.5 Head

5.6 训练策略

6 yoloX

6.1 耦合检测头(coupled detection head)

6.2 无先验框(anchor-free)

6.3 SimOTA

7 yolov6

7.1 改进之处

7.1.1 网络设计

7.1.2 标签分配

7.1.2.1 OTA(SimOTA)

7.1.2.2 TAL(Task alignment learning—任务对齐学习)

7.1.3 损失函数

7.1.4 工业改进

7.1.4.1 自蒸馏(self-distillation)

7.1.4.2 图像灰色边界(Gray border of images)

7.1.5 量化和部署

7.2 总结

8 yolov7

8.1 改进之处

8.1.1 扩展的高效层聚合网络

8.1.2 基于连接的模型的模型缩放

8.1.3 可训练的bag-of-freebies

9 yolov8

写在后面


  • 首先强调一下,该笔记只用于个人学习,侵权自删

  • 主要参考了该博主的文章:路人贾'ω'

1 yolov1

1.1 概述

  • 处理步骤

    • 将输入的图像大小调整为448×448,分割得到7×7网格(grid cell)

    • 通过CNN提取特征和预测

    • 利用非极大值抑制(NMS)进行筛选

  • 优点

    • YOLO的速度非常快。能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。

    • YOLO在做预测时使用的是全局图像。与FastR-CNN相比,YOLO产生的背景错误数量不到一半。

    • YOLO 学到物体更泛化的特征表示。因此当应用于新域或意外输入时,不太可能崩溃。

  • 与其他模型对比

NETFPSmAP
DPM0.534.3
R-CNN-58.5
Fast R-CNN0.570
Faster R-CNN773.2
YOLO4563.4

1.2 统一检测

  • yolo提出了网格+预测框(bounding box)的检测模式。如果物体中心落入cell中,就生成两个框,每个包含了x,y(相对于cell左上角的点),w,h还有置信度(confidence)

  • 预测特征组成 最终的预测特征由边框的位置、边框的置信度得分以及类别概率组成,这三者的含义如下:

    • 边框位置: 对每一个边框需要预测其中心坐标及宽、高这4个量, 两个边框共计8个预测值边界框宽度w和高度h用图像宽度和高度归一化。因此 x,y,w,h 都在0和1之间。

    • 置信度得分(box confidence score) c : 框包含一个目标的可能性以及边界框的准确程度。类似于Faster RCNN 中是前景还是背景。由于有两个边框,因此会存在两个置信度预测值。

    • 类别概率: 由于PASCAL VOC数据集一共有20个物体类别,因此这里预测的是边框属于哪一个类别。

  • 注意

    • 一个cell预测的两个边界框共用一个类别预测, 在训练时会选取与标签IoU更大的一个边框负责回归该真实物体框,在测试时会选取置信度更高的一个边框,另一个会被舍弃,因此7×7=49个gird cell最多只能预测49个物体。

    • 因为每一个grid cell只能有一个分类,也就是他只能预测一个物体,这也是导致YOLO对小目标物体性能比较差的原因。如果所给图片极其密集,导致 grid cell里可能有多个物体,但是YOLO模型只能预测出来一个,那这样就会忽略在本grid cell内的其他物体。

1.3 网络设计

  • YOLO主要是建立一个CNN网络生成预测7×7×1024 的张量 。

  • 然后使用两个全连接层执行线性回归,以进行7×7×2 边界框预测。将具有高置信度得分(大于0.25)的结果作为最终预测。

  • 在3×3的卷积后通常会接一个通道数更低1×1的卷积,这种方式既降低了计算量,同时也提升了模型的非线性能力。

  • 除了最后一层使用了线性激活函数外,其余层的激活函数为 Leaky ReLU

    • Leaky ReLU是对负值给与一个非零的斜率,从而避免神经元死亡的情况。且由于其线性特点,使得神经网络计算和训练比sigmoid快很多。

    • 但Leaky-ReLU中的超参 alpha 需要人工调整

  • 在训练中使用了 Dropout 与数据增强的方法来防止过拟合。

  • 对于最后一个卷积层,它输出一个形状为 (7, 7, 1024) 的张量。 然后张量展开。使用2个全连接层作为一种线性回归的形式,它输出1470个参数,然后reshape为 (7, 7, 30) 。

1.4 训练

1.4.1 损失函数

  • 损失主要包括三个方面

    • 坐标损失(localization loss)

      • 1^(obj|ij)的含义:第i个cell的第j个box负责预测obj时为1,否则为0

      • 高宽误差中根号的作用:削弱大框的误差(大小框不能一视同仁)

    • 置信度损失(confidence loss)

      • 第一行:负责检测物体的那个框的置信度误差

      • 第二行:不负责检测物体的那个框的置信度误差(包括因为IoU过小而被舍去的那部分)

    • 分类损失(classification loss)

      • 负责检测物体的grid cell分类的误差

  • 交并比的计算方法

    • 在计算机视觉中,交并比(Intersection over Union,IoU)是一种衡量目标检测算法预测边界框(bounding box)与实际边界框(ground truth)重合程度的指标。IoU 通常用于评估目标检测、分割等任务的模型性能。

    • IoU 的计算方法如下:

      • 计算预测边界框与实际边界框的交集区域(intersection)面积。

      • 计算预测边界框与实际边界框的并集区域(union)面积。

      • 计算交集面积与并集面积的比值,即 IoU = (intersection) / (union)。

    • IoU 的取值范围为 0 到 1。当 IoU 为 0 时,表示预测边界框与实际边界框完全不重叠;当 IoU 为 1 时,表示预测边界框与实际边界框完全重合。因此,较高的 IoU 值表示目标检测算法具有较好的性能。

    • 在评估模型性能时,通常会设置一个 IoU 阈值(例如 0.5),只有当预测边界框与实际边界框的 IoU 大于该阈值时,才认为预测是正确的。不同的阈值设置会影响模型的精度和召回率,从而影响模型的整体性能评估。

1.4.2 NMS非极大值抑制

  • NMS算法主要解决的是一个目标被多次检测的问题,意义主要在于在一个区域里交叠的很多框选一个最优的

  • 具体操作为,先针对某一种类中的所有框进行比较,如果二者IoU大于某一阈值,则认定为统一物体,概率小的一方会被置为0

  • 对7×7×2=98列数据而言,最后会得到一个稀疏矩阵,取非0部分即为最后的目标检测结果

  • NMS只发生在预测阶段,训练阶段是不能用NMS的

2 yolov2

2.1 概述

  • yolov1的不足

    • 定位不准确

    • 和基于region proposal的方法相比召回率较低

  • yolo的改进

    • YOLO9000: 先进,实时的目标检测方法,可检测9000多类物体

    • 多尺度训练方法( multi-scale training): 相同的YOLOv2模型可以在不同的大小下运行,在速度和精度之间提供了一个简单的折中

    • mAP表现更好: 67FPS,在VOC 2007上76.8 mAP,在40 FPS,78.6mAP;而且速度更快。

    • 提出了一种联合训练目标检测和分类的方法: 使用该方法在COCO目标检测数据集和Imagenet图像分类数据集上,训练出了YOLO9000

    • 可以检测出更多的类别: 即使这些类别没有在目标检测的数据集中出现

2.2 Better

2.2.1 BN层

  • CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,对网络的每一层的输入(每个卷积层后)都做了归一化(Batch Normalization),这样网络就不需要每层都去学数据的分布,收敛会更快,mAP获得了2%的提升。Batch Normalization 也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合

2.2.2 高分辨率分类器(High Resolution Classifier)

  • 在预训练过程中之间将输入尺寸调整为448×448的尺寸,微调的时候也是448×448,使mAP增加了4%

2.2.3 先验框(Anchor Boxes)

  • 所谓先验框,就是指在图像上预设好的不同大小,不同长宽比的参照框。在训练时,以真实的边框位置相对于预设边框的偏移来构建训练样本

  • 先验框的长宽比与面积,相当于是一系列的框生成规则。由于anchor的中心点是以CNN提取到的Feature Map的点为中心位置,所以可以在任意位置生成一系列边框

  • Anchor的构成

    • 使用CNN提取的Feature Map的点,来定位目标的位置

    • 使用Anchor Box的Scale来表示目标的大小

    • 使用Anchor Box的Aspect Ratio来表示目标的形状

  • 效果:使用Anchor,模型的mAP值从69.5降到了69.2,下降了一丢丢,而召回率却从81%提高到了88%

  • 与v1的对比

YOLOv1YOLOv2
初始设置初始生成两个boxes,加大了学习复杂度Anchor初始是固定的,但在训练过程中会进行微调。使用Anchor boxes之后,每个位置的各个Anchor box都单独预测一组分类概率值
输入公式(框数×信息数)+分类数框数×(信息数+分类数)
公式含义在YOLOv1中,类别概率是由grid cell来预测的,每个cell都预测2个boxes,每个boxes包含5个值,每个grid cell 携带的是30个信息。但是每个cell只预测一组分类概率值,供2个boxes共享在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由cell决定,因此这边每个box对应25个预测值。每个grid cell携带的是 25 × 5 =125个信息,25是 xywh+置信度+分类数,5就是5个Anchor。
输出框7 × 7 × 2 = 98个框13 × 13 × 5 = 845个框
输出值7 ×7 × 3013 × 13 × 5 × 25

2.2.4 维度聚类(Dimension Clusters)

  • Faster R-CNN的先验框时手工指定的,针对这一问题,yolo在训练集的边界框上运行K-means聚类训练boxes,以自动找到更好(IoU更大)的宽高维度。所以聚类分析时选用box与聚类中心box之间的IoU值作为距离指标。

  • K-means步骤

    • 选择初始化的K个样本作为初始聚类中心

    • 针对数据集中每个样本,计算它到K个聚类中心的距离,并将其分到距离最小的聚类中心所对应的类中

      • 公式:d(box, centroid) = 1 − IOU(box, centroid) (box:其他框, centroid:聚类中心框)

    • 针对每个类别,重新计算它的聚类中心

    • 重复上面的步骤2、3,直到达到某个终止条件(迭代次数、最小误差变化)

    • K=5时为最佳,K越大就生成越多的Anchor,越多的框自然准确率就能上去了,但同时也成倍的增加了模型的复杂度。R-CNN就是因为提取2K个候选框拉跨的

2.2.5 直接位置预测(Direct location predict)

  • 预测的边界框相对于特征图的中心坐标(bx,by)和宽高bw、bh的计算公式需要进行限制

  • 预测边界框中心点相对于对应cell左上角位置的相对偏移值。将网格归一化为1×1,坐标控制在每个网格内,同时配合sigmod函数将预测值转换到0~1之间的办法,做到每一个Anchor只负责检测周围正负一个单位以内的目标box

2.2.6 细粒度特征(Fine-Grained Features)

  • 为了能够预测小物体,在模型中添加了一个直通层(passthrough layer),获取前层26×26的分辨率特征。具体操作为,

  • 提取Darknet-19最后一个maxpooling层的输入,得到26×26×512的特征图。经过1×1×64的卷积以降低特征图的维度,得到26×26×64的特征图,然后经过pass through层的处理变成13x13x256的特征图(抽取原特征图每个2x2的局部区域组成新的channel,即原特征图大小降低4倍,channel增加4倍),再与13×13×1024大小的特征图连接,变成13×13×1280的特征图,最后在这些特征图上做预测

  • 具体操作如下:

  • 一个feature map,也就是在最后的池化之前,分成两路:一路是做拆分,分成四块,四块拼成一个长条,另一个是做正常的池化卷积操作,最后两个长条叠加输出

2.2.7 多尺度训练(Multi-Scale Training)

  • yolov2的输入大小并不固定,而是每10个批次就选择一个新的图像尺寸大小(以32的倍数提取,320、352、……608)

  • 在小尺寸图片检测中,YOLOv2成绩很好,输入为228 × 228的时候,帧率达到90FPS,mAP几乎和Faster R-CNN的水准相同。使得其在低性能GPU、高帧率视频、多路视频场景中更加适用。在大尺寸图片检测中,YOLOv2达到了先进水平,VOC2007 上mAP为78.6%,仍然高于平均水准

2.3 Faster

2.3.1 Darknet-19

  • 结构上类似于VGG,含有19个卷积层和5个池化层

2.3.2 训练分类

  • 训练数据集: 标准ImageNet 1000类分类数据集

  • 训练参数: 对网络进行160个epochs的训练,使用初始学习率为0.1随机梯度下降法、4的多项式率衰减法、0.0005的权值衰减法和0.9的动量衰减法

  • 模型: 使用的是Darknet神经网络框架。

  • 数据增强: 在训练中使用标准的数据增强技巧,包括随机的裁剪、旋转、色相、饱和度和曝光变化。

  • 如上所述,在最初的224×224图像训练之后,然后放到448 × 448上微调,但只训练约10个周期。在这个高分辨率下,网络达到很高精度。微调时,10epoch,初始lr0.001。

  • 结果: 高分辨率下训练的分类网络在top-1准确率76.5%,top-5准确率93.3%

2.3.3 训练检测

  • 移除最后一个卷积层、global avgpooling层和softmax

  • 增加3个3x3x1024的卷积层

  • 增加passthrough层

  • 增加一个1×1个卷积层作为网络输出层。输出的channel数为num_ anchors×(5+num_ calsses)(num_anchors在文中为5,num _classes=20是类别个数,5是坐标值和置信度)

2.4 stronger

  • YOLOv2和YOLO9000算法在2017年CVPR上被提出,重点解决YOLOv1召回率和定位精度方面的误差。

  • YOLOv2: 是在YOLOv1的基础上改进得到,改进之处主要有:Batch Normalization (批量归一化)、High Resolution Classfier(高分辨率的分类器)、Convolutional With Anchor Boxes (带锚框的卷积)、Dimension Clusters (维度聚类)、Direct location prediction (直接位置预测)、Fine-Grained Feature (细粒度特性)、Multi-Scale Training (多尺度训练),它的特点是“更好,更快,更强”。

  • YOLO9000: 的主要检测网络也是YOLO v2,同时使用WordTree来混合来自不同的资源的训练数据,并使用联合优化技术同时在ImageNet和COCO数据集上进行训练,目的是利用数量较大的分类数据集来帮助训练检测模型,因此,YOLO9000的网络结构允许实时地检测超过9000种物体分类,进一步缩小了检测数据集与分类数据集之间的大小代沟。

  • YOLO9000是怎样进行联合训练的? YOLO9000采用 YOLO v2的结构,Anchorbox由原来的5调整到3,对每个Anchor box预测其对应的边界框的位置信息x , y , w , h和置信度以及所包含的物体分别属于9418类的概率,所以每个Anchor box需要预测4+1+9418=9423个值。每个网格需要预测3×9423=28269个值。在训练的过程中,当网络遇到来自检测数据集的图片时,用完整的 YOLO v2 loss进行反向传播计算,当网络遇到来自分类数据集的图片时,只用分类部分的loss进行反向传播。

  • YOLO 9000是怎么预测的? WordTree中每个节点的子节点都属于同一个子类,分层次的对每个子类中的节点进行一次softmax处理,以得到同义词集合中的每个词的下义词的概率。当需要预测属于某个类别的概率时,需要预测该类别节点的条件概率。即在WordTree上找到该类别名词到根节点的路径,计算路径上每个节点的概率之积。预测时, YOLO v2得到置信度,同时会给出边界框位置以及一个树状概率图,沿着根节点向下,沿着置信度最高的分支向下,直到达到某个阈值,最后到达的节点类别即为预测物体的类别。

3 yolov3

  • 作者自述

Sometimes you just kinda phone it in for a year, youknow? I didn’t do a whole lot of research this year. Spent a lot of time on Twit

  • 所以,v3的改动其实很有限,最主要的改进之处为以下三点:

    • 更好的backbone(骨干网络)(从v2的darknet-19到v3的darknet-53,类似于ResNet引入残差结构)

    • 多尺度预测(引入FPN)

    • 考虑到检测物体的重叠情况,用多标签的方式替代了之前softmax单标签方式,分类器不再使用softmax(darknet-19中使用),损失函数中采用binary cross-entropy loss(二分类交叉损失熵)

3.1 改进之处

3.1.1 Darknet-53

It has 53 convolutional layers so we call it.... wait for it..... Darknet-53!

  • 其实就是resnet50的翻版,含有残差结构(residual)

3.1.2 多尺度预测(Predictions Across Scale)

  • 真正的多尺度(v2那个只是调了输入图片的大小),一共三种尺寸,分别是13×13、26×26、52×52三种分辨率,分别负责预测大,中,小的物体边框,这种改进对小物体检测更加友好

    • 举个例子,假如输入416×416的图像,则会得到13×13(416/32),26×26以及52×52这3个尺度的特征图。

3.1.3 多标签分类

  • 为了解决物体之间相互覆盖,导致同一个感受野中包含多个物体的问题。softmax只适用于单目标多分类(甚至类别是互斥的假设),但目标检测任务中可能一个物体有多个标签。(属于多个类并且类别之间有相互关系),比如Person和Women。

  • YOLOv3 使用的是logistic 分类器,而不是之前使用的softmax。

  • 在YOLOv3 的训练中,便使用了Binary Cross Entropy ( BCE, 二元交叉熵) 来进行类别预测。

4 yolov4

4.1 概述

  • 提高CNN准确性的方法

    • 专用特性:一些特征只针对某一模型、某一问题或仅为小规模数据集

    • 通用特性: 一些特性,如批处理规范化和残差连接,则适用于大多数模型、任务和数据集。这些通用特性包括加权剩余连接(WRC)、跨阶段部分连接(CSP)、跨小批标准化(CmBN)、自反训练(SAT)和Mish 激活函数

    • yolov4的新特性有:WRC、CSP、CmBN、SAT、Mish 激活函数、Mosaic数据增强、CmBN、DropBlock正则化、CIoU损失,结合这些技巧实现先进的结果

4.1.1 目标检测模型

  • 目标检测算法

    • 头部head: 对图像特征进行预测,生成边界框和并预测类别

      • 一级目标检测

        • YOLO、SSD、RetinaNet

      • 二级目标检测

        • R-CNN、Fast R-CNN、Faster R-CNN、R-FCN、Libra R-CNN

      • 无锚单级

        • CenterNet、CornerNet、FCOS

    • 颈部neck(由自上而下和自下而上的路径组成)

      • FPN(特征金字塔)

      • PAN(路径聚合网络)

      • BiFPN

      • NAS-FPN

    • 主干backbone: 在ImageNet上预先训练的网络用来特征提取

      • GPU:VGG、ResNet、ResNeXt、DenseNet

      • CPU:SqueezeNet、MobileNet、ShufflfleNet

4.1.2 Bag of freebies(BOF)

  • 只会改变培训策略或只增加培训成本的方法

  • 数据增强

    • 像素级调整

      • 光度失真: brightness(亮度)、contrast(对比度)、hue(色度)、saturation(饱和度)、noise(噪声)

      • 几何失真: scaling(缩放尺寸)、cropping(裁剪)、flipping(翻转)、rotating(旋转)

    • 模拟目标遮挡

      • erase(擦除)、CutOut(剪切): 随机选择图像的矩形区域,并填充随机或互补的零值

      • hide-and-seek和grid mask: 随机或均匀地选择图像中的多个矩形区域,并将它们替换为全零

      • 将上述方式作用于特征图上: DropOut、DropConnect、DropBlock

    • 将多张图像组合在一起

      • MixUp: 使用两个图像以不同的系数比率相乘后叠加,利用叠加比率调整标签

      • CutMix: 将裁剪的图像覆盖到其他图像的矩形区域,并根据混合区域大小调整标签

    • 使用style transfer GAN进行数据扩充,有效减少CNN学习到的纹理偏差

      • 基于GAN(生成对抗网络)的图像风格迁移

      • 纹理特征:纹理特征刻画了图像中重复出现的局部模式与他们的排列规则

  • 语义分布偏差

    • 单阶段:focal损失处理各类之间存在的数据不平衡问题

    • 两阶段:使用硬反例挖掘或在线硬例挖掘来解决(不适用于单级目标检测

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

    • IoU损失:将预测BBox区域的区域和真实BBox区域考虑在内。由于IoU是尺度不变的表示,它可以解决传统方法在计算{x, y, w, h}的l1或l2损耗时,损耗会随着尺度的增大而增大的问题。

    • GIoU loss: 除了覆盖区域外,还包括了物体的形状和方向。他们提出寻找能够同时覆盖预测BBox和地面真实BBox的最小面积BBox,并以此BBox作为分母来代替IoU损失中原来使用的分母。

    • DIoU loss: 它额外考虑了物体中心的距离。

    • CIoU loss : 同时考虑了重叠区域、中心点之间的距离和纵横比。对于BBox回归问题,CIoU具有更好的收敛速度和精度。

4.1.3 Bag of specials(BOS)

  • 只增加少量推理成本但又能显著提高目标检测精度的插件模块和后处理方法

  • 增强感受野

    • SPP模块(指定空间特征金字塔):将softmax最后的pooling层变成SPP模块,使其可以以任意尺寸接入

    • ASPP模块:通过并联的采用不同膨胀速率的空洞卷积层用于捕捉多尺度信息

    • RFB模块:在inception的基础上加入了空洞卷积,从而增大感受野

  • 注意力机制

    • channel_wise注意力:Squeeze-and-Excitation挤压激励模块(SE)

    • point-wise注意力:Spatial Attention Module空间注意模块(SAM)

  • 特征融合

    • SFAM:利用SE模块在多尺度的拼接特征图上进行信道级重加权

    • ASFF:使用softmax对多尺度拼接特征图在点维度进行加权

    • BiFPN:多输入加权剩余连接来执行按比例的水平重加权,然后添加不同比例的特征图

  • 激活函数

    • LReLU和PReLU:主要目的是解决输出小于0时ReLU的梯度为零的问题。

    • ReLU6和hard-Swish:专门为量化网络设计的。

    • SELU: 针对神经网络的自归一化问题。

    • Swish和Mish:都是连续可微的激活函数

  • 后处理

    • NMS

    • soft NMS

    • DIoU

4.2 方法选择

4.2.1 架构选择

  • 架构选择目标

    • 在输入网络分辨率、卷积层数、参数数(filter size2×filters × channel / groups)和层输出数(filters)之间找到最优平衡

    • 选择额外的块来增加感受野

    • 选择不同的主干层对不同的检测器层(如FPN、PAN、ASFF、BiFPN)进行参数聚合的最佳方法

  • CSPDarknet53主干(backbone)

  • SPP附加模块增加感受野

  • PANet路径聚合(neck)

  • 基于锚点的yolov3头部(head):anchor-base

4.2.2 BoF与BoS

  • 激活函数:ReLU6

  • 正则化:DropBlock

  • 归一化:没有考虑syncBN

4.2.3 进一步改进

  • Mosaic数据增强:借鉴了CutMix的思想(混合了两张图像),这里提出的Mosaic随机混合四张图像,随机缩放、随机裁剪、随机排布。四张不同图像的上下文信息被混合,这样在BN在计算信息时候,也就减少了mini-batch的尺寸,进而对与单张GPU运算有好处

  • SAT(自我对抗训练):训练一个基本的分类器网络,如卷积神经网络(CNN)或全连接神经网络(FCN),用于解决一个特定任务。在训练过程中,引入随机扰动或正则化项来增加模型输出的不确定性。这通常可以通过添加dropout、噪声注入或权重衰减等方法来实现。对模型输出进行扰动,产生对抗样本。通常可以使用FGSM(Fast Gradient Sign Method)或PGD(Projected Gradient Descent)等方法来生成对抗样本。 使用这些对抗样本重新训练模型,以增加模型鲁棒性。这一步通常称为“对抗训练”。可以反复执行步骤3和步骤4,直到模型在对抗样本上表现出足够的鲁棒性。

  • 应用遗传算法选择最优超参数

  • 修改现有的方法,使设计适用于有效的训练和检测

    • 修改的SAM: 将SAM从空间上的注意修改为点态注意

    • 修改PAN: 将PAN的快捷连接替换为shortcut 连接

    • 交叉小批量标准化(CmBN): CmBN表示CBN修改后的版本,如图所示,只在单个批内的小批之间收集统计信息

4.2.4 不同特征对检测器训练的影响

  • S:消除网格灵敏度的公式

  • 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-使用不同的损失算法进行边界框回归

5 yolov5

5.1 整体结构

  • 输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放

  • Backbone:Focus结构,CSP结构

  • Neck:FPN+PAN结构

  • Head:CIOU_loss

5.2 输入端

5.2.1 Mosaic数据增强

  • 主要步骤

    • 随机选取图片拼接基准点坐标(xc, yc),另随机选取四张图片

    • 四张图片根据基准点,分别经过尺寸调整和比例缩放后,放置在指定尺寸的大图的左上,右上,左下,右下位置

    • 根据每张图片的尺寸变换方式,将映射关系对应到图片标签上

    • 依据指定的横纵坐标,对大图进行拼接。处理超过边界(每张子图的边界)的检测框坐标

  • 优点

    • 丰富数据集:随机使用4张图像,随机缩放后随机拼接,增加很多小目标,大大增加了数据多样性

    • 增强模型的鲁棒性:混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标

    • 加强BN的效果:当模型设置BN操作后,训练时会尽可能增大批样本总量,因为BN原理为计算每一个特征层的均值和方差,如果批样本总量越大,BN计算的均值和方差就越接近于整个数据集的均值和方差,效果越好

    • Mosaic数据增强算法有利于提升小目标检测性能:Mosaic数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标,从而提升了模型的检测能力

5.2.2 自适应锚框计算

  • yolov5将计算初始锚框的功能嵌入进了训练代码中,所以在每次训练开始之前,都会根据不同的数据集来自适应计算anchor

  • 具体过程

    • 获取数据集中所有目标的宽和高

    • 将每张图片中按照等比例缩放的方式到resize指定大小,这里保证宽高中的最大值符合指定大小

    • 将bboxes从相对坐标改为绝对坐标(乘以缩放后的宽高)

    • 筛选bboxes,保留宽高都大于等于两个像素的bboxes

    • 使用k-means聚类三方得到n个anchors

    • 使用遗传算法随机对anchors的宽高进行变异。倘若变异后的效果好,就将变异后的结果赋值给anchors,如果变异后效果变差则跳过,默认变异1000次。这里是使用anchor_fitness方法计算得到适应度fitness,然后再评估

5.2.3 自适应图片缩放

  • 主要过程

    • 根据原始图片大小以及输入到网络的图片大小计算缩放比例

    • 根据原始图片大小与缩放比例计算缩放后的图片大小

    • 计算黑边填充数值

  • 注意

    • yolov5中填充的灰色,即(114,114,114)

    • 训练时没有采用缩减黑边的方式,而是采用传统填充的方式(缩放到416×416的大小),只是在测试时缩减黑边

    • mod32的原因:yolov5经过5次下采样,而2的5次方等于32.所以至少要去掉32的倍数再取余,以免产生尺度太小走不完stride的问题

5.3 backbone

5.3.1 Focus结构

  • 具体操作为在一张图片中每隔一个像素拿到一个值,类似于下采样,拿到4张图片。将W.H信息集中到通道空间,输入通道扩充了4倍,RGB3通过扩充为12条,最后将得到新图片进行卷积操作

  • 切片操作如下

  • 作用:可以使信息不丢失的情况下提高计算力

  • 不足:Focus对某些设备不支持且不友好,开销很大

  • 改进:新版本的v5将focus模块换成了6×6的卷积层,二者计算量等价,但对于GPU来说6×6会更有效

5.3.2 CSP结构

  • 关于CSPNet(Cross Stage Partial Network,跨阶段局部网络),

  • CSPNet的提出主要是为了解决三个问题:

    • 问题1:增强CNN的学习能力,能够轻量化的同时保持准确性

      神经网络推理过程中计算量过高是网络优化中的梯度信息重复所导致的。CSPNet将梯度的变化从头到尾集成到特征图中,这样就可以在减少了计算量的同时可以保证准确率。

    • 问题2:降低计算瓶颈

      过高的计算瓶颈会导致更多的周期来完成神经网络的推理过程,或者一些算术单元经常处于空闲状态。因此,如果能在CNN的每一层上均匀地分配计算量,就能有效地提高每个计算单元的利用率,从而减少不必要的能耗。

    • 问题3:降低内存成本

      在特征金字塔生成过程中采用跨通道池来压缩特征映射,可以减少内存使用。

  • 基本思想

    • 将之前所有层的输出特征连接起来,作为下一层的输入,使分支路径(cardinality)的数量最大化

    • 由梯度信息结合的思想,让高cardinality和稀疏性连接来提升网络的学习能力

  • 其实就是把输入的feature map分成2个part,其中一个不处理,另一个经过特定block的卷积处理,最后在局部转移层(Paritical Transition Layer)中进行二个分支的堆叠concat。从思想上看,与RPNRegion

  • 从实验结果来看,分类问题中,使用CSPNet可以降低计算量,但是准确率提升很小;在目标检测问题中,使用CSPNet作为Backbone带来的提升比较大,可以有效增强CNN的学习能力,同时也降低了计算量。

  • v5与v4的不同之处在于,v4只在主干中使用CSP结构,而v5中设计了两种CSP结构,一条应用于Backbone,另一条应用于Neck

5.4 Neck

  • FPN

    • 自下而上,自上而下,横向连接和卷积融合

    • 自下而上:先把预处理好的图片送进预训练的网络,比如像ResNet这些,这一步就是构建自下而上的网络,就是对应下图中的(1,2,3)这一组金字塔。

    • 自上而下:将层3进行一个复制变成层4,对层4进行上采样操作(就是2 * up),再用1 * 1卷积对层2进行降维处理,然后将两者对应元素相加(这里就是高低层特征的一个汇总),这样我们就得到了层5,层6以此类推,是由层5和层1进行上述操作得来的。这样就构成了自上而下网络,对应下图(4,5,6)金字塔。(其中的层2与上采样后的层4进行相加,就是横向连接的操作)

    • 卷积融合:最后我们对层4,5,6分别来一个3 * 3卷积操作得到最终的预测(对应下图的predict)。

  • PAN

  • 在FPN的自上而下形成的特征金字塔的基础上,来以下这波操作就是PAN

  • 先复制特征金字塔中最底下的那层(①),变成新特征金字塔的最底层。

  • 将新特征金字塔的最底层来一个下采样操作,然后原特征金字塔的倒数第二层进行一个3 * 3卷积,步幅为2;然后与下采样后的最底层进行一个横向连接,两者相加。最后再来一个3 * 3卷积来融合他们的特征。

  • 新特征金字塔其他层的操作与(2)一致。

5.5 Head

  • Bounding box损失函数

    • YOLO v5采用CIOU_LOSS作为bounding box的损失函数

  • NMS非极大值抑制

    • 抑制检测时冗余的框

5.6 训练策略

  • 多尺度训练。如果网络输入416×416,那么训练的时候会从0.5×416到1.5×416中任意取值,但所取的值都是32的整数倍

  • 训练开始前使用warmup进行训练。在模型预训练阶段,先使用较小的学习率训练一些epochs或者steps,再修改为预先设置的学习率进行训练

  • 使用了cosine学习率下降策略

  • 采用了EMA更新权重。相当于训练时给参数赋予一个动量,这样更新起来就会更加平滑

  • 使用了amp进行混合精度训练,能够减少显存的占用并且加快训练速度,但是需要GPU的支持

6 yoloX

6.1 耦合检测头(coupled detection head)

  • 主要由三个分支组成,分别对应类别、边框和IoU(解耦)

  • 对不同预测特征图采用不同的head,即参数不共享

6.2 无先验框(anchor-free)

  • 经过从v2-v5后,yoloX又把检测方式改回了基于锚点的

  • 还是老一套,把预测中心相对grid cell的偏移量作为边框参数

6.3 SimOTA

  • 比较有意思的一点是,OTA居然也是旷视科技出品的。为了这叠醋,特意包了这顿饺子

  • OTA(Optimal Transport Assignment,最优传输问题)将目标检测中的标签分配视为最佳传输问题,自适应地寻找当前特征点应该去拟合的真实框

  • SimOTA是OTA的简化版本,它减少了额外的超参数并保持了性能

  • 其所解决的问题为:M个正样本如何分配给N个Gt 框去做预测的优化问题

  • 算法组成

    • 划分正负样本,落在Gt 框中的特征点预测位置的样本为正样本

    • Cost代价矩阵计算

      • cost =  pair_wise_cls_loss + 3.0 * pair_wise_ious_loss + 100000.0 *
         (~is_in_boxes_and_center)
      • 由分类准确度、回归准确度(反映重合程度)、是否在GT Box和fixed center area交集内三部分组成

      • cost是选取匹配正样本的代价,在选取时会优先选择gt附近区域的优质样本做cost计算

    • 样本与真值匹配

      • IOU矩阵决定当前gt选取多少正样本

      • COST矩阵决定gt匹配哪些正样本

  • 具体做法

    • 计算每个目标cost最低的10个特征点

    • 把这10个特征点预测的预测框与真实框做IOU操作,得到10个IOU的值

    • 把10个IOU的值进行sum操作会得到一个值,即为dynamic_k(正样本数量)

  • 不足:SimOTA在yoloX里面首次引入,但其会拉慢训练速度,容易导致训练不稳定

    • 所以,yolov6需要一个新的方法来代替SimOTA

7 yolov6

7.1 改进之处

7.1.1 网络设计

  • 主干:EffificientRep(backbone)

    • 小模型中使用RepBlock

    • 大模型中使用CSP StackRep Blocks

    • 将步长为2的普通Conv替换成了步长为2的RepConv

    • 将CSP-Block重新设计为了RepBlock

    • 将SPPF优化设计为了更加高效的SimSPPF

  • 颈部:Rep-PAN

    • Rep-PAN 基于PAN拓扑方式,用RepBlock替换了YOLOv5中使用的CSP-Block,同时对整体Neck中的算子进行了调整,目的是在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力

  • 头部:Efficient decoupled head

    • 将中间3×3的卷积层减少为1

    • head的尺度和backbone及neck同大同小

    • Anchor-free:拿掉了从第二代开始引入的先验框

      • 原因: 由于 Anchor-based检测器需要在训练之前进行聚类分析以确定最佳 Anchor 集合,这会一定程度提高检测器的复杂度 在一些边缘端的应用中,需要在硬件之间搬运大量检测结果的步骤,也会带来额外的延时

      • 两种Anchor-free的方式

        • 基于锚点——FCOS(v6使用的)

        • 基于关键点——CornerNet

7.1.2 标签分配

7.1.2.1 OTA(SimOTA)
  • OTA 将目标检测中的标签分配视为最佳传输问题,自适应地寻找当前特征点应该去拟合的真实框

  • SimOTA 是 OTA 的简化版本,它减少了额外的超参数并保持了性能

  • 其所解决的问题为:M个正样本如何分配给N个Gt 框去做预测的优化问题

  • 算法组成

    • 划分正负样本,落在Gt 框中的特征点预测位置的样本为正样本

    • Cost代价矩阵计算

      • cost =  pair_wise_cls_loss + 3.0 * pair_wise_ious_loss + 100000.0 * (~is_in_boxes_and_center)
      • 由分类准确度、回归准确度(反映重合程度)、是否在GT Box和fixed center area交集内三部分组成

      • cost是选取匹配正样本的代价,在选取时会优先选择gt附近区域的优质样本做cost计算

    • 样本与真值匹配

      • IOU矩阵决定当前gt选取多少正样本

      • COST矩阵决定gt匹配哪些正样本

  • 具体做法

    • 计算每个目标cost最低的10个特征点

    • 把这10个特征点预测的预测框与真实框做IOU操作,得到10个IOU的值

    • 把10个IOU的值进行sum操作会得到一个值,即为dynamic_k(正样本数量)

  • 不足:SimOTA在yoloX里面首次引入,但其会拉慢训练速度,容易导致训练不稳定

    • 所以,yolov6需要一个新的方法来代替SimOTA

7.1.2.2 TAL(Task alignment learning—任务对齐学习)
  • TAL 是在 TOOD 中被提出的,其中设计了一个【分类得分和定位框质量的统一度量标准】,使用该度量结果代替 IoU 来帮助分配标签,有助于解决任务不对齐的问题,且更稳定,效果更好

  • 步骤

    • 在各个特征层计算gt与预测框IoU及与分类得分乘积作为score,进行分类检测任务对齐

    • 对于每个gt选择top-k个最大的score对应bbox

    • 选取bbox所使用anchor的中心落在gt内的为正样本

    • 若一个anchor box对应多个gt,则选择gt与预测框IoU最大那个预测框对应anchor负责该gt

7.1.3 损失函数

  • 分类损失(Classification Loss)

    • VariFoca Loss(VFL):提出了非对称的加权操作

    • 针对正负样本有不平衡的问题和正样本中不等权的问题,来发现更多有价值的正样本。因此选择VariFocal Loss 作为分类损失

  • 回归框(Box Regression Loss)

    • IoU系列损失

      • SIoU Loss在小模型上提升明显, GIoU Loss在大模型上提升明显,因此选择SIoU (for n/t/s) /GIoU (for m/l) 损失作为回归损失

    • 概率损失

      • Distribution Focal Loss (DFL) 和 Distribution Focal Loss (DFL) v2可以带来一定的性能提升,但是对效率影响较大,因此弃用

  • 目标损失(Object Loss)

    • Object loss 首次提出是在 FCOS 中,用于降低 low-quality bbox 的得分,利于在 NMS 中过滤掉,YOLOX 中使用了该 loss 来加 速收敛并提升准确性,但 YOLOv6 中使用同样的方法后并无收益

7.1.4 工业改进

7.1.4.1 自蒸馏(self-distillation)
  • 知识蒸馏是通过构建一个轻量化的小模型,利用性能更好的大模型的监督信息,来训练这个小模型,以期达到更好的性能和精度

  • 注意力蒸馏:把大网络学习到的注意力特征图(attention map)迁移到小网络中

  • 自蒸馏:网络本身既是教师模型又是学生模型,但经过预训练

    • 开始时老师的软标签更容易学习,但随着迭代次数提升,学生与教师相匹配

  • 自蒸馏被分别应用在分类分支,预测框回归任务以及权重衰减

7.1.4.2 图像灰色边界(Gray border of images)
  • 图像周围半截灰色的边框有助于检测图像边缘的物体,但会降低推理速度

  • 淡化策略:在最后一轮epoch中关闭马赛克(mosaic)增强

  • 将带灰框的图片直接调整为目标图像的大小,并且改变灰色边框的面积

7.1.5 量化和部署

  • 重新参数化

    • RepOptimizer 提出了在每次训练的时候进行梯度重参数化,该方法能够较好的解决基于重参数化的模型。

    • YOLOv6 中就使用了 RepOptimizer 用于获得 PTQ-friendly 的权重,其特征的分布是非常狭窄的,能够有利于量化

  • 敏感度

    • 通过将量化敏感操作部分转换为浮点计算,进一步提高了 PTQ 性能为了得到敏感性分布,作者使用了 mean-square error (MSE), signal-noise ratio (SNR) 和 cosine similarity

  • 基于通道蒸馏的量化感知训练

    • 为防止PTQ不足,作者引入QAT (训练中量化),保证训练推理一致,作者同样使用RepOptimizer,此外使用channel-wise蒸馏

7.2 总结

  • yolo系列的发展

    • yolov1-v3:开辟了one_stage检测器的新道路

    • yolov4:将检测框架重组为独立的几个部分

    • v5-v7:缝缝补补

    • v8:?

  • 与yolov6(2022)同时期的竞争对手

    • YOLOv5、YOLOX、PPY-OLOE、YOLOv7

  • yolov6解决的问题

    • RepVGG提出的结构重参数化方法表现良好,但在此之前没有检测模型使用。作者认为RepVGG的block缩放不合理,小模型和大模型

    • 没必要保持相似网络结构;小模型使用单路径架构,大模型就不适合在单路径上堆参数量。

    • 使用重参数化的方法后,检测器的量化也需要重新考虑,否则因为训练和推理时的结构不同,性能可能会退化。

    • 前期工作很少关注部署。前期工作中,推理是在V100等高配机器完成的,但实际使用时往往用T4等低功耗推理gpu,作者更关注后者的性能。

    • 针对网络结构的变化,重新考虑标签分配和损失函数。

    • 对于部署,可以调整训练策略,在不增加推理成本的情况下提升性能,如使用知识蒸馏

  • 未来的发展方向

    • 在多种硬件平台上,设计硬件友好的模型。

    • 支持 ARM 平台部署以及量化蒸馏等全链条适配。

    • 横向拓展和引入关联技术,如半监督、自监督学习等等。

    • 探索 YOLOv6 在更多的未知业务场景上的泛化性能

8 yolov7

  • SOTA需要具备哪些特性?

    • 更快更有效的网络

    • 更有效的特征集成方法

    • 更准确的检测方法

    • 更有鲁棒性的损失函数

    • 更有效的标签匹配方法

    • 更有效的训练方法

8.1 改进之处

8.1.1 扩展的高效层聚合网络

  • VoVNet

    • 一个基于连接的模型,由OSA(One-Shot Aggregation)组成,将DenseNet改进的更加高效,区别于常见的plain结构和残差结构,该结构不仅继承了DenseNet的多感受野表示多种特征的优点,也解决了密集连接效率低下的问题

      OCA模块:

  • CSPVoVNet

    • CSP的VoV变体,CSPVoVNet除了考虑到参数量、计算量、计算密度、ShuffleNet v2提出的内存访问成本(输入输出通道比,架构分支数量,element-wise等),还分析了梯度路径,可以让不同层的权重学习到更具有区分性的特征

  • E-ELAN

  • 使用组卷积来增大通道和计算块的基数(expand cardinality)

  • 将计算块得到的特征图打乱顺序,分配到各个组里进行拼接(shuffle)

  • 将每个组的特征相加

8.1.2 基于连接的模型的模型缩放

  • 目的:调整模型的某些属性,并生成不同比例的模型,以满足不同速度的需要

  • 作者对于连接模型,提出了一种复合模型方法,在考虑计算模块深度因子缩放的同时也考虑过渡层宽度因子做同等量的变化

  • 当对连接结构的网络进行尺度缩放时,只缩放计算块的深度,转换层的其余部分只进行宽度的缩放

8.1.3 可训练的bag-of-freebies

  • 训练与预测的解耦合

    • 训练结构

      • 当输入输出维度不一致时(步长大于1),则含有3×3、1×1、shortcut三个分支

      • 当输入输出维度不一致时,在后三层卷积中不仅由1×1的identity connection,还有一个无卷积的直接进行特征融合的identity connection

    • 预测结构:删除掉所有连接,退化为一个单一的VGG

  • Auxiliary head(辅助头)

    • 深度监督是在网络中间层增加额外的辅助训练头(Auxiliary head),以及以Auxiliary损失为导向的浅层网络权值

    • Auxiliary head用于辅助训练,Lead head用于最终的输出

  • 标签分配器

    • 不再是hard label的硬性指向,而是以概率形式描述的soft label(40%是人,60%是只因)

    • 两个头采用独立的分配器结构

  • 导向标签分配器:主要基于Lead head的预测结果和GT来计算,并通过优化过程生成soft label 。这组soft label 将用作Auxiliary head和Lead head的训练(lead head能够只学习Auxiliary head没有学习到的特征

  • 由粗到精的标签分配器

    • 在这个过程中生成了两组不同的soft label,即粗标签和细标签

      • 细标签与Lead head 在标签分配器上生成的soft label相同

      • 粗标签是通过放宽认定positive target的条件生成的,也就是允许更多的grids作为positive target

  • 其它的可训练“工具”

    • conv-bn-activation topology中的Batch normalization:这部分主要将batch normalization layer直接连接到convolutional layer。这样做的目的是在推理阶段将批归一化的均值和方差整合到卷积层的偏差和权重中。

    • YOLOR中的隐式知识与卷积特征图相结合的加法和乘法方式:YOLOR中的隐式知识可以在推理阶段通过预计算简化为向量。 该向量可以与前一个或后一个卷积层的偏差和权重相结合。

    • EMA 模型:EMA 是一种在 mean teacher 中使用的技术,在我们的系统中,我们使用 EMA 模型纯粹作为最终的推理模式

9 yolov8

  • 整体结构

  • 从框架上看,跟v5差不多一样

  • 主干与颈部的改动

    • 第一个卷积层的核心从6改到了3

    • 所有的C3模块(3-6-9-3)换成了C2f(3-6-6-3)

    • 去掉了FPN里的两个CBS

  • 头部的改动

    • 把Conv2d耦合头换成解耦头,结构如下:

    • 另外,yolov5为基于先验框,v8为无先验框(改变于v6)

  • loss计算加入了正负样本分配策略(源自v6)

  • 数据增强:引入了 YOLOX 中提出的最后 10 个 epoch 关闭 Mosaic 的操作

写在后面

  • 花了差不多5天的时间,囫囵吞枣地看完了yolo系列里比较主要的模型。其实开始还是挺认真的在看,不过基本上从v4开始,后面几代的更新很难让人提起兴趣。对于很多新特性,总有种看起来很高大上,实际却没什么创新性的感觉,索性就走马观花般的略过了。

  • 我自己也是这么划分的,原作者操刀的v1-v3都是比较有开创性的,尤其是v1和v2。AB大神接手的v4算是首次明确了整个yolo的大框架,此后的所有版本都是在该框架体系下的小修小补。v5则是集大成者,无论是从模型角度还是数据集角度,都是一次非常大的整合。至于后面的,包括国内团队出品的几个yolo,个人感觉就没那么令人惊艳了,或者说,有些太过普通了。

  • 至于代码层面,暂时只跑了v5,试着做了一个比较有意思的

  • 不过以后应该用v8多一些,到不是因为v8比v5强,只是为了不给一些不懂的人质疑的口实

  • 后面如果再有新的体会就更在下面吧,大概率会有的

  • 最后强调一下,该笔记只用于个人学习,侵权自删

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ST-Naive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值