0

我正在尝试使用 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

4

1 回答 1

0

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

于 2021-10-28T19:24:10.880 回答