点击上方蓝色“程序猿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余行代码,让你实时从视频中隐身相关推荐

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

    项目作者 | Jason Mayes 转自 | 机器之心    参与 | Oblivion Max.思 只需网页端,秒速消失不留痕. Jason Mayes 是一名在谷歌工作的资深网页工程师,他长期致 ...

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

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

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

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

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

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

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

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

  6. 聊聊实时音视频中的技术难点:回声消除+噪声消除

    文 | 菊风媒体引擎资深研究团队 在各个实时音视频互动场景中,回声和噪声对于影响用户体验而言都是很大的问题.音视频正在发展成为互联网线上沟通的必然趋势,在自然的交流环境中,回声和噪声是非常影响沟通体验 ...

  7. 聊聊语音聊天室app源码实时音视频中的技术难点:回声消除+噪声消除

    聊聊语音聊天室app源码实时音视频中的技术难点:回声消除+噪声消除 在聊聊语音聊天室app源码各个实时音视频互动场景中,回声和噪声对于影响用户体验而言都是很大的问题.音视频正在发展成为互联网线上沟通的 ...

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

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

  9. 对信用卡欺诈 Say No|百行代码实现简化版实时欺诈检测

    进入互联网时代,你的绝大部分操作都可以在网上进行,极大的方便了我们的生活.但是信用卡盗刷者也可以利用网络来诈骗,典型的做法是:诈骗者首先入侵安全级别较低系统来盗窃信用卡卡号,用盗得的信用卡进行很小额度 ...

最新文章

  1. java 打包apk_Android APK打包流程
  2. virtualbox 创建桥接网络_Windows 10下的Virtualbox中的桥接网络不起作用
  3. android使用Activity
  4. Linux环境安装并配置Maven
  5. CREO - 基础2 - 如何让装配好的零件重新装配
  6. Windows新建一个新的磁盘空间:
  7. mysql 电商实战_电商项目测试实战(一)
  8. VS对.ini文件的操作
  9. 微软希望通过监控开发者结束软件 bug
  10. C#的解题思路(1):不重复随机数的产生问题
  11. 2016计算机二级考试c语言真题及答案,计算机二级考试c语言真题_2017计算机二级考试C语言复习题及答案...
  12. yii2 restful的自定义api
  13. PTA 7-7 新年倒计时
  14. 【机器学习理论】换底公式--以e,2,10为底的对数关系转化
  15. PT_基本概率公式(减法/加法/乘法/除法(条件概率)/全概率/贝叶斯)@条件概率链式法则@乘法法则
  16. 《规范》前端编码规范
  17. 免费的小程序微商城系统它不香吗?
  18. ChatGPT 大智近妖,从宇宙人生到手搓光刻机,从哄女朋友到写年终总结我们聊得非常开心,反而让人越来越忧心...
  19. hiho一下 第三周---KMP算法
  20. 2天赚了4个W,手把手教你用Threejs搭建一个Web3D汽车展厅 | 大帅老猿threejs特训

热门文章

  1. IntelliJ idea 缓存和索引 清理方法
  2. 操作系统识别工具 xprobe2 p0f 简介
  3. clion pycharm 报错 bash: line 0: cd: /xxx: No such file or directory
  4. docker 占用磁盘空间清理 无用数据卷删除
  5. python3 RSA加解密
  6. 内核模式下的注册表操作
  7. Linux下逻辑地址-线性地址-物理地址图解
  8. 良性代码,恶意利用:浅谈 Return-Oriented 攻击
  9. java 构造器 血药主题_java中的构造器
  10. NeHe教程Qt实现——lesson09