ModelBox开发案例 - 使用Lightweight OpenPose做多人人体关键点检测
ModelBox开发案例 - 使用Lightweight OpenPose做多人人体关键点检测
本案例将使用Lightweight OpenPose模型,实现一个多人人体关键点检测应用,最终效果如下所示:
本案例所需资源(代码、模型、测试数据等)已做成模板放到华为云上,查看和下载模板可以使用如下命令:
- Windows PC版本请使用
solution.bat
工具:
PS ███\modelbox>: .\solution.bat -l
...
Solutions name:
...
multi_person_pose_lightweight_openpose
...
结果中的multi_person_pose_lightweight_openpose即为多人关键点检测模板,可使用如下命令下载模板:
PS ███\modelbox>: .\solution.bat -s multi_person_pose_lightweight_openpose
...
- Linux开发板版本请使用
solution.py
脚本:
rock@rock-3a:~/███/modelbox$ ./solution.py -l
...
Solutions name:
...
multi_person_pose_lightweight_openpose
...
结果中的multi_person_pose_lightweight_openpose即为多人关键点检测模板,可使用如下命令下载模板:
rock@rock-3a:~/███/modelbox$ ./solution.py -s multi_person_pose_lightweight_openpose
...
solution.bat
/solution.py
工具的参数中,-l
代表list
,即列出当前已有的模板名称;-s
代表solution-name
,即下载对应名称的模板。下载下来的模板资源,将存放在ModelBox
核心库的solution
目录下。
如果对ModelBox AI应用开发还不熟悉,请先阅读ModelBox 端云协同AI开发套件(RK3568)上手指南,或者ModelBox 端云协同AI开发套件(博时特EC02)上手指南。
模型准备
本案例使用的是Lightweight OpenPose
模型,在下载的资源包中,已经包含了转换好的rknn模型或者onnx模型,可以在对应的平台上直接使用。
原始模型是通过PyTorch框架训练得到的,训练工程可参考此项目,相比原始的OpenPose模型,该模型更轻量推理速度更快,感兴趣的开发者可使用该项目自行训练模型。
得到onnx格式的模型后,如果想体验rknn模型的转换过程,rknpu版本可参考RK1808模型转换验证案例,rknpu2版本可参考RK3568模型转换验证案例。
应用开发
打开VS Code,连接到ModelBox sdk所在目录或者远程开发板,开始进行多人人体关键点检测应用开发。下面以RK3568版本为例进行说明,其他版本与之类似。
1)创建工程
使用create.py
创建multi_person_pose_lightweight
工程(Windows PC版本请使用create.bat
):
rock@rock-3a:~/███/modelbox$ ./create.py -t server -n multi_person_pose_lightweight -s multi_person_pose_lightweight_openpose
sdk version is modelbox-rk-aarch64
success: create multi_person_pose_lightweight in /home/rock/███/modelbox/workspace
将会用多人关键点检测模板创建出一个multi_person_pose_lightweight工程。
2)查看推理功能单元
AI应用的核心是模型推理部分,推理功能单元在工程目录下的model/pose_infer
文件夹中,目录结构如下(以RK3568开发板版本为例):
其中lightweight_openpose_288x512_rknpu2.rknn
是转换好的rknn模型,pose_infer.toml
是该模型的ModelBox功能单元配置文件,其内容如下:
# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.
[base]
name = "pose_infer" # 功能单元名称
device = "rknpu" # 功能单元运行的设备类型
version = "1.0.0" # 功能单元版本号
type = "inference" # 功能单元类型,推理功能单元此处为固定值inference
virtual_type = "rknpu2" # 推理引擎类型,RK3399pro/RK1808设备为rknpu,RK3568设备为rknpu2
group_type = "Inference" # 功能单元分组信息, 推理功能单元默认为Inference
is_input_contiguous = "false" # rk芯片推理时的固定属性
description = "lightweight-openpose model for human joints detection" # 功能单元的描述信息
entry = "./lightweight_openpose_288x512_rknpu2.rknn" # 模型文件路径,默认在当前路径下
# 模型输入节点描述:uint8格式的图片数据
[input]
[input.input1]
name = "input"
type = "uint8"
device = "rknpu" # 输入端口数据位于哪种设备
# 模型输出节点描述
[output]
[output.output1] # 输出数据1:关键点信息对应的特征向量
name = "out_heatmaps"
type = "float"
[output.output2] # 输出数据2:关节信息对应的特征向量
name = "out_pafs"
type = "float"
可以看到该模型有两个输出节点,即关键点信息和关节信息对应的feature map,需要从中解码出所有的关键点并组合成每个人的关节。
3)后处理功能单元
后处理功能单元负责从模型推理结果中解码出关键点和关节,它在工程目录的etc/flowunit/pose_post_light
文件夹中:
解码过程的核心逻辑在pose_utils_light.py
文件中,可以查阅OpenPose模型细节阅读代码。
4)画图功能单元
得到关键点后可以画在原图上进行输出展示,它在工程目录的etc/flowunit/draw_pose_light
文件夹中:
5)查看流程图
模型推理和配套的功能单元准备好后,我们就可以串联出流程图进行测试了,工程的默认流程图为multi_person_pose_lightweight.toml
(以RK3568开发板版本为例):
# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.
[driver]
# 功能单元的扫描路径,包含在[]中,多个路径使用,分隔
# ${HILENS_APP_ROOT} 表示当前应用的实际路径
# ${HILENS_MB_SDK_PATH} 表示ModelBox核心库的实际路径
dir = [
"${HILENS_APP_ROOT}/etc/flowunit",
"${HILENS_APP_ROOT}/etc/flowunit/cpp",
"${HILENS_APP_ROOT}/model",
"${HILENS_MB_SDK_PATH}/flowunit",
]
skip-default = true
[profile]
profile = false # 是否记录profile信息
trace = false # 是否记录trace信息
dir = "${HILENS_DATA_DIR}/mb_profile" # profile/trace信息的保存位置
[flow]
desc = "multi-person pose estimation example using lightweight-openpose for local video or rtsp video stream" # 应用的简单描述
[graph]
format = "graphviz" # 流程图的格式,当前仅支持graphviz
graphconf = """digraph multi_person_pose_lightweight {
node [shape=Mrecord]
queue_size = 4
batch_size = 1
# 定义节点,即功能单元及其属性
input1[type=input, flowunit=input, device=cpu, deviceid=0]
data_source_parser[type=flowunit, flowunit=data_source_parser, device=cpu, deviceid=0]
video_demuxer[type=flowunit, flowunit=video_demuxer, device=cpu, deviceid=0]
video_decoder[type=flowunit, flowunit=video_decoder, device=rknpu, deviceid=0, pix_fmt="bgr"]
image_resize[type=flowunit, flowunit=resize, device=rknpu, deviceid=0, image_width=512, image_height=288]
pose_detection[type=flowunit, flowunit=pose_infer, device=rknpu, deviceid=0]
pose_post_light[type=flowunit, flowunit=pose_post_light, device=cpu, deviceid=0]
draw_pose_light[type=flowunit, flowunit=draw_pose_light, device=cpu, deviceid=0]
video_out[type=flowunit, flowunit=video_out, device=rknpu, deviceid=0]
# 定义边,即功能间的数据传递关系
input1:input -> data_source_parser:in_data
data_source_parser:out_video_url -> video_demuxer:in_video_url
video_demuxer:out_video_packet -> video_decoder:in_video_packet
video_decoder:out_video_frame -> image_resize:in_image
image_resize:out_image -> pose_detection:input
pose_detection:out_heatmaps -> pose_post_light:in_heatmaps
pose_detection:out_pafs -> pose_post_light:in_pafs
video_decoder:out_video_frame -> draw_pose_light:in_image
pose_post_light:out_pose -> draw_pose_light:in_pose
draw_pose_light:out_image -> video_out:in_video_frame
}"""
该流程图对于某个视频流,经过视频解码、图像缩放、lightweight openpose推理、关键点后处理与画图等一系列操作后,将结果保存下来。
工程的任务配置文件bin/mock_task.toml
中设置了输入输出源,内容为:
# 任务输入配置,当前支持以下几种输入方式:
# 1. rtsp摄像头或rtsp视频流:type="rtsp", url="rtsp://xxx.xxx"
# 2. 设备自带摄像头或者USB摄像头:type="url",url="${摄像头编号}" (需配合local_camera功能单元使用)
# 3. 本地视频文件:type="url",url="${视频文件路径}" (请使用${HILENS_APP_ROOT}宏,表示当前应用的实际路径)
# 4. http服务:type="url", url="http://xxx.xxx"(指的是任务作为http服务启动,此处需填写对外暴露的http服务地址,需配合httpserver类的功能单元使用)
[input]
type = "url"
url = "${HILENS_APP_ROOT}/data/multi_person_pose.mp4"
# 任务输出配置,当前支持以下几种输出方式:
# 1. rtsp视频流:type="local", url="rtsp://xxx.xxx"
# 2. 本地屏幕:type="local", url="0:xxx" (设备需要接显示器,系统需要带桌面)
# 3. 本地视频文件:type="local",url="${视频文件路径}" (请使用${HILENS_APP_ROOT}宏,表示当前应用的实际路径)
# 4. http服务:type="webhook", url="http://xxx.xxx"(指的是任务产生的数据上报给某个http服务,此处需填写上传的http服务地址)
[output]
type = "local"
url = "${HILENS_APP_ROOT}/hilens_data_dir/multi_person_pose_result.mp4"
测试视频为data/multi_person_pose.mp4
,流程图使用这一视频进行人体关键点检测,检测结果绘制后保存为hilens_data_dir/multi_person_pose_result.mp4
文件。
6)运行应用
在工程路径下执行build_project.sh
进行工程构建(以RK3568开发板版本为例):
rock@rock-3a:~/███/modelbox/workspace/multi_person_pose_lightweight$ ./build_project.sh
build success: you can run main.sh in ./bin folder
rock@rock-3a:~/███/modelbox/workspace/multi_person_pose_lightweight$
执行bin/main.sh
(Windows PC版本请使用bin\main.bat
)运行应用,运行结束后在hilens_data_dir
目录下生成了multi_person_pose_result.mp4
文件,可以下载到PC端查看。
- 点赞
- 收藏
- 关注作者
评论(0)