本期课程,将以计算机视觉领域的目标检测任务为目标,带领大家动手完成从模型训练优化到深度学习应用部署的整个端到端的开发流程。你会逐步学习了解到如何使用飞桨目标检测套件PaddleDetection工具套件完成目标检测模型的训练与适配,如何使用深度学习编译器TVM编译飞桨模型以及如何将编译后的模型部署在含有Arm Cortex-M55处理器的Arm Corstone-300虚拟硬件上。
百度飞桨与Arm深度合作,增加了Cortex-M硬件上支持的深度学习模型的数量,同时也填补了飞桨模型在Arm Cortex-M硬件上的适配空白,为开发者提供了更多的选择。
项目概述
经典的深度学习工程是从确认任务目标开始的,我们首先来简单地介绍一下目标检测任务以及本期部署实战课程中我们所使用的工具和平台。
目标检测任务
目标检测任务就是将图片或视频中所有目标的类别识别出来,并在该目标周围绘制边界框,标示出每个目标的位置。常见的目标检测任务包括人物检测、人脸检测、车辆跟踪等方向,在工业、智慧城市、安防、交通、零售、医疗等十余种行业场景中应用广泛。
图1 目标检测任务案例
PP-PicoDet
PaddleDetection中提出了全新的轻量级系列模型PP-PicoDet,在移动端具有卓越的性能,成为全新的SOTA轻量级模型。PP-PicoDet模型通过创新SOTA模块,例如ESNet、CSP-PAN、SimOTA等,不仅第一个实现了在1M参数量之内mAP(0.5:0.95)超越30+(输入416像素时),而且其性能优于同类算法模型。
图2 PP-PicoDet系统框图
*更多关于PP-PicoDet的详细技术细节,可查看PP-PicoDet arXiv技术报告[5]
Arm虚拟硬件
(Arm Virtual Hardware, AVH)
作为Arm物联网全面解决方案的核心技术之一,AVH很好地解决了实体硬件所面临的难扩展、难运维等痛点。AVH提供了简单便捷并且可扩展的途径,让IoT应用的开发摆脱了对实体硬件的依赖并使得云原生开发技术在嵌入式物联网、边缘侧机器学习领域得到了应用。尤其是在芯片紧张的当今时代,使用AVH,开发者甚至可以在芯片RTL之前便可接触到最新的处理器IP。
目前AVH提供两种形式供开发者使用。一种是托管在AWS以及AWS China上以亚马逊机器镜像AMI形式存在的Arm Corstone和Cortex CPU的虚拟硬件,另外一种则是由Arm以SaaS平台的形式提供的AVH第三方硬件。本期课程我们将使用第一种托管在AWS以及AWS China上以亚马逊机器镜像AMI形式存在的Corstone和Cortex CPU的虚拟硬件。
由于目前AWS China账号主要面向企业级开发者开放,个人开发者可访问AWS Marketplace订阅AVH相关服务。参考下图步骤创建AVH AMI实例。
图3 AVH AMI创建步骤
(访问AWS Marketplace [6]订阅AVH)
端到端部署流程
接下来将重点向大家展示从模型训练到部署的全流程,本期课程所涉及的相关代码已在GitHub仓库开源,欢迎大家下载体验!链接:
https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.5/deploy/third_engine/demo_avh
图4 端到端部署流程示意图
模型训练
PaddleDetection使用配置文件 (.yml) 管理网络训练、评估的参数。在静态图版本下,一个模型往往可以通过两个配置文件(一个主配置文件、一个reader的读取配置)实现,在PaddleDetection 2.0后续版本,采用了模块解耦设计,用户可以组合配置模块实现检测器,并可自由修改覆盖各模块配置。我们使用的配置文件[7]位于configs/picodet目录下的picodet_s_320_coco_lcnet.yml。训练命令可参考如下:
# Example of training on single-GPU
export CUDA_VISIBLE_DEVICES=0
python tools/train.py -c configs/picodet/picodet_s_320_coco_lcnet.yml --eval
模型导出
模型训练完成后,还需要将训练好的目标检测模型导出为Paddle Inference模型,才能使用深度学习编译器TVM对其进行编译从而获得适配在Cortex-M 处理器上运行的代码。在导出模型时,由于CMSIS-NN不支持NMS算子,可通过指定-o export.nms=False完成算子适配。参考以下命令导出Paddle Inference模型:
# Example exporting model command
python tools/export_model.py \
-c configs/picodet/picodet_s_320_coco_lcnet.yml \
-o weights=https://paddledet.bj.bcebos.com/models/picodet_s_320_coco_lcnet.pdparams \
export.nms=False \
--output_dir=output_inference
为了便于开发者朋友直接体验推理部署的流程,大家可以通过链接直接下载我们训练完成并完成导出适配的目标检测Paddle Inference模型。链接:
https://bj.bcebos.com/v1/paddledet/deploy/Inference/picodet_s_320_coco_lcnet_no_nms.tar。
模型编译
为实现在Cortex-M上直接完成飞桨模型的部署,我们需要借助深度学习编译器TVM来进行相应模型的转换和适配。TVM是一款开源的深度学习编译器, 主要用于解决将各种深度学习框架部署到各种硬件设备上的适配性问题。
如下图所示,他可以接收由飞桨等经典的深度学习训练框架编写的模型并将其转换成可在目标设备上运行推理任务的代码。
图5 编译流程示意图
*了解TVM更多信息,请访问https://tvm.apache.org
我们使用TVM的Python应用程序tvmc来完成模型的编译。大家可参考如下命令对Paddle Inference模型进行编译。通过指定--target=cmsis-nn,c使得模型中CMSIS NN[8]库支持的算子会调用CMSIS-NN库执行,而不支持的算子则会回调到C代码库。
# Example of Model compiling using tvmc
python3 -m tvm.driver.tvmc compile --target=cmsis-nn,c \
--target-cmsis-nn-mcpu=cortex-m55 \
--target-c-mcpu=cortex-m55 \
--runtime=crt \
--executor=aot \
--executor-aot-interface-api=c \
--executor-aot-unpacked-api=1 \
--pass-config tir.usmp.enable=1 \
--pass-config tir.usmp.algorithm=hill_climb \
--pass-config tir.disable_storage_rewrite=1 \
--pass-config tir.disable_vectorize=1 \
--output-format=mlf \
--model-format=paddle \
--module-name=picodet \
--input-shapes image:[1,3,320,320] \
--output=picodet.tar \
picodet_s_320_coco_lcnet_no_nms/model.pdmodel
更多关于参数配置的具体说明,大家可以直接输入tvmc compile --help来查看。编译后的模型可以在--output参数指定的路径下查看(此处为当前目录下的picodet.tar压缩包内)。
模型部署
参考图3所示的AVH AMI实例 (instance) 创建的流程并通过ssh命令远程登录到实例中去,当看到如下所示的提示画面说明已经成功登入。
图6 AVH AMI成功登录界面
成功登入后大家可以切换到“/opt/VHT” 以及“/opt”目录下查看当前版本AVH AMI所支持的Corstone和Cortex CPU虚拟硬件。下图为部分1.2.3版本AVH AMI所支持的AVH列表。本期部署课程中所使用的正是Corstone-300虚拟硬件 (VHT_Corstone_SSE-300_Ethos-U55),其内含有Cortex-M55处理器、Arm Ethos-U55处理器及一些基本外设。更多关于Corstone-300虚拟硬件的相关信息,欢迎访问Arm开发者社区的技术文档[9]进行查看。
图7 1.2.3版本AVH AMI所支持的AVH部分示意图
为便于开发者朋友更直观地体验如何在AVH上完成飞桨模型部署,我们为大家提供了部署的示例代码脚本(run_demo.sh)来帮助大家自动化的完成环境配置,构建目标检测应用以及在含有 Cortex-M55 的 Corstone-300虚拟硬件上执行并获取结果。
您也可以按照以下几个步骤来手动部署。
第一步
下载安装相应的软件包并配置运行环境
确保示例代码路径下configure_avh.sh脚本以及requirment.txt脚本中涉及的相应软件包均根据其版本要求正确安装。
第二步
下载获取目标检测Paddle Inference模型
可使用wget命令下载模型(下载地址详见2.2节)并通过tar命令解压模型文件压缩包。
第三步
使用TVMC命令编译Paddle Inference模型
参考2.3节中使用的TVMC命令编译第二步下载好的Paddle Inference模型(model.pdmodel)。
第四步
处理图片数据
参考提供的convert_image.py脚本对所测试的示例图片000000014439_640x640.jpgs(如下图所示)进行处理,并生成相应的输入输出头文件。
图8 目标检测示例图片
第五步
构建应用程序
使用Makefile工具构建目标检测应用程序的二进制镜像文件。
第六步
执行目标检测应用并查看运行结果
调用VHT_Corstone_SSE-300_Ethos-U55 (Corstone-300虚拟硬件) 执行构建好的目标检测应用并查看运行结果。运行结果如下图所示。
其中,前四个数字为box框位置,class为类别序号,score为得分。由于模型可能存在精度损失的问题,得分偏低,但整体目标识别结果与图片一致,说明将飞桨模型直接部署在Cortex-M55虚拟硬件上运行良好。
图9 Corstone-300 (含 Cortex-M55) 虚拟硬件运行结果
总结
本期课程带领大家学习了如何将PaddleDetection中发布的PP-PicoDet目标检测模型 (完成算子适配后) 部署在Corstone-300的虚拟硬件平台上,欢迎大家动手体验。后续我们也将持续为大家带来更多如何在Arm虚拟硬件上部署百度飞桨模型的实例,敬请期待!
*点击阅读原文浏览AVH官网
参考链接
飞桨官网:
https://www.paddlepaddle.org.cn
Paddle Detection GitHub:
https://github.com/PaddlePaddle/PaddleDetection
Arm虚拟硬件(AVH)官网:
https://avh.arm.com/
Arm虚拟硬件第三方硬件平台注册报名链接:
https://www.arm.com/resources/contact-us/virtual-hardware-boards
PP-PicoDet arXiv 技术报告:
https://arxiv.org/abs/2111.00902
AWS Marketplace:
https://aws.amazon.com/marketplace/pp/prodview-urbpq7yo5va7g?ref_=unifiedsearch
目标检测模型配置文件:
https://github.com/PaddlePaddle/PaddleDetection/blob/develop/configs/picodet/picodet_s_320_coco_lcnet.yml
Arm CMSIS NN GitHub:
https://github.com/ARM-software/CMSIS_5/tree/develop/CMSIS/NN
Arm Corstone SSE-300技术参考文档:
https://developer.arm.com/documentation/101773/latest
拓展阅读
AVH部署实践 (一) | 在Arm虚拟硬件上部署飞桨模型
AVH动手实践 (二) | 在Arm虚拟硬件上部署PP-OCR模型
关注【飞桨PaddlePaddle】公众号
获取更多技术内容~