Github 3.4k星,200余行代码,让你实时从视频中隐身-程序员宅基地

    点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

Smiling doesn't always mean you're happy. In some cases, it simply means that you're a strong girl.

微笑并不总是说明你是快乐的,有的时候,它只说明你是很坚强。

每日掏心

有所牵挂,总是一种幸福。无论牵挂别人,还是被别人牵挂。亦不论亲情、友情,还是爱情。

来自:机器之心 | 责编:乐乐

程序员小乐(ID:study_tech)第 801 次推文   图片来自百度

往日回顾:Spring Boot 最流行的 16 条实践解读!

     

   正文   

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

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,然后模型就能重建图像,完成最终的修复了。

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

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入订阅号程序员小乐技术群,在后台回复“加群”或者“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

必须要掌握的 InterruptedException 异常处理

Git 居然还有这么高级用法,你一定需要

一次SQL查询优化原理分析(900W+数据,从17s到300ms)

关注订阅号「程序员小乐」,收看更多精彩内容

嘿,你在看吗

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaoxiaole0313/article/details/104765552

智能推荐

大明:讲解硬盘ESP分区和MSR分区有什么用?值得收藏-程序员宅基地

文章浏览阅读9k次。我个人认为,ESP分区的作用会大一些,影响到系统的“引导启动恢复”功能,至于MSR分区作用不大,删除了也无所谓。_esp分区和msr分区

详细记录YOLACT实例分割ncnn实现-程序员宅基地

文章浏览阅读1k次。点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达链接:https://zhuanlan.zhihu.com/p/128974102本文转载自知乎,作者已授权,未经许可请勿二次转载。0x0 YOLACT实例分割https://urlify.cn/rURFry端到端一阶段完成实例分割速度快,550x550图片在TitanXP上号称达到33FPS开源代码,..._ncnn yolact

C# 引用Newtonsoft.Json库 将Json格式字符串中的null转换为空字符串_c# json反序列化null值处理-程序员宅基地

文章浏览阅读2.2k次。定义自定义的JsonConverter类,用于控制反序列化过程中的类型转换。使用JsonSerializerSettings对象设置反序列化。_c# json反序列化null值处理

K8S教程(5)Dashboard的安装与使用_kubectl edit svc kubernetes-dashboard -n kubernete-程序员宅基地

文章浏览阅读2.7k次。K8S Dashboard的官方介绍:https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/1、下载资源清单并且应用kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml2、查看应用资源清单后所创建的deployment及Pod信_kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

Google I/O大会轰动全场的Glass Demo视频是怎么来的?-程序员宅基地

文章浏览阅读2.1k次。说起Google I/O 2012开发者大会上令人印象最深刻的一幕莫过于Google Project Glass的跳伞表演了。整个过程在Google Hangout上视频直播,现场的观众和在网上观看Youtube视频直播的网友们随着跳伞者的视角如醉如痴。在昨天玩High全场后,今天Google又玩了一回跳伞,不过观众们还是很兴奋,有读者甚至在雷锋网微博上留言:“这次Google I/O 201

k8s-1.26.6 二进制部署_etcd-ca-crs.json-程序员宅基地

文章浏览阅读509次,点赞2次,收藏3次。公有云要用公有云自带的负载均衡,比如阿里云的SLB,腾讯云的ELB,用来替代haproxy和keepalived,因为公有云大部分都是不支持keepalived的,另外如果用阿里云的话,kubectl控制端不能放在master节点,推荐使用腾讯云,因为阿里云的slb有回环的问题,也就是slb代理的服务器不能反向访问SLB,但是腾讯云修复了这个问题。下载地址:https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md。_etcd-ca-crs.json

随便推点

汉字库,字模的了解_显示汉字为什么是dedede-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏4次。汉字库,字模的了解标签: 技术类 2007-09-04 21:50阅读(726)评论(0) 由于Turbo C应用于DOS操作系统下,在使用Turbo C进行程序设计时,一般情况下只好使用英文进行人机交互。要是想直接用中文界面,就需要另想他法了。  如果使用中文DOS系统(如UCDOS),则可以解决在字符界面下的汉字显示问题。也就是说,可以用printf或其他_显示汉字为什么是dedede

linux 源码搭建lnmp_Linux源码安装lnmp-程序员宅基地

文章浏览阅读69次。php安装;./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysql..._linux源码部署lnmp平台

车辆航向角、横摆角、质心侧偏角的区别——转载_qiche航向角和偏航角的区别-程序员宅基地

文章浏览阅读604次,点赞2次,收藏2次。如下图: θ是航向角;_qiche航向角和偏航角的区别

Vue+element ui 表单中自适应文本高度的文本域及表格中列数据展示_vue autosize-程序员宅基地

文章浏览阅读4.3k次,点赞2次,收藏7次。Vue+element ui 表单中自适应文本高度的文本域及表格中列数据展示:通过设置autosize属性可以使得文本域的高度能够根据文本内容自动进行调整,并且autosize还可以设定为一个对象,指定最小行数和最大行数。..._vue autosize

MySQL 菜鸟入门“秘籍”-程序员宅基地

文章浏览阅读126次。本文收录在Linux 系统化学习系列文章总目录一、MySQL简介1、什么是数据库 ?  数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型...

N1刷armbian,安装cups(惠普打印机)_armbian升级cups-程序员宅基地

文章浏览阅读4k次。自用,网络设置还是没有搞懂_armbian升级cups