我想使用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}
有什么方法可以消除泄漏。
答案 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
处置frame
和hr_image_0
await tf.browser.toPixels(hr_image_0, ccanvas);
tf.dispose(hr_image_0)