Tensorflow.js BodyPix在浏览器中对于单个图像非常慢



我正试图使用tensorflow.js body pix 创建一个浏览器内背景删除

虽然在线演示在我的电脑上达到每秒10帧,但我的代码一帧大约需要3秒。

我主要遵循官方github 上的示例

这是我的代码:

const remove_background = async (img) => {
console.time("ML");
console.time("loadModel");
const net = await bodyPix.load({
architecture: 'MobileNetV1',
outputStride: 16,
multiplier: 0.5,
quantBytes: 2
});
console.timeEnd("loadModel");
console.time("segmentPerson");
const segmentation = await net.segmentPerson(img.imageData, {
segmentationThreshold: 0.7,
internalResolution: 0.25
});
console.timeEnd("segmentPerson");
console.time("ApplyMask");
for (var i=0;i<segmentation.data.length;i++) {
if(segmentation.data[i] === 0) {
img.imageData.data[i*4] = 255;
img.imageData.data[i*4+1] = 0;
img.imageData.data[i*4+2] = 0;
}
}
console.timeEnd("ApplyMask");
console.timeEnd("ML");
return img;
}

时间如下:

loadModel: 129.35498046875 ms
segmentPerson: 2755.817138671875 ms
ApplyMask: 4.910888671875 ms
ML: 2890.7060546875 ms

我从内部分辨率为0.1的1700x1700图像开始,一直到分辨率为0.25的200x200图像,没有明显的改进。

我做错了什么?

我正在使用tfjs@1.2&body-pix@2.0

我在使用bodypix的实现中发现,第一次检测比后续检测花费的时间要长得多。我相信他们在第一次调用segmentPerson时会进行一次性初始化。我们正在分割视频。我发现,只需在采集流时将空白图像传递给segmentPerson,然后在流开始时逐帧传递视频,就可以节省约500ms的第一次检测启动时间。

最新更新