PanDonglin - BodyPix
type: channel
link: http://16084a.com/index.php/tag/BodyPix/
items: 【学习笔记】人像提取与部位分割 - BodyPix 模型

【学习笔记】人像提取与部位分割 - BodyPix 模型
type: item
date: 2019-03-01T16:00:00+08:00
description: 我们很高兴宣布推出 BodyPix，这是一种开源的机器学习模型，可在浏览器中使用 TensorFlow.js 对人物及身体部位进行分割。默认设置下，该模型可在 2018 版 15 英寸 MacBook Pro 以及 iPhone X 上分别以 25 fps 和 21 fps 的帧率，估测及呈现人物及身体部位的分割。人物分割究竟是什么？在计算机视觉中，图像分割是指将图像中的像素分成几组特定语义区域以确定对象和边界的技术。研究期间，我们训练 BodyPix 模型对人物及 24 个身体部位（如左手、右前小腿或后背等部位）执行此项操作。换言之，BodyPix 可将图像的像素分为以下两类：1) 表示人物的像素和 2) 表示背景的像素。它还可将表示人物的像素进一步分类为 24 个身体部位中的任一个部位。实时演示，点击即可访问：https://storage.googleapis.com/tfjs-models/demos/body-pix/index.html人物分割有何用途？这项技术可广泛应用于多个多领域，包括增强现实、摄影编辑以及图像或视频的艺术效果等。具体应用由您决定！去年，当我们推出 PoseNet（首个能够在浏览器中使用简易网络摄像头估测身体部位（Kinect 的功能）的模型）时，人们便对此项技术设想出各类用例。我们希望 BodyPix 也能用于开展同样的创意实验。为何要在浏览器中执行此操作？与 PoseNet 的情况类似，您过去只能借助专用硬件，或对系统要求严苛且安装难度较高的软件，才能进行实时人物分割。相比之下，您无需执行安装步骤，而仅凭几行代码即可使用 BodyPix 和 PoseNet。使用这些模型时无需任何专用镜头，因为它们能与任何基本的网络摄像头或手机相机配合使用。最后，用户只需打开网址即可访问这些应用。由于所有计算均在设备上完成，因此数据可以保持私密性。鉴于以上所有原因，我们认为，对于艺术家、创意程序员和编程新手而言，BodyPix 是一个可轻松上手的工具。在深入介绍 BodyPix 之前，我们要感谢 Google Research 团队的 Tyler Zhu（此模型的幕后研究员，专攻人体姿势估测）[1，2]、Google Brain 团队工程师 Nikhil Thorat 与 Daniel Smilkov（TensorFlow.js 库的幕后研究员），以及 Daniel Shiffman，同时还要感谢 Google Faculty Research Award 为 Dan Oved 的研究工作提供资助。注：1 链接 https://arxiv.org/abs/1701.017792 链接 https://arxiv.org/abs/1803.08225BodyPix 入门指南让我们深入了解使用此模型时的技术细节。BodyPix 可用于将图像分割为人物像素和非人物像素。人物像素又可进一步分类为 24 个身体部位中的任一部位。重要的是，此模型仅适用于单个人物，因此请确保您的输入数据不包含多个人。导入 TensorFlow.js 和 BodyPix 库让我们回顾一下有关如何建立 BodyPix 项目的基础知识。您可通过 npm install @tensorflow-models/body-pix 安装此库，然后使用 es6 模块将其导入：import * as bodyPix from '@tensorflow-models/body-pix'; async function loadAndUseBodyPix() { const net = await bodyPix.load(); // BodyPix model loaded }您也可通过网页中的软件包将其导入，而无需执行任何安装步骤： bodypix.load().then(function(net) { // BodyPix model loaded }); 人物分割在基础层面，人物分割将图像分割为人物像素和非人物像素。但实际过程并非如此简单，图像在输入模型后会转化为二维图像，其中每个像素处的浮点值均介于 0 到 1 之间，表示该像素中存在人物的概率。我们需设定一个名为“分割阈值”的值，其表示像素分值必须达到此最小值后，方可视作人物的一部分。通过使用分割阈值，这些介于 0 到 1 之间的浮点值会成为二进制数值 0 或 1（即表示，若阈值为 0.5 ，则任何高于 0.5 的值均会变为 1，而低于 0.5 的值则变为 0）。我们调用 API 方法 estimatePersonSegmentation 对图像或视频执行人物分割操作；下方简短的代码块展示了如何使用此方法：const imageElement = document.getElementById('i…