54

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

 5 years ago
source link: https://www.leiphone.com/news/201807/FDcIIp81d5ih7Gve.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

雷锋网按:本文为雷锋字幕组编译的技术博客,原标题 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

Jvm6fuJ.gif

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 如下:

eeIJv2f.jpg!web

加载预先训练的 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索引的关键点数组,每一个关键点都有一个分值和一个位置信息。

应用范例 

通过脚本标记

2yuUVrM.jpg!web

通过 NPM

a6zQzmB.jpg!web

产生输出:

VNz6B3Y.jpg!web

多重姿势检测

多重姿态检测可以解码图像中的多个姿势。比单个姿势检测算法复杂得多,并且运行速度稍慢,但却在图像中有多人的情况下很有优势,检测到的关键点不太可能与错误的姿势相关联。即使用于检测单个人的姿势, 这种算法也可能更可取。因为当多个人出现在图像中时,两个姿势被连接在一起的意外就不会发生。 它使用快速贪婪解码算法,这个算法来自于 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 索引的关键点,每一个关键点都有一个分值和位置信息。

通过脚本标记

BV3AjyE.jpg!web

通过 NPM

VvyqQjU.jpg!web

输出:

aeaiiqU.jpg!web

开发 Demo

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

关于作者

这段代码归 Google 所有。

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

iMZvEjA.jpg!web

雷锋网 (公众号:雷锋网) 雷锋网

雷锋网原创文章,未经授权禁止转载。详情见 转载须知


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK