专栏首页大数据文摘视频会议玩消失?借助神器TensorFlow.js,200行代码教你“隐身”,GitHub标星3k+

视频会议玩消失?借助神器TensorFlow.js,200行代码教你“隐身”,GitHub标星3k+

大数据文摘出品

作者:曹培信

疫情期间,许多公司都开启了远程办公,试想一下,在视频会议时,如果你的同事突然从镜头中消失,大家会有什么样的反应?

Google网站工程师Jason Mayes就做了这么一个项目,成功吓到了自己的盆友。通过TensorFlow.js制作了一个插件,可以让系统分离人物和背景,然后从场景中实时删除任何人,也就是说,可以从视频中让人“消失”。

从处理视频的效果来看,隐身的效果还不错。

当然,除了文章开头提到的“隐身“恶作剧,Jason也想到了不少有趣的应用场景。比如帮一个BBC在线连线的“翻车”视频做消除处理:从这两个小孩“嚣张”地走进来到被“无情”地拎走,都被Jason的小插件处理的一干二净

推特上的粉丝也表示,这确实很有趣,也很神奇。

目前,该项目在GitHub上的标星已超过三千。

项目地址:

https://github.com/jasonmayes/Real-Time-Person-Removal

借助神器TensorFlow.js,200行代码实现“隐身”

除了在GitHub放出项目,作者也在codepen.io网站上放出了所有的代码,其JS代码只有短短200多行。

文摘菌也仔细学习了一下,值得注意的是,这个项目本身没有训练新的模型,用的是TensorFlow.js现成的模型,然后通过算法对视频进行了处理,体现的是巧妙的工程思维。

首先,作者利用TensorFlow.js提供的身体分割模型识别出的人体,并定义一个人体区域。

// 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;

      }
    }
  }

  // Calculate dimensions of bounding box.

  var width = maxX - minX;
  var height = maxY - minY;

同时,为了应对可能出现的假阴性,定义一个1.3的比例参数。

// 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;

这个参数很重要,如果大了,背景的更新区域就会变小,视频的实时性也将受到影响;如果定义小了,那么在人物快速移动时,会出现身体边缘闪现的情况,这是一个工程上的取舍问题,感兴趣的同学可以动手修改试一下。

而后,对除人体区域之外的区域(即背景部分)进行实时更新,当在定义的人体区域外检测到人体(即人体出现了移动)时,即可对新的背景部分进行更新。

/ 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);

完整代码链接如下,感兴趣的同学可以试试看?

https://codepen.io/jasonmayes/

TensorFlow.js能做的远不止让你“消失”

作者整个项目的核心是TensorFlow.js提供的身体分割模型,TensorFlow.js可以说是网站工程师使用机器学习模型的一个神器!

TensorFlow.js是一个使用JavaScript进行机器学习开发的库,允许使用JavaScript进行机器学习模型的开发,并可以直接在浏览器或Node.js中使用机器学习模型。

而作者要让镜头中人物“消失”,首先就要找到人体的位置区域,这里使用的就是TensorFlow.js已经训练好的身体分割模型。

比如上面这个项目所用的身体分割模型MobileNet,其调用十分简单:

const net = await bodyPix.load({
 architecture: 'MobileNetV1',
 outputStride: 16,
 multiplier: 0.75,
 quantBytes: 2
});

当然,除了MobileNet这种小而快但是准确率不是特别高的模型,也可以选择ResNet这种大而慢但是准确率相对较高的模型。

并且除了身体分割模型,TensorFlow.js还提供图像分类、对象检测、身体分割、句子编码等多种现成的机器学习模型。当然,如果有需要,用户也可以进行重新训练自己的模型。

再或者,如果你想做一些有趣的事情放松一下,TensorFlow.js也绝对不会让你失望。

知乎网友Henry,同时也是一位阿里的高级技术专家,就用TensorFlow.js做了一个完全独立运行于浏览器环境下的AI程序,成功打爆了隐藏在Chrome中的彩蛋游戏“暴龙酷跑”(T-Rex Runner)。

第一次,AI在尝试3次后逐渐学会了如何控制暴龙避让障碍物。

第二次,在引入遗传算法后,仅尝试2次后AI即可学会躲避障碍物。

技术比创造力多一点点的15年老程序员

项目的作者的Jason Mayes在GitHub上的自我介绍是一位15年开发年龄的工程师,除了在GitHub留下足迹,他还给自己做了一个特别有意思的个人网站。

目前,Jason Mayes就职于谷歌“Creative Innovation”团队,专门帮助谷歌的客户开发定制的Web解决方案,所以Jason对HTML、CSS和JavaScript十分熟练,因此在GitHub上的其他项目也都是用这几种语言来实现。

比如他还写过一个小程序,用来在网站上无缝排列自己的“猫片”,看着他为每一张照片配的旁白,资深“猫奴”无疑了。

在网站里面,Jason形容自己是Web开发人员、程序员、技术顾问和分析师的混合型开发者,51%偏向技术,49%偏向创造。

的确,要成为一名合格的开发者,除了技术过硬,对这个世界的好奇心也是做出好项目的重要源泉。

“宅”家发呆,不如学嗨

手把手教你关联数据的深度分析

配套TigerGragh部署与实战解析

快扫码到碗里来~

本文分享自微信公众号 - 大数据文摘(BigDataDigest),作者:文摘菌

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 未来已来,看看腾讯用机器人写的新闻稿

    大数据文摘
  • 斯坦福最新研究:看图“猜车祸”,用谷歌街景数据建立车祸预测新模型

    与其他商品不同的是,车祸保单的最终成本在初始销售时是未知的。因此,建立一个合理的定价机制是非常具有挑战的。有些保险公司尝试使用统计方法来解决这一问题:预测每个客...

    大数据文摘
  • 手把手 | 用Python语言模型和LSTM做一个Drake饶舌歌词生成器

    大数据文摘
  • 将文本转语音速度提高38倍,这个FastSpeech真的很fast

    作者:Yi Ren、Yangjun Ruan、Xu Tan、Tao Qin、Sheng Zhao、Zhou Zhao、Tie-Yan Liu

    机器之心
  • 想和时间做朋友?这 5 个小程序你一定会喜欢!

    那是一个雨天的下午,一名 15 岁的洛杉矶少年,在一张黄色便条上写下了 My Life List(生命清单),列出了他人生的 127 个目标。

    知晓君
  • MySql - InnoDB - 事务 , Php版

    (出处:https://cloud.tencent.com/developer/user/1148436/activities) 1,前序 由于要重构APP(...

    林冠宏-指尖下的幽灵
  • Python实现Telnet自动连接检测密码

    最近在学习Python网络相关编程,这个代码实现了Telnet自动连接检测root用户密码,密码取自密码本,一个一个检测密码是否匹配,直到匹配成功,屏幕输出停止...

    周小董
  • WPF 跨线程 UI 的方法

    本文告诉大家如何在 WPF 使用多线程的 UI 的方法 在很多的时候都是使用单线程的 UI 但是有时候需要做到一个线程完全处理一个耗时的界面就需要将这个线程作为...

    林德熙
  • 谷歌用AI诊断早期肺癌超越人类医生,登上Nature子刊

    据国家癌症中心统计,我国每年新发肺癌约78.7万人,因肺癌死亡约63.1万人,如果这些患者都能早发现、早治疗,那么他们的寿命将会大大延长。

    量子位
  • 安装Anaconda

    Anaconda的英文解释是产于南美洲的水蟒,这个Python的大蟒蛇是一个物种不同品种。

    KEVINGUO_CN

扫码关注云+社区

领取腾讯云代金券