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

预备知识

时信魔方的客户端使用 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. Java 书单

    Java 基础 <Head First Java> 有人说这本书不适合编程新手阅读?其实本书还是很适合稍微有一点点经验的新手来阅读的,当然也适合我们用来温故 Java 知识点. ps:刚入 ...

  2. 精尽Spring MVC源码分析 - HandlerMapping 组件(二)之 HandlerInterceptor 拦截器

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  3. Linux相关-回顾-文件和目录(98.1.1)

    @ 目录 1.linux下的文件系统 2.用户目录 3.Linux 主要目录速查表 关于作者 1.linux下的文件系统 在 Linux 下,我们是看不到这些驱动器盘符,我们看到的是文件夹(目录): ...

  4. 【命令】ln命令

    这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件或目录在另外一个位置建立一个同步的链接,默认是链接是硬链接,常用参数是 "-s"  . 对于ln命令,这里 ...

  5. easyui框架 jsp页面

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. 超长JVM总结,面试必备

    什么是JVM JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收,堆 和 一个存储方法域.JVM 是运行在操作系统之上的,它与硬件没有直接的交互. ...

  7. js:表单校验(获取元素、事件)

    1.表单校验步骤 (1)确定事件(submit事件),创建一个函数并和该事件绑定. (2)书写函数对输入的数据是否合法进行校验(需要设定ID并通过ID来获取用户输入的数据的值). (3)输入的信息合法 ...

  8. 通过naa在esxi主机上找到物理磁盘的位置

    因为有一块磁盘告警,需要找到这个块磁盘.通过网络搜索就找到了这个shell脚本. 感谢 Jorluis Perales, VxRail TSE 2 shell脚本: # Script to obtai ...

  9. spring boot maven profiles,打包不同的配置文件

    1. 在pom.xml添加 <profiles> <profile> <id>dev</id> <properties> <envir ...

  10. java interface和class中的协变

    协变 Java中的协变是指,当发生继承时,子类中重写父类的方法时,可以返回父类方法返回类型的子类型.比如: class SuperClass{} class SubClass extends Supe ...