https://mp.weixin.qq.com/s/8EWemexa7DspalAKfENDXw
本期课程,将以计算机视觉领域的目标检测任务为目标,带领大家动手完成从模型训练优化到深度学习应用部署的整个端到端的开发流程。你会逐步学习了解到如何使用飞桨[1]目标检测套件 PaddleDetection[2] 工具套件完成目标检测模型的训练与适配,如何使用深度学习编译器 TVM 编译飞桨模型以及如何将编译后的模型部署在含有 Arm Cortex-M55 处理器的 Arm Corstone-300 虚拟硬件上。
百度飞桨与 Arm 深度合作,增加了 Cortex-M 硬件上支持的深度学习模型的数量,同时也填补了飞桨模型在 Arm Cortex-M 硬件上的适配空白,为开发者提供了更多的选择。
项目概述
经典的深度学习工程是从确认任务目标开始的,我们首先来简单地介绍一下目标检测任务以及本期部署实战课程中我们所使用的工具和平台。
1.1 目标检测任务
目标检测任务就是将图片或视频中所有目标的类别识别出来,并在该目标周围绘制边界框,标示出每个目标的位置。常见的目标检测任务包括人物检测、人脸检测、车辆跟踪等方向,在工业、智慧城市、安防、交通、零售、医疗等十余种行业场景中应用广泛。
图 1:目标检测任务案例
1.2 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 技术报告[3]。
1.3 Arm 虚拟硬件 (Arm Virtual Hardware, AVH)
作为 Arm 物联网全面解决方案的核心技术之一,AVH 很好地解决了实体硬件所面临的难扩展、难运维等痛点。AVH[4] 提供了简单便捷并且可扩展的途径,让 IoT 应用的开发摆脱了对实体硬件的依赖并使得云原生开发技术在嵌入式物联网、边缘侧机器学习领域得到了应用。尤其是在芯片紧张的当今时代,使用 AVH,开发者甚至可以在芯片 RTL 之前便可接触到最新的处理器 IP。
目前 AVH 提供两种形式供开发者使用。一种是托管在 AWS 以及 AWS China 上以亚马逊机器镜像 AMI 形式存在的 Arm Corstone 和 Cortex CPU 的虚拟硬件,另外一种则是由 Arm 以 SaaS 平台的形式提供的 AVH 第三方硬件[5]。本期课程我们将使用第一种托管在 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:端到端部署流程示意图
2.1 模型训练
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
2.2 模型导出
模型训练完成后,还需要将训练好的目标检测模型导出为 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
2.3 模型编译
为实现在 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 压缩包内)。
2.4 模型部署
参考图 3 所示的 AVH AMI 实例创建的流程并通过 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 动手实践 (一) | 在 Arm 虚拟硬件上部署 PaddlePaddle 模型(点击阅读)
_
AVH 动手实践 (二) | 在 Arm 虚拟硬件上部署 PP-OCR 模型(点击阅读)
欢迎各位开发者扫描下方二维码或点击“阅读原文”即刻注册 AVH 第三方硬件平台,抢先体验 AVH 为你的嵌入式开发之旅所带来的极致便捷体验!大家也可扫码访问极术社区 AVH 专栏了解更多应用案例。
AVH 第三方硬件平台
极术社区 AVH 专栏
参考链接集锦:
[1] 飞桨官网:https://www.paddlepaddle.org.cn
[2] Paddle Detection GitHub: https://github.com/PaddlePadd...
[3] PP-PicoDet arXiv 技术报告: https://arxiv.org/abs/2111.00902
[4] Arm 虚拟硬件 (AVH) 官网: https://avh.arm.com/
[5] Arm 虚拟硬件第三方硬件平台注册报名链接: https://www.arm.com/resources...
[6] AWS Marketplace: https://aws.amazon.com/market...
[7] 目标检测模型配置文件:https://github.com/PaddlePadd...
[8] Arm CMSIS NN GitHub: https://github.com/ARM-softwa...
[9] Arm Corstone SSE-300 技术参考文档: https://developer.arm.com/doc...