翻译文章,内容有删减。原文地址:https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5
与谷歌创意实验室合作,我很高兴地宣布发布TensorFlow.js版本的PoseNet,这是一种机器学习模型,允许在浏览器中进行实时人体姿势估计。您可以访问https://storage.googleapis.com/tfjs-models/demos/posenet/camera.html 尝试一下在线演示。
PoseNet可以使用单姿态或多姿态算法检测图像和视频中的人物形象 - 全部来自浏览器。
那么,问题来了,什么是姿态估计?姿态估计是指在图像和视频中检测人物的计算机视觉技术,以便人们可以确定某个人的肘部在图像中出现的位置。需要澄清的是,这项技术并不能识别谁在图像中 - 没有任何与识别身份相关的个人身份信息。该算法仅仅估计关键身体关节的位置。
好吧,为什么这是令人兴奋的开始? 姿态估计有很多用途,从对身体做出反应的交互式安装到增强现实、动画、健身用途等等。我们希望此模型的辅助能力能够激励更多的开发人员和制造商尝试将姿态检测应用到他们自己的项目中。虽然许多可选的姿态检测系统已经开源,但都需要专门的硬件和/或相机,以及相当多的系统设置。PoseNet运行在TensorFlow.js上,任何拥有摄像头的PC或手机的人都可以在网络浏览器中体验这种技术。 而且由于我们已经开源了这个模型,JavaScript开发人员可以用几行代码来使用这个技术。更重要的是,这实际上可以帮助保护用户隐私。由于TensorFlow.js上的PoseNet在浏览器中运行,因此任何姿态数据都不会留在用户的计算机上。
PoseNet可用于估计单个姿势或多个姿势,这意味着该算法的一个版本只能检测图像/视频中的一个人,而另一个版本可以检测图像/视频中的多个人。为什么会有两个版本?单人姿势检测器更快,更简单,但图像中只能有一个主体(稍后会深入探讨)。我们先探讨更容易使用的单个姿势。
在上层看来,姿势估计发生在两个阶段:
等等,这些关键词的含义是什么? 让我们回顾一下最重要的:
PoseNet返回检测到的每个人的置信度值以及检测到的每个姿势关键点。图片来源:“Microsoft Coco:上下文数据集中的通用对象”,https://cocodataset.org。
PosNet检测的17个姿势关键点。
将模型的复杂性抽象化并将功能封装为易于使用的方法,这放面已经做了很多工作。让我们回顾一下如何配置PoseNet项目的基础知识。
该库可以通过npm安装:
npm install @tensorflow-models/posnet
使用es6模块导入:
import * as posenet from '@tensorflow-models/posenet';
const net = await posenet.load();
或通过页面的bundle:
<html>
<body>
<script src="https://unpkg.com/@tensorflow/tfjs">script>
<script src="https://unpkg.com/@tensorflow-models/posenet">
script>
<script type="text/javascript">
posenet.load().then(function(net) {
// posenet model loaded
});
script>
body>
html>
应用于图像的单人姿势估计算法示例。图片来源:“Microsoft Coco:上下文数据集中的通用对象”,https://cocodataset.org。
如前面所说的,单姿态估计算法更简单、速度更快。它的理想场景是只有一个人在输入图像或视频的中间。缺点是,如果图像中有多个人,那么来自两个人的关键点可能会被估计为是同一个单一姿势的一部分 - 例如,#1的左臂和#2的右膝由该算法确定为属于相同姿势而可能被合并。如果输入图像可能包含多人,则应该使用多姿态估计算法。
我们来看看单姿态估计算法的输入:
现在让我们看一下单姿态估计算法的输出:
一下这个简短的代码块展示了如何使用单姿态估计算法:
const imageScaleFactor = 0.50;
const flipHorizontal = false;
const outputStride = 16;
const imageElement = document.getElementById('cat');
// load the posenet model
const net = await posenet.load();
const pose = await net.estimateSinglePose(imageElement, scaleFactor, flipHorizontal, outputStride);
一个输出姿势的例子如下所示:
{
"score": 0.32371445304906,
"keypoints": [
{ // nose
"position": {
"x": 301.42237830162,
"y": 177.69162777066
},
"score": 0.99799561500549
},
{ // left eye
"position": {
"x": 326.05302262306,
"y": 122.9596464932
},
"score": 0.99766051769257
},
{ // right eye
"position": {
"x": 258.72196650505,
"y": 127.51624706388
},
"score": 0.99926537275314
},
...
]
}
一个应用于图像的多人姿态估计算法的示例。 图片来源:“Microsoft Coco:上下文数据集中的通用对象”,https://cocodataset.org
多人姿势估计算法可以估计图像中的许多姿势/人物。它比单姿态算法更复杂并且速度稍慢,但它的优点是,如果图片中出现多个人,他们检测到的关键点不太可能与错误的姿势相关联。出于这个原因,即使应用场景是检测单人姿势,该算法也可能更合乎需要。
此外,该算法的一个吸引人的特性是性能不受输入图像中人数的影响。无论是15人还是5人,计算时间都是一样的。
让我们看看输入:
查看这些参数有什么效果的最好方法是尝试使用这个多姿态估计的示例:https://storage.googleapis.com/tfjs-models/demos/posenet/camera.html。
让我们看一下输出:
下面这段简单的代码块展现了如何使用多姿态估计算法:
const imageScaleFactor = 0.50;
const flipHorizontal = false;
const outputStride = 16;
// get up to 5 poses
const maxPoseDetections = 5;
// minimum confidence of the root part of a pose
const scoreThreshold = 0.5;
// minimum distance in pixels between the root parts of poses
const nmsRadius = 20;
const imageElement = document.getElementById('cat');
// load posenet
const net = await posenet.load();
const poses = await net.estimateMultiplePoses(
imageElement, imageScaleFactor, flipHorizontal, outputStride,
maxPoseDetections, scoreThreshold, nmsRadius);
姿势数组输出的样例如下所示:
// array of poses/persons
[
{ // pose #1
"score": 0.42985695206067,
"keypoints": [
{ // nose
"position": {
"x": 126.09371757507,
"y": 97.861720561981
},
"score": 0.99710708856583
},
...
]
},
{ // pose #2
"score": 0.13461434583673,
"keypositions": [
{ // nose
"position": {
"x": 116.58444058895,
"y": 99.772533416748
},
"score": 0.9978438615799
},
...
]
},
...
]
读到这儿,您就获得了足够的知识理解PoseNet示例。 如果您想了解更多关于该模型和实施的技术细节,请阅读原文:https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5 ,里面附录了更多的技术细节。