用 TensorFlow Lite 在安卓系统上实时人体姿态跟踪
2019年08月15日 由 sunlei 发表
298892
0
我们很高兴发布一个TensorFlowLite样本应用程序,用于在Android上使用PoseNet模型进行人体姿态估计。PoseNet是一种视觉模型,通过检测关键身体部位的位置来估计人在图像或视频中的姿势。例如,模型可以估计一个人的肘部和/或膝盖在图像中的位置。姿势估计模型不识别图像中的人,只识别关键身体部位的位置。
TensorFlowLite正在共享一个Android示例应用程序,该应用程序利用设备的摄像头实时检测和显示个人的关键身体部位。
这里查看源代码!
为什么这令人兴奋?
姿态估计有很多可能性。举几个例子,开发人员可以基于身体图像的
增强现实,
动画计算机图形字符,并分析运动员在
运动中的步态。在谷歌I/O ' 19上,TensorFlow Lite展示了一款名为
Dance Like的应用程序,它可以帮助用户学习如何使用PoseNet模型跳舞。
这个示例应用程序将使应用程序开发人员和机器学习专家更容易地探索轻量级移动模型的可能性。
PoseNet示例应用程序
与现有的用Java编写的Android示例相比,PoseNet示例应用程序是用Kotlin开发的。开发该应用程序的目的是使任何人都可以轻松地使用PoseNet模型,而开销最小。示例应用程序包括一个PoseNet库,它抽象了模型的复杂性。下图显示了应用程序、PoseNet库和TensorFlow Lite库之间的工作流。
[caption id="attachment_42887" align="aligncenter" width="722"]
PoseNet应用工作流[/caption]
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 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、创建一个位图对象来保存RGB格式帧数据中的像素。裁剪位图并将其缩放到模型输入大小,以便将其传递给模型。
3、从PoseNet库调用estimateSinglePose()函数来获取Person对象。
4、将位图缩放到屏幕大小。在画布对象上绘制新的位图。
5、使用从Person对象获取的关键点的位置在画布上绘制骨架。显示置信度得分高于某个阈值的关键点,默认值为0.2。
为了使姿态渲染与摄像机帧同步,输出显示使用了单个SurfaceView,而不是单独的姿态和摄像机视图实例。SurfaceView通过在视图画布上获取、锁定和绘制来确保将surface毫不延迟地放到屏幕上。
在运行设备上
我们鼓励您通过从
GitHub下载源代码并参考
README了解如何运行该应用程序来试用该应用程序。
在路线图上
在未来,我们希望为这个示例应用探索更多的功能,包括:
1、Multi-pose估计
2、GPU加速与GPU委托
3、使用NNAPI委托加速NNAPI
4、训练后的量化模型,以减少延迟
5、附加的模型选项,如ResNet PoseNet模型
很高兴在这个夏天开发PoseNet示例应用程序!我们希望这个应用程序能让设备上的机器学习变得更容易。如果您使用该应用程序,请使用#TFLite、#TensorFlow和#PoweredByTF与我们共享。
作者:Eileen Mao和Tanjin Prity,谷歌工程实习生,2019年夏季发布。
原文链接:https://medium.com/tensorflow/track-human-poses-in-real-time-on-android-with-tensorflow-lite-e66d0f3e6f9e