YOLOv7-pose:回归到回归的多人单阶段关键点检测🤔
YOLOv7-pose:回归到回归的多人单阶段关键点检测🤔
最近,一种基于目标检测的关键点检测算法悄然兴起。如基于YOLOv5的KAPAO以及基于YOLOv7的YOLOv7-pose,这类方法不使用heatmap
而是类似回归的方法进行关键点检测,因此可以达到更好的速度精度trade-off,对工程比较友好。此外,单阶段关键点检测在拥挤的场景下比双阶段的方法更有优势,因此我们决定,就用YOLOv7-pose做一个多人关键点检测的案例,最终效果如下:
本案例所需资源(代码、模型、测试数据等)均可从obs下载,案例使用Windows版本的ModelBox SDK进行开发,如果对此还不熟悉,请先阅读ModelBox端云协同AI开发套件(Windows)开发环境篇,如果对ModelBox AI应用开发感兴趣,欢迎参加我们的ModelBox实战营。
工程目录
这个应用对应的ModelBox版本已经做成模板放在华为云OBS中,可以用sdk中的solution.bat工具下载,接下来我们给出该应用在ModelBox中的完整开发过程:
1)下载模板
执行.\solution.bat -l
可看到当前公开的技能模板:
PS ███> .\solution.bat -l
...
Solutions name:
mask_det_yolo3
...
multi_human_pose_yolov7pose
结果中的multi_human_pose_yolov7pose即为yolov7多人关键点应用模板,可使用如下命令下载模板:
PS ███> .\solution.bat -s multi_human_pose_yolov7pose
...
solution.bat
工具的参数中,-l
代表list
,即列出当前已有的模板名称;-s
代表solution-name
,即下载对应名称的模板。下载下来的模板资源,将存放在ModelBox
核心库的solution
目录下。
2)创建工程
在ModelBox sdk
目录下使用create.bat
创建multi_human_pose_yolov7pose
工程:
PS ███> .\create.bat -t server -n multi_human_pose_yolov7pose -s multi_human_pose_yolov7pose
sdk version is modelbox-xxx
success: create multi_human_pose_yolov7pose in ███\modelbox\workspace
create.bat
工具的参数中,-t
表示创建事务的类别,包括工程(server)、Python功能单元(Python)、推理功能单元(infer)等;-n
代表name
,即创建事务的名称;-s
代表solution-name
,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程。
workspace
目录下将创建出multi_human_pose_yolov7pose
工程,工程目录如下:
multi_human_pose_yolov7pose
├─bin
│ ├─main.bat // 技能运行入口脚本
│ └─mock_task.toml // 本地mock运行配置文件
├─data
│ └─demo.mp4 // 测试视频
├─depandence
│ └─modelbox_requirements.txt // python依赖库,如使用hilens控制台部署技能会自动安装
├─etc
│ └─flowunit // 功能单元目录
│ └─yolov7_pose_post // 关键点检测后处理功能单元
│ ├─yolov7_pose_post.py // 关键点检测后处理功能单元入口文件
│ ├─yolov7_pose_post.toml // 关键点检测后处理功能单元配置文件
│ └─utils.py // 其他工具函数
├─graph
│ └─multi_human_pose_yolov7pose.toml // 默认技能流程图,运行测试视频
├─model
│ └─yolov7_pose
│ ├─yolov7_pose.toml // 关键点检测推理单元配置文件
│ └─yolov7-pose.onnx // 关键点检测模型
├─...
└─build_project.sh
可以看到,工程非常的简单,只包含一个推理功能单元与一个后处理功能单元。其中关键点检测模型为YOLOv7-pose预训练模型导出的onnx
模型,后处理单元也只需要进行一些简单的NMS
等操作以及结果绘制:
def process(self, data_context):
in_image = data_context.input("in_image")
in_feat = data_context.input("in_feat")
out_image = data_context.output("out_image")
for buffer_img, buffer_feat in zip(in_image, in_feat):
width = buffer_img.get('width')
height = buffer_img.get('height')
channel = buffer_img.get('channel')
out_img = np.array(buffer_img.as_object(), dtype=np.uint8, copy=False)
out_img = out_img.reshape(height, width, channel)
pose_data = np.array(buffer_feat.as_object(), copy=False).reshape((1, -1, self.kps))
decoder_and_draw(out_img, pose_data, self.score_threshold, (self.net_h, self.net_w))
add_buffer = modelbox.Buffer(self.get_bind_device(), out_img)
add_buffer.copy_meta(buffer_img)
out_image.push_back(add_buffer)
return modelbox.Status.StatusCode.STATUS_SUCCESS
此外,我们也比较关心案例的性能,因此在默认技能图中开启了性能统计配置:
[profile]
profile=true
trace=true
运行项目
打开工程目录下bin/mock_task.toml文件,设置其中的任务输入和任务输出配置为如下内容:
[input]
type = "url"
url = "${HILENS_APP_ROOT}/data/demo.mp4"
[output]
type = "local"
url = "${HILENS_DATA_DIR}/result.mp4"
即使用data目录下的测试视频运行技能,结果保存在hilens_data_dir下。
执行bin/main.bat 运行应用,可以看到hilens_data_dir下生成了结果视频与性能统计文件:
hilens_data_dir
├─mb_profile
│ ├─performance_{time}.json
│ └─trace_{time}.json
└─result.mp4
在Chrome浏览器chrome://tracing/中加载性能统计文件查看:
可以看到耗时最久的为推理功能单元,平均耗时39.657ms,因为ModelBox是静态图并行推理,fps取决于耗时最久的功能单元,因此此技能约能达到25fps,还是满不错的😎
- 点赞
- 收藏
- 关注作者
评论(0)