3D人体关键点检测

1 任务介绍

人体关键点检测插件基于 MindX SDK 开发,在昇腾芯片上进行人体关键点和骨架检测,将检测结果可视化并保存。输入一幅图像,可以检测得到图像中所有行人的关键点并连接成人体骨架。

人体关键点检测是指在输入图像上对指定的 18 类人体骨骼关键点位置进行检测,包括鼻子、左眼、右眼等。然后将关键点正确配对组成相应的人体骨架,展示人体姿态,共 19 类人体骨架,如左肩和左肘两个关键点连接组成左上臂,右膝和右踝两个关键点连接组成右小腿等。本方案采取YOLOv3与3DMPPE-ROOTNET模型,将待检测图片输入模型进行推理,推理得到包含人体关键点信息和关键点之间关联度信息的两个特征图,首先从关键点特征图中提取得到所有候选人体关键点,然后结合关联度信息特征图将不同的关键点组合连接成为人体骨架,再将所有人体骨架连接组成不同的人体,最后将关键点和骨架信息标注在输入图像上,描绘人体姿态。本方案可以对遮挡人体、小人体、密集分布人体等进行检测,还适用于不同姿态(蹲坐、俯卧等)、不同方向(正面、侧面、背面等)以及模糊人体关键点检测等多种复杂场景。

本次实验在MindStudio上进行,请先按照教程配置环境,安装MindStudio。MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,该IDE上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。MindStudio除了具有工程管理、编译、调试、运行等一般普通功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MIndStudio具有远端环境,运行任务在远端实现,对于近端的个人设备的要求不高,用户交互体验很好,可以让我们随时随地进行使用。

2 环境搭建和配置

2.1 服务器端推理环境准备

1.获取YOLOv3与3DMPPE-ROOTNET模型,如下表2.1所示。

表2.1 模型选用表

模型名称

获取链接

YOLOv3

https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4

3DMPPE-ROOTNET

https://www.hiascend.com/zh/software/modelzoo/detail/1/c7f19abfe57146bd8ec494c0b377517c

2.安装模型所需依赖包,YOLOv3与3DMPPE-ROOTNET模型所需依赖如下图2.1与图2.2所示。

图2.1 YOLOv3依赖

图2.2 3DMPPE-ROOTNET依赖

3.配置环境变量如下图2.3所示。

图2.3 环境变量

2.2 MindStudio简介及安装

MindStudio提供了AI开发所需的一站式开发环境,提供图形化开发界面,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。同时还支持网络移植、优化和分析等功能。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助用户在一个工具上就能高效便捷地完成AI应用开发。同时,MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。本图文教程,将基于Windows平台上的MindStudio,具体安装流程,可以参考官网如下图2.4与2.5所示。

MindStudio软件包下载地址:

https://www.hiascend.com/software/mindstudio/download

Windows平台下载安装流程:

安装流程_MindStudio 版本:3.0.4_安装指南_安装操作(Linux)_华为云

图2.4 MindStudio软件包下载

图2.5 Windows平台安装

2.3 CANN简介及安装

CANN(Compute Architecture for Neural Networks)是华为公司针对AI场景推出的异构计算架构,通过提供多层次的编程接口,支持用户快速构建基于昇腾平台的AI应用和业务。

用户根据实际使用需要,下载对应的CANN软件包,具体安装流程可以参考官网的用户手册如下图2.6与2.7所示。

CANN软件包下载地址https://www.hiascend.com/software/cann/commercial

CANN安装流程:https://www.hiascend.com/document/detail/zh/canncomme

rcial/51RC1/envdeployment/instg

图2.6 CANN软件包下载

图2.7 CANN安装流程

2.4 本地Python安装

安装python3.x及以上版本,并检查环境,本图文教程以Python3.9.2为例,如下图2.8所示。

图2.8 本地Python版本

配置完上述环境,使用MindStudio进行目标检测的准备工作就已经完成了。

3 检测流程

3.1整体流程

本方案将待检测图片经过解码、缩放后输入YOLOv3模型进行检测,检测得到多组人体的像素坐标,通过像素坐标,就可以把各个人体图片裁剪出来,将这些经过后处理的图像输入3D人体关键点检测模型(3DMPPE-ROOTNET),从关键点特征图中提取得到所有候选人体目标,然后结合关联度信息特征图将不同的关键点组合连接成为人体骨架,再将所有人体骨架连接组成不同的人体,最后将关键点和骨架信息标注在输入图像上,描绘人体姿态。整体流程如图3.1所示。

图3.1 人体关键点检测流程图

3.2 MindX SDK业务流程

基于MindX SDK的人体关键点检测业务流程如图3.2所示,待检测图片通过 appsrc0 插件输入,然后使用图像解码插件mxpi_imagedecoder0对图片进行解码,再通过图像缩放插件mxpi_imageresize0将图像缩放至满足检测模型要求的输入图像大小要求,缩放后的图像输入模型推理插件mxpi_tensorinfer0,采用YOLOv3模型检测,经检测后处理插件mxpi_objectpostprocessor0与扣图插件处理后,将图像输入模型推理插件mxpi_tensorinfer1,采用3DMPPE-ROOTNET模型从中提取关键点,由模型后处理插件确定关键点和关键点之间的连接关系,输出关键点连接形成的人体实现结果可视化,最后通过输出插件 appsink0 获取人体关键点检测插件输出结果,在外部进行人体姿态可视化描绘。MindX SDK业务流程如图3.2所示。

图3.2 MindX SDK业务流程图

人体关键点检测插件的输入是模型推理插件输出的特征图,对于本模型,输出两个特征图,分别是关键点特征图 K 和关联度特征图 P,其中 K 的形状大小为 19 ×w ×h,P 的形状大小为 38 × w ×hwh 表示特征图宽、高), K中每个通道的二维特征图上每个位置的值表示该类关键点在该位置的置信度,共计 18 类关键点,包括鼻子、左眼、右眼、左耳、右耳、左肩、右肩、左肘、右肘、左手腕、右手腕、左髋、右髋、左膝、右膝、左踝、右踝,如图3.3(a) 所示,关键点特征图的最后一个通道即第19个通道为背景点类。P 中每两个通道组成的三维特征图上的每个位置的值表示对应类别关键点在该位置处的向量坐标(x, y),通过计算两个不同类关键点组成的连接置信度将关键点连接成骨架,关键点之间组成的骨架共 19 类,如图3.3(b) 所示。

关键点插件从输出特征图检测得到人体关键点和骨架的整体流程为:

1.先将 K 和 P 放大 8 倍,因为本模型推理过程中会将输入缩小 8 倍得到特征图,然后去除 mxpi_imageresize 插件在缩放原图到指定尺寸时在图片右侧和下方添加的补边值,最后将特征图缩放到原图的尺寸大小,记此时 K 和 P 的尺寸分别为 19 ×W ×H 和 38 ×W×H

2.从关键点特征图检测得到每一类的候选关键点。每一类关键点特征图 F的形状为 W ×H,对于 F 上的每一点 kp:

(1)首先将置信度小于一定阈值T的点的置信度设为 0,这些位置不会成为候选关键点。

(2)如果该点的置信度值大于其上、下、左、右四个相邻点的置信度值,则该点是该类关键点的一个候选关键点。

(3)对于每个候选关键点,去除其周围与其欧式距离小于一定阈值 TD 的其他候选关键点。上述过程如图3.4所示。

图3.3 关键点和骨架类别

图3.4 候选关键点选择

3.结合关联度特征图 P 将候选关键点配对形成候选骨架。对于图3.3(b)中的每个骨架(kp1, kp2):

(1)从步骤2的结果中得到 kp1 的所有候选关键点集S1={kp1_0, kp1_1, ……}和 kp2 的所有候选关键点集S2={kp2_0, kp2_1, ……},将S1 中的每个点kp1_i和 S2 中的每个点kp2_j组合,计算每个点对是该骨架的置信度。计算方式为:在kp1_i 和kp2_j 两点连成的线段上等间距的生成 10个点,每两个相邻点确定一个子段,计算这两个相邻点确定的向量和kp1_i,kp2_j 两点确定的向量的重合度值,重合度值大于一定阈值 TF 时记该子段为有效子段,有效子段的平均重合度记作该骨架的置信度。该过程如图7.5所示。

(2)置信度值超过一定阈值 TP 且有效子段数超过 8 个的点对是候选骨架。

(3)去除冲突的候选骨架,两个骨架有相同的端点时,保留置信度高的骨架。

图3.5 计算两个关键点确定骨架的置信度

4.将候选骨架组成人体。将有相同端点的骨架依次连接,最终组成一个或多个人体。

综上所述,关键点插件从输出特征图检测得到人体关键点和骨架的整体流程如图3.6所示。

图3.6 人体关键点检测插件示意图

以输入图片尺寸为 560 ×560 为例,关键点插件的业务处理流程如图3.7所示。

图3.7 实例流程图

3.3 达成指标

要求项

描述

精度要求

平均精确率(AP):31.87

补充说明:本检测模型在 MuPoTS数据集上AP 值达到 33.3%。

4 核心代码

main.py如下图4.1所示,main.py首先调用StreamManagerApi()新建一个流管理StreamManager对象并初始化,然后读入item.ini初始化相机内参与人体关键点坐标,随后调用first_model()与second_model()函数使图像经YOLOv3模型与3DMPPE-ROOTNET模型检测,最后通过evaljosn()函数将结果评估并可视化。first_model()与second_model()函数所构建的pipeline如下图4.2与4.3所示。

图4.1 main.py主函数代码

4.1 YOLOv3模型检测

first_model()中的pipeline代码如下图4.2所示,按照pipeline的流程将图像test.jpg输入、解码、缩放至满足检测模型要求,采用YOLOv3模型检测,再经检测后处理插件扣图插件处理后,输出YOLOv3的人体坐标和根据人体坐标裁剪的人体图片,输出部分代码如下图4.3所示。

图4.2 first_model()中的pipeline代码

图4.3 YOLOv3模型检测输出代码

4.2 3DMPPE-ROOTNET模型检测

3DMPPE-ROOTNET模型需求两个输入。一个是1*256*256的tensor ,是由YOLOv3模型检测所输出的人体图片的,另一个是1*1的tensor,由人体的坐标数据和相机内参计算出来,如下图4.4所示。

图4.4 人体的坐标数据和相机内参

4.3 输出结果处理

如下图4.5所示,3DMPPE-ROOTNET模型的输出结果是一个1*3的tensor,是一个三维的人体关键点坐标。然后利用坐标变化,将结果转换为真正的二维和三维坐标,再加上预先提供的二维三维坐标,标到二维和三维的结果图上面,如下图4.6与图4.7所示。

图4.5 获取推理结果代码

图4.6 坐标变化代码

图4.7 坐标标注代码

4.4 精度计算

将3DMPPE-ROOTNET模型输出的1*3的tensor,以及YOLOv3模型输出的人体坐标等参数保存为json,和预先提供的记录groundtruth的json计算精确度,如下图4.8所示。

图4.8 精度计算代码

5 工程创建与目标检测

1.创建项目,点击菜单栏的“File>New>Project”按钮,如下图5.1所示。

图5.1 创建项目

2.选择Ascend App,输入app名,其中CANN版本应与远端服务器转一致,点击change,如下图5.2与5.3所示。

图5.2 项目属性设置

图5.3 CANN设置

3.添加远程服务器,填写远端服务器信息,测试连接,如下图5.4所示。

图5.4 添加远程服务器

4. 连接成功后,选择CANN目录,等待本地同步远端服务器CANN文件,如下图5.5所示。

图5.5 同步远端CANN

5.同步成功后,选择Detection and Classification(python)项目,点击完成,完成新建项目,如下图5.6所示。

图5.6 选择项目模板

6.配置项目结构,如下图5.7所示。

图5.7 配置项目结构

7.选择add python SDK,如下图5.8所示。

图5.8 配置Python SDK

8.选择添加Python interpreter,如下图5.9所示。

图5.9 添加Python interpreter

9.配置本地文件夹与远程服务器映射,如下图5.10所示。

图5.10 配置文件夹映射

10.从远端服务器拉取代码,如下图5.11所示。

图5.11 拉取代码

11.拉取代码成功后,添加名为test.jpg的测试图片,如下图5.12所示。

图5.12 添加测试图片

12.配置运行属性,添加环境变量,点击OK运行,如下图5.13所示。

图5.13 配置运行属性

13.运行成功后在当前项目文件夹下生成输出图片,如下图5.14、5.15、5.16、5.17与5.18所示。

图5.14 检测所得人体图像

图5.15 人体关键点及骨架绘制

图5.16 人体关键点及骨架坐标图

6 精度验证

执行eval.py 脚本,结果保存在 bbox_root_mupots,_output.json中,与MuPoTS_gt.json数据集标签比对,精度达标。MindStudio界面操作如下:

1.重新配置运行属性,添加环境变量,点击OK运行,如下图6.1所示。

图6.1 配置运行属性

2.运行成功后输出评估结果,如下图6.2所示。

图6.2 输出评估结果

7 遇到的问题

1.在执行样例时报错“No module named 'StreamManagerApi'”,如下图7.1所示。

图7.1 引入StreamManagerApi失败

解决方法:

环境变量缺失,重新配置环境变量后问题解决,如下图7.2所示。

图7.2 重新配置环境变量

2.运行main.py时,cv2包引入失败,显示文件不存在,如下图7.3所示。

图7.3 cv2包引入失败

解决方案:缺少opencv依赖包,执行pip install opencv-python-headless后问题解决。

3.运行main.py时,显示“No module named 'google'”,如下图7.4所示。

图7.4 缺少google依赖包

解决方案:缺少google依赖包,执行pip install -i Links for google-cloud与pip install -i Links for google-cloud-vision后问题解决。

4.尝试在服务器运行eval.py时,显示“No module named 'pycocotools'”,如下图7.5所示。尝试安装pycocotools包报错,如下图7.6所示。

图7.5 缺少pycocotools依赖包

图7.6 pycocotools安装失败

解决方案:

安装pycocotools包需要服务器端的c++编译环境,而服务器gcc版本不适应。故尝试在本地安装C++环境后问题解决,eval.py成功执行。

基于MindStudio的3D人体关键点检测相关推荐

  1. VideoPose3D:基于视频的3D人体关键点检测

    1. 概述 Dario Pavllo等人于2019年提出了VideoPose3D模型,旨在把输入视频转换成人体各关键点相对于根关节的相对三维位置.为了实现这一目的,作者采取的是两步走的策略.首先要利用 ...

  2. 基于深度学习目标检测和人体关键点检测的不健康坐姿检测

    基于深度学习目标检测和人体关键点检测的不健康坐姿检测 代码下载链接:下载地址 0.实验结果

  3. 基于Tkinter和百度Aip的人体关键点检测

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-104.html 最近某些项目需要用到人体姿势识别.当前有很多著 ...

  4. 基于百度AL平台人体检测实现人体关键点检测代码

    本文通过OpenCV模块调用摄像头,利用百度开放的人体关键点检测API,实现了实时对人体的关键点检测. 一.百度API获取 使用百度的API,首先要在百度AI的官网上注册帐号,然后在人体关键点识别功能 ...

  5. 人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码

    人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码 目录 人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码 1.人体姿态估计2D Pose方法 2.人体姿 ...

  6. OpenMMLab AI实战营第二期|人体关键点检测与MMPose学习笔记

    OpenMMLab AI实战营第二期|人体关键点检测与MMPose学习笔记 文章目录 OpenMMLab AI实战营第二期|人体关键点检测与MMPose学习笔记 一.前言 1.1 人体姿态概述 1.2 ...

  7. OpenMMLab-AI实战营第二期——2-1.人体关键点检测与MMPose

    文章目录 1. 人体姿态估计的介绍和应用 2-1. 2D姿态估计概述 2.1 任务描述 2.2 基于回归 2.3 基于热力图 2.3.1 从数据标注生成热力图(高斯函数) 2.3.2 使用热力图训练模 ...

  8. 人体姿态估计(人体关键点检测)分类与经典方法分析(附GitHub地址)

    人体姿态估计(Human Pose Estimation)也称为人体关键点检测(Human Keypoints Detection).对于人体姿态估计的研究,大致可做如下分类. 1. RGB vs R ...

  9. 项目开源!基于PaddleDetection打造实时人体姿态检测的多关节控制皮影机器人

    本文已在[飞桨PaddlePaddle]公众号平台发布,详情请戳链接:项目开源!基于PaddleDetection打造实时人体姿态检测的多关节控制皮影机器人 皮影戏是一种以兽皮或纸板做成的人物剪影以表 ...

最新文章

  1. c++十六进制加法_C++中输出十六进制形式的字符串
  2. ThinkPHP5.0中Redis的使用和封装
  3. facade 提供一个接口,通过这个接口,可以使一个子系统更容易使用。
  4. java servlet 请求_java servlet请求数据
  5. node.js第一步
  6. 【Android】启动过程:Bootloader-System/Recovery
  7. java金字塔等边三角形_java99乘法表的小练习 正三角 倒三角 正金字塔 倒金字塔...
  8. Tensorflow添加matplotlib可视化
  9. enctype =#39;multipart / form-data#39;是什么意思?
  10. Wowza服务器系列(5):使用rtsp协议向wowza推流的wowoza配置方法
  11. 走进小作坊(九)----省时省力的二八法则
  12. ip 查找计算机,win10系统通过ip地址查找计算机名的详细技巧
  13. C#操作.exe文件
  14. mysql数据库误删恢复
  15. VB与数据库的几种交互
  16. 《过目不忘的读书方法》读书摘要
  17. maven 打包把依赖jar打进去
  18. CDM计算机辅助,CDM方法学与CDM项目的.pdf
  19. ubuntu 里安装 OracleXE
  20. 黑金开发板在NiosII环境下烧写image到flash失败的解决办法

热门文章

  1. php老掉牙的技术,老掉牙技术——HOOK 封包
  2. 主板芯片组的南桥和北桥
  3. Android之SQLite数据库的使用
  4. pcs和serdes_对Lattice ECP3/ECP5器件中的SerDes/PCS进行了简要的介绍
  5. 打印机之——G3800故障维修
  6. 设备漏电对计算机影响,电脑机箱漏电对电脑硬件伤害大吗?
  7. Python练习题:1 用Python判断闰年
  8. Java项目:田径运动会管理系统(java+SpringBoot+Thymeleaf+HTML+maven+mysql)
  9. 天载理财解读碳中和主题依旧是热点
  10. 生成二维码并且将生成图片转换成输入流