Github3.4k星200余行代码让你实时从视频中隐身

放大字体  缩小字体 2020-03-08 19:09:40  阅读:9531 作者:责任编辑NO。许安怡0216

机器之心报导

项目作者: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

for (let y = 0; y

let n = y * canvas.width + x;

// Human pixel found. Update bounds.

if (segmentation.data[n] !== 0) {

if(x

minX = x;

}

if(y

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

for (let y = 0; y

// If outside bounding box and we found a body, update background.

if (foundBody && (x newXMin + newWidth) || ( 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,然后模型就能重建图画,完结终究的修正了。

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

本文为机器之心报导,转载请联络本大众号取得授权。

------------------------------------------------

参加机器之心(全职记者 / 实习生):hr@jiqizhixin.com

投稿或寻求报导:content@jiqizhixin.com

广告 & 商务协作:bd@jiqizhixin.com

“如果发现本网站发布的资讯影响到您的版权,可以联系本站!同时欢迎来本站投稿!