@BangBang
这个作者很懒,什么都没留下…
展开
-
语义分割蒸馏1:基于注意力引导的特征蒸馏方法(Attn)
与现有的常用的从教师向学生提取知识的复杂方法相比,所¬提出的方法展示了一种简单而强大的方法的功效,该方法可以利用精细的特征图来转移注意力。所提出的方法已被证明在提取丰富信息方面是有效的,在作为密集预测任务的语义分割方面优于现有方法。所提出的注意力引导特征提取(AttnFD)方法采用卷积块注意力模块(CBAM),该模块通过考虑特定通道和空间信息内容来细化特征图。通过仅使用教师和学生的精细特征图之间的均方误差。原创 2024-03-27 21:15:07 · 798 阅读 · 0 评论 -
基于pytorch prune 实现剪枝
局部结构化剪枝(Locall Structured Pruning)有两种函数,对应函数原型如下。原创 2024-03-10 15:56:47 · 176 阅读 · 0 评论 -
模型压缩-剪枝算法概述
学术界的 SOTA 模型在落地部署到工业界应用到过程中,通常是要面临着低延迟(Latency)、高吞吐高效率(Efficiency)挑战的。而模型压缩算法可以将一个庞大而复杂的预训练模型转化为一个精简的小模型,从而减少对硬件的存储、带宽和计算需求,以达到加速模型推理和落地的目的。近年来主流的模型压缩方法包括:数值量化(Data Quantization,也叫模型量化),模型稀疏化(Model sparsification,也叫模型剪枝知识蒸馏轻量化网络设计。原创 2024-03-08 09:15:39 · 107 阅读 · 0 评论 -
知识蒸馏综述及代码
全称:Distilling the Knowledge in a Neural Network发表:NIPS14最经典的,也是明确提出知识蒸馏概念的工作,通过使用带温度的softmax函数来软化教师网络的逻辑层输出作为学生网络的监督信息,使用来衡量学生网络与教师网络的差异,具体流程如下图所示(来自Knowledge Distillation A Survey)对学生网络来说,一部分监督信息来自hard label标签,另一部分来自教师网络提供的soft label。原创 2024-02-07 10:16:38 · 156 阅读 · 0 评论 -
yolov8 PTQ和QAT量化实战(源码详解)
量化():是指将高精度浮点数(FP32)转换为低精度(8bit或4bit)整数的过程,它是模型部署中的一种非常重要的优化方法,可以在较少的精度损失下,大幅提供神经网络的效率和性能。目前主流的神经网络量化方式有PTQ和QATPTQ是训练后量化(),无需数据集和训练,直接量化模型权重QAT是量化感知训练(),量化后需要在数据集上继续微调训练。QAT过程中,我们首先需要选择哪些层需要进行finetune训练,并利用FP32对应层的输出作为监督进行训练。原创 2024-01-07 18:09:34 · 1421 阅读 · 0 评论 -
yolov8知识蒸馏代码详解:支持logit和feature-based蒸馏
特别地,在COCO数据集上对MAP中的RetinaNet检测器(resnet50主干)获得了3.4%的性能提升,在Cityscapes数据集上, 针对mIoU指标,PSPNET(resnet-18 backbone)获得5.81%的性能提升。大部分的KD方法都是通过algin学生网络和教师网络的归一化的feature map, 最小化feature map上的激活值的差异。MGD是一种真正通用的基于特征feature的知识蒸馏方法,它可以用于各种任务,包括图像分类,目标检测,语义分割和实例分割。原创 2023-12-27 17:33:07 · 3069 阅读 · 17 评论 -
Featured Based知识蒸馏及代码(3): Focal and Global Knowledge (FGD)
知识蒸馏已经在图像分类领域取得了不错的效果,然而,目标检测比较复杂,大部分知识蒸馏算法效果不佳。本文指出,在目标检测领域,教师和学生的特征在不同区域差异很大,尤其是在前景和背景区域。如果我们同等地蒸馏它们,特征图之间的不均匀差异将对蒸馏产生负面影响。因此,我们提出(FGD),Focal 蒸馏将图像分离出前景和背景,让学生网络更加关注教师网络的局部的关键像素和通道,Global蒸馏可以重建不同像素之间的关系并将知识从教师迁移到学生,补偿Focal蒸馏缺失的全局信息。由于本文提出的蒸馏算法是。原创 2023-12-23 19:06:23 · 545 阅读 · 0 评论 -
Featured Based知识蒸馏及代码(2):Channel-wise Distillation (CWD)
知识蒸馏用于训练紧凑型(轻量)模型被证明是一种简单、高效的方法,轻量的学生网络通过教师网络的知识迁移来实现监督学习。大部分的KD方法都是通过algin学生网络和教师网络的归一化的feature map, 最小化feature map上的激活值的差异。与以往的方法不同,本文提出了将每个通道的特征图归一化来得到软化的概率图。通过简单地最小化两个网络的通道概率图之间的散度,蒸馏过程更关注每个通道最显著的区域,这对于密集预测任务很有价值。本文对几个密集预测任务进行了实验,包括语义分割和目标检测。原创 2023-12-19 00:07:50 · 374 阅读 · 0 评论 -
轻松实现结构化剪枝DepGraph(2)
MagnitudePruner是一种利用权值大小定位冗余参数的经典算法,相关技术发表于”一文。在文章的开篇,作者讨论了一种神经网络中最基础的依赖关系,可视化如下:在这张图中,我们可以找到两个卷积参数矩阵(Kernel Matrix):第一个卷积层以xix_ixi作为输入,xi1x_{i+1}xi1输出特征图;第二个卷积层以xi1x_{i+1}xi1作为输入,生成特征图xi2x_{i+2}xi2。原创 2023-12-16 14:09:51 · 266 阅读 · 0 评论 -
Featured Based知识蒸馏及代码(1): Masked Generative Distillation (MGD)
知识蒸馏已成功地应用于图像检测、分割、分类等任务。目前的蒸馏算法通常会通过模仿教师网络的输出以使学生特征具有更强的表征能力。我们认为提升学生的表征能力并不一定需要通过直接模仿教师实现。从这点出发,我们把模仿任务修改成了生成任务让学生凭借自己较弱的特征去生成教师较强的特征。在蒸馏过程中,我们对学生特征进行了随机 mask,强制学生仅用自己的部分特征去生成教师的所有特征,以提升学生的表征能力。MGD是一种真正通用的基于特征feature的知识蒸馏方法,它可以用于各种任务,包括图像分类目标检测。原创 2023-12-14 21:05:16 · 448 阅读 · 0 评论 -
pytorch 钩子函数hook 详解及实战
这4个 hook 中有是应用于 tensor 的,另外 3 个是针对nn.Module的。模型剪枝是一种通过减少神经网络中的参数来减小模型大小和计算量的技术。在实际应用中,模型剪枝可以有效地减小模型的体积,提高模型的推理速度,从而更适合在嵌入式设备上部署。在PyTorch中,可以使用钩子函数来实现模型剪枝。原创 2023-12-09 16:46:27 · 318 阅读 · 0 评论 -
美团YOLOv6量化部署实战方案
综上所述,本文基于 YOLOv6 V1.0 版本,以 YOLOv6s 为例探讨了基于重参数化结构设计的 2D 检测模型的量化难点和具体方案,在模型精度基本保持的前提下,通过量化加速,提升了约 40% 的 QPS。部署时的预处理优化则额外提升了 214%,极大地提升了工业部署吞吐能力。下表列出了本文尝试的方法及叠加效果。表10 本文使用的量化方案及效果对比本文使用的速度测试环境见表 11, 测试输入 batch size 为 1,尺寸为 640x640。表11 速度测试环境。原创 2023-11-26 16:38:28 · 308 阅读 · 0 评论 -
轻松实现结构化剪枝DepGraph(1)
全文概要:本文主要分为两部分:第一部分介绍工具,一种通用的结构化剪枝库,并通过实例演示如何快速实现结构化剪枝;第二部分侧重Torch-Pruning的底层算法,主要讨论如何建模结构化剪枝中的层依赖,实现任意结构的剪枝。关于设计初衷:这是一个90%时间都花在工程上的工作,原本也是自己在github上写着自娱自乐的项目。在2019年在做某项目时,需要对完成多个不同架构网络的结构化剪枝,然而实际操作后发现每一个网络都需要重新写专用的代码,顿感不妙。众所周知懒才是第一生产力,于是咱就开始琢磨起了结构化剪枝的自动化。原创 2023-11-12 15:27:50 · 615 阅读 · 0 评论 -
剪枝基础与实战(5): 剪枝代码详解
对模型进行剪枝,我们只对有参数的层进行剪枝,我们基于BatchNorm2d对通道重要度γ参数进行稀释训练。对BatchNorm2d及它的前后层也需要进行剪枝。但是我们不会对Pool2d 层进行剪枝,因为Pool2d只用来做下采样,没有可学习的参数,不用处理。原创 2023-09-02 17:32:58 · 1307 阅读 · 0 评论 -
剪枝基础与实战(4):稀疏训练及剪枝效果展示
稀疏训练是通过在损失loss中增加BN的γ参数的L1正则,从而让绝大多数通道对应的γ值趋近与0LL1γLwλ∣γ∣。原创 2023-08-21 16:25:53 · 779 阅读 · 0 评论 -
剪枝基础与实战(3): 模型剪枝和稀疏化训练流程
对网络进行稀释训练,需要设置$ \lambda$稀疏因子(平衡正则项损失的权重),从而控制网络的稀释化效果。论文中对VGGNet中,在不同程度的稀疏正则化(由参数λ \lambdaλ控制)下,训练的VGGNet中缩放因子(scale factor)的分布,这一步的训练就是非常普通的训练过程,为了获得原模型的训练权重,可以拿来作为一个对比的基准,也可以拿来进行稀疏训练。考虑一个问题,深度学习模型里面的卷积层出来之后的特征有非常多,这里面会不会。,Pool2d 的层只用来做下采样,没有可学习的参数,不用处理。原创 2023-08-20 21:43:03 · 766 阅读 · 0 评论 -
剪枝基础与实战(2): L1和L2正则化及BatchNormalization讲解
Pytorch 集成了很多常见数据集的API, 可以通过pytorch 来下载这些数据集,并做成模型需要的DataSet和Dataloader, 供模型训练使用。我们所说的正则化,就是在原来的 Loss Function 的基础上,加上了一些正则化项或者称为模型复杂度惩罚项。CIFAR10 是深度学习入门最先接触到的数据集之一,主要用于图像分类任务中,该数据集总共有。各一个,进行实现,为了简单起见,将最后3层全连接层简化位1个全连接层。VGG 网络是一个很经典的卷积神经网络,网络结构比较简单。原创 2023-08-20 18:36:09 · 1044 阅读 · 0 评论 -
剪枝基础与实战(1): 概述
本文介绍基于L1正则化的剪枝原理,并以VGG网络进行实战说明。将从零详细介绍模型的全过程,提供详细的源码及说明,有助于对剪枝的熟练掌握,后续也会对yolov8进行剪枝的介绍。原创 2023-08-20 16:06:12 · 613 阅读 · 0 评论 -
深度学习模型压缩方法综述
我们知道,一定程度上,网络越深,参数越多,模型也会越复杂,但其最终效果也越好,而模型压缩算法是旨在将一个庞大而复杂的大模型转化为一个精简的小模型。之所以必须做模型压缩,是因为嵌入式设备的算力和内存有限,经过压缩后的模型方才能部署到嵌入式设备上。在阅读和理解经典的轻量级网络 mobilenet 系列、MobileDets、shufflenet 系列、cspnet、vovnet、repvgg 等论文的基础上,做了以下总结:低算力设备-手机移动端 cpu 硬件,考虑。原创 2023-06-23 22:34:30 · 735 阅读 · 0 评论 -
PPQ量化框架
这是一个为处理复杂量化任务而生的框架 —— PPQ 的执行引擎是专为量化设计的,截止 PPQ 0.6.6 版本,软件一共内置 99 种常见的 Onnx 算子执行逻辑,并原生支持执行过程中的量化模拟操作。在我们不断的尝试与探索中,我们抽象出量化器这一逻辑类型,负责初始化不同硬件平台上的量化策略,并允许用户自定义网络中每一个算子、每一个张量的量化位宽、量化粒度与校准算法等。PPQ 是一个高度可扩展的模型量化框架,借助 ppq.lib 中的函数功能,您能够将 PPQ 的量化能力扩展到其他可能的硬件与推理库上。原创 2023-04-10 22:40:07 · 546 阅读 · 0 评论 -
FastestDet:比yolov-fastest更快!更强!全新设计的超实时Anchor-free目标检测算法
FastestDet是设计用来接替yolo-fastest系列算法,相比于业界已有的轻量级目标检测算法如yolov5n, yolox-nano, nanoDet, pp-yolo-tiny, FastestDet和这些算法压根儿不是一个量级,FastestDet无论在速度还是参数量上,都是要小好几个数量级的(不要在拿int8的模型和我fp32的模型比体积了,不公平),但是精度自然而然也比不过。FastestDet是针对计算资源紧缺的ARM平台设计的。原创 2023-04-01 16:01:51 · 750 阅读 · 0 评论 -
Yolov5改进: Yolov5-FasterNet网络推理加速
FasterNet是CVPR 2023 新出来的网络,主要用来加速网络推理实现轻量化。作者重新审视了现有的操作符,特别是DWConv的计算速度——FLOPS。作者发现导致低FLOPS问题的主要原因是频繁的内存访问。然后,作者提出了PConv作为一种竞争性替代方案,它减少了计算冗余以及内存访问的数量。为了设计快速神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,作者观察到FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运算(FLOPS)效率低下。原创 2023-03-27 22:21:09 · 2640 阅读 · 0 评论 -
输出模型每层的耗时和GFlops(yolov5 yolov7)
输出模型每层的耗时及GFlops的代码,在yolov5和yolov7官方代码已经实现。在模型改进和轻量化的时候,可以观测哪一层比较耗时以及参数量比较大。原创 2023-03-25 22:55:06 · 1567 阅读 · 0 评论 -
模型量化(7):Yolov5 QAT量化训练
从模型量化(5): 敏感层分析可以看出来,对于yolov5-nano模型,对最后一层detect层进行敏感层分析的时候,发现对检测精度的影响比较大。所以在PTQ/QAT在进行量化时,会跳过这些敏感层。QAT微调的模型,就是PTQ在校准后的模型。从上一小节可以看出如果PTQ中模型训练和量化是分开的,而QAT则是在模型训练时加入了伪量化节点,用于模拟模型量化时引起的误差。QAT过程中,我们首先需要选择哪些层需要进行finetune训练,并利用FP32对应层的输出作为监督进行训练。原创 2023-03-21 22:05:58 · 2214 阅读 · 10 评论 -
模型量化(5): 敏感层分析
在实际PTQ或者QAT过程中,我们不知道哪些层属于敏感层,从而在量化的过程中跳过这些层,所以就需要进行敏感层分析。通过分析每层是否量化对map或者是精度的影响程度,从而确定敏感层。。原创 2023-03-19 15:18:57 · 931 阅读 · 0 评论 -
模型量化(6): 基于PTQ的yolov5量化完整代码讲解
(例如MobileNet),同时不同层对于精度的影响也比较大。基础上增加了PTQ量化的代码。的数据分布,找到合适的Scale,从而一定程度上。等量化算子来替换torch.nn对应的算子。(例如ResNet101),但是在。是目前常用的模型量化方法之一。baseline模型。原创 2023-03-18 22:43:54 · 1294 阅读 · 16 评论 -
Pytorch 钩子函数hook的使用
PyTorch会自动舍弃图计算的中间结果,所以想要获取这些数值就需要使用hook函数。(1)因为模块可以是多输入的,所以输入是tuple型的,需要先提取其中的。(remove),以避免每次都运行钩子增加运行负载。的值(不能返回,本地修改也无效),修改时最好用。用来导出指定张量的梯度,或修改这个梯度值。输出是Tensor型的可直接用。(2)导出后不要放到显存上,很。的梯度(即只能返回gin),用来导出指定子模块(可以是。,但只可修改输出,常用来。用来导出指定子模块的。输出张量梯度不可修改。原创 2023-03-18 15:46:43 · 591 阅读 · 0 评论 -
模型量化(4): Pytorch 量化工具包介绍
在实际开发过程中,单独开发量化的工具进行PTQ或者QAT量化,同时去适配TensorRT, onnxruntime,openvion等推理引擎。Pytorch官方推出了量化工具:Pytorch Quantization库,方便大家使用。是一个工具包,用于训练和评估具有模拟量化的PyTorch模型。支持将 PyTorch 模块自动转换为其量化版本。转换也可以使用 API 手动完成,这允许在不想量化所有模块的情况下进行部分量化。例如,一些层可能对量化比较敏感,对其不进行量化可提高任务精度。原创 2023-03-18 15:04:17 · 1148 阅读 · 0 评论 -
量化(3): 量化校准
为了简单起见,这里只描述了对称范围的校准(工业界一般对称量化即可满足需求),如对称量化所需。(threshold),舍弃那些超出范围的数进行量化,这种量化方式。的方法,它的显著特点是int8的表示空间没有充分利用,因此称为。那么问题来了,对于数据流的饱和量化,怎么在数据流中找到这个。我们都知道量化的过程与数据的分布有关。选择使FP32和int8的激活值分布的。方式虽然充分利用了低比特表示空间,但是。时,高精度向低精度进行映射就会将表示。的选择主要有2种方式,分别是。的表示空间,因此称为。原创 2023-03-18 13:18:06 · 886 阅读 · 0 评论 -
量化(2):模型常见的量化方式
量化的映射量化的粒度量化的方式量化的对象以及量化的Bit。其中,在量化的映射中,包括线性映射和非线性映射(DSQ),在实际工程项目中主要使用的是线性映射。原创 2023-03-16 20:25:35 · 1242 阅读 · 0 评论 -
量化(1):基础知识
这里数组为[-0.52, 0.3, 1.7],这里我们用映射的方法来进行一个数组的映射,首先,通过求组数组的最大最小值之差然后除以int8的表示范围可以得到Scale=(1.7 -(-0.52))/(127-(-128)) = 0.0087059然后,根据Scale和上式的量化映射方法,可以得到映射后的int8数组为[-60, 34, 195];最后,由于int8的定点表示范围为[-128, 127],因此对于前面得到的结果需要进行Clip。原创 2023-03-15 22:33:10 · 365 阅读 · 1 评论 -
NCNN量化详解2
量化算法介绍的文章的话,下面这篇文章的大佬 @章小龙介绍的比我好多啦。虽然介绍的是NVIDIA TensorRT的算法,但是NCNN是参考其算法做出来的,方法几乎一样变换公式正常的量化,FP32 Value 和 INT8 Value之间的关系是这样的:取值范围由于float32的取值范围几乎是无穷的,而int8只有-128~127。因此建立映射关系时,确定float32的取值范围很重要。原创 2023-02-25 22:11:58 · 312 阅读 · 0 评论 -
NCNN Conv量化详解1
本文介绍了NCNN代码中目前对于量化的处理。至于如何得到量化模型,请参考NCNN github上的wiki:quantized int8 inference,可以将caffe模型量化成NCNN模型。, 本文仅做学术分享,如有侵权,请联系删文。原创 2023-02-25 19:16:41 · 807 阅读 · 0 评论 -
卡尔曼滤波在非线性系统中的扩展
卡尔曼滤波器在1960年被卡尔曼发明之后,被广泛应用在动态系统预测。在自动驾驶、机器人、AR领域等应用广泛。卡尔曼滤波器使用类似马尔可夫链的性质,假设系统状态只与上一时刻的系统状态有关。基础的卡尔曼滤波器使用线性方程对系统状态进行建模。为了能够应用到非线性系统,扩展卡尔曼滤波器利用泰勒展开,并只保留一次项,抛弃高次项,将非线性关系近似为线性关系。这一篇文章对扩展卡尔曼滤波器(r)的具体步骤和公式进行讲解。[1]:kalman滤波与目标跟踪1: kalman滤波理论详解。原创 2022-12-26 15:42:41 · 801 阅读 · 0 评论 -
yolov5剪枝实战5:模型剪枝和fine-tune
所以在我们剪枝的时候用的是32位浮点,所以对比的时候要注下,我们后续做微调的时候还会保留为16位的浮点,可以看到权重的大小还有变化。注意剪枝比率percent设置的过大的话,可能会报错,所以如果有报错的话就降低percent.可以看到有些层的channel变化很小或者没有变化,有些成的channel大幅被剪掉,比如。剪枝前模型大小为27MB,剪枝后模型大小为12MB左右,这里要注意。剪枝后,在项目路径下会保留,两个权值文件分别为:剪枝前的权重文件。剪枝后与剪枝前对比,剪枝后掉点了将近。原创 2022-11-27 20:36:15 · 1361 阅读 · 1 评论 -
yolov5剪枝实战4: 正常训练和稀疏化训练
下,我们可以看到训练过程中产生的中间文件,包括result.png可以看到训练过程中的loss以及mAP指标的变化趋势,另外在weights保持best.pt和last.pt,best.pt对应我们训练出来性能最好的模型文件,last.pt对应最后一个epoch训练保存的权重文件。创建好了voc_ball.yaml 和yolov5s_ball.yaml这两个文件后,就有了针对自己数据集的配置文件了。针对自己的数据集,需要训练用的配置文件。使用yolov5s训练处的权重。使用yolov5s训练出的权重。原创 2022-11-21 21:48:21 · 2345 阅读 · 0 评论 -
yolov5剪枝实战3: yolov5-slimming项目运行演示
项目没有从yolov5 github上直接克隆项目文件,而是从百度网盘上下载项目文件并解压,因为yolov5原始的代码是没有带网络剪枝的,网盘上的代码是。注意:simple 不能少, 是 https 而不是 http。在yolov5-6.1-slimming路径下执行。:包括项目完整源代码、数据集、原理的课件说明等。,项目是基于yolov5 6.1版本上修改的。网盘地址,文末有链接。原创 2022-11-20 16:39:58 · 556 阅读 · 0 评论 -
yolov5剪枝实战2:网络剪枝原理介绍
而在成长过程中,那些密集的突触反而又会变得稀疏,比如14岁左右它相对于6岁而言突触变得洗刷,然而对于人的思维反而是有利的,可以认为在人类成长过程中突触之间学到了更多有用的知识。一般我们会训练一个比较大的神经网络,然后进行剪枝,可以基于不同的级别剪枝,剪枝以后可以进行fine-tune,也就是说对剪枝后的网络再进行训练来提升剪枝后网络的性能。, 在下图示意图中,在全连接的神经元之间都有相应的权重,我们如果可以将相应的权重剪裁掉,就是权重的剪枝,这种剪枝方法剪枝以后网络的结构就会变得。原创 2022-11-18 15:29:01 · 1159 阅读 · 0 评论 -
yolov5剪枝实战1: 论文及yolov5剪枝实战项目介绍
神经网络一般都存在过参数化(over-parameterized)的问题,存在冗余的神经元或权重,所以可以进行剪枝。其实对网络可以针对不同的颗粒度进行剪枝,可以进行权重、神经元级别的剪枝,也可以基于channel, shape,filter以及layer级别的剪枝。如果对element-wise级别的剪枝会导致非结构化的网络剪枝,所以我们研究的重点是结构化的剪枝方法。本项目利用yolov5对足球数据集进行训练,并进行Network Slimming剪枝,本系列博客主要包括以下内容。原创 2022-11-17 22:59:20 · 1078 阅读 · 0 评论 -
Pytorch量化感知训练
量化感知训练(Quantization Aware Training)是在模型中插入伪量化模块(fake_quant module)模拟量化模型在推理过程中进行的舍入(rounding)和钳位(clamping)操作,从而在训练过程中提高模型对量化效应的适应能力,获得更高的量化模型精度。在这个过程中,所有计算(包括模型正反向传播计算和伪量化节点计算)都是以浮点计算实现的,在训练完成后才量化为真正的int8模型。原创 2022-09-03 21:03:42 · 1723 阅读 · 0 评论