使用 TensorFlow Lite 在 Android 上实时跟踪人体姿势
2019 年 8 月 6 日
发布者 Eileen MaoTanjin Prity,Google 工程实习生,2019 年夏季

我们很高兴发布一个 TensorFlow Lite 示例应用程序,用于使用 PoseNet 模型 在 Android 上进行人体姿态估计。PoseNet 是一个视觉模型,通过检测关键身体部位的位置来估计图像或视频中的人的姿势。例如,该模型可以估计一个人在图像中的肘部和/或膝盖的位置。姿势估计模型不识别图像中的人物,只识别关键身体部位的位置。

TensorFlow Lite 正在分享一个 Android 示例应用程序,该应用程序利用设备的摄像头实时检测和显示单个人的关键身体部位。查看 源代码

为什么这令人兴奋?

姿态估计有很多可能性。举几个例子,开发人员可以根据身体图像 增强现实动画计算机图形角色,以及 分析运动员的步态。在 Google I/O’19 上,TensorFlow Lite 展示了 Dance Like,一款使用 PoseNet 模型帮助用户学习跳舞的应用程序。

这个示例应用程序将使应用程序开发人员和机器学习专家更容易探索轻量级移动模型的可能性。

PoseNet 示例应用程序

与用 Java 编写的现有 Android 示例相比,PoseNet 示例应用程序 是用 Kotlin 开发的。开发该应用程序的目标是使任何人都能轻松使用 PoseNet 模型,而无需过高的开销。示例应用程序包含一个 PoseNet 库,它抽象了模型的复杂性。下图显示了应用程序、PoseNet 库和 TensorFlow Lite 库之间的工作流程。
PoseNet 应用程序工作流程

PoseNet 库

PoseNet 库提供一个接口,该接口接收处理过的相机图像并返回有关人关键身体部位位置的信息。此功能由 estimateSinglePose() 提供,该方法在处理过的 RGB 位图上运行 TensorFlow Lite 解释器并返回一个 Person 对象。此页面 说明了如何解释 PoseNet 的输入和输出。
// Estimate the body part positions of a single person.
// Pass in a Bitmap and obtain a Person object.
estimateSinglePose(bitmap: Bitmap): Person {...}
Person 类包含关键身体部位的位置及其关联的置信度分数。人的置信度分数是每个关键点的置信度分数的平均值,它表示关键点存在于该位置的概率。
// Person class holds a list of key points and an associated confidence score.
class Person {
  var keyPoints: List = listOf()
  var score: Float = 0.0f
}
每个 KeyPoint 都保存着特定 BodyPart Position 和该关键点的置信度分数。可以在这里访问所有定义的关键点列表 这里
// KeyPoint class holds information about each bodyPart, position, and score.
class KeyPoint {
  var bodyPart: BodyPart = BodyPart.NOSE
  var position: Position = Position()
  var score: Float() = 0.0f
}

// Position class contains the x and y coordinates of a key point on the bitmap. 
class Position {
  var x: Int = 0
  var y: Int = 0
}

// BodyPart class holds the names of seventeen body parts.
enum class BodyPart {
  NOSE, 
  LEFT_EYE, 
  RIGHT_EYE, 
  ... 
  RIGHT_ANKLE
}

PoseNet 示例应用程序

PoseNet 示例应用程序 是一款设备上的相机应用程序,它从相机捕获帧并实时将关键点叠加到图像上。

对于每个传入的相机图像,应用程序执行以下步骤
  1. 从相机预览中捕获图像数据,并将其从 YUV_420_888 转换为 ARGB_888 格式。
  2. 创建一个 Bitmap 对象来保存来自 RGB 格式帧数据的像素。裁剪和缩放 Bitmap 以适合模型输入大小,以便可以将其传递给模型。
  3. 调用 PoseNet 库中的 estimateSinglePose() 函数以获取 Person 对象。
  4. Bitmap 缩放回屏幕大小。在 Canvas 对象上绘制新的 Bitmap。
  5. 使用从 Person 对象获得的关键点位置在画布上绘制骨架。显示置信度分数高于一定阈值的关键点,默认值为 0.5。

为了将姿态渲染与相机帧同步,对输出显示使用单个 SurfaceView,而不是为姿态和相机使用单独的 View 实例。SurfaceView 通过获取、锁定和在 View 画布上绘画来处理在屏幕上放置表面,而不会延迟。

在设备上运行

我们鼓励您尝试该应用程序,方法是从 GitHub 下载源代码,并参考 README 获取有关如何运行它的说明。

路线图

将来,我们希望探索该示例应用程序的更多功能,包括
  1. 多姿态估计
  2. 使用 GPU 代理进行 GPU 加速
  3. 使用 NNAPI 代理进行 NNAPI 加速
  4. 模型的训练后量化以减少延迟
  5. 其他模型选项,例如 ResNet PoseNet 模型

这个夏天开发 PoseNet 示例应用程序非常愉快!我们希望这个应用程序能使设备上的机器学习更容易获得。如果您使用该应用程序,请使用 #TFLite、#TensorFlow 和 #PoweredByTF 与我们分享。

致谢

特别感谢 Nupur GargPulkit Bhuwalka,我们的主持人和 Tensorflow Lite 软件工程师,Tyler Zhu,PoseNet 模型的创建者,Pavel Senchanka,实习生同事,Clément Julliard,Pixel Camera 软件工程师,以及 TensorFlow Lite 团队。
下一篇文章
Track human poses in real-time on Android with TensorFlow Lite

发布者 Eileen MaoTanjin Prity,Google 工程实习生,2019 年夏季

我们很高兴发布一个 TensorFlow Lite 示例应用程序,用于使用 PoseNet 模型 在 Android 上进行人体姿态估计。PoseNet 是一个视觉模型,通过检测关键身体部位的位置来估计图像或视频中的人的姿势。例如,该模型可以估计一个人在图像中的肘部和/或膝盖的位置。姿势估计模型不识别图像中的人物,只识别关键身体部位的位置。