我们做的是关于在边缘设备部署目标检测模型的研究,本文包含以下几个部分,一些常见的模型压缩提高速率的算法,以及常用的多设备协同目标检测的分布式推理模型及方法,在树莓派上跑yolov5-lite的实验的踩坑记录,旨在让刚刚踏入轻量级目标检测领域大门的同学对本领域常见方法有一个大概的了解,方便后续工作的研究,还有避免一些常见的环境配置错误问题,避免不必要的浪费时间。
轻量化目标检测是一种在资源有限的环境下能够高效、准确地进行目标检测的技术。在国计民生方面,轻量化目标检测有着重要的应用价值。轻量化目标检测技术能够广泛应用于智能安防、物流、家具、医疗领域。
1.智慧安防:监控摄像头可以使用轻量化目标检测技术,对场景中出现的人、车等物体进行实时识别,提高安防系统的预警效率和准确性;
2.智慧物流:在快递行业中,轻量化目标检测技术可以对包裹进行快速准确的识别和分类,从而提高快递业务的运营效率和服务质量。
3.智能家居:可以实现对家居设备、人体、宠物等物体的实时监测和识别,从而实现智能化的家庭管理和控制。
4.智能医疗:可以实现对医疗设备、患者病情等方面的监测和识别,从而提高医疗服务的质量和效率。
1. latency延迟:实时推理对许多应用程序至关重要。例如,需要快速处理来自自动驾驶汽车的摄像头帧以检测和避开障碍物,或者基于语音的辅助应用程序需要快速解析和理解用户的查询并返回响应。然而,将数据发送到云端进行推理或训练可能会导致额外的排队和网络传播延迟,并且无法满足实时、交互式应用程序所需的严格端到端低延迟要求;例如,实际实验表明,将相机帧卸载到 Amazon Web Services 服务器并执行计算机视觉任务需要超过 200 毫秒的端到端。
2. 精度/准确度:标签分类分的准不准、目标框框的准不准。
3. 模型的大小,占用存储空间的大小。
树莓派与笔记本/服务器比较
| 树莓派 | 笔记本 |
CPU | aarch64/armv7 | x86_64/amd |
CPU核数 | 2、4 | 8 |
GPU内存 | 256MB | 4G、8G |
RAM内存 | 2G、4G | 16G、32G |
存储空间 | 16GB~256GB SD卡 | 一般512GB以上硬盘 |
总之,计算资源受限、存储资源受限。
如果做训练的话,训练coco数据集,电脑需要十几个小时,需要几十个小时才能完成1个epoch,一般会训练几十上百个epoch。边缘服务器/云服务器需要几个小时能完成几十个epoch。所以在树莓派上做模型训练不是一个好的选择。所以在边缘终端设备上做模型推理,在边缘服务器做模型训练。
看一个推理过程:
yolov5-lite:
dog1.mp4:
一个8s的视频,总共266帧,分辨率为640×384,总共花费950.106s,大概3.57s推理完成一帧的图像。
我们可以使用一些方法加速推理:
1. 使用硬件加速器:树莓派上可以使用一些硬件加速器,如Coral Edge TPU或者Intel Neural Compute Stick等,这些硬件加速器专门用于深度学习模型推理,可以显著提高推理速度。将训练好的pt文件转换为轻量化的、可加速的onnx文件进行推理。
使用了openvine,onnx硬件加速器驱动之后达到2fps,但还是与实时检测有差距。
2. 模型优化:对模型进行优化,如去除冗余计算、量化、剪枝等,可以减少模型的计算量,提高推理速度,这是我们重点关注的内容。
剪枝、量化、知识蒸馏、低秩分解、轻量化卷积核、网络结构搜索。
1.1剪枝的重要性/性能对比
Google在《To prune, or not to prune: exploring the efficacy of pruning for model compression》中探讨了具有同等参数量的稀疏大模型和稠密小模型的性能对比,在图像和语音任务上表明稀疏大模型普遍有更好的性能。
① 对Inception V3模型进行了实验,在参数的稀疏性分别为0%,50%,75%,87.5%时,模型中非零参数分别是原始模型的1,0.5,0.25,0.128倍进行了实验。实验结果表明在稀疏性为50%时,Inception V3模型的性能几乎不变。稀疏性为87.5%时,在ImageNet上的分类指标下降为2%。
② 稀疏率为75%的模型比宽度为原始MobileNet的0.5倍的模型在ImageNet分类任务的top-1指标上高出了4%,而且模型的体积更小。稀疏率为90%的模型比宽度为原始MobileNet的0.25倍的模型在ImageNet分类任务的top-1指标上高出了10%,而两者的模型大小相当。
Table2对应的折线图
1.2模型剪枝核心算法
模型剪枝算法根据剪枝的处理策略来说,可以分为对模型进行稀疏约束然后进行训练后的剪枝,在模型的训练过程中进行剪枝,以及在模型训练之前就进行剪枝。而根据粒度的不同,流行的剪枝算法是细粒度的权重连接剪枝和粗粒度的通道/滤波器剪枝。
1.2.1细粒度剪枝核心技术(连接剪枝)[2]
对权重连接和神经元进行剪枝,如下图所示
需要注意的点:
如何评估一个连接的重要性?
如何在剪枝后恢复模型的性能?
1.2.2粗粒度剪枝核心技术(通道剪枝)
相对于连接权重剪枝,粗粒度剪枝可以得到不需要专门的算法支持的精简小模型。
通道剪枝算法有三个经典思路:
1. 基于重要性因子评估一个通道的有效性,再配合约束一些通道使得模型结构本身具有稀疏性,从而基于此进行剪枝[3]
Network Trimming通过激活的稀疏性来判断一个通道的重要性,认为拥有更高稀疏性的通道更应该被去除。它使用batch normalization(批量归一化)中的缩放因子γ来对不重要的通道进行裁剪,如下图:
思想:以广泛和大型的网络作为输入模型,在训练过程中,不重要的通道被自动识别并在之后进行修剪,从而产生具有相当精度的薄而紧凑的模型。
2. 利用重建误差来指导剪枝[4]
基于重要性因子的方法主观性太强,而另一种思路就是基于输出重建误差的通道剪枝算法,它们根据输入特征图的各个通道对输出特征图的贡献大小来完成剪枝过程,可以直接反映剪枝前后特征的损失情况。
方法步骤:
第一步,根据LASSO回归找出最具代表性的通道,并修剪冗余的通道
第二步,用线性最小二乘法重建剩余通道的输出
示例图如下:
从中可以看出在剪掉当前层B的若干通道后,重建其输出特征图C使得损失信息最小。
1.2.3 灵感来源
稀疏剪枝的灵感来自于神经科学领域中的“神经可塑性”(Neural Plasticity)理论,即神经元之间的连接是可以通过一定的训练过程而发生变化的。
早期的神经科学研究表明,神经元之间的连接是非常复杂和动态的。当神经元之间频繁地传递信息时,它们的连接会变得更加强大和持久;反之,如果神经元之间的信息传递很少,它们的连接就会减弱或消失。
基于这种神经可塑性的观察,研究者们开始探索如何将神经可塑性的原理应用到深度神经网络中。他们发现,通过去除网络中一些不必要的连接,可以显著地降低网络的计算复杂度,并在不影响网络准确性的情况下减少存储需求。
因此,稀疏剪枝是一种受到神经科学启发的模型压缩技术,它试图在深度神经网络中实现神经可塑性的效果,从而减少计算和存储开销。
连续性剪枝的灵感主要来自于神经科学领域中的“神经元活跃性”(Neuronal Activity)理论,即神经元在不同的时间段内会表现出不同的活跃水平。
在神经科学研究中,研究者们已经发现,神经元之间的连接是通过不断的学习和适应来建立和加强的。神经元的活跃水平对于连接的建立和强度起到了非常重要的作用。在网络训练过程中,神经元的活跃水平通常会随着时间的推移而改变,这对于网络的性能和学习效果非常关键。
基于这种神经元活跃性的观察,研究者们开始探索如何将神经元活跃性的原理应用到深度神经网络中,以实现网络的压缩和优化。他们发现,通过删除网络中一些梯度最小的连接,可以实现一定程度的模型压缩,同时保持网络的性能和学习效果。
因此,连续性剪枝是一种受到神经元活跃性启发的模型压缩技术,它试图在深度神经网络中模拟神经元的活跃水平,并基于这种活跃性来剪枝网络,从而实现网络的优化和压缩。
3. 基于优化目标的变化来衡量通道的敏感性(略)
含义:模型量化是指将神经网络的浮点算法转换为定点。
作用:
(1) 减小模型大小
(2) 加快推理速度
(3) 某些硬件加速器如 DSP/NPU 只支持 int8
体现模型量化优点的两个例子:
example1:Rough energy costs for various operations in 45nm 0.9V.[5]
FP运算大约占用一条简单指令的1/10的能量,使机器的指令能量由FP运算支配。获得最高的能源效率需要一个非常具体的组合:非常低的能源操作和极端的局部性。1000 MOPS/mW=1pJ/次操作。
只有当应用程序处理短整数数据(8到16位),并且每次本地存储器提取都要完成数十次数据操作,每次DRAM提取大约要完成1000次操作时,这样的效率水平才有可能实现。
example2:
FP32乘法运算的能耗是INT8乘法运算能耗的18.5倍,芯片占用面积则是int8的27.3倍
2.1模型量化的方案
1.data free:不使用校准集,传统的方法直接将浮点参数转化成量化数,使用上非常简单,但是一般会带来很大的精度损失,但是高通最新的论文 DFQ 不使用校准集也得到了很高的精度。
2.calibration:基于校准集方案,通过输入少量真实数据进行统计分析。很多芯片厂商都提供这样的功能,如 tensorRT、高通、海思、地平线、寒武纪
3.finetune:基于训练 finetune 的方案,将量化误差在训练时仿真建模,调整权重使其更适合量化。好处是能带来更大的精度提升,缺点是要修改模型训练代码,开发周期较长。
2.2量化的分类
1. 二值化,其可以用简单的位运算来同时计算大量的数。对比从 nvdia gpu 到 x86 平台,1bit 计算分别有 5 到128倍的理论性能提升。且其只会引入一个额外的量化操作,该操作可以享受到 SIMD(单指令多数据流)的加速收益。
2. 线性量化(最常见),又可细分为非对称,对称和 ristretto 几种。在 nvdia gpu,x86、arm 和 部分 AI 芯片平台上,均支持 8bit 的计算,效率提升从 1 倍到 16 倍不等,其中 tensor core 甚至支持 4bit计算,这也是非常有潜力的方向。线性量化引入的额外量化/反量化计算都是标准的向量操作,因此也可以使用 SIMD 进行加速,带来的额外计算耗时不大。
2. 对数量化,一种比较特殊的量化方法。两个同底的幂指数进行相乘,那么等价于其指数相加,降低了计算强度。同时加法也被转变为索引计算。目前 nvdia gpu,x86、arm 三大平台上没有实现对数量化的加速库,但是目前已知海思 351X 系列芯片上使用了对数量化。
2.3 量化的idea来源
量化参数的想法最初来自于Hinton等人在2015年的一篇论文中,该论文探索了使用低精度参数来加速神经网络的训练和推理的方法。Hinton等人认为,使用更少的比特来表示神经网络的参数可以显著地减少计算开销和存储需求,同时在一定程度上可以保持模型的性能。
具体地说,Hinton等人提出了一种使用二进制权重和三元激活函数(即只取-1、0和1三种值)的神经网络模型,并在MNIST数据集上取得了不错的效果。他们还将这种想法扩展到了更深的卷积神经网络上,并通过对CIFAR-10数据集的实验表明,使用低精度参数可以加速网络的训练和推理过程,并同时减少存储需求。
因此,量化参数的想法是通过将神经网络中的参数进行二进制化或低精度化,以减少计算开销和存储需求的方式而得到的。这种想法不仅可以提高神经网络的效率,而且也在一定程度上启示了后来的研究者开发新的模型压缩和优化技术。
文献
[1] Zhu M, Gupta S. To prune, or not to prune: exploring the efficacy of pruning for model compression[J]. arXiv: Machine Learning, 2017.
[2] Han S, Pool J, Tran J, et al. Learning both weights and connections for efficient neural network[C]//Advances in neural information processing systems. 2015: 1135-1143.
[3] Liu Z, Li J, Shen Z, et al. Learning efficient convolutional networks through network slimming[C]//Proceedings of the IEEE International Conference on Computer Vision. 2017: 2736-2744.
[4] He Y, Zhang X, Sun J. Channel pruning for accelerating very deep neural networks[C]//Proceedings of the IEEE International Conference on Computer Vision. 2017: 1389-1397.
[5] M. Horowitz, "1.1 Computing's energy problem (and what we can do about it)," 2014 IEEE International Solid-State Circuits Conference pp. 10-14, 2014
[6]Yu-Ming Zhang, Chun-Chieh Lee, Jun-Wei Hsieh, Kuo-Chin Fan “CSL-YOLO: A New Lightweight Object Detection System for Edge Computing” 2021 Computer Vision and Pattern Recognition.
基本思想:
知识蒸馏的基本思想正是让卷积神经网络模仿 人类的学习行为,将大型网络(教师网)学习到的知识提炼传授给小型网络(学生网),并指导小型网络 的训练,从而实现了从大型网络压缩成小型网络的目的。其一般实现思路如图 所示。
下文根据蒸馏位置的不同,把知识蒸馏划分为基于 softmax 输出层的知识蒸馏与基于中间层知识蒸馏,其他代表性的方法还包括基于相关性知识的知识蒸馏以及结合生成对抗网络(generative adversarial networks,GAN)的知识蒸馏。
1.基于softmax输出层的知识蒸馏
在一个训练成熟的网络模型输出的概率分布中,错误类别的概率一般比较小,但是其中可能会存在一些概率相对较高的类别,例如,一辆公交车可能只有很小的机会被误认为小汽车,但这个错误概率仍然比误认为一棵树的可能性高很多倍,Hinton等人认为这些错误类别的相对概率中隐藏着网络学习到的知识,这种知识是概率分布只有 0和 1的真实标签不具备的,因而,在 softmax 输出层中加入 超参数 T(如式(1)所示)用来平滑网络输出的概率分布,以强化输出的概率分布中网络学习到的知识。通过温度系数 T 平滑过后的网络输出被称为软目标,软目标和真实标签一起指导学生网络训练,损失函数的组成 JKD 一般如式(2)所示。
1.1拓展方法
1>最高分差(TSD)知识蒸馏
TSD 只使用教师网络预测输出置信度最高的 k个类别计算损失,超参数 k 代表每个图像语义上最相似的类的数量,其中包含真实类别在内。然后,计算最高置信度类别与其之下得分最高的 k - 1 类之间的置信度差距,将结果作为教师网络提供的损失,联合目标任务损失对学生网络进行训练。
2>提前停止知识蒸馏(ESKD)
大模型的准确率更高,但是它往往并不能更好地指导学生网络训练,原因容量不匹配。由于网络规模差距过大,学生无法模仿老师,反而会带偏了目标任务损失。因此在学生网络训练结束之前停止教师的知识指导以提高学生网络学习效果,通过使教师网络知识对应的损失权重逐渐衰减,以获得一个更适合学生训练的方案。
2.基于中间层的知识蒸馏
基于中间层的知识蒸馏是目前研究最多的方法,主要是从网络的中间隐藏层中通过各种手段
提取可以表示网络学习过程的知识,或者能够蕴藏网络如何对输入数据进行推理的知识,将提取到的这些知识传递给学生网络以实现知识蒸馏,达到提高学生网络性能的目的。
1>FitNet
使用教师网络的特征图作为指导层,选择学生网络的特征图作为被指导层,FitNet是一个二阶知识蒸馏,第一步使用指导层指导被指导层训练,第二步使用 KD继续训练学生网络。
注意力转移(AT )
AT把注意力看作一组空间映射,这些映射可以在网络的各个层中定义,以便它们能够捕获低、中、高级的表示信息,然后把注意力从教师网络转移到学生网络,以提高后者的表现。如图 4 所 示,AT 定义了基于激活值(神经元在预测过程的输出)的注意力图,其基本假设是隐藏层神经元激活的绝对值可以代表这个神经元的重要性,通过对同一空间位置不同通道的特征图的统计,将 C 个通道的特征图映射为单通道的注意力图。通过让学生网络的注意力图拟合教师网络的注意力图,并联合目标任务损失对学生网络进行训练。
3>FSP蒸馏
对于具有相同尺寸的特征图,使用低和高层不同通道的特征图两两计算内积,得到的结果代表对应通道的两两特征图的互相关值,将互相关值作为 FSP 矩阵的对应位置的元素。最后用 L2 损失去拉近教师和学生的 FPS 矩阵之间的距离,通过构建 FSP 损失联合目标任务损失一起指导学生网络训练。
4>神经元选择性转移(NST)
NST 的假设是每个神经元都从原始输入中提取与目标任务相关的特定模式,因此,如果一个神经元在某些区域或样本中被激活,这就意味着这些区域或样本可能具有一些与任务相关的共同
属性。NST 通过匹配教师和学生网络之间神经元选择性模式的分布进行知识蒸馏,采用最大平均偏差(maximum mean discrepancy,MMD)作为损失函数来度量师生分布之间的差异,并结合目标任务损失对学生网络进行训练。
5>因子传输(FT)
先将教师网络特征图的通道扩展 k倍,使 m 个通道特征图的知识转化到 m × k 个通道上,再进行知识传递。整体架构如图所示,在教师网络指导层的特征图后面连接一个额外的释义器模
块,将特征图通道数扩展为 m × k 。释义器由卷积模块组成,为了保证通道扩展后得到的信息可以完整地表示原始特征图,在释义器的输入特征 x 和输出特征 p(x) 间设置重建损失,对释义者进行无监督训练。相应地,在学生网络的被指导层后连接一个适配器,适配器也由卷积模块构成,目的是为了让学生网络的通道数与释义器的输出相匹配。
其他相关知识蒸馏
1>关系知识蒸馏
如图所示,RKD 算法的核心是以教师网络的输出为结构单元,取代 IKD 中以教师网络单个输出为知识的蒸馏方式,RKD 利用多输出组合成结构单元,更好地获取教师网络的结构化特征。 RKD 学习的损失函数如式(11)所示,其中 t1, t2,⋯,tn 表示教师网络的多个输出,
s1,s2,⋯,sn 表示学生网络的多个输出,∂ 是构建结构信息的函数,由两个样本之间的欧几里德距离或三元组之间的角距离实现,l表示计算二者之间的差距。
2>样本关系图蒸馏
首先,构造 IRG,其中顶点表示训练样本,两个顶点之间的边权重表示样本之间的相似性程度。然后,使用 IRG变换对从低层到更高层的特征空间转换进行建模,尽管输入样本的特征在不同的网络结构中通常具有不同的维度,但图的大小总是相同的,因为节点的数量等于单次输入训练样本的数量。最后,设计 IRG 损失、IRG 变换损失以及目标任务损失的联合损失函数,使用联合损失函数指导学生网络训练。
3>基于生成对抗网络的知识蒸馏
对抗知识蒸馏[76-78] 将学生网络作为生成器,先分别获取生成器和教师网络生成对输入样本的输出概率分布,再使用判别器来区分学生网络的输出与教师网络的输出。学生网络和判别器交替更新参数,其中判别器的更新为了更好地区分教师网络的输出与学生网络的输出,学生网络的更新为 了更好地欺骗判别器,使判别器无法区分学生网络的输出与教师网络的输出。经过学生网络和判别器的多次交替更新后,并达到使判别器无法区分学生网络的输出与教师网络的输出的效果,最终实现学生网络模拟教师网络的目的。如图描述了基于生成对抗网络的知识蒸馏的一般思想。
效果对比
表4为不同知识蒸馏方法在相同数据集上进行的结果,可见KD方法最优,效果最佳。
表5为使用知识蒸馏方法后学生网络的性能情况,都相对于未指导前都有所提升。
低秩分解是指通过合并维数和施加低秩约束的方式稀疏化卷积核矩阵,由于权值向量大多分布在低秩子空间,所以可以用少数的基向量来重构卷积核矩阵,达到缩小存储空间的目的。
特点:低秩分解在大卷积核和中小型网络中都有不错的压缩效果,但是由于过去研究较为成熟,同时1×1卷积的流行,这种小卷积核不利于低秩分解方法的使用,因此不利于模型压缩与加速。
奇异值分解(SVD)
SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵A是一个m×n的矩阵,那么我们定义矩阵A的SVD为:
其中U是一个 m×m的矩阵, Σ 是一个 m×n 的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值, V是一个 n×n的矩阵。 U和V 都是酉矩阵,即满足UTU=I,VTV=I 。
下图就解释了奇异值分解的过程。
CP分解
一般而言,给定一个大小为n1*n2*n3的张量X,其CP分解可以写成如下形式,即
下图展示了三阶张量的CP分解。
基于低秩分解的效果对比
下图显示了基于速度和压缩比的实际增长,对两种方法进行了简单的比较,以衡量每种方法的性能。右图可得,BN与CP方法都使模型大小缩小了多倍且保持精度变化不大,可见低秩分解的效果还是很好的,但低秩分解的成本比较高,不易找到分解方法,且有些矩阵不适用等缺点。
主要采用以下两种方法:
深度可分离卷积(Depthwise Separable Convolution):深度可分离卷积是将传统卷积拆分为深度卷积和逐点卷积两个子操作的方法。深度卷积是将输入的每个通道分别进行卷积,然后将卷积结果在通道维度上进行拼接;逐点卷积是将不同通道之间的信息进行交互,可以看作是一种点乘操作。通过将传统卷积操作分解成深度卷积和逐点卷积两个子操作,可以大幅降低卷积操作中的计算量和参数数量,从而实现轻量化。
分组卷积(Group Convolution):分组卷积是将输入的通道进行分组,并将每个分组分别进行卷积操作的方法。将输入通道分组后,每个分组只需要与相应的卷积核进行卷积,然后将卷积结果在通道维度上进行拼接,可以大幅降低卷积操作中的计算量和参数数量。在分组卷
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!