基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康

时间:2022-09-22 01:19:14


前言

ModelBox 是一套专门为 AI 开发者提供的易于使用,高效,高扩展的 AI 应用开发框架,它可以帮助 AI 开发者快速完成从模型文件到 AI 推理应用的开发和上线工作,降低 AI 算法落地门槛,同时带来 AI 应用的高稳定性和极致性能。通过 ModelBox 框架,我们可以快速实现 AI 推理业务的开发,同时可以增加推理的数据吞吐量,降低 AI 分析耗时。在本文中我们将通过讲解 ModelBox 的案例——AI 养猪,实时看护猪的健康来进一步说明这个天赋异禀的 AI 应用开发框架。

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康


一、ModelBox 产品介绍

1.1、什么是 ModelBox,有什么功能?

ModelBox 是一个 AI 应用的推理框架,中文名称为“模盒”或“模核”。ModelBox 通过编排和插件化的形式支持 AI 应用的开发,支持的数据有视频,音频,语音,文本,通用数据的编排处理。

1.2、ModelBox 具备哪些特性?

作为 AI 应用开发框架,ModelBox 具备以下三大特点:

  • 屏蔽底层软硬件差异,一次开发,端边云多处部署。
  • 智能调度,保证极致 AI 推理运行性能。
  • 全场景灵活开发模式,可视化图编排和 API 开发。

1.3、相比直接调用底层 API 开发 AI 业务,ModelBox 有什么优势?

ModelBox 主要聚焦解决 AI 应用开发的问题,相比直接调用底层 API,开发者需要关注每个底层的 API 使用方法,关注并发,关注 GPU,NPU 设备编程接口,关注 TensorRT,TensorRT 等推理框架的编程 API,与云计算结合的接口,和分布式通信,日志等琐碎而复杂的周边代码。

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康
ModelBox 解决的就是业务开发的周边问题,将周边问题交由 ModelBox 处理,ModelBox 通过对内存,CPU,GPU,周边组件的精细化管理,使 AI 推理业务开发更高效,性能也更高,质量也更好。

1.4、ModelBox 手册

关于 ModelBox 核心概念、功能单元和流程图开发的更多介绍,可以查看 ModelBox 手册,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康

二、ModelBox AI 应用开发全景

2.1、ModelBox AI 应用开发全景运行架构

ModelBox 是在 AI 应用开发的“推理阶段”使用的高性能开发框架,其运行架构具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康

2.2、ModelBox 如何搭配使用?

ModelBox AI 应用开发可以基于以下三个方面

  • 基于 ModelBox 开源社区源码开发 AI 应用。
  • 基于华为云 ModelArts 平台开发 ModelBox AI 应用。
  • 基于 HiLens 平台提供的 ModelBox SDK 开发 AI 应用。

2.3、ModelBox 目前支持哪些框架训练的模型?

目前支持的模型有 TensorFlow、TensorRT、Ascend ACL 模型。

ModelBox 框架里面包含了支持 TensorFlow、Caffe、LibTorch、MindSpore 模型运行所需的功能单元 Flowunit,我们称为推理功能单元(Inference Flowunit),这些推理功能单元可以直接加载对应的模型文件,而不需要编写代码,只需提供一个简单的配置文件,即可将模型引入到 ModelBox 的流程中。

2.4、ModelBox 跟华为云 ModelArts、HiLens 服务的关系?

ModelBox 是由华为云开发并开源的 AI 应用开发框架。

  • 华为云 ModelArts 服务在线开发环境 Notebook 中,提供了 ModelBox AI 应用开发镜像,方便开发者可选用后便捷在线开发,开发完成后可在线部署到云上。
  • 华为云 HiLens 服务基于 ModelBox 源码,提供了适用在多种端侧设备的 ModelBox SDK,方便开发者开发运行在这类设备上的 AI 应用,且在设备注册后,可以在 HiLens 管理控制台上在线部署到设备上运行。

三、基于 ModelBox 实现“AI 养猪”

3.1、什么是“AI 养猪”?

说到这,可能就有好奇的同学提问了,“什么是“AI 养猪”呢?具体一点,与传统人工队相比,这玩意有什么优势呢?”

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康
别急,我来给你讲,AI 养猪可以实现:

  • 通过人工智能全天候监控猪场的实时动态。
  • 摄像头联通物联网设备,实现生产指标的自动统计,弥补了传统养殖业对人力资源需求的不足。
  • 猪只体态可以直观地反映猪只的生理状态,为猪只疾病预防提供重要依据。
  • 基于 ModelBox 展开收拢单元开发,识别猪的站立躺卧两种姿态和猪只数量

3.2、“AI 养猪”应用开发和部署架构

根据在 2.1 中 ModelBox AI 应用开发全景运行架构,我们可以通过如下流程进行“养猪”的 AI 应用开发和部署,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康

四、“AI 养猪”数据处理与模型训练

4.1、数据采集与处理

“AI 养猪”,我们需要先训练一个模型,这里我们使用 ModelArts。ModelArts 是一站式 AI 开发平台,支持图像自动标注。

实验数据采用猪只检测数据集,包含 500 张图片以及对应的 xml 文件,目前已发布到 AI Gallery 上,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康

4.2、模型训练与转换

目标检测模型采用 YOLOX 网络结构,YOLOX 是 YOLO 系列的优化版本,引入了解耦头、数据增强、无锚点以及标签分类等目标检测领域的优秀进展,拥有较好的精度表现,同时对工程部署友好,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康
我们在 ModelArts 的 Notebook 环境中训练后,再转换成对应平台的模型格式:onnx 格式可以运行在 Windows 设备上,RK 系列设备上需要转换为 rknn 格式,模型训练 300 个 Epoch 取得的结果,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康
体态识别模型使用 MobileNetV2 作为卷积基,分别使用迁移学习和从头开始训练网络,实验表明训练网络所有层明显优于迁移学习。模型的训练与转换教程已经开放在 AI Gallery 中,其中包含训练数据、训练代码、模型转换脚本以及模型推理代码

开发者如果希望尝试自己训练模型,或者对模板中提供的模型效果不满意,可以进入体态识别模型的训练与转换页面,点击右上角的 Run in ModelArts 按钮,也可以修改其中的代码、更换新的数据集训练出自己的模型,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康

五、“AI 养猪”应用开发

使用 VS Code 连接到 ModelBox sdk 所在目录或者远程开发板,开始进行猪只体态识别应用的开发。

说明:本文以 RK3568 版本为例进行说明,其他版本与之类似。

5.1、下载模板

本案例所需模板资源(代码、模型、测试数据等)均可从 multi_pig_pose_yolox_mbv2 下载,下载模板到 ModelBox 核心库的 solution 目录下,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康

5.2、新建项目

在 ModelBox sdk 目录下使用 create.py 创建 multi_pig_pose 工程,末尾 -s 参数,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康

5.3、查看流程图

ModelBox 提供了可视化图编排工具:Editor,我们可以使用 python ./create.py -t editor 开启图编排服务,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康
可以看到条件功能单元 yolox_post 的两个输出分别对接到不同的功能单元:

  • 在未检测到猪只时,no_pig 分支直接对接到 video_out 进行视频编码。
  • 检测到猪只时,has_pig 对接到之后的展开/收拢功能单元做全部猪的体态识别。

而展开功能单元 expand_box 与收拢功能单元 collapse_pig_pose 之间其他功能单元的使用方式,与正常流程并无不同。

multi_pig_pose 需要根据检测结果选择不同的分支进行后续操作:

  • 如果没有检测到猪,直接输出原始图像。
  • 如果检测到猪,需要对图中检测到的每只猪都识别体态。

使用展开功能单元 expand_box,将图中的所有检测框展开为多个输出,传递到后面的功能单元分别做体态识别;最后又增加了收拢功能单元 collapse_pig_pose,对同一张图的多只猪的体态数据进行合并输出,使得后面的画图功能单元能收集到同一张图片的完整数据。

另外,可以看到预处理功能单元 resizenormalize 等分别使用了两次(两次的属性不同),每种功能单元在图中也相应的定义了两个实例,使用不同的节点名称进行区分。

5.4、查看输入、输出配置

查看任务配置文件 bin/mock_task.toml,可以看到其中的任务输入和任务输出配置为如下内容,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康
即使用本地视频文件 data/pig.mp4 作为输入,解码、预处理、猪只检测、后处理、猪只体态识别后,输出画面显示到名为 modelbox_show 的本地屏幕窗口中。

5.5、用启动脚本执行应用

启动应用前执行 build_project.sh 进行工程构建,该脚本将编译自定义的 C++ 功能单元(本应用不涉及)、将应用运行时会用到的配置文件转码为 Unix 格式(防止执行过程中的格式错误),实现代码如下:

███$ ./build_project.sh
dos2unix: converting file xxx.toml to Unix format...
...
build success: you can run main.bat in ./bin folder


Press ‘p’ to pause…, any key to exit

然后执行 bin/main.bat 运行应用,实现代码如下:

███$ ./bin/main.bat
…

将会自动弹出实时的猪只体态识别的画面,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康

5.6、性能评估

我们在技能流程图中开启性能统计配置项,配置代码如下:

[profile]
profile=true
trace=true

之后双击 bin/main.bat 或在 powershell 中运行技能,实现代码如下:

./bin/main.bat

运行完成后生成的视频与性能统计文件都在 hilens_data_dir 文件夹下,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康
我们可以在 Chrome 浏览器 chrome://tracing/ 中加载性能统计文件查看,具体如下图所示:

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康
逐项查看后发现耗时最久的是体态识别功能单元,平均耗时 10.69ms,因为 ModelBox 是静态图并行推理,fps 取决于耗时最久的功能单元,理论计算 fps = 1000 / 10.69 \approx 94fps=1000/10.69≈94,ModelBox 真的很快!


总结

在本案例中我们使用 ModelBox 的展开/合并功能单元进行猪只体态识别应用的开发,有一类常见的视频 AI 应用是检测 + 分类,或者检测 + 识别,需要对检测到的所有对象分别处理,如人脸识别、车牌识别等,此时可以使用 ModelBox 中的展开/合并功能单元,它能保证大部分模块的处理逻辑与正常数据流相同,又能对展开的子数据流进行高效的并发处理,提高运行速度。最后打包部署,就完成了一个 AI 应用的开发,从模型的训练到转换再到开发到部署的全部流程。ModelBox 加速跨平台高性能 AI 应用开发和落地,打通 AI 应用落地最后一公里,ModelBox 让模型以统一的格式和接口更高效地运行,给开发者提供以下能力:开发者无需关注底层开发、聚焦核心业务逻辑、提升 AI 应用开发效率。

基于 ModelBox 实现 AI 应用快速开发:AI 养猪,实时看护猪的健康


我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!