基于HRNet的姿态识别算法移植与测试

课程全程将在SOPHGO(算能)云平台上进行。
本次课程将介绍:

  1. SOPHGO(算能)PCIE 云平台环境搭建
  2. HRNet的姿态识别算法
  3. 通过BMNNSDK进行HRNet模型转换和量化
  4. 实现算法的移植
  5. 部署和测试
  6. 相关链接

版本环境: 本次课程使用的版本环境适配 SOPHON SDK V2.7.0 和 SOPHON SDK V3.0.0 版本,其他版本可能会出现不兼容的情况。目前课程的云环境版本是SOPHON SDK V2.7.0


1. SOPHGO(算能)云平台环境搭建

1.1. 开通云平台账号   

参考: https://cloud.sophgo.com/tpu.pdf

1.2. 开发环境初始化  

1.2.1 进入命令行模式,进去默认在/home/sophgo目录  

基于HRNet的姿态识别算法移植与测试_第1张图片

 1.2.2 安装驱动  

# 切换成root权限
sudo -i
cd /home/sophgo/bmnnsdk2-bm1684_v2.7.0/scripts
bash ./install_driver_pcie.sh

执行ls /dev/bm*, 如果可以看到以下设备节点,表示驱动安装成功: 

1.2.3 加载Docker,并初始化环境  

apt install unzip
cd /home/sophgo/bmnnsdk2-bm1684-ubuntu-docker-py37/
docker load -i bmnnsdk2-bm1684-ubuntu.docker

1.2.4 通过脚本创建Docker容器

cd  /home/sophgo/bmnnsdk2-bm1684_v2.7.0/
bash ./docker_run_bmnnsdk.sh

# 自动进入Docker容器
cd /workspace/scripts && bash install_lib.sh nntc

# 每次进入镜像都要source 
source /workspace/scripts/envsetup_pcie.sh 

#  安装sophon包
pip3 install /workspace/lib/sail/python3/pcie/py37/sophon-2.7.0-py3-none-any.whl

可以通过python3 -c "import sophon.sail" 来检查是否出现问题   
基于HRNet的姿态识别算法移植与测试_第2张图片

1.2.5 通过云空间文件系统拷贝代码到Docker容器中

打开云空间文件系统:   

基于HRNet的姿态识别算法移植与测试_第3张图片
上传文件:文件会被存储在服务器的 /tmp 目录下  

基于HRNet的姿态识别算法移植与测试_第4张图片

 拷贝文件到Docker容器中: 
Docker容器的workspace目录被映射到 /home/sophgo/bmnnsdk2-bm1684_v2.7.0/

注意:本教程后续步骤均在Docker容器中进行

2. HRNet的姿态识别算法  

仓库链接: https://github.com/leoxiaobin/deep-high-resolution-net.pytorch

论文链接: https://arxiv.org/abs/1902.09212 

HRNet pose,是中科大和微软亚洲研究院发布的人体姿态估计模型, 拥有与众不同的并联结构,可以随时保持高分辨率表征。

 

3. 通过BMNNSDK进行HRNet模型转换 

3.1 下载项目文件 

git clone xxx(待更新)

3.2 准备推理的模型 

cd HRNet/v2.7.0/scripts/
bash download_from_nas.sh

3.3 生成FP32 BModel 

BMNETO是针对ONNX的模型编译器,可以把ONNX格式的model经过图编译优化后,转换成BMRuntime所需的文件。在编译模型的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。 可参考文档 https://doc.sophgo.com/docs/3.0.0/docs_latest_release/nntc/html/usage/bmneto.html 

执行以下命令转为bmodel

bash gen_fp32bmodel.sh

部分输出:

基于HRNet的姿态识别算法移植与测试_第5张图片

 

3.4 查看FP32 BModel相关信息   

命令:bm_model.bin --info xxxx.bmodel

bm_model.bin --info compilation/compilation.bmodel

基于HRNet的姿态识别算法移植与测试_第6张图片

命令:bmrt_test --bmodel xxxxxxx.bmodel

bmrt_test --bmodel compilation/compilation.bmodel

基于HRNet的姿态识别算法移植与测试_第7张图片

 

3.5 分层量化:生成INT8 BModel  

int8模型是原始fp32模型量化后得到的。量化是指将信号的连续取值近似为有限多个离散值的过程。可理解成一种信息压缩的方法。在计算机系统上考虑这个概念,一般用“低比特”来表示。 BM168X支持INT8量化模型的部署。在通用流程中,需要先借助于算能提供的量化工具对fp32模型进行量化。 ​Qantization-Tools 如下图所示,是算能科技自主开发的网络模型量化工具,它解析各种已训练好的32bit浮点网络模型,生成8bit的定点网络模型。该8bit定点网络模型,可用于算能科技SOPHON系列AI运算平台。在SOPHON运算平台上,网络各层输入、输出、系数都用8bit来表示,从而在保证网络精度的基础上,大幅减少功耗,内存,传输延迟,大幅提高运算速度。  

基于HRNet的姿态识别算法移植与测试_第8张图片

 量化的流程是:  
- 使用量化数据集生成lmdb格式数据  
- 生成FP32 umodel
- 生成INT8 umodel
- 精度测试 (可选)  
- 生成INT8 bmodel


SophonSDK v3.0.0版本中,提供了使用一键假数据实现量化,对应脚本gen_int8bmodelv3.0.sh.  

通过执行以下命令可以生成INT8 bmodel(这里不涉及精度测试,过程用时较长)。  

bash gen_int8bmodel.sh

部分输出:

基于HRNet的姿态识别算法移植与测试_第9张图片

 

4. 实现算法的移植

要在x86 PCIe平台使用bm_opencv可添加环境变量如下:   
export PYTHONPATH=$PYTHONPATH:$REL_TOP/lib/opencv/pcie/opencv-python/

5. 部署和测试

5.1 Python示例程序测试

文件参数

bmodel.py [-h] [--bmodel-path BMODEL_PATH] [--img-root IMG_ROOT]
                 [--json-file JSON_FILE] [--out-img-root OUT_IMG_ROOT]
                 [--kpt-thr KPT_THR] [--radius RADIUS] [--thickness THICKNESS]

optional arguments:
  -h, --help            show this help message and exit
  --bmodel-path BMODEL_PATH
                        bmodel path
  --img-root IMG_ROOT   Image root
  --json-file JSON_FILE
                        Json file containing image info.
  --out-img-root OUT_IMG_ROOT
                        Root of the output img file. Default not saving the
                        visualization images.
  --kpt-thr KPT_THR     Keypoint score threshold
  --radius RADIUS       Keypoint radius for visualization
  --thickness THICKNESS
                        Link thickness for visualization

执行以下命令即可实现推理(路径已经处理好)

cd ../python
# FP32 BModel
python3 bmodel.py # 默认BModel为../dataset/mmpose_fp32.bmodel
# INT8 BModel
python3 bmodel.py --bmodel-path ../dataset/mmpose_int8b1.bmodel

输出(FP32与INT8大同小异):

基于HRNet的姿态识别算法移植与测试_第10张图片

预测的可视化结果保存在 ./vis_results文件夹下    


5.2 获得推理生成的图片

注意: 由于是在Docker容器中,如果想要看到推理的可视化结果需要退出容器,并打开Docker容器映射的文件夹,在对应位置将图片拷贝到
/tmp 文件夹下后可在云平台文件系统中下载。

# 退出容器
exit
# 进入Docker容器映射的文件夹,即Docker容器中的 workspace/目录
cd /home/sophgo/bmnnsdk2-bm1684_v2.7.0/
# 打开hrnet项目, ${hrnet}即项目所在路径
cd ${hrnet}/python/vis_results
# 拷贝需要的推理结果图片
cp *.jpg /tmp/

如图所示  

 

结果展示:  

基于HRNet的姿态识别算法移植与测试_第11张图片

基于HRNet的姿态识别算法移植与测试_第12张图片 

基于HRNet的姿态识别算法移植与测试_第13张图片 

基于HRNet的姿态识别算法移植与测试_第14张图片 

 

6. 相关链接   

样例开源仓库:https://github.com/sophon-ai-algo/examples  
BM1684 BMNNSDK文档:https://developer.sophgo.com/site/index/document/6/all.html   
编译工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/nntc/html/index.html  
量化工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/calibration-tools/html/index.html  
算能量化工具介绍及使用说明:https://www.bilibili.com/video/BV1DA4y1S75p?spm_id_from=333.999.0.0  
官网视频教程:https://developer.sophgo.com/site/index/course/all/all.html  
官网文档中心:https://developer.sophgo.com/site/index/document/all/all.html  
官网下载中心:https://developer.sophgo.com/site/index/material/all/all.html  
官网论坛:https://developer.sophgo.com/forum/view/43.html 

你可能感兴趣的:(TPU实战课,算法,docker,ubuntu)