0
本文作者: AI研习社-译站 | 2018-07-10 21:18 |
雷锋网按:本文为雷锋字幕组编译的技术博客,原标题 Pose Detection in the Browser: PoseNet Model,作者为 Siraj Raval 。
翻译 | 赵朋飞 程炜 整理 | 凡江
概述
这里附上 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 使用,如下:
<script src="https://unpkg.com/@tensorflow/tfjs"></script>
<script src="https://unpkg.com/@tensorflow-models/posenet"></script>
或者,在 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
雷锋网雷锋网
雷峰网原创文章,未经授权禁止转载。详情见转载须知。