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

预备知识

时信魔方的客户端使用 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. Private jre vs Public jre

    今天说一下java环境构建中,jre相关的小知识点. private jre:一般是C:\Program Files\jdk1.8.0\jre,必须安装,它为jdk的运行提供必需的环境. public ...

  2. git单人本地操作

    git配置个人信息 git config --global user.name "用户名" git config --global user.email "邮箱" ...

  3. 每日CSS_霓虹灯按钮悬停效果

    每日CSS_霓虹灯按钮悬停效果 2020_12_20 1. 代码解析 1.1 html 代码片段解析 <a href="#"> <span></spa ...

  4. B. Navigation System【CF 1320】

    传送门 题目:简单理解就是,我们需要开车从s点到t点.车上有一个导航,如果当前点为x,则导航会自动为你提供一条从x到t的最短的路线(如果有多条,则随机选一条),每走到下一个点则会实时更新最短路线,当然 ...

  5. fiddler抓APP的https接口

    吐槽一下,fiddler这工具很蛋疼,用的时候很好用,出bug的时候死活抓不了: ①为了少踩坑,我们在官网下最新的fiddler,官网:Fiddler - Free Web Debugging Pro ...

  6. SpringBoot进阶教程(六十八)Sentinel实现限流降级

    前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Senti ...

  7. Code Review 最佳实践

    ref: Code review Best Practices 文章将了以下内容: 3w:why.what.when 进行 code review code review 之前的准备 执行 code ...

  8. 学习 Gin 问题总结 2020.12.29

    学习 Gin 问题总结 2020.12.29 数据绑定与解析 BindXXX,ShouldBindXXX和ShouldBindWith区别 BindXXX 会自动返回信息,输入无效时,在header写 ...

  9. C语言测一个浮点数的位数长度

    测浮点数的位数牵扯到一个精度的问题,用普通的测整形数值的方法不能实现,于是我自己写了一个测浮点数的函数. #include <stdio.h> //for printf int lengt ...

  10. Spring Cloud是什么鬼?

    研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...