Jetson Nano搭建人脸检测系统: (四)后处理优化

Jetson Nano搭建人脸检测系统: (四)后处理优化,第1张

  在前面两篇文章中我们使用的人脸检测算法,在经过神经网络模型输出后还进行了一系列的后处理 *** 作,那么这些后处理 *** 作的意义是什么?

  要解决这个问题,我们要先弄懂目标检测算法的网络结构,该模型有两部分输出:类别概率分布和边界框回归。模型的损失函数只是将边界框的回归损失与分类的交叉熵损失相加,通常使用均方误差(MSE):

TensorRT中已经为我们设计好了常用的Layers,可以通过 https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/python_api/infer/Graph/Network.html 查看。为了能够完成上面的公式,这里介绍几个:

除了已经编好的层之外,还有一些特别的插件可以自定义一些 *** 作,官方有写好的插件,也可以自己定义自己的插件。目前主要介绍一些官方的插件:

  通过上面介绍的各种插件,可以把上一节中人脸检测模型的后处理部分整合到一起,一方面可以使模型更简洁方便部署,另一方面也可与后面的人脸识别模型无缝的联结在一起。

在主流卷积神经网络模型中 Conv+BN+Relu 是一种常见的模型结构。在模型推理和训练中,BN层往往与其他层合并,以减少计算量。

node_of_325

node_of_326

node_of_327

在TensorRT中会对网络结构进行垂直整合,即将 Conv、BN、Relu 三个层融合为了一个层,即CBR融合

在BN层中,首先对输入 进行归一化( 输入张量的均值, 输入张量的方差),然后对归一化的结果进行比例缩放和位移。 [1][2]

展开可得:

带入替换后可得:

此时可以将BN层视为一个1x1卷积层。

BN层的输入特征(Conv层的输出特征) 的形状为 ,对于Conv层:

,因此BN与Conv融合之后

融合之后:

线性整流函数(Rectified Linear Unit, ReLU)即: ,又称修正线性单元,是一种人工神经网络中常用的激活函数(activation function)。

在神经网络中,线性整流作为神经元的激活函数,定义了该神经元在线性变换之后的非线性输出结果。换言之,对于来自上一层卷积层的输入向量 ,使用线性整流激活函数可以得到输出:

在Int8量化模型中,Conv+ReLU 一般也可以合并成一个Conv进行运算 [3] 。

对于Int8ReLU,其计算公式可以写为 :

由于ReLU的输入(数值范围为 )和输出(数值范围为 )的数值范围不同,因此需要保证 和 、 和 是一致的。由于ReLU的截断 *** 作,因此需要使用 和 ,即对于ReLU的输入,使用输出对应的和保证其对小于0截断的输入进行截断,对大于等于0的输入映射至[0,255]范围内。

在Int8Conv的计算过程中,首先使用量化计算公式 对输入和权重值进行量化计算,将其转换为数值范围为(0,255)的整数,在完成卷积计算后再将计算结果进行反量化计算。而 ReLU 本身没有做任何的数学运算,只是一个截断函数。假设Int8Conv的卷积输出为 122( ),则对应反量化输出 -0.3,经过Int8ReLU( ),对该值进行Int8量化,对应的输出为0。因此在ReLU层对输入进行截断之前,即可得到需要截断的数值。

因此,通过在完成卷积计算后直接使用 ReLU 后的 scale 和 zeropoint进行反量化,实现了将 ConvReLU融合。

TensorRT repo

参考 csdn

在 TensorRT/samples/python/ 下参考 costom 编写方式和cmake,docker环境里make生成 .so, 注意插件名字和trt用到的组件名应该一致

python 加载插件

如果用 trtexec ,需要 vim .bashrc

安装依赖 参考


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11949613.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存