项目作者 | Jason Mayes

转自 | 机器之心    参与 | Oblivion Max、思

只需网页端,秒速消失不留痕。

Jason Mayes 是一名在谷歌工作的资深网页工程师,他长期致力于运用新兴技术提供物联网解决方案。近日,充满奇思妙想的 Mayes 又使用 TensorFlow.js 制作了一个仅用 200 余行代码的项目,名为 Real-Time-Person-Removal。它能够实时将复杂背景中的人像消除,而且仅基于网页端。

现在,Mayes 在 GitHub 上开源了他的代码,并在 Codepen.io 上提供了演示 Demo。从视频中看到,你现在只需要一台能上网的电脑和一个网络摄像头就能体验它。

项目地址:https://github.com/jasonmayes/Real-Time-Person-Removal

Demo 地址:https://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」项目。在此项目中,只要画个边界框,模型就能自动追踪边界框内的物体,并在视频中隐藏它。

项目地址:https://github.com/zllrunning/video-object-removal

但从项目效果来看,也会有一些瑕疵,例如去掉了行人后,背景内的车道线对不齐等。

与 Mayes 的这个项目类似,video-object-removal 主要借鉴了 SiamMask 与 Deep Video Inpainting,它们都来自 CVPR 2019 的研究。通过 SiamMask 追踪视频中的目标,并将 Mask 传递给 Deep Video Inpainting,然后模型就能重建图像,完成最终的修复了。

对此类技术感兴趣的读者可自行运行下这两个项目,做下对比。

—完—

Github 3.4k星,200余行代码,让你实时从视频中隐身相关推荐

  1. 200余行代码,让你实时从视频中隐身

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 机器之心 只需网页端,秒速消失不留痕. Jas ...

  2. 几行代码起家到实时音视频一线,6 岁声网计划赴美上市!

    从硅谷一个车库的几行代码开始到国内实时音视频第一梯队的位置,从个位数成长到超 200 人的研发团队,云通信服务商声网Agora.io仅用了 6 年的时间将实时通信技术推向了全球. 如今,在疫情的&qu ...

  3. PyTorch超级资源列表(Github 2.4K星)包罗万象

    PyTorch超级资源列表,包罗万象 PyTorch超级资源列表(Github 2.4K星)包罗万象 -v7.x 1 Pytorch官方工程 2 自然语言处理和语音处理(NLP & Speec ...

  4. python爬虫实战:利用scrapy,短短50行代码下载整站短视频

    近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...

  5. 利用scrapy,短短50行代码下载整站短视频

    一.撕开爬虫的面纱--爬虫是什么,它能做什么 爬虫是什么 爬虫就是一段能够从互联网上高效获取数据的程序. 我们每天都在从互联网上获取数据.当打开浏览器访问百度的时候,我们就从百度的服务器获取数据,当拿 ...

  6. 40行代码教你爬遍小视频网站

    /1 前言/ 还在为在线看小视频缓存慢发愁吗?还在为想重新回味优秀作品但找不到资源而忧虑吗?莫要慌,让python来帮你解决,40行代码教你爬遍小视频网站,先批量下载后仔细观看,岂不美哉! /2 整理 ...

  7. Vue 团队公开快如闪电的全新脚手架工具,未来将替代 Vue-CLI,才300余行代码,学它!...

    1. 前言 大家好,我是若川.欢迎关注我的公众号若川视野源码共读活动ruochuan12 想学源码,极力推荐之前我写的<学习源码整体架构系列>jQuery.underscore.lodas ...

  8. paddlepaddle测试安装_PaddlePaddle升级解读 | 十余行代码完成迁移学习,PaddleHub实战篇...

    迁移学习 (Transfer Learning) 是属于深度学习的一个子研究领域,该研究领域的目标在于利用数据.任务.或模型之间的相似性,将在旧领域学习过的知识,迁移应用于新领域中.迁移学习吸引了很多 ...

  9. resnet50代码_十余行代码完成迁移学习,百度PaddleHub实战解读

    机器之心专栏 来源:百度 PaddlePaddle 迁移学习 (Transfer Learning) 是属于深度学习的一个子研究领域,该研究领域的目标在于利用数据.任务.或模型之间的相似性,将在旧领域 ...

最新文章

  1. java aio_java中的AIO
  2. STARTUP报错:ORA-00205: error in identifying control file, check alert log for more info
  3. 前沿视频教室——《C#图解教程》是本好书,强烈推荐!
  4. SpringBoot+Vue整合WebSocket实现前后端消息推送
  5. C++加号运算符重载
  6. C# 观察文件的更改
  7. java进阶之注解篇
  8. android王者调不了界面,王者荣耀登录界面怎么改?登录界面更改教程[多图]
  9. linux内网安装git,一键安装GitLab7在RHEL6.4上
  10. GitLab 发布安全修复版本:11.9.4, 11.8.6 和 11.7.10
  11. java统计中英文字数 Java问题通用解决代码
  12. 计算机桌面无法中英文切换,输入法无法切换到中文怎么办_输入法失效只能打英文的解决方法...
  13. 如何正确的使用 Service?
  14. MSSQL Server 2008 - express 版 安装 企业管理器Management Studio
  15. 评论区抽奖程序2.0
  16. 二叉树面试题:前中序求后序、中后序求前序
  17. 阿西莫夫 - 神们自己(2015年6月23日)
  18. 完美二叉树、完全二叉树、完满二叉树
  19. 【探花交友DAY 12 完结】推荐系统
  20. Raft算法在Curve中的实践

热门文章

  1. 【ACM】杭电OJ 2063
  2. input不管用 vue_Vue自定义指令实现快速读取Excel
  3. Meta 发布 Bean Machine 帮助衡量 AI 模型的不确定性
  4. 二维已经 OUT 了?3DPose 实现三维人体姿态识别真香 | 代码干货
  5. CSDN湘苗培优|成长,从走出舒适区开始
  6. 清华硕士爆料:这些才是机器学习必备的数学基础
  7. 谁是当今最顶级的技术?SQL、Java、Python、C++ 皆上榜!
  8. 与其撩妹尬舞,倒不如跟AI学跳舞
  9. Spring Boot 面试杀手锏:自动配置原理
  10. 它是谁?一个比 c3p0 快200倍的数据库连接池!