浏览器中的姿态检测:PoseNet 模型

概述

这里附上 Youtube 上这段视频的源代码,作者是 Siraj Raval:https://youtu.be/9KqNk5keyCc

这个资源包括一个称作 PoseNet 的独立模型,一些 Demo,可在浏览器上使用 TensorFlow.js 实时运行人体姿态检测。

点击这里运行 Demo!https://storage.googleapis.com/tfjs-models/demos/posenet/camera.html

PoseNet 可以用于检测单个或多个姿势,意味着有一个版本的算法可以检测一幅图像或视频中的单个人,而另一个版本的算法可以检测视频或图像中的多个人。

参考这篇博客(https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5),可以了解 PoseNet 在 Tensorflow.js 运行的更高层级的描述。

为追踪问题,我们使用 tensorflow/tfjs Github repo。

安装

你可以将其作为独立的 ES5 使用,如下:

或者,在 TypeScript/ES6 项目中使用时,可以通过 npm 安装。

npm install @tensorflow-models/posenet

使用

我们的多姿势检测可以从一副图像中检测出每个姿势。每种方法都有自己的算法和参数集。

关键点

所有的关键点都用部位 ID 标记,每个部位和对应的 ID 如下:

加载预先训练的 PoseNet 模型

在姿势检测的第一步,将一幅图像输入预先训练过的模型。PoseNet 有一些不同版本的模型,每一个版本都对应一个拥有特定乘数的 MobileNet v1 架构。 在通过模型提供图像时,输出的期望步幅。必须是32、16、8。默认为16。数字越高,速度越快,准确度越低,反之亦然。

const net = await posenet.load(multiplier);

输入

multiplier - 可选的值是: 1.01, 1.0, 0.75, 或者 0.50。默认选择 1.01。乘数是所有卷积操作的深度(通道数)。这个值对应于MobileNet 架构和检查点。值越大,每层的规模越大。牺牲速度的情况下模型精度越高。将这个值设置小,可以提高模型运行速度而牺牲准确性。

默认情况下, PoseNet 加载模型时使用乘数 1.01 。拥有超强 GPU 的计算机建议采用该值。如果计算机拥有中等或低端 GPU,建议乘数采用0.75。移动设备建议使用0.5。

单人姿势检测

单人姿势检测是两种算法中最简单也是运行最快的。理想的使用场景是图像中只有一个人的情况。缺点是,如果图片中有多个人时,来自不同的人的关键点有可能会被检测为一个人的。例如,1# 人的左胳膊和 #2 人的右膝盖有可能被算法认为属于同一个人。

const pose = await poseNet.estimateSinglePose(image, imageScaleFactor, flipHorizontal, outputStride);

输入

image- ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement 输入网络中的图像

imageScaleFactor- 数值范围 0.2 到 1.0,默认 0.50。用于在图像输入网络前调整图像比例。这个值设置得越小将会缩小图像,增加速度,但是会牺牲准确性。

flipHorizontal- 默认为 False。 如果姿势应该进行水平的翻转/镜像 。对于视频默认水平翻转的视频(比如网络摄像头),如果你希望姿势回到原来正确的方向,改参数设置为 True。

outputStride- 在通过模型提供图像时,输出的期望步幅。必须是32、16、8。默认为16。数字越高,速度越快,准确度越低,反之亦然。

返回值

它返回一个带有信心值的姿势和一个由部位id索引的关键点数组,每一个关键点都有一个分值和一个位置信息。

应用范例

通过脚本标记

通过 NPM

产生输出:

多重姿势检测

多重姿态检测可以解码图像中的多个姿势。比单个姿势检测算法复杂得多,并且运行速度稍慢,但却在图像中有多人的情况下很有优势,检测到的关键点不太可能与错误的姿势相关联。即使用于检测单个人的姿势, 这种算法也可能更可取。因为当多个人出现在图像中时,两个姿势被连接在一起的意外就不会发生。 它使用快速贪婪解码算法,这个算法来自于 PersonLab 的研究论文:使用 Bottom-Up、Part-Based 和 Geometric Embedding 模型的人体姿势检测和实例分割。

const poses = await net.estimateMultiplePoses(image, imageScaleFactor, flipHorizontal, outputStride, maxPoseDetections, scoreThreshold, nmsRadius);

输入

image- ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement  输入网络中的图像

imageScaleFactor-  数值范围 0.2 到 1.0,默认 0.50。用于在图像输入网络前调整图像比例。这个值设置的越小将会缩小图像比例,增加速度,但是会牺牲准确性。

flipHorizontal-  默认为 False。 如果姿势应该进行水平的翻转/镜像 。对于视频默认水平翻转的视频(比如网络摄像头),如果你希望姿势回到原来正确的方向,改参数设置为 True。

outputStride-  在通过模型提供图像时,输出的期望步幅。必须是 32、16、8。默认为 16。数字越高,性能越快,准确度越低,反之亦然。

maxPoseDetections(可选项) - 最大可检测姿势数量,默认 5。

scoreThreshold(可选项)   -  只返回根部位得分大于或等于这个值的检测实例。默认为 0.5。

nmsRadius(可选项)   -  Non-maximum 抑制部位距离。它必须为正。如果两个部位距离小于 nmsRadius 像素,就会相互抑制。默认为 20。

返回值

它的返回值由姿势数组构成,每个姿势包括一个信心值和一组由部位 ID 索引的关键点,每一个关键点都有一个分值和位置信息。

通过脚本标记

通过 NPM

输出:

开发 Demo

Demo 的运行细节包含在 demos/文件夹。

关于作者

这段代码归 Google 所有。

博客原址:https://github.com/llSourcell/pose_estimation

雷锋网雷锋网

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180710C1V8NF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券