200余行代码,让你实时从视频中隐身
点击上方蓝色“程序猿DD”,选择“设为星标”
回复“资源”获取独家整理的学习资料!
来源 | 机器之心
只需网页端,秒速消失不留痕。
Jason Mayes 是一名在谷歌工作的资深网页工程师,他长期致力于运用新兴技术提供物联网解决方案。近日,充满奇思妙想的 Mayes 又使用 TensorFlow.js 制作了一个仅用 200 余行代码的项目,名为 Real-Time-Person-Removal。它能够实时将复杂背景中的人像消除,而且仅基于网页端。
现在,Mayes 在 GitHub 上开源了他的代码,并在 Codepen.io 上提供了演示 Demo。从视频中看到,你现在只需要一台能上网的电脑和一个网络摄像头就能体验它。
项目地址:github.com/jasonmayes/Real-Time-Person-Removal
Demo 地址:codepen.io/jasonmayes/pen/GRJqgma
目前,该项目异常火热,在 Github 上已经获得了 3.4k 的 Star 量。
实时隐身不留痕项目作者:Jason Mayes
我们先来看一下运行的效果。下图中,上半部分是原始视频,下半部分是使用 TensorFlow.js 对人像进行消除后的视频。可以看到,除了偶尔会在边缘处留有残影之外,整体效果还是很不错的。
为了展现这个程序在复杂背景下消除人像并重建背景的能力,Mayes 特意在床上放了一台正在播放视频的笔记本电脑。当他的身体遮挡住笔记本电脑时,可以看到消除算法暂停在电脑被遮挡前的播放画面,并能在人移开时迅速地重建出当前画面。
此外,Mayes 还在 Codepen.io 上提供了能够直接运行的示例。只需要点击 Enable Webcam,离开摄像头一段距离确保算法能够较全面的收集到背景图像,之后当你再出现在摄像头前时就能从下方的预览窗口看到「隐形」后的画面了。
网友表示有了这个程序,像之前 BBC 直播中孩子闯进门来那样的大型翻车现场就有救了。
项目运行机制
Mayes 开发的这个人像消除程序背后的运行机制十分简单,他使用了 TensorFlow.js 中提供的一个预训练的 MobileNet,用于人像分割。
const bodyPixProperties = {architecture: 'MobileNetV1',outputStride: 16,multiplier: 0.75,quantBytes: 4
};
TensorFlow.js 提供的部分计算机视觉预训练模型。
MobileNet 是谷歌在 2017 年针对移动端和嵌入式设备提出的网络,针对图像分割。其核心思想是使用深度可分离卷积构建快速轻量化的网络架构。Mayes 选择使用它的原因也是出于其轻量化的原因,假如使用 YOLO 或者 Fast-RCNN 这类物体检测算法的话,在移动端就很难做到实时性。
通过 MobileNet 的输出获得检测到人物像素的边界框。
// Go through pixels and figure out bounding box of body pixels.for (let x = 0; x < canvas.width; x++) {for (let y = 0; y < canvas.height; y++) {let n = y * canvas.width + x;// Human pixel found. Update bounds.if (segmentation.data[n] !== 0) {if(x < minX) {minX = x;}if(y < minY) {minY = y;}if(x > maxX) {maxX = x;}if(y > maxY) {maxY = y;}foundBody = true;}} }
为避免人物没有被检测完全的现象,这里使用变量额 scale 对检测区域进行适当放缩。这个 1.3 的参数是测试出来的,感兴趣的读者可以调整试试看。
// Calculate dimensions of bounding box.var width = maxX - minX;var height = maxY - minY;// Define scale factor to use to allow for false negatives around this region.var scale = 1.3;// Define scaled dimensions.var newWidth = width * scale;var newHeight = height * scale;// Caculate the offset to place new bounding box so scaled from center of current bounding box.var offsetX = (newWidth - width) / 2;var offsetY = (newHeight - height) / 2;var newXMin = minX - offsetX;var newYMin = minY - offsetY;
之后对人物 bounding box 之外的区域进行更新,并且当检测到人物移动时,更新背景区域。
// Now loop through update backgound understanding with new data// if not inside a bounding box.for (let x = 0; x < canvas.width; x++) {for (let y = 0; y < canvas.height; y++) {// If outside bounding box and we found a body, update background.if (foundBody && (x < newXMin || x > newXMin + newWidth) || ( y < newYMin || y > newYMin + newHeight)) {// Convert xy co-ords to array offset.let n = y * canvas.width + x;data[n * 4] = dataL[n * 4];data[n * 4 + 1] = dataL[n * 4 + 1];data[n * 4 + 2] = dataL[n * 4 + 2];data[n * 4 + 3] = 255; } else if (!foundBody) {// No body found at all, update all pixels.let n = y * canvas.width + x;data[n * 4] = dataL[n * 4];data[n * 4 + 1] = dataL[n * 4 + 1];data[n * 4 + 2] = dataL[n * 4 + 2];data[n * 4 + 3] = 255; }}}ctx.putImageData(imageData, 0, 0);if (DEBUG) {ctx.strokeStyle = "#00FF00"ctx.beginPath();ctx.rect(newXMin, newYMin, newWidth, newHeight);ctx.stroke();}
}
至此为算法的核心部分,用了这个程序,你也可以像灭霸一样弹一个响指(单击一下鼠标)让人凭空消失。
热门的「视频隐身术」
其实,这并非机器之心报道的第一个消除视频中人像的项目。
2019 年,我们也曾报道过「video-object-removal」项目。在此项目中,只要画个边界框,模型就能自动追踪边界框内的物体,并在视频中隐藏它。
项目地址:github.com/zllrunning/video-object-removal
但从项目效果来看,也会有一些瑕疵,例如去掉了行人后,背景内的车道线对不齐等。
与 Mayes 的这个项目类似,video-object-removal 主要借鉴了 SiamMask 与 Deep Video Inpainting,它们都来自 CVPR 2019 的研究。通过 SiamMask 追踪视频中的目标,并将 Mask 传递给 Deep Video Inpainting,然后模型就能重建图像,完成最终的修复了。
对此类技术感兴趣的读者可自行运行下这两个项目,做下对比。
往期推荐
为什么SpringBoot的 jar 可以直接运行?
改变世界的十大算法
GitHub 私有仓库完全免费面向团队提供
2020年最新Java面试题免费下载!
8000 字服务端高并发分布式架构 14 次演进之路
扫一扫,关注我
一起学习,一起进步
200余行代码,让你实时从视频中隐身相关推荐
- Github 3.4k星,200余行代码,让你实时从视频中隐身
项目作者 | Jason Mayes 转自 | 机器之心 参与 | Oblivion Max.思 只需网页端,秒速消失不留痕. Jason Mayes 是一名在谷歌工作的资深网页工程师,他长期致 ...
- 几行代码起家到实时音视频一线,6 岁声网计划赴美上市!
从硅谷一个车库的几行代码开始到国内实时音视频第一梯队的位置,从个位数成长到超 200 人的研发团队,云通信服务商声网Agora.io仅用了 6 年的时间将实时通信技术推向了全球. 如今,在疫情的&qu ...
- python爬虫实战:利用scrapy,短短50行代码下载整站短视频
近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...
- 利用scrapy,短短50行代码下载整站短视频
一.撕开爬虫的面纱--爬虫是什么,它能做什么 爬虫是什么 爬虫就是一段能够从互联网上高效获取数据的程序. 我们每天都在从互联网上获取数据.当打开浏览器访问百度的时候,我们就从百度的服务器获取数据,当拿 ...
- 40行代码教你爬遍小视频网站
/1 前言/ 还在为在线看小视频缓存慢发愁吗?还在为想重新回味优秀作品但找不到资源而忧虑吗?莫要慌,让python来帮你解决,40行代码教你爬遍小视频网站,先批量下载后仔细观看,岂不美哉! /2 整理 ...
- 聊聊实时音视频中的技术难点:回声消除+噪声消除
文 | 菊风媒体引擎资深研究团队 在各个实时音视频互动场景中,回声和噪声对于影响用户体验而言都是很大的问题.音视频正在发展成为互联网线上沟通的必然趋势,在自然的交流环境中,回声和噪声是非常影响沟通体验 ...
- 聊聊语音聊天室app源码实时音视频中的技术难点:回声消除+噪声消除
聊聊语音聊天室app源码实时音视频中的技术难点:回声消除+噪声消除 在聊聊语音聊天室app源码各个实时音视频互动场景中,回声和噪声对于影响用户体验而言都是很大的问题.音视频正在发展成为互联网线上沟通的 ...
- Vue 团队公开快如闪电的全新脚手架工具,未来将替代 Vue-CLI,才300余行代码,学它!...
1. 前言 大家好,我是若川.欢迎关注我的公众号若川视野源码共读活动ruochuan12 想学源码,极力推荐之前我写的<学习源码整体架构系列>jQuery.underscore.lodas ...
- 对信用卡欺诈 Say No|百行代码实现简化版实时欺诈检测
进入互联网时代,你的绝大部分操作都可以在网上进行,极大的方便了我们的生活.但是信用卡盗刷者也可以利用网络来诈骗,典型的做法是:诈骗者首先入侵安全级别较低系统来盗窃信用卡卡号,用盗得的信用卡进行很小额度 ...
最新文章
- java 打包apk_Android APK打包流程
- virtualbox 创建桥接网络_Windows 10下的Virtualbox中的桥接网络不起作用
- android使用Activity
- Linux环境安装并配置Maven
- CREO - 基础2 - 如何让装配好的零件重新装配
- Windows新建一个新的磁盘空间:
- mysql 电商实战_电商项目测试实战(一)
- VS对.ini文件的操作
- 微软希望通过监控开发者结束软件 bug
- C#的解题思路(1):不重复随机数的产生问题
- 2016计算机二级考试c语言真题及答案,计算机二级考试c语言真题_2017计算机二级考试C语言复习题及答案...
- yii2 restful的自定义api
- PTA 7-7 新年倒计时
- 【机器学习理论】换底公式--以e,2,10为底的对数关系转化
- PT_基本概率公式(减法/加法/乘法/除法(条件概率)/全概率/贝叶斯)@条件概率链式法则@乘法法则
- 《规范》前端编码规范
- 免费的小程序微商城系统它不香吗?
- ChatGPT 大智近妖,从宇宙人生到手搓光刻机,从哄女朋友到写年终总结我们聊得非常开心,反而让人越来越忧心...
- hiho一下 第三周---KMP算法
- 2天赚了4个W,手把手教你用Threejs搭建一个Web3D汽车展厅 | 大帅老猿threejs特训
热门文章
- IntelliJ idea 缓存和索引 清理方法
- 操作系统识别工具 xprobe2 p0f 简介
- clion pycharm 报错 bash: line 0: cd: /xxx: No such file or directory
- docker 占用磁盘空间清理 无用数据卷删除
- python3 RSA加解密
- 内核模式下的注册表操作
- Linux下逻辑地址-线性地址-物理地址图解
- 良性代码,恶意利用:浅谈 Return-Oriented 攻击
- java 构造器 血药主题_java中的构造器
- NeHe教程Qt实现——lesson09