视频画面中实现人脸遮挡教程 - 基于 TensorFlow 实现
在进行视频通话时,我们往往需要对画面进行一些实时分析,例如识别画面里的人、车、动物等等。这节里我们将使用时信魔方的人脸监视模块实现人脸被手部遮挡的检测,如下图所示效果:

预备知识
时信魔方的客户端使用 TensorFlow 作为机器学习引擎,服务器端使用 DJL 。本节我们的示例程序主要是演示客户端的人脸检测,使用 FaceMonitor 模块完成自动模型加载和画面实时预测,整个过程由 FaceMonitor 自动完成,对于开发者来说不需要知道如何使用 TensorFlow 来进行机器学习,做到 开箱即用 。
程序界面
首先我们需要选择一个可用的摄像机,用摄像机采集实时的人像。为了提示我们的脸部是否被手部遮挡,我们设计一个指示灯在工具栏的最右侧。
然后我们在页面中心显示实时人像画面。最后为了方便观察系统的数据,我们在画面下方设计一个日志显示容器。界面结构如下图所示:

准备工作
我们使用 MediaDeviceTool 媒体设备工具来枚举可用的摄像机设备。
JavaScript 代码:
MediaDeviceTool.enumDevices(function(devices) {
var html = [];
devices.forEach(function(desc) {
if (desc.isVideo()) {
videoDevices[desc.getDeviceId()] = desc;
var c = ['<option id="', desc.getDeviceId(), '">', desc.getLabel(), '</option>'];
html.push(c.join(''));
}
});
if (html.length > 0) {
deviceSelect.innerHTML = html.join('');
}
else {
deviceSelect.innerHTML = '<option>未检测到可用设备</option>';
}
});
对于 FaceMonitor 模块来说,我们需要监听的事件是 Touched 事件:
JavaScript 代码:
// 获取 FaceMonitor 模块
const monitor = cube.getModule('FaceMonitor');
// 监听 Touched 事件
monitor.on(FaceMonitorEvent.Touched, onTouched);
在 Touched 事件里,我们通过改变状态灯的颜色来表示脸部是否被手遮挡。
设置视频显示元素
在启动程序前,我们需要将界面上的 video 标签元素及其容器元素设置给 FaceMonitor 以便当摄像头画面加载到 video 标签后 FaceMonitor 自动开始对画面进行人脸检测。
JavaScript 代码:
monitor.setup(videoContainer, cameraVideo);
启动程序
与之前启动 Cube 的流程一样,我们通过调用 start() 方法来启动时信魔方,启动成功后在启动 FaceMonitor 模块。
JavaScript 代码:
monitor.start();
我们使用 MediaDeviceTool.getUserMedia() 来启动摄像机,在成功启动摄像机之后,使用 MediaDeviceTool.bindVideoStream() 把摄像机的流数据传递给 video 标签。
JavaScript 代码:
MediaDeviceTool.getUserMedia({
video: {
width: { exact: 640 },
deviceId: videoDevice.getDeviceId(),
groupId: videoDevice.getGroupId()
}
}, function(stream) {
videoStream = stream;
MediaDeviceTool.bindVideoStream(cameraVideo, stream);
}, function(error) {
appendLog('获取视频数据失败 ' + error);
});
启动之后在视频区域就能看到摄像机的拍摄画面,你可以尝试用手来遮挡脸部观察指示灯的颜色变化。就向本例中第一幅图那样,当检测到脸部被手遮挡时会触发 Touched 事件。
在整个过程中,你只需要设置好参数,并启动模块,之后 FaceMonitor 会自动加载模型并执行画面实时检测。检测结果通过事件方式告诉应用程序,几行代码即可完成!
工作原理
如前所述我们使用 TensorFlow 来加载 BodyPix 的模型对人体的各个部分进行识别。
针对视频通话的场景,FaceMonitor 调整了部分参数来加快人体识别,例如仅让 BodyPix 识别一个人而不是多个人来降低运算量从而获得较好的实时处理帧率等等。
在检测到人脸之后,通过计算鼻子、左脸、右脸和手部的重叠像素来判断手部是否遮挡脸部,因为是实时计算,每一次的计算值没有足够的信息量来支持结果,因此对 FaceMonitor 每一次采样之后的识别数据进行累加,通过累加得分与我们期望的阀值得分进行比较从而判断是否是有效遮挡。
处理摄像头和麦克风调用权限
首次运行程序时,浏览器会提示你是否允许程序调用你的摄像头和麦克风,这时需要你选择允许,以便程序能顺利获取到视频流和音频流。
Chrome 浏览器的媒体设备管理窗口在浏览器地址栏右侧:

Firefox 浏览器的媒体设备管理窗口在地址栏左侧:

作者:徐江威
日期:2021年1月15日
邮箱:xujiangwei@spap.com, hermit86@163.com
视频画面中实现人脸遮挡教程 - 基于 TensorFlow 实现的更多相关文章
- 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(二)
前言 已完成数据预处理工作,具体参照: 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一) 设置配置文件 新建目录face_faster_rcn ...
- 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)
前言 大家应该都知道几个很常见的例子,比如在张学友的演唱会,在安检通道检票时,通过人像识别系统成功识别捉了好多在逃人员,被称为逃犯克星:人行横道不遵守交通规则闯红灯的路人被人脸识别系统抓拍放在大屏上以 ...
- 基于TensorFlow的深度学习系列教程 2——常量Constant
前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图.本篇则着重介绍和整理下Constant相关的内容. 基于TensorFlow的深度学习系列教程 1--Hell ...
- OpenCV + python 实现人脸检测(基于照片和视频进行检测)
OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...
- 基于TensorFlow的深度学习系列教程 1——Hello World!
最近看到一份不错的深度学习资源--Stanford中的CS20SI:<TensorFlow for Deep Learning Research>,正好跟着学习一下TensorFlow的基 ...
- 基于 TensorFlow 在手机端实现文档检测
作者:冯牮 前言 本文不是神经网络或机器学习的入门教学,而是通过一个真实的产品案例,展示了在手机客户端上运行一个神经网络的关键技术点 在卷积神经网络适用的领域里,已经出现了一些很经典的图像分类网络,比 ...
- FaceRank-人脸打分基于 TensorFlow 的 CNN 模型
FaceRank-人脸打分基于 TensorFlow 的 CNN 模型 隐私 因为隐私问题,训练图片集并不提供,稍微可能会放一些卡通图片. 数据集 130张 128*128 张网络图片,图片名: 1- ...
- ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档]
ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档] 简介 简单地说就是该有的都有了,但是总体跑起来效果还不好. 还在开发中,它工作的效果还不好.但是你可以直 ...
- 基于tensorflow的MNIST手写数字识别(二)--入门篇
http://www.jianshu.com/p/4195577585e6 基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型 基于tensorflow的MNIST手写数字识 ...
随机推荐
- vue 分支结构
分支循环结构 分支循环结构指令 v-if v-else v-else-if v-show v-if 指令 可以直接在元素中添加指令,添加判断的值 最后运行可以得到结果是: v-show v-show ...
- Cloudera Manager API使用
Cloudera Manager提供了很多API供用户进行访问,因此可以利用其提供的API进行大数据集群中各种服务的状态检测.监控以及服务的启停操作. 版本信息 Cloudera Manager 6. ...
- Flink读取resource资源文件
public static ParameterTool getParameterTool(String[] args){ try { return ParameterTool .fromPropert ...
- WP | BUGKU 论剑
题目:bugku Misc论剑 第一步:在winhex里分析 发现文件头有两个 两个jpg文件中间还有一段二进制码 在kali里分离出两个一样jpg图片,但是没有什么发现 二进制码解出来也没有flag ...
- NO.001- 简说 Java 并发编程史
这篇文章是Java并发编程思想系列的第一篇,主要从理解Java并发编程历史的原因和Java并发演进过程两部分,以极简地回溯并发编程的历史,帮助大家从历史这个角度去了解一门语言一个特性的演进.对历史理解 ...
- NET 5 Session、Cookie和Cache的使用
1.Cookie public IConfiguration Configuration { get; } // This method gets called by the runtime. Use ...
- 分布式事务MSDTC使用时,需要的配置
服务器最终配置 DTC服务 组件 防火墙 这里,跟下面的解决方案有点差异,在添加2个规则之后,原本就有分布式相关的规则,也给开启了. 网上的解决办法 在服务里打开 Distributed Transa ...
- .Net MVC Redirect出现:服务器无法在已发送 HTTP 标头之后设置状态解决方案
使用过滤器控制权限时,若无权则跳转到无权页面,但是每次跳转都会出现 ERROR - System.Web.HttpException (0x80004005): 服务器无法在已发送 HTTP 标头之后 ...
- 机器学习-决策树之ID3算法
概述 决策树(Decision Tree)是一种非参数的有监督学习方法,它是一种树形结构,所以叫决策树.它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回 ...
- 实验2 C语言表达式编程应用及输入输出函数( 后附炫彩小人:) )
实验任务一 #include <stdio.h> int main (){ int a=5,b=7,c=100,d,e,f; d=a/b*c; e=a*c/b; f=c/b*a; prin ...