tf.browser.fromPixel(视频)导致内存泄漏

时间:2019-12-02 16:45:19

标签: tensorflow.js

我想使用tf.browser.fromPixels(video)从视频中获取当前帧数据,但是每次调用此函数时,都会发生内存泄漏。 TensorFlow.js版本

  

1.3.1   浏览器版本   Chrome版本75.0.3770.142   这是导致内存泄漏的代码。

async function drawScreen () {

    console.log(tf.memory());

    var frame = tf.tidy( () => {

    return  tf.browser.fromPixels (videoElement, 3).expandDims(0).toFloat().div(tf.scalar(255))

    });

    console.log(tf.memory());

    hr_image_0 = tf.tidy( () => {

    return net.execute(frame).squeeze().clipByValue(0,1);

    });

    tf.dispose(frame);

    console.log(tf.memory());

    tf.browser.toPixels(hr_image_0, ccanvas);

    await tf.tidy( () =>  {

     tf.browser.toPixels(hr_image_0, ccanvas);

    });

    console.log(tf.memory());

}

我用过

  

requstAnimationFrame()

调用drawScreen函数。 在Chrome上运行代码,控制台上将显示以下内容

  

对象{不可靠:false,numBytesInGPU:210113944,numTensors:172,numDataBuffers:172,numBytes:211660580}

     

CH6EX8.html:129:11对象{不可靠:false,numBytesInGPU:   210344344,numTensors:173,nnumDataBuffers:173,numBytes:211833380}

     

CH6EX8.html:135:11对象{不可靠:false,numBytesInGPU:   212187544,numTensors:173,numDataBuffers:173,numBytes:213215780}

     

CH6EX8.html:141:11对象{不可靠:false,numBytesInGPU:   213745048,numTensors:173,numDataBuffers:173,numBytes:213215780}

有什么方法可以消除泄漏。

1 个答案:

答案 0 :(得分:1)

根据文档:

  

执行提供的函数fn,执行后,清除由fn分配的所有中间张量,但由fn返回的中间张量

tf.tidy确实删除了中间张量。但是在这种情况下,没有任何中间张量需要去除。当您继续调用drawscreen方法时,该缓冲区将不断增加,该方法将始终返回tf.browser.fromPixels (videoElement, 3).expandDims(0).toFloat().div(tf.scalar(255)),从而将分配给张量创建的缓冲区保留在内存中。

要清除未使用的张量,应在drawScreen中包含调用tf.tidy的方法,以处置从图像创建张量时使用的张量。

由于drawScreen是由requestAnimation调用的,因此tf.tidy可以是其中的顶级函数。

async function drawScreen () {
  tf.tidy(() => {
   // do all operations here
  })
}

另一种选择是在将图像绘制到屏幕上之后,使用tf.dispose处置framehr_image_0

await tf.browser.toPixels(hr_image_0, ccanvas);
tf.dispose(hr_image_0)