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

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.24.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成功执行。

你可能感兴趣的:(人工智能,深度学习)