一、二值姿态估计网络
二值网络较难用后训练的方式进行量化,因此本文基于Simple Baselines 提出的模型结构,替换其backbone中的卷积模块为二值卷积(其中实现参考了这篇论文)并使用pytorch框架进行训练。
由于二值网络的权重在训练时仍然是浮点类型,因此在模型转换时需要将pytorch模型中的weight使用torch.sign进行二值化。随后将pytorch模型导出为onnx,再使用bolt提供的转换工具进行转换。
二、实验准备
实验使用的开发板为昇腾的Atlas200,CPU为8*Cortex-A55,但其中只有四核能进行通用计算,剩下四核仅用于NPU的调度。之前刚好跑过NPU的任务,可以看看二值网络的实际性能能否与NPU相竞争。Bolt的安装还算简单,从官方仓库克隆后按照Linux(armv8.2+) 的平台安装即可。
安装时需注意:
1、使用多线程计算需要在install.sh中把openmp的选项打开;
2、默认情况下third_party/install.sh中第96行protoc的版本号会报错,因为github上没有这个版本的release(不知道为什么开发者在linux-aarch64平台下要使用3.1.0版本的?),将其也设为3.14.0后即可成功安装。
三、实验结果
模型 | 线程数 | 卷积耗时 (ms) | 反卷积耗时 (ms) | 总时间 (ms) | 内存占用 (M) | 精度 (mAP) |
---|---|---|---|---|---|---|
Pose_bireal18 (BNN) | 1 | 145.4 | 402.9 | 588.5 | 41.5 | 54.0 |
Pose_bireal18 (BNN) | 4 | 107.3 | 111.1 | 246.6 | 41.0 | 54.0 |
Pose_resnet18 (FP32) | 1 | 329.8 | 401.8 | 760.6 | 114.0 | 66.6 |
Pose_resnet18 (FP32) | 4 | 183.0 | 110.7 | 311.4 | 114.1 | 66.6 |
Pose_resnet50 (NPU) | 4 | - | - | 8.34 | - | 70.4 |
由于simple baseline选择了在模型最后连接反卷积层来做上采样,而这些反卷积层在实验中是没有被二值化的,因此占用了较多的时间。
从BNN和全精度模型对比来看,在卷积层上的加速比为329.8/145.4=2.27(单线程),带来的收益还是可以的。但是在多线程的情况下,全精度反卷积的计算有了接近于线程数的4倍的加速,而二值化卷积的并行加速却没这么明显,此时卷积层的加速比仅为183/107.3=1.70。这就导致了在总推理时间上,二值化网络带来的收益较低,没有达到理想的效果。当然,二值化网络使用一个比特位存储权重,带来的内存占用降低还是实打实的。
最后是二值网络做姿态估计的实际效果图。虽然在精度上和SOTA还有不小的差距,但在图像质量还不错时效果还是可以的~