让计算机看懂你在摆什么 Pose
文 / Eileen Mao & Tanjin Prity
2019 年夏季 Google 工程师实习生
我们很高兴发布一款 TensorFlow Lite 示例应用,该应用使用 PoseNet 模型在 Android 中实现人体姿势估测。PoseNet 是一种视觉模块,通过检测人体关键部位的位置,来估测图像或视频中的人体姿势。例如,该模型可以估测图像中人物手肘和膝盖的所在位置。姿势估测模型只会识别人体关键部位的位置,而不会去辨别图像中的人物。
TensorFlow Lite 现与您分享这款 Android 示例应用,该应用可利用设备的相机实时检测和显示个人的关键身体部位,快来下载源代码!
PoseNet 应用前景
姿势估测存在多种用途。例如,开发者可根据人体图像增强现实、制作计算机图形人物动画以及为运动中的运动员分析步态。在 Google I/O 2019 大会上,TensorFlow Lite 展示了使用 PoseNet 模块帮助用户学习舞蹈的应用 Dance Like。
借助这款示例应用,应用开发者和机器学习专家能够更轻松地探索轻量级移动模型的各种可能性。
PoseNet 示例应用
不同于用 Java 编写的现有 Andriod 应用,PoseNet 示例应用的开发采用 Kotlin 语言。开发此应用旨在让所有人都能以低成本轻松使用 PoseNet 模型。示例应用包含可消除模型复杂性的 PoseNet 库。下图展示应用、PoseNet 库 和 TensorFlow Lite 库之间的工作流。
PoseNet 应用工作流
PoseNet 库
PoseNet 库提供了一个接口,通过该接口接收经处理的相机图像,并返回人体关键部位所在位置的相关信息。此功能由 estimateSinglePose() 函数提供,该函数会在经处理的 RGB 位图上运行 TensorFlow Lite 解释器并返回 Person 对象。了解 PoseNet 输入和输出的含义 (https://tensorflow.google.cn/lite/models/pose_estimation/overview)。
2// Pass in a Bitmap and obtain a Person object.
3estimateSinglePose(bitmap: Bitmap): Person {...}
Person 类包含人体关键部位的位置及其相关的可信度。用户的可信度是每个关键点可信度的平均值,表示该位置存在关键点的可能性。
2class Person {
3var keyPoints: List<KeyPoint> = listOf<KeyPoint>()
4var score: Float = 0.0f
5}
每个 KeyPoint(关键点)均包含某个 BodyPart(身体部位)的 Position(位置)信息,以及该关键点的置信度得分。查看所有已定义的关键点列表 (https://tensorflow.google.cn/lite/models/pose_estimation/overview#how_it_works)。
1// KeyPoint class holds information about each bodyPart, position, and score.
2class KeyPoint {
3var bodyPart: BodyPart = BodyPart.NOSE
4var position: Position = Position()
5var score: Float() = 0.0f
6}
7// Position class contains the x and y coordinates of a key point on the bitmap.
8class Position {
9var x: Int = 0
10var y: Int = 0
11}
12// BodyPart class holds the names of seventeen body parts.
13enum class BodyPart {
14NOSE,
15LEFT_EYE,
16RIGHT_EYE,
17...
18RIGHT_ANKLE
19}
PoseNet 示例应用
PoseNet 示例应用是一种设备端相机应用,该应用可通过相机捕获帧,并实时覆盖图像上的关键点。
针对每张传入的相机图像,该应用均会执行以下步骤:
从相机预览中捕获图像数据,并将其格式从 YUV_420_888 转换为 ARGB_888。 创建 Bitmap 对象,以保存 RGB 格式帧数据的像素。将 Bitmap 裁剪并缩放至可输入模块的尺寸,从而将其传入模块。
调用 PoseNet 库的 estimateSinglePose () 函数,以获取 Person 对象。
将 Bitmap 重新缩放至屏幕尺寸。在 Canvas 对象上绘制新 Bitmap。
使用通过 Person 对象获取的关键点位置,在画布上绘制骨架。显示可信度高于特定阈值(默认为 0.2)的关键点。
为使姿势渲染与相机帧同步,我们对输出显示使用单个 SurfaceView,而非分别对姿势与相机使用 View 实例。SurfaceView 会在 View 画布上进行捕获、锁定和绘制,从而确保在屏幕上实时显示画面。
在设备端运行
我们推荐您从 GitHub 下载源代码,参阅 README 了解运行方法,进而试用此应用。
注:GitHub 链接
https://github.com/tensorflow/examples/tree/master/lite/examples/posenet/android
README 链接
https://github.com/tensorflow/examples/tree/master/lite/examples/posenet/android/README.md
发展蓝图
我们希望未来能为此示例应用开发更多功能,其中包括:
多姿势估测 使用 GPU 代理实现 GPU 加速
使用 NNAPI 代理实现 NNAPI 加速
使用模型的训练后量化降低延迟
更多模型选项,例如 ResNet PoseNet 模型
在这个夏天,我们很高兴能开发出 PoseNet 示例应用!我们希望此应用能让更多人接触设备端机器学习。如果您是此应用的用户,请使用 #TFLite、#TensorFlow 和 #PoweredByTF 话题标签与我们分享您的使用感受。
致谢
特别感谢我们的负责人和 Tensorflow Lite 软件工程师 Nupur Garg 和 Pulkit Bhuwalka、PoseNet 模型的创造者 Tyler Zhu、实习生 Pavel Senchanka、Pixel Camera 软件工程师 Clément Julliard,以及 TensorFlow Lite 团队。
如果您想详细了解 TensorFlow 的相关内容,请参阅以下文档。这些文档深入探讨了这篇文章中提及的许多主题:
TensorFlow Lite https://tensorflow.google.cn/lite PoseNet https://tensorflow.google.cn/lite/models/pose_estimation/overview PoseNet 示例应用 https://github.com/tensorflow/examples/tree/master/lite/examples/posenet/android 增强现实 https://www.instagram.com/p/BbkKLiegrTR/ 制作计算机图形人物动画 https://www.instagram.com/p/Bg1EgOihgyh/ 运动员分析步态 https://www.runnersneed.com/expert-advice/gear-guides/gait-analysis.html Dance Like https://www.youtube.com/watch?v=T99oyqImToM