深度学习
TensorRT介绍
TensorRT采用C++开发, 能使深度学习模型在GPU上进行低延迟、高吞吐量的部署Pytorch的支持需要先转换成中间模型ONNX格式- 工作流程
- 首先输入一个训练好的
FP32模型文件, 并通过parser等方式输入到TensorRT中做解析, 解析完成后engin会进行计算图优化 - 得到优化好的
engine可以序列化到内存(buffer)或文件(file), 读的时候需要反序列化, 将其变成engine以供使用 - 在执行的时候创建
context, 主要是分配预先的资源,engine加context就可以做推理(Inference)
- 首先输入一个训练好的
- 优化原理
- 算子融合(网络层合并)
concat层的消除; 对于channel维度的concat层,TensorRT通过非拷贝方式将层输出定向到正确的内存地址来消除concat层, 从而减少内存访存次数Kernel可以根据不同batch size大小和问题的复杂度, 去自动选择最合适的算法;TensorRT预先写了很多GPU实现, 有一个自动选择的过程; 其问题包括:怎么调用CUDA核心、怎么分配、每个block里面分配多少个线程、每个grid里面有多少个blockFP32->FP16,INT8,INT4:低精度量化, 模型体积更小、内存占用和延迟更低等- 不同的硬件如
P4卡还是V100卡甚至是嵌入式设备的卡,TensorRT都会做对应的优化, 得到优化后的engine
卷积网络的压缩方法
来源旷世学术分享-张祥雨:高效轻量级深度模型的研究和实践
- 低秩近似
- 原理: 将权值矩阵表示为若干个低秩矩阵的组合, 其中每个低秩矩阵可以分解为小规模矩阵的乘积, 当秩取值很小时,能大幅降低总体的存储和计算开销
- 方法:
- 使用结构化矩阵进行低秩分解
- 奇异值分解(SVD分解)
- 剪枝与稀疏约束
- 方法1:对不重要的神经元进行剪枝随后微调网络
- 方法2:对低于某个阈值的权重连接全部剪枝随后微调网络
- 方法3:利用稀疏约束对网络进行剪枝(思路是在网络的优化目标中加入权重的稀疏正则项, 使得训练时网络的部分权重趋向于 0 , 而这些 0 值就是剪枝的对象)
- 参数量化
- 浮点转定点, 加快运算速率同时减少内存和存储空间的占用保证模型精度损失在可接受的范围内
- 二值化网络
- 知识蒸馏
- 先训练好一个
teacher网络, 然后将teacher的网络的输出结果 作为student网络的目标, 训练student网络, 使得student网络的结果 接近 , 因此,student网络的损失函数为 , 是真实标签的onehot编码, 是teacher网络的输出结果, 是student网络的输出结果 - 使用
softmax-T(软标签计算公式)解决teacher网络输出的softmax结果q置信度较高的问题(无法将teacher网络学到的数据的相似信息传达给student网络, 因为概率接近0) softmax-T:T的取值会影响最终的结果, 一般而言, 较大的 T 能够获得较高的准确度, T(蒸馏温度参数)属于知识蒸馏模型训练超参数的一种. T 是一个可调节的超参数、T 值越大、概率分布越软(论文中的描述), 曲线便越平滑
- 先训练好一个
- 浅层网络
- 设计浅层网络
MobilenetV2、ShuffleNetv2等作为backbone
- 设计浅层网络
YOLOv4论文中的相关工作
Bag of freebies(Tricks)
不改变模型大小, 主要针对输入和loss做的优化工作
- 数据增强(data augmentation): 提升输入图像的可变性, 使模型在不同环境中会有更高的鲁棒性
- 逐像素调节:
- 光度失真: 调节亮度、对比度、色调、饱和度噪声
- 几何失真:随机缩放、裁剪、翻转、旋转
- 模拟对象遮挡
- 随机擦除(random-erase)和Cutout方法:随机选择图像中的矩形区域, 并填充零的随机或互补值
- 捉迷藏(hide-and-seek)和网格遮罩(grid-mask):随机或均匀地选择图像中的多个矩形区域, 并将它们替换为所有的 zeros(类似Dropout等在feature层面的操作)
- 多个图像一起执行数据增强
- Mixup方法:使用两个图像以不同的系数比值相乘后叠加, 然后使用这些叠加的比值来调整标签
- CutMix方法:将裁切后的图像覆盖到其他图像的矩形区域, 并根据混合区域的大小调整标签
- style transfer GAN方法用于数据扩充、减少 CNN 所学习的纹理偏差
- 针对解决数据集中予以分布可能存在偏差的问题(
semantic distribution in the dataset may have bias)- 类别不平衡(
imbalance between different classes)- 两阶段对象模型: 困难负样本挖掘(
hard negative example mining)或在线困难样本挖掘(online hard example mining (OHEM)) - 一阶段检测器(密集检测架构(
prediction architecture)): Focal Loss决绝类别不平衡
- 两阶段对象模型: 困难负样本挖掘(
- 很难用
one-hot hard representation表达不同类别之间的关联程度, 但执行标记时通常使用这种方法- 标签平滑(
label smoothing)[Rethinking the inception architecture for computer vision] - 知识蒸馏设置标签细化网络[
Label refinement network for coarse-to-fine semantic segmentation]
- 标签平滑(
- 类别不平衡(
- 针对边界框(BBox)回归的目标函数
- 传统目标检测器使用均方根误差MSE对中心点坐标以及高度和宽度直接执行回归, 或对基于锚的方法估计相应的偏移量, 没有考虑对象本身的完整性
IOU损失是尺度不变的表示, 所以可以解决传统方法计算 的 或 损失时, 损失会随着尺度增加的问题GIoU损失除了覆盖区域外还包括对象的形状和方向, 分母为同时包含了预测框和真实框的最小框的面积DIoU损失还考虑了对象中心的距离CIoU损失同时考虑了重叠区域, 中心点之间的距离和纵横比, 在 BBox 回归问题上可以实现更好的收敛速度和准确性.
Bag of sepcials(即插即用模块+后处理方法)
仅增加少量推理成本但可以显著提高目标检测器准确性的插件模块或后处理方法
一般而言, 插件模块用于增强模型中的某些属性, 例如扩大感受野, 引入注意力机制或增强特征集成能力等, 而后处理是用于筛选模型预测结果的方法
- 增大感受野模块
- 常用模块:
SPP,ASPP和RFB- SPP 起源于空间金字塔匹配(SPM),SPM 的原始方法是将特征图分割为几个个相等的块, 其中可以为 , 从而形成空间金字塔.
SPP将SPM集成到CNN中, 并使用最大池化操作. 原始的SPP模块是输出一维特征向量, 在FCN网络中不可行
- SPP 起源于空间金字塔匹配(SPM),SPM 的原始方法是将特征图分割为几个个相等的块, 其中可以为 , 从而形成空间金字塔.
- 常用模块:
- 引入注意力机制
- 目标检测中常用的注意力模块为
channel-wise注意力和point-wise注意力, 代表模型为SE和SAM
- 目标检测中常用的注意力模块为
- 特征融合或特征集成
- 早期的实践是使用
skip connection或hyper-column将低层物理特征集成到高层语义特征 - 由于诸如
FPN的多尺度预测方法已变得流行, 因此提出了许多集成了不同特征金字塔的轻量级模块. 这种模块包括SFAM,ASFF和BiFPN.SFAM的主要思想是使用SE模块在多尺度级联特征图上执行通道级级别的加权- 对于
ASFF, 它使用softmax作为逐点级别权重, 然后添加不同比例的特征图 - 在
BiFPN中, 提出了多输入加权残差连接以执行按比例的级别重新加权, 然后添加不同比例的特征图
- 对于
- 早期的实践是使用
- 激活函数
- 良好的激活函数可以使梯度在反向传播算法中得以更有效的传播, 同时不会引入过多的额外计算成本
ReLU激活函数, 实质上解决了传统的tanh和sigmoid激活函数中经常遇到的梯度消失问题LReLU和PReLU的主要目的是解决当输出小于零时ReLU的梯度为零的问题ReLU6和Hard-Swish是专门为量化网络设计的SELU激活函数来对神经网络进行自归一化
- 后处理
- 最开始常用
NMS来剔除重复检测的BBox, 但是NMS会不考虑上下文信息(可能会把一些相邻检测框框给过滤掉), Soft NMS, 为相邻检测框设置一个衰减函数而非彻底将其分数置为零DIoU NMS则是在soft NMS的基础上将中心距离的信息添加到BBox筛选过程中- 值得一提的是, 因为上述后处理方法都没有直接涉及捕获的图像特征, 因此在后续的
anchor-free方法中不再需要NMS后处理
- 最开始常用