使用Mask R-CNN模型实现人体关键节点标注

使用,mask,cnn,模型,实现,人体,关键,节点,标注 · 浏览次数 : 234

小编点评

**Mask R-CNN 模型扩展实现人体关键节点标注** **简介** 本文展示了如何对基础的 Mask R-CNN 模型进行扩展,完成人体关键节点标注的任务。通过添加一个人体关键节点 keypoint分支,我们能够为模型提供关键节点分析的能力。 **模型结构** * **head 网络:**包含分类、位置框和分割分支。 * **keypoint分支:**用于生成和训练人体关键节点。 **关键步骤** 1. **数据集准备:** - 下载预训练模型。 - 创建训练集和验证集。 - 创建CocoDataset 类生成训练集和验证集。 2. **模型创建:** - 创建模型对象,加载预训练模型。 - 设置训练参数。 3. **模型训练:** - 训练模型。 4. **图片检测:** - 创建模型对象,加载训练好的模型文件。 - 从验证数据集中随机选择一张图片。 - 使用模型对图片进行预测。 5. **结果展示:** - 显示最终识别结果。 **结果** 通过对人体 17 个关键点的标注,我们取得了良好的效果。

正文

摘要:在本案例中,我们将展示如何对基础的Mask R-CNN进行扩展,完成人体关键节点标注的任务。

本文分享自华为云社区《使用Mask R-CNN模型实现人体关键节点标注》,作者: 运气男孩。

前言

ModelArts 是面向开发者的一站式 AI 开发平台,为机器学习与深度学习提供海量数据预处理及交互式智能标注、大规模分布式训练、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期 AI 工作流。

背景

Mask R-CNN是一个灵活开放的框架,可以在这个基础框架的基础上进行扩展,以完成更多的人工智能任务。在本案例中,我们将展示如何对基础的Mask R-CNN进行扩展,完成人体关键节点标注的任务。

Mask R-CNN整体架构,它的3个主要网络:

  • backbone网络,用于生成特征图
  • RPN网络,用于生成实例的位置、分类、分割(mask)信息
  • head网络,对位置、分类和分割(mask)信息进行训练

在head网络中,有分类、位置框和分割(mask)信息的3个分支,我们可以对head网络进行扩展,加入一个人体关键节点keypoint分支。并对其进行训练,使得我们的模型具备关键节点分析的能力。那么我们的模型结构将如下图所示:

head网络中,红色的keypionts分支为新加入的人体关键节点分支

MaskRCNN模型的解析可以参考此文章 。

本案例的运行环境是 TensorFlow 1.8.0 。

keypoints分支

在RPN中,我们生成Proposal后,当检测到Proposal的分类为"Person"时,对每个部位的关键点生成一个one-hot掩码,训练的目标最终是得到一个56*56的二值掩码,当中只有一个像素被标记为关键点,其余像素均为背景。对于每一个关键点的位置,进行最小化平均交叉熵损失检测,K个关键点是被独立处理的。

人体姿态检测中,人本身可以作为一个目标实例进行分类检测。但是,采取了one-hot编码以后,就可以扩展到coco数据集中被标注的17个人体关键点(例如:左眼、右耳),同时也能够处理非连续型数值特征。

COCO数据集中,对人体中17个关键点进行了标注,包括:鼻子,左眼,右眼,左耳,右耳,左肩,右肩,左肘,右肘,左手腕,右手腕,左膝盖,右膝盖,左脚踝,右脚踝,左小腿,右小腿,如下图所示:

基础环境准备

在使用 ModelArts 进行 AI 开发前,需先完成以下基础操作哦(如有已完成部分,请忽略),主要分为4步(注册–>实名认证–>服务授权–>领代金券):

1、使用手机号注册华为云账号:点击注册

2、点此去完成实名认证,账号类型选"个人",个人认证类型推荐使用"扫码认证"。

3、点击进入 ModelArts 控制台数据管理页面,上方会提示访问授权,点击【服务授权】按钮,按下图顺序操作:

4、进入 ModelArts 控制台首页,如下图,点击页面上的"彩蛋",领取新手福利代金券!后续步骤可能会产生资源消耗费用,请务必领取。

以上操作,也提供了详细的视频教程,点此查看:ModelArts环境配置

在ModelArts中训练Mask R-CNN keypoints模型

准备数据和源代码

第一步:准备数据集和预训练模型

下载完成后,显示如下压缩包

解压后,得到data目录,其结构如下:

data/
├── mask_rcnn_coco.h5
├── annotations
│   ├── person_keypoints_train2014.json
│   ├── ***.json
├── train2014
│   ├── COCO_train2014_***.jpg
└── val2014
    ├── COCO_val2014_***.jpg复制

其中data/mask_rcnn_coco_humanpose.h5为预训练模型,annotations、train2014和val2014为我们提前准备好的最小数据集,包含了500张图片的标注信息。

第二步:准备源代码

第三步:安装依赖pycocotools

我们使用COCO数据集,需要安装工具库pycocotools

程序初始化

第一步:导入相关的库,定义全局变量

第二步:生成配置项

我们定义Config类的子类MyTrainConfig,指定相关的参数,较为关键的参数有:

  • __NAME__: Config的唯一名称
  • __NUM_CLASSIS__: 分类的数量,我们只生成圆形,正方形和三角形,再加上背景,因此一共是4个分类
  • __IMAGE_MIN_DIM和IMAGE_MAX_DIM__: 图片的最大和最小尺寸,我们生成固定的128x128的图片,因此都设置为128
  • __TRAIN_ROIS_PER_IMAGE__: 每张图片上训练的RoI个数
  • __STEPS_PER_EPOCH和VALIDATION_STEPS__: 训练和验证时,每轮的step数量,减少step的数量可以加速训练,但是检测精度降低

第三步:创建数据集对象

我们使用封装好的CocoDataset类,生成训练集和验证集。

创建模型

用"training"模式创建模型对象,并加载预训练模型

运行完成后输出下面

训练模型

Keras中的模型可以按照制定的层进行构建,在模型的train方法中,我们可以通过layers参数来指定特定的层进行训练。layers参数有以下几种预设值:

  • heads:只训练head网络中的分类、mask和bbox回归
  • all: 所有的layer
  • 3+: 训练ResNet Stage3和后续Stage
  • 4+: 训练ResNet Stage4和后续Stage
  • 5+: 训练ResNet Stage5和后续Stage

此外,layers参数还支持正则表达式,按照匹配规则指定layer,可以调用model.keras_model.summary()查看各个层的名称,然后按照需要指定要训练的层。

我们针对不同的layer进行训练,首先,训练head网络中的4个分支:

输出结果:

然后训练ResNet Stage4和后续Stage

最后,对所有layer进行优化,并将训练的模型保存到本地

输出结果:

使用模型检测图片物体

第一步:创建"Inference"模式的模型对象,并加载我们训练好的模型文件

第二步:从验证数据集中随机选出一张图片,显式Ground Truth信息

输出结果,识别图片如下:

第三步:使用模型对图片进行预测,并显示结果

最终识别结果:

总结

使用Mask R-CNN模型实现人体关键节点标注,在head网络中,有分类、位置框和分割(mask)信息的3个分支,我们可以对head网络进行扩展,加入一个人体关键节点keypoint分支。并对其进行训练,使得我们的模型具备关键节点分析的能力。对人体中17个关键点进行了标注,包括:鼻子,左眼,右眼,左耳,右耳,左肩,右肩,左肘,右肘,左手腕,右手腕,左膝盖,右膝盖,左脚踝,右脚踝,左小腿,右小腿,并且取得了不错的效果。

 

点击关注,第一时间了解华为云新鲜技术~

与使用Mask R-CNN模型实现人体关键节点标注相似的内容:

使用Mask R-CNN模型实现人体关键节点标注

摘要:在本案例中,我们将展示如何对基础的Mask R-CNN进行扩展,完成人体关键节点标注的任务。 本文分享自华为云社区《使用Mask R-CNN模型实现人体关键节点标注》,作者: 运气男孩。 前言 ModelArts 是面向开发者的一站式 AI 开发平台,为机器学习与深度学习提供海量数据预处理及交

WPF使用Shape实现复杂线条动画

看到巧用 CSS/SVG 实现复杂线条光效动画的文章,便也想尝试用WPF的Shape配合动画实现同样的效果。ChokCoco大佬的文章中介绍了基于SVG的线条动画效果和通过角向渐变配合 MASK 实现渐变线条两种方式。WPF中的Shape与SVG非常相似,因此这种方式也很容易实现。但WPF中仅有的两

使用EF 连接 数据库 SQLserver、MySql 实现 CodeFirst

1.新建项目,下载Nuget安装包 创建项目需要注意几点,如果是基于 .net framework 的项目 需要选择 相应版本的 EF, 如果是跨平台则选择EF Core版本。 我这里选择的是 .net framework 版本。红框里面是 实现EF Code First 需要的包。 对应的版本:

使用explain优化慢查询的业务场景分析

问:你最害怕的事情是什么? 答:搓澡 问:为什么? 答:因为有些人一旦错过,就不在了 Explain 这个词在不同的上下文中有不同的含义。在数据库查询优化的上下文中,"EXPLAIN" 是一个常用的 SQL 命令,用于显示 SQL 查询的执行计划。执行计划是数据库如何执行查询的一个详细描述,包括它将

使用Github Action来辅助项目管理

Github action 是一个Github官方提供的非常流行且速度集成 持续集成和持续交付(CI/CD)的工具。它允许你在GitHub仓库中自动化、定制和执行你的软件开发工作流。你可以发现、创建和分享用于执行任何你想要的工作的操作,包括CI/CD,并在完全定制的工作流中组合操作。 持续集成需要做

使用 GPU 进行 Lightmap 烘焙 - 简单 demo

作者:i_dovelemon 日期:2024-06-16 主题:Lightmap, PathTracer, Compute Shader 引言 一直以来,我都对离线 bake lightmap 操作很着迷。一方面,这个方案历久弥新,虽然很古老,但是一直在实际项目中都有使用;另一方面,它能够产生非常高

使用 Spring 实现控制反转和依赖注入

使用 Spring 实现控制反转和依赖注入 概述 在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们。 什么是控制反转? 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传

使用Kubesec检查YAML文件安全

使用Kubesec检查YAML文件安全,YAML文件是Kubernetes配置的主要载体,因此,检查YAML文件的安全性对于确保Kubernetes集群的安全至关重要,Kubesec简介,使用Kubesec检查YAML文件安全,kubesec scan podyamlsafe.yaml

使用Microsoft.SemanticKernel基于本地运行的Ollama大语言模型实现Agent调用函数

大语言模型的发展日新月异,记得在去年这个时候,函数调用还是gpt-4的专属。到今年本地运行的大模型无论是推理能力还是文本的输出质量都已经非常接近gpt-4了。而在去年gpt-4尚未发布函数调用时,智能体框架的开发者们依赖构建精巧的提示词实现了gpt-3.5的函数调用。目前在本机运行的大模型,基于这一

使用 TensorRT C++ API 调用GPU加速部署 YOLOv10 实现 500FPS 推理速度——快到飞起!!

NVIDIA ® TensorRT ™ 是一款用于高性能深度学习推理的 SDK,包含深度学习推理优化器和运行时,可为推理应用程序提供低延迟和高吞吐量。YOLOv10是清华大学研究人员近期提出的一种实时目标检测方法,通过消除NMS、优化模型架构和引入创新模块等策略,在保持高精度的同时显著降低了计算开销...