文章目录

  • 姿态迁移简介
  • 方案详解
    • Mediapipe
      • Mediapipe数据获取
      • 多人姿态识别方向探索
    • PoseNet
    • MoveNet
    • OpenPose
    • OpenMMD
  • 总结
  • 参考链接

姿态迁移简介

目前AR,VR,元宇宙都比较火,需要实际场景和虚拟中进行交互的情况,因此研究了通过摄像头获取图像进行识别,本文主要概述了在人体身体姿势识别跟踪方面的一些调研和尝试。

通过各个方案,我们可以从RGB视频帧中推断出整个身体的关键特征点,从而根据这些关键特征点去做扩展,比如迁移到unity模型中等。

从识别角度来说,我们可以分成两个大方向,一是人体身体关键特征点识别,这里特征点分为2d特征点和3d特征点,部分方案只支持2d特征点;二是人体动作识别,比如用户在做什么动作,举一个很简单的例子,我们可以通过mediapipe识别出用户在做俯卧撑或者深蹲等。

从用户体验角度来说,我们可以分成实时摄像头传输和对视频进行处理两个方向。摄像头实时传输的话就必须要做到对视频每一帧RGB图像做到即时处理,这里就牵扯到优化效率问题。对视频进行处理的话可以采用对视频后期处理的形式去处理,一般动捕方案都是这么做的。

方案详解

Mediapipe

Google出品,可以实现人脸检测、姿态识别,手势识别等很多效果,并且可以在多平台高效的输出。这里强调下Mediapipe检测出来的特征点数据均为3d,有空间感。

Mediapipe检测是基于BlazeFace模型,明确地预测了两个额外的虚拟关键点,这些虚拟关键点将人体中心、旋转和缩放牢固地描述为一个圆圈。受莱昂纳多的维特鲁威人的启发,我们预测了一个人臀部的中点,外接整个人的圆的半径,以及连接肩部和臀部中点的线的倾斜角。

Mediapipe数据获取

从Mediapipe上获取的身体的33个特征点,具体如下图,对此33个特征点进行判断。

主要通过角度来判断:

float Angle(NormalizedLandmark ver1, NormalizedLandmark ver2, NormalizedLandmark ver3, NormalizedLandmark ver4)
{ return Vector3.Angle(new Vector3(ver1.X, ver1.Y, ver1.Z) - new Vector3(ver2.X, ver2.Y, ver2.Z),new Vector3(ver3.X, ver3.Y, ver3.Z) - new Vector3(ver4.X, ver4.Y, ver4.Z));
}

多人姿态识别方向探索

Mediapipe 在人脸上是支持多人的,但是在姿态识别上目前只支持单人。在实验了网上能搜到的各种方案之后,有一种方案目前是可行的,但是在性能上会比较卡顿。
既然Mediapipe支持单人,那我们把视频画面中的多人画面拆分成多个单人就行了。
这里我采用的是OpenVINO中的行人检测模型。(我尝试了多种方案,YOLO-unity、Barracuda-Image-Classification和OpenVINO后发现OpenVINO效果最佳)OpenVINO ToolKit是英特尔发布的一套深度学习推断引擎,支持各种网络框架。对此不熟悉的同学可以参考OpenVINO开发系列文章汇总进行较为系统的学习。

具体思路就是通过OpenVINO识别出人物范围框,然后使用Opencv进行图像分割,单人图像传递给Mediapipe sdk去做单人姿态识别,然后进行汇总。目前该方案在移动端测试效果较为卡顿,不是很理想。

PoseNet

PoseNet是TensorFlow和谷歌创意实验室合作发布的专门用于姿态估计的一种技术方案。PoseNet可用于估计单个姿势或多个姿势,该算法有一个版本可以仅检测图像/视频中的一个人,另一个版本可以检测图像/视频中的多个人。
流程主要有两个阶段:

  1. 输入RGB 图像通过卷积神经网络馈送。
  2. 单姿势或多姿势解码算法用于解码来自模型输出的姿势、姿势置信度分数、关键点位置 和关键点置信度分数。

同Mediapipe一样,我们来看看PoseNet给到我们的关键姿势点。PoseNet提供了17个关键点,不同于Mediapipe提供的3d数据点,PoseNet提供的是关键点的2d坐标,x和y。以及关键点可信度分数,使用者可以根据实际情况去做判断,范围在0.0-1.0之间,越接近1.0表示识别出来的点越正确。

ok,我们来看下我把posenet这一套通过tf-lite加载的形式在unity上的呈现效果。

MoveNet

MoveNet是一种超快速且准确的模型,可检测身体的 17 个关键点。该模型在TF Hub上提供,有两种变体,称为 Lightning 和 Thunder。Lightning 适用于延迟关键的应用程序,而 Thunder 适用于需要高精度的应用程序。在大多数现代台式机、笔记本电脑和手机上,这两种模型的运行速度都比实时 (30+ FPS) 快,这对于现场健身、健康和保健应用至关重要。

我们可以看到movenet的识别出来的点的效果如下:

官方从tf hub 加载模型代码:

model_name = "movenet_lightning"if "tflite" in model_name:if "movenet_lightning_f16" in model_name:!wget -q -O model.tflite https://tfhub.dev/google/lite-model/movenet/singlepose/lightning/tflite/float16/4?lite-format=tfliteinput_size = 192elif "movenet_thunder_f16" in model_name:!wget -q -O model.tflite https://tfhub.dev/google/lite-model/movenet/singlepose/thunder/tflite/float16/4?lite-format=tfliteinput_size = 256elif "movenet_lightning_int8" in model_name:!wget -q -O model.tflite https://tfhub.dev/google/lite-model/movenet/singlepose/lightning/tflite/int8/4?lite-format=tfliteinput_size = 192elif "movenet_thunder_int8" in model_name:!wget -q -O model.tflite https://tfhub.dev/google/lite-model/movenet/singlepose/thunder/tflite/int8/4?lite-format=tfliteinput_size = 256else:raise ValueError("Unsupported model name: %s" % model_name)# Initialize the TFLite interpreterinterpreter = tf.lite.Interpreter(model_path="model.tflite")interpreter.allocate_tensors()def movenet(input_image):"""Runs detection on an input image.Args:input_image: A [1, height, width, 3] tensor represents the input imagepixels. Note that the height/width should already be resized and match theexpected input resolution of the model before passing into this function.Returns:A [1, 1, 17, 3] float numpy array representing the predicted keypointcoordinates and scores."""# TF Lite format expects tensor type of uint8.input_image = tf.cast(input_image, dtype=tf.uint8)input_details = interpreter.get_input_details()output_details = interpreter.get_output_details()interpreter.set_tensor(input_details[0]['index'], input_image.numpy())# Invoke inference.interpreter.invoke()# Get the model prediction.keypoints_with_scores = interpreter.get_tensor(output_details[0]['index'])return keypoints_with_scoreselse:if "movenet_lightning" in model_name:module = hub.load("https://tfhub.dev/google/movenet/singlepose/lightning/4")input_size = 192elif "movenet_thunder" in model_name:module = hub.load("https://tfhub.dev/google/movenet/singlepose/thunder/4")input_size = 256else:raise ValueError("Unsupported model name: %s" % model_name)def movenet(input_image):"""Runs detection on an input image.Args:input_image: A [1, height, width, 3] tensor represents the input imagepixels. Note that the height/width should already be resized and match theexpected input resolution of the model before passing into this function.Returns:A [1, 1, 17, 3] float numpy array representing the predicted keypointcoordinates and scores."""model = module.signatures['serving_default']# SavedModel format expects tensor type of int32.input_image = tf.cast(input_image, dtype=tf.int32)# Run model inference.outputs = model(input_image)# Output is a [1, 1, 17, 3] tensor.keypoints_with_scores = outputs['output_0'].numpy()return keypoints_with_scores

实际生产过程中,movenet主要通过tf-lite去加载计算,可以分为单人和多人。tf-hub地址如下:地址。测试发现,从帧率和效果上来说,movenet比mediapipe效果要好一点。
但是在unity使用中,我发现movenet的tf-lite模型在unity中遇到了unity barracuda插件转换的问题,单人的tf-lite可用,但是多人无法转换。已知是unity barracuda插件问题,已提交issues,但目前还没走通。

不熟悉unity barracuda的同学可以移步这里
主要用于在untiy中集成神经网络算法。

OpenPose

OpenPose是我在github上搜到的一个人体姿态识别的一个算法方案。
主要功能:

  1. 2D实时多人关键点检测:15、18 或25 关键点身体/足部关键点估计,包括6 个足部关键点。运行时不受检测到的人数的影响。2x21-keypoint 手部关键点估计。运行时间取决于检测到的人数。70个关键点人脸关键点估计。运行时间取决于检测到的人数。
  2. 3D实时单人关键点检测

其实可以理解成在效果产出和姿态识别角度来说,是mediapipe和posenet的综合体。

效果如下:

OpenMMD

OpenMMD是一个可以直接分析现成视频(各种MP4, AVI等视频格式),自动生成vmd动作文件的工具。
这个方案无法做到实时转换,即使你的输入源是摄像头的话,也必须录完以后生成动捕文件,然后再把动捕文件绑定到模型上才可以完成。
OpenMMD具体使用教程在b站上有一个大佬总结的很清楚了,但有一个问题,他只能绑定在mmd模型上,mmd模型在游戏里的通用性并不大,属于比较小范围的应用。尝试了几种模型之间互转的方案,Blender等,但无果,转换起来没那么简单。
这是我迁移后的效果,左边是mmd模型,成功跑通。

总结

以上五种方案,简单总结如下:

参考链接

  1. BlazeFace
  2. Mediapipe Pose
  3. PoseNet
  4. MoveNet
  5. OpenPose
  6. OpenMMD

个人微信公共账号已上线,欢迎关注:

人体姿态识别方案详解相关推荐

  1. 美团多渠道打包方案详解,速度快到白驹过隙

    美团多渠道打包方案详解,速度快到白驹过隙 Andorid渠道市场有多分散呢?分散到比Android碎片化还严重,你还在为多渠道打包而头疼吗?美团提供了速度快到白驹过隙的多渠道打包方案.说的有点夸张,对 ...

  2. 哈工程计算机学院培养方案,哈工程2012年硕士培养方案详解(计算机科学与技术学院).doc...

    哈工程2012年硕士培养方案详解(计算机科学与技术学院) 计算机科学与技术学院 计算机科学与技术 Computer?Science and Technology(0812) 一.适用学科 一级学科名称 ...

  3. 技术分享——机房搬迁工作步骤及方案详解

    技术分享--机房搬迁工作步骤及方案详解 随着企业.单位的不断深入发展,现有的涉及办公.生产场所已经不能满足,新的厂房及办公大楼逐渐筹建,那么机房搬迁或机房改建服务应运而生,而机房搬迁作为一项非常重要的 ...

  4. 高并发架构系列:Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  5. 传美云商系统软件方案详解

    传美云商系统是通过颐和果园让公众所知道的,颐和果园是做水果生鲜食品市场的,运用传美云商这个软件为什么能打通互联网市场?究其主要原因是因新零售正在发生日新月异的变化! 任何新零售都需要数据的支撑.办公室 ...

  6. 方案详解|AARRR+八角行为分析=用游戏化思维实现用户增长

    我们需要一套基于AARRR模型,围绕增长成本.效率.质量三个话题来针对每一层转化漏斗提炼可操作的运营方案,以AARRR模型+八角行为分析法为理论框架的,游戏化运营增长策略应运而生.随着互联网线上流量的 ...

  7. Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解、插件。

    Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解.插件. **应用场景:**在很多时候,前端开发过程中需要动态的获取图片的主要的颜色值,并根据主色调去调整主题样式的颜色或者模拟 ...

  8. 数字孪生城市概念分析及建设方案详解

    数字孪生城市概念分析及建设方案详解 一.数字孪生城市的内涵 (一)数字孪生 据美国航空航天局(NASA)权威性定义,数字孪生就是指充分运用物理模型.传感器.运作历史等数据,集成多学科.多物理量.多尺度 ...

  9. 《前端》权限链接--vue前端权限控制方案详解附demo_feiyu_may的博客-CSDN博客_vue 前端权限

    前端权限控制 - 潘正 - 博客园  https://www.cnblogs.com/guchengnan/p/11800947.html vue前端权限控制方案详解附demo_feiyu_may的博 ...

  10. mysql千万级数据怎么删除,MySQL 快速删除大量数据(千万级别)的几种实践方案详解...

    这篇文章主要介绍了MySQL 快速删除大量数据(千万级别)的几种实践方案详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 笔者 ...

最新文章

  1. 2009-08-19股市大跌分析(转载)
  2. boost::test模块针对模式文件测试单元测试框架报告功能
  3. 学习笔记(34):Python网络编程并发编程-异步调用与回调机制
  4. Dubbo(十一)dubbo的超时重试配置以及启动检查
  5. 微服务架构-服务注册中心和服务网关(6.8) (转载)
  6. TikTok最适合普通小白的赚钱方法?
  7. 八数码问题引发的思考
  8. 机器学习 - 训练集、验证集、测试集
  9. Spring核心技术
  10. 项目实训个人报告(二)
  11. 树莓派4b 3.5inch显示屏+远程+FTP+建站
  12. 031永久储存:腌制一缸美味的泡菜
  13. IDEA: 全局搜索 、全局查找
  14. 软件测试之自动化测试Pytest教程
  15. 【图文详解】路由器设置关闭DHCP后电脑手机无法上网
  16. Android 下拉刷新实践
  17. 2021周更03:周末加了两天班
  18. 计算机的学生跨专业考研
  19. 《上帝掷骰子吗》人物八卦之费因曼
  20. 叙述微型计算机系统组成,微型计算机系统的组成.doc

热门文章

  1. wps office 2019中文版
  2. JLINK 驱动 V7.00a 更新导致JLINK V9无法使用问题解决
  3. 容器-2018百战程序员JAVA全系列终结版第07阶:容器和数据结构
  4. 2022年第三届全国大学生网络安全精英赛
  5. Ubuntu14.04 64位安装iNode客户端
  6. Cgroup 资源配置方法----------Control Groups------Docker通过 Cgroup 来控制容器使用的资源配额
  7. 星环科技多模型数据统一存储的大数据分布式存储平台方案分享
  8. STM8S103硬件I2C的操作注意事项
  9. 如何使用AxureShare创建团队文件
  10. 电子测量——用C语言设计测量数据误差处理的通用程序