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

预备知识

时信魔方的客户端使用 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 实现的更多相关文章

  1. 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(二)

    前言 已完成数据预处理工作,具体参照: 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一) 设置配置文件 新建目录face_faster_rcn ...

  2. 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)

    前言 大家应该都知道几个很常见的例子,比如在张学友的演唱会,在安检通道检票时,通过人像识别系统成功识别捉了好多在逃人员,被称为逃犯克星:人行横道不遵守交通规则闯红灯的路人被人脸识别系统抓拍放在大屏上以 ...

  3. 基于TensorFlow的深度学习系列教程 2——常量Constant

    前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图.本篇则着重介绍和整理下Constant相关的内容. 基于TensorFlow的深度学习系列教程 1--Hell ...

  4. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  5. 基于TensorFlow的深度学习系列教程 1——Hello World!

    最近看到一份不错的深度学习资源--Stanford中的CS20SI:<TensorFlow for Deep Learning Research>,正好跟着学习一下TensorFlow的基 ...

  6. 基于 TensorFlow 在手机端实现文档检测

    作者:冯牮 前言 本文不是神经网络或机器学习的入门教学,而是通过一个真实的产品案例,展示了在手机客户端上运行一个神经网络的关键技术点 在卷积神经网络适用的领域里,已经出现了一些很经典的图像分类网络,比 ...

  7. FaceRank-人脸打分基于 TensorFlow 的 CNN 模型

    FaceRank-人脸打分基于 TensorFlow 的 CNN 模型 隐私 因为隐私问题,训练图片集并不提供,稍微可能会放一些卡通图片. 数据集 130张 128*128 张网络图片,图片名: 1- ...

  8. ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档]

    ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档] 简介 简单地说就是该有的都有了,但是总体跑起来效果还不好. 还在开发中,它工作的效果还不好.但是你可以直 ...

  9. 基于tensorflow的MNIST手写数字识别(二)--入门篇

    http://www.jianshu.com/p/4195577585e6 基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型 基于tensorflow的MNIST手写数字识 ...

随机推荐

  1. v-once

    v-once 使用了这个指令,那么这个值将只会渲染一次,后续将不会再被更改 初始运行结果: 在控制台中分别修改他们的值: 可以看到使用了v-once指令的插值没有被修改.

  2. 对着爬虫网页HTML学习Python正则表达式re

    1.正则表达式初探 用比较经典的例子,查找一段文本中的手机号码.比如对于文本"我现在用的电话是188-8888-8888,之前那个186-6666-6666已经不用了",我们想获取 ...

  3. 手写算法-python代码实现KNN

    原理解析 KNN-全称K-Nearest Neighbor,最近邻算法,可以做分类任务,也可以做回归任务,KNN是一种简单的机器学习方法,它没有传统意义上训练和学习过程,实现流程如下: 1.在训练数据 ...

  4. C# 多态virtual标记重写 以及EF6 查询性能AsNoTracking

    首先你如果不用baivirtual重写的话,系统默认会为du你加new关键字,他zhi的作用是覆盖,而virtual的关键作用在dao于实现多态 virtual 代表在继承了这个类的子类里面可以使用o ...

  5. [MVC] - Asynchronous操作

    最近在项目里遇到个问题,是在MVC的项目里处理异步操作的,操作流程是这样的: 1.从MVC的一个controller调用一个异步方法: public ActionResult CreateOrUpda ...

  6. 理解Tomcat工作原理

    WEB服务器 只要Web上的Server都叫Web Server,但是大家分工不同,解决的问题也不同,所以根据Web Server提供的功能,每个Web Server的名字也会不一样. 按功能分类,W ...

  7. [leetcode]54. Spiral Matrix二维数组螺旋取数

    import java.util.ArrayList; import java.util.List; /** * Given a matrix of m x n elements (m rows, n ...

  8. spring: 我是如何解决循环依赖的?

    1.由同事抛的一个问题开始 最近项目组的一个同事遇到了一个问题,问我的意见,一下子引起的我的兴趣,因为这个问题我也是第一次遇到.平时自认为对spring循环依赖问题还是比较了解的,直到遇到这个和后面的 ...

  9. Vue 面试题总结

    1. Vue 框架的优点是什么? (1)轻量级框架:只关注视图层,大小只有几十Kb:     (2)简单易学:文档通顺清晰,语法简单:     (3)数据双向绑定,数据视图结构分离,仅需操作数据即可完 ...

  10. 轻松理解UML用例图时序图类图的教程

    摘自https://zhuanlan.zhihu.com/p/29874146 写在前面 当你老大扔给你这样的图,或者你需要完成某些功能而去看文档的时候发现以下类似这样的图会不会不(一)知(脸)所(懵 ...