资源技术动态浏览器中的姿态检测:PoseNet 模型(附代码)

浏览器中的姿态检测:PoseNet 模型(附代码)

2019-09-30 | |  89 |   0

原标题:浏览器中的姿态检测:PoseNet 模型(附代码)      

来源:搜狐网       链接:http://www.sohu.com/a/239569259_717210

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


1064c328fb6a416d83f0f3797aad109d.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 使用,如下:

<src="https://unpkg.com/@tensorflow/tfjs"></>

<src="https://unpkg.com/@tensorflow-models/posenet"></>

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

npminstall@tensorflow-models/posenet


使用

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


关键点

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

ad7838e35d4344d6953399e485deccd7.jpeg


加载预先训练的 PoseNet 模型


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

constnet = awaitposenet.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 人的右膝盖有可能被算法认为属于同一个人。

constpose = awaitposeNet.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索引的关键点数组,每一个关键点都有一个分值和一个位置信息。


应用范例


通过脚本标记

03.jpeg

通过 NPM


04.jpeg

产生输出:


05.jpeg

多重姿势检测


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

constposes = awaitnet.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 索引的关键点,每一个关键点都有一个分值和位置信息。


通过脚本标记

06.jpeg


通过 NPM


07.jpeg

输出:


08.jpeg


开发 Demo


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


关于作者


这段代码归 Google 所有。

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

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:ECCV 2018丨YOLO遇上OpenPose,近200FPS的高帧数多人姿态检测

下一篇:计算机视觉五大技术:图像分类、对象检测、目标跟踪、语义分割和实例分割

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...