ModelBox开发案例 - 使用Lightweight OpenPose做多人人体关键点检测

举报
HWCloudAI 发表于 2022/12/21 16:30:42 2022/12/21
【摘要】 ModelBox开发案例 - 使用Lightweight OpenPose做多人人体关键点检测本案例将使用Lightweight OpenPose模型,实现一个多人人体关键点检测应用,最终效果如下所示:本案例所需资源(代码、模型、测试数据等)均可从multi_person_pose_lightweight_openpose下载(提取码为modbox),该目录中的资源列表说明如下:desc....

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端查看。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。