抖音粉丝群1
『7x24小时有问必答』
加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!
同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注  极市平台  公众号  ,回复  加群,立刻申请入群~

来源:OpenCV学堂@微信公众号

最近,Google官方推出了使用TensorFlow.js的人体图像分割工具BodyPix 2.0,对该工具进行了一次重大升级,加入多人支持,并提高了准确率。

1.gif

BodyPix能将图像分割为属于人的和不属于人的像素,属于人的部分可以进一步分类为二十四个身体部位之一。

BodyPix可以直接在浏览器中运行,开发者只需加入几行代码,即可与电脑或手机的摄像头配合使用。

在使用默认设置的情况下,BodyPix可以在15寸MacBook Pro上以25 fps的速度估计,并渲染人和身体部位的分割。而在iPhone X上,BodyPix能以21 fps的速度进行估计。

2.gif

BodyPix于今年2月推出,本次2.0版的主要更新有:对多人图像的支持、增加基于ResNet-50的模型、新的API、权重量化以及对不同尺寸图像的支持。

功能演示

在项目的GitHub主页上,TensorFlow给出了BodyPix 2.0软件的一些基本用法演示,还有网页版Demo供用户体验。

人像分割

对于给定具有一个或多个人的图像,人像分割可预测所有人的分割。segmentPerson返回PersonSegmentation,对应于图像中人物分割的对象。

3.jpeg

segmentPerson默认不会在不同的个人之间消歧义。因此如果您需要对不同的人进行区分,请使用segmentMultiPerson,不过引入此方法会导致运行速度变慢。

以上结果返回的是一组0和1的数组,用于表示该像素点是否属于人。

身体部位细分

BodyPix的  segmentPersonParts  方法可以预测所有人的24个身体部位分割。

4.jpeg

PartSegmentation会所有合并的人,返回值是每个像素与身体部位相对应的编码。同样的,如果需要区分多人,请使用segmentMultiPersonParts。

身体不同部位对应的编码如下表所示:
5.jpeg

把结果输出到图像上

BodyPix还包含其他实用程序功能,可以将输出结果与原始图像合成,得到你所需的渲染图像。

bodyPix.toMask  可以给人和背景加上一层蒙版,指定渲染像素的颜色和不透明度。

6.jpeg

bodyPix.toColoredPartMask 可以给人体部位分割加上一个24色的颜色数组,每个身体部位都对应着数组中的一个颜色。

7.jpeg

以上是BodyPix的基础功能的用法。

既然BodyPix可以区分出人体和背景 ,我们就可以用它实现实时的背景虚化,调用的API方法是bodyPix.drawBokehEffect

8.gif

利用BodyPix识别出身体不同部位的功能,可以调用  bodyPix.blurBodyPart  给人脸打上马赛克。

9.jpeg

此外还有更多的图像绘制API,在此就不一一列举了。

安装方法

BodyPix使用非常简便,用户可以将其与脚本标签一起嵌入HTML使用:

<html>      

      <body>  

                <!--  Load  TensorFlow.js  -->  

                &lt;script  src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.3"&gt;<!--script-->  

                <!--  Load  BodyPix  -->

                &lt;script  src="https://cdn.jsdelivr.net/npm/@tensorflow-models/body-pix"&gt;<!--script-->  

                        bodypix.load().then(function(net)  {

                                //  BodyPix  model  loaded

                        });

                <!--script-->

        <!--body-->

<!--html-->

或者通过npm方式安装:

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运行更快

BodyPix带有不同尺寸的模型,具有不同的性能。通过设定模型的大小和输出步长,可以在运行速度和准确性之间进行权衡。

默认情况下,BodyPix加载的是0.75倍的MobileNetV1架构,适合中低端GPU的计算机使用,而导入0.50倍的模型可以用于移动设备。

const  net  =  await  bodyPix.load({

    architecture:  'MobileNetV1',

    outputStride:  16,

    multiplier:  0.75,

    quantBytes:  2

});

倍率的数值越大,神经网络中层的尺寸也越大,准确率更高、推理速度更慢。不同倍率模型的性能对比如下:

10.jpeg

对于具有更强大GPU的计算机,官方建议使用ResNet架构,这一部分也是2.0版加入的新功能。

const  net  =  await  bodyPix.load({

    architecture:  'ResNet50',

    outputStride:  32,

    quantBytes:  2

});

原理简介

BodyPix的核心是执行人体分割的算法,对输入图像的每个像素执行二进制决策,以估计该像素是否属于某个人。

图像通过MobileNet网络馈送,并且使用S型激活函数将输出转换为0到1之间的值。

11.jpeg
为了估计身体部位的分割,BodyPix使用相同的MobileNet表示,但是这次通过预测额外的24个通道输出张量P来重复上述过程,其中二十四是身体部位的数量。每个通道编码身体某部位是否存在的概率。

输出张量P中有24个通道,因此需要在24个通道中找到最佳部分。在推断期间,对于输出身体部位张量P的每个像素位置(u,v),body_part_id使用以下公式选择属于第i个部位概率最高的像素:
12.png

这将产生一个二维图像,每个像素都包含一个整数,该整数表示该像素属于哪个身体部位。通过将值设置为-1,可以把不属于人体的部分剔除掉。

13.jpeg

传送门

试玩Demo:

https://storage.googleapis.com/tfjs-models/demos/body-pix/index.html

官方博客:

https://blog.tensorflow.org/2019/11/updated-bodypix-2.html

GitHub地址:

https://github.com/tensorflow/tfjs-models/tree/master/body-pix

-End-

---

图像分割交流群

添加极市小助手微信(ID : cv-mart)备注:研究方向-姓名-学校/公司-城市(如:目标检测-小极-北大-深圳)即可进群。(已经添加小助手的好友直接私信)

△长按添加极市小助手

其他方向如目标检测、目标跟踪、人脸、工业检测、医学影像、三维&SLAM、超分辨率、姿态估计、嵌入式视觉、OCR 等,也可扫码添加极市小助手拉你进群,更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流,一起来让思想之光照的更远吧~
△长按关注极市平台

觉得有用麻烦给个在看啦~   

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码