GitHub - HankYe/PAGCP: PAGCP for the compression of YOLOv5
yolov5知识蒸馏1:基础原理讲解及yolov5项目实战介绍-CSDN博客
1.
2.教师网络生成的软标签(soft labels)是一种相对于硬标签(one-hot编码的离散标签)
而言的一种概率分布形式。在深度学习中,使用软标签的一个主要优势在于它提供了更为丰富的信息,有助于训练更复杂、泛化能力更强的模型。以下是一些使用软标签的常见情境和优势:
-
知识蒸馏(Knowledge Distillation):
- 教师网络生成的软标签可以用于知识蒸馏,即将大型、复杂的教师模型的知识传递给较小、更轻量级的学生模型。通过训练学生模型去逼近教师网络的软标签,可以提高模型的泛化性能和对抗性能。
-
模型集成(Model Ensemble):
- 软标签还可用于模型集成,其中多个模型的预测结果通过软标签进行组合。这样的集成方法通常比硬投票方式更为灵活,有助于提高整体模型的性能。
-
损失平滑(Label Smoothing):
- 软标签可以用于减缓模型对训练数据的过拟合,通过对真实标签和其他类别的概率进行平滑,避免模型对单一标签的过于自信,从而提高泛化性能。
-
类别不确定性建模:
- 软标签允许模型在处理不确定性时更加灵活。类别的概率分布可以反映模型对不同类别的相对置信度,有助于模型更好地处理模糊和边缘情况。
-
对抗训练(Adversarial Training):
- 软标签可用于对抗训练,通过引入对抗性的样本和软标签,加强模型的鲁棒性,使其对于输入的微小扰动更为鲁棒。
总体而言,使用软标签的目标是提供更多的信息和灵活性,以改进深度学习模型的训练和性能。然而,在选择使用软标签时,需要谨慎权衡其优势和计算成本,具体取决于任务需求和资源约束。
3.
网络剪枝(Network Pruning)和稀疏表示(Sparse Representation)虽然在某些方面涉及稀疏性,但它们是两个不同的概念和技术。
-
网络剪枝:
- 定义: 网络剪枝是指通过去除神经网络中的一些连接、神经元或层来减小模型的大小。这些去除的部分通常是根据某些准则(例如权重的大小)进行选择的。
- 目的: 网络剪枝的目的是减小模型的计算和存储需求,以提高模型的推理速度和减小资源占用。
- 方法: 常见的剪枝方法包括按权重剪枝、按通道剪枝和按层剪枝等。在这个过程中,模型中的一些权重或神经元被设置为零,从而实现稀疏性。
-
稀疏表示:
- 定义: 稀疏表示是指在某个表示空间中,大多数元素都为零,只有少数元素非零。这通常用于数据表示,以减小数据的维度并提取出关键特征。
- 目的: 稀疏表示的目的是通过表示中只包含关键信息,减小数据的冗余性,提高数据的紧凑性。
- 方法: 在稀疏表示中,通常使用一些技术,如 L1 正则化、字典学习等,来促使表示中的元素保持稀疏。
尽管在网络剪枝中,稀疏性体现在模型的权重或神经元的选择上,而在稀疏表示中,稀疏性体现在数据的表示上,但两者的共同点在于都利用了稀疏性的思想,通过保留关键信息来减小冗余和提高效率。
需要注意的是,网络剪枝通常是一种模型优化技术,而稀疏表示更广泛地用于数据表示和特征提取。网络剪枝可以看作是一种特殊的稀疏表示应用,针对的是神经网络模型的结构。
一.量化
基于 AX650N/AX620Q 部署 YOLO World - 知乎
INT8 中的稀疏性:NVIDIA TensorRT 加速的训练工作流程和最佳实践 - 知乎
TensorRT(NVIDIA的深度学习推理库)的量化是一种用于优化深度学习模型的技术,可以将模型中的浮点数参数转换为低位数表示(如8位整数),从而减少模型的内存占用和计算需求,提高推理速度。在TensorRT的量化过程中,校准(Calibration)是一个重要的步骤,其作用如下:
-
动态范围量化:量化过程中需要确定每个参数的量化范围(或量化范围的缩放因子),这会影响量化后模型的精度。校准过程通过观察一批代表性的数据,动态地估计每个参数的范围,以便更准确地进行量化。
-
处理数据分布变化:在推理过程中,实际输入数据可能与训练数据分布有所不同。校准可以帮助模型适应推理数据的分布,从而在实际场景中获得更好的性能。
-
量化误差的控制:量化会引入一定的量化误差,即量化后的值与原始浮点值之间的差异。校准过程可以通过将量化误差控制在可接受范围内,从而避免过多损失模型的精度。
-
提高量化后模型的精度:校准可以选择合适的量化策略,比如使用均匀量化或最大化信息熵等方法,以提高量化后模型的精度。
总之,校准是TensorRT量化过程中的重要步骤,可以帮助模型更好地适应实际数据、控制量化误差并提高推理性能。校准过程旨在保持量化后模型在实际场景中的良好性能,并确保在减少模型存储和计算需求的同时不会显著降低模型的精度。
TensorRT 中的量化校准是为了确保量化后的神经网络模型在推理阶段能够获得准确的结果。校准的主要目的是解决以下问题:
-
量化参数确定: 量化将神经网络中的浮点参数(权重和激活值)转换为整数,但整数表示的精度有限。校准过程会分析示例输入数据,以确定适当的量化参数,如量化比特宽度和量化范围。这有助于在保持模型准确性的同时,将模型参数量化为整数。
-
确保准确性: 量化可能引入舍入误差,因为浮点数被映射到了有限的整数集合。校准会评估模型在量化后的性能,并根据需求进行微调,以确保在量化后的模型在输入数据上能够产生满足精度要求的输出。
-
动态范围校准: 有些量化技术,如动态范围量化,会根据输入数据的范围动态调整量化参数。这种校准方法可以适应不同范围的输入数据,以提高模型的适用性。
-
减少误差累积: 在量化模型的推理过程中,多次舍入操作可能会导致误差的累积。通过校准,可以在模型的不同部分中应用合适的量化参数,以减少累积误差并保持准确性。
总之,量化校准是确保量化模型在准确性、性能和适应性方面达到预期要求的关键步骤。它帮助优化量化后的模型,以便在较低的计算和内存要求下仍能保持高质量的推理结果。
模型量化过程中,将浮点数(通常是32位单精度浮点数,即FP32)转换为8位整数(INT8)是为了减小模型大小、提高计算效率,但这一过程不可避免地会导致一定程度的精度损失。损失的程度取决于多种因素,包括但不限于:
-
模型类型与结构:不同类型的神经网络模型以及模型内部的复杂结构对量化敏感度各异。某些模型结构可能对量化更为鲁棒,而某些模型可能由于存在大量非线性运算或深度堆积的结构,对量化产生的精度损失更为敏感。
-
量化算法与策略:量化方法的选择对精度损失有很大影响。常见的量化方法有均匀量化、线性量化、分段线性量化、基于KL散度的量化、感知哈希量化等,以及是否采用量化感知训练(Quantization-Aware Training, QAT)、权重量化、激活值量化、混合精度量化等策略。不同的量化算法和策略对保留模型精度的能力不同。
-
数据集与任务特性:用于评估量化后模型的测试数据集的性质,以及所执行任务的复杂度(如分类、检测、分割等)也会影响量化后的精度表现。对于特定领域的数据集,模型可能更容易适应量化带来的变化;而对于具有广泛分布或复杂模式的数据集,量化可能导致更大的精度下降。
-
硬件支持与后处理:海思作为芯片厂商,其提供的硬件平台和配套软件工具(如编译器、推理引擎等)对INT8模型的支持程度,以及是否包含针对量化模型的优化技术和后处理手段(如反量化、校准等),都会影响最终模型在实际部署时的精度表现。
关于具体的量化损失数值,“多少”是一个相对概念,没有一个固定的阈值适用于所有模型。通常情况下,如果量化过程处理得当,INT8量化后的模型精度损失可以在几个百分点以内,有时甚至可以做到接近FP32模型的精度。但也有情况下,特别是在未进行充分优化或对量化特别敏感的模型上,精度损失可能会达到10%以上。
对于海思平台上的INT8量化,若要了解具体模型量化后的精度损失,通常需要:
-
实施量化过程:使用海思提供的量化工具或SDK,按照其指导文档对模型进行量化转换。
-
量化后模型验证:在相同的测试集上对比量化前(FP32)与量化后(INT8)模型的性能指标(如准确率、mAP等),计算二者之间的差距,以此得出量化损失的具体数值。
由于量化结果高度依赖于具体模型、量化方法、数据集以及海思平台的量化工具特性,无法给出一个通用的量化损失值。实际操作中,应通过实验来确定特定模型在海思平台上量化为INT8后的精度损失。在量化过程中,可以尝试不同的量化策略和参数调整,以尽可能减少精度损失,同时确保满足硬件部署的需求。
我们的目的是把原来的float 32bit 的卷积操作(乘加指令)转换为int8的卷积操作,这样计算就变为原来的1/4,但是访存并没有变少哈,因为我们是在kernel里面才把float32变为int8进行计算的。
- Post Training Dynamic Quantization,模型训练完毕后的动态量化;
- Post Training Static Quantization,模型训练完毕后的静态量化;
- QAT(Quantization Aware Training),模型训练中开启量化。
二.剪枝:
即移除对结果作用较小的组件,移除一些层和连接参数
(164条消息) PyTorch--模型剪枝案例_前尘昨夜此刻的博客-CSDN博客_pytorch模型剪枝
CVPR 2023 | DepGraph 通用结构化剪枝 - 知乎
三.蒸馏:
知识蒸馏是指使用教师模型(teacher model)去指导学生模型(student model)学习特定任务,保证小模型在参数量不变的情况下,得到比较大的性能提升。
(159条消息) 模型蒸馏(Distillation)_喜欢打酱油的老鸟的博客-CSDN博客_模型蒸馏
(164条消息) 【Pytorch】使用Pytorch进行知识蒸馏_码猿小菜鸡的博客-CSDN博客_知识蒸馏pytorch
pytorch知识蒸馏&模型压缩总结 - 知乎 (zhihu.com)
yolov5知识蒸馏1:基础原理讲解及yolov5项目实战介绍_yolo 知识蒸馏-CSDN博客
GitHub - Adlik/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite
压缩方法
2.1 模型裁剪,使用稀疏训练的方式对yolov5s进行压缩。
代码链接:GitHub - midasklr/yolov5prune
在全目标数据集v1.3上训练和测试结果如下。
裁剪之前:
Class Images Labels P R mAP@.5 mAP@.5:.95:
all 8707 28279 0.965 0.912 0.96 0.779
face 8707 8158 0.971 0.942 0.97 0.713
human 8707 14999 0.969 0.898 0.958 0.793
motor_vehicle 8707 3329 0.962 0.92 0.969 0.848
non_motor_vehicle 8707 1793 0.959 0.889 0.944 0.764
海思3516推理速度:250ms
裁剪比例0.4,裁剪后:
Class Images Labels P R mAP@.5 mAP@.5:.95:
all 8707 28279 0.97 0.908 0.958 0.773
face 8707 8158 0.975 0.936 0.966 0.703
human 8707 14999 0.978 0.893 0.954 0.787
motor_vehicle 8707 3329 0.965 0.923 0.968 0.84
non_motor_vehicle 8707 1793 0.962 0.879 0.944 0.761
海思3516推理速度:160ms
2.2 使用yolov5n训练。
在全目标数据集v1.3上训练和测试结果如下。
400个epoch
Class Images Labels P R mAP@.5 mAP@.5:.95:
all 8707 28279 0.972 0.903 0.955 0.769
face 8707 8158 0.978 0.929 0.964 0.706
human 8707 14999 0.978 0.886 0.951 0.782
motor_vehicle 8707 3329 0.969 0.916 0.963 0.829
non_motor_vehicle 8707 1793 0.963 0.881 0.941 0.759
海思3516推理速度:93ms
2.3 修改yolov5backbone,使用轻量化模型mobilenet进行压缩。
代码链接:GitHub - rglkt/yolov5-with-more-backbone: yolov5 with more backbone
在全目标数据集v1.3上训练和测试结果如下。海思3516推理速度:
212个epoch
Class Images Labels P R mAP@.5 mAP@.5:.95:
all 8707 28279 0.969 0.877 0.941 0.726
face 8707 8158 0.973 0.901 0.947 0.652
human 8707 14999 0.979 0.851 0.934 0.742
motor_vehicle 8707 3329 0.967 0.891 0.956 0.794
non_motor_vehicle 8707 1793 0.957 0.864 0.926 0.714
shufflenet改造
基于Stemblock+shufflenet改进YOLOv5的垃圾分类检测系统 - 知乎
2.4 使用知识蒸馏方式进行压缩。
代码链接:mirrors / Adlik / yolov5 · GitCode
教师模型是yolov5s,学生模型是yolov5n。
在全目标数据集v1.3上训练和测试结果如下。海思3516推理速度:
深度学习模型压缩与优化加速(Model Compression and Acceleration Overview)_Law-Yao的博客-CSDN博客_深度学习模型压缩
四.网络改造
我记得他们是在pelee 结构上 加了yolov8用的repvgg 的结构
2.
在神经网络中的Batch Normalization(BN)层,γ(gamma)参数是用来控制标准化后输出数据的幅度(scale)的可学习参数。每个通道(channel)都有一个独立的γ值,这意味着网络可以根据训练过程中收到的反馈信号来调整每个通道的影响力。
γ值在训练过程中之所以会变得不一样,是因为它们通过反向传播和优化算法(如梯度下降法)来进行更新。每个γ值的更新取决于它对损失函数梯度的影响以及网络试图最小化损失函数的程度。不同的通道在模型学习过程中发挥的作用可能不同,有的通道可能对最终预测结果更为重要,而有的通道可能相对不太重要。在训练过程中,对于重要的通道,网络可能会学习到较大的γ值以放大该通道的输出,而对于不那么重要的通道,γ值可能就较小。
此外,由于输入数据、网络结构、任务类型等各种因素的影响,各个通道的γ值也会反映出网络在学习过程中对不同特征维度的重视程度。因此,在不同的训练迭代、不同的网络结构或者不同的数据分布下,BN层的γ值往往是有差异的。