商汤深度学习算法+地平线开发板部署

大家好,我是地平线的海盗旗,今天教程讲述的是商汤算法在地平线开发板的部署。经过长期的使用,相信大家对地平线的开发套件Open_Explorer有了较深理解,现在简单介绍商汤的算法库:OpenMMLab 是一个适用于学术研究和工业应用的开源项目,涵盖了计算机视觉的许多研究课题,如:图像分类、目标检测、目标分割、超分辨率图像生成等。其包含上百个算法源码与与训练模型,广大开发者可以快速使用现有算法实现项目落地。

下面开始正式讲解商汤算法在地平线开发板的部署,本次例程使用商汤的预训练模型mobilenet_v2

  • 一、模型转化

1.安装mmcv+mmcls:

具体细节请参考OpenMMLab开发手册:OpenMMLab

下载mmcls源码与与训练模型:open-mmlab/mmclassification: OpenMMLab Image Classification Toolbox and Benchmark (github.com)

2.商汤训练模型转化为onnx模型:

使用mmcls中自带的pytorch2onnx工具,把训练好的mobilenetv2模型转化为onnx模型,开发者也可以根据自己的场景需求进行训练。

python tools/deployment/pytorch2onnx.py \ 
    configs/mobilenet_v2/mobilenet_v2_b32x8_imagenet.py \ 
    --checkpoint mobilenet_v2.pth  \ 
    --output-file mobilenetV2.onnx \ 
    --show  
    --verify 
 

运行之后,用户可以获取相应的onnx模型!

  • 二、模型校验

成功得到ONNX模型之后,我们需要把ONNX模型转化为板端部署文件,地平线提供了天工开物工具链,可以有效地对ONNX模型进行验证并转化。使用工具链对ONNX模型进行校验,校验不通过的模型目前无法上板部署,需要调整算子或提交地平线开发人员进行算子支持升级!!

工具链可在地平线生态社区获取:地平线 AI 社区 (horizon.ai)

图 2

model_type="onnx" 
onnx_model="../../../01_common/modelzoo/mapper/classification/mobilenet/mobilenet_v2.onnx" 
output="./mobilenet_checker.log" 
march="bernoulli2" 
hb_mapper checker --model-type ${model_type} \ 
                  --model ${onnx_model} \ 
                  --output ${output} --march ${march}

图3 Check结果图

使用Checker 模型校验可以判断地平线BPU模块是否支持算子推理,这是模型上板的第一步。上图为校验结果,显示出算子的运行设备。

第二步是数据准备,从训练或测试集中选取50-100张图像作为校准图像。

第三步是使用makertbin工具把ONNX模型转化为半段推理的二进制bin文件。

config_file="./mobilenet_config.yaml" 
model_type="caffe" 
# build model 
hb_mapper makertbin --config ${config_file}  \ 
                    --model-type  ${model_type}

model_type为ONNX、Caffe等可选模型,config_file中包含了模型转化的各种参数,包括模型输入大小,节点名称,输入类型(此处非常重要,因为板端通常接入MIPI相机等,NV12的图像数据结构与训练使用的NCHW差别较大,大部分MIPI相机输入都需要增加转化节点),模型输出layout以及推理优先级(速度优先还是带宽优先)等,下图为转化推理文件的输出结果,模型的精度保持达到97.76%。

图4 量化模型输出图

  • 三、推理测试

使用天公开物工具链,调用上板测试模块:

1.构建应用:

# parallel_process_num的设置,参考您的cpu配置,如果不设置这个环境变量,默认为单进程 
cd samples/04_detection/01_yolov2/runtime_arm 
sh 01_build.sh

2.数据预处理

# parallel_process_num的设置,参考您的cpu配置,如果不设置这个环境变量,默认为单进程 
export PARALLEL_PROCESS_NUM=${parallel_process_num} 
sh 02_preprocess.sh

处理好的图像将会用于后续的评测eval。

3.将构建好的应用传到开发板

sh 03_scp_to_board.sh ${board_ip}

执行这个命令,会将构建好的应用,通过scp,传输到开发板的 /userdata/samples/mobilenet 目录下。

若要执行单张图片的infer, 则可通过下面的代码操作远程登录开发板进行执行:

ssh root@${board_ip} 
cd /userdata/samples/yolov2 
sh dev_board_01_infer.sh

4.执行评测

sh 04_eval.sh ${board_ip}

该脚本会将图片传输至板上进行运行和评测, 此过程将持续很久.

5.执行性能测试

sh 05_perf.sh ${board_ip}

同时该操作也可从开发板上单独完成, 则可通过下面的代码操作远程登录开发板进行执行:

ssh root@${board_ip} 
cd /userdata/samples/yolov2 
sh dev_board_03_perf.sh

图5 速度验证与精度验证图

在测试集上获取70%左右的准确率,训练精度约为72.3%,保留了较高的精度,可以满足板端推理需求。

  • 四、总结

商汤OpenMMLab可以快速有效地构建深度学习模型,地平线的天公开物开发板可以快速进行嵌入式开发部署,而且速度与精度都能得到有效的保证。商汤和地平线的强强联合,进一步扩大了地平线芯片的算法生态,同时助力OpenMMLab用户更好地进行多样化的AI部署。

图片怎么都不见了

搬迁,迁移时候有一些数据遗漏,具体可以参考飞桨模型在地平线开发板的部署 - 知乎 (zhihu.com)