我正在尝试使用javascript进行tensorflow实验。我想在图像文件夹上运行posenet模型。通过一些谷歌搜索,我在下面编写了HTML。当我运行下面显示的HTML时,系统即将耗尽内存,确实存在内存泄漏。我不知道内存泄漏发生的位置和方式。社区能否解释一下内存泄漏如何发生以及如何解决
<html>
<head>
<script src="https://unpkg.com/@tensorflow/tfjs"></script>
<script src="https://unpkg.com/@tensorflow-models/posenet"</script>
</head>
<body>
<img id='faceImg' src='1.0.jpg'/>
<script>
var i = 1;
async function makeTensors(){
var psData;
var imageScaleFactor = 0.5;
var outputStride = 16;
var flipHorizontal = false;
var iterator;
var imageElements = document.getElementById('faceImg');
console.log(imageElements);
let result = await posenet.load().then(function(net){
return net.estimateSinglePose(imageElements, imageScaleFactor, flipHorizontal, outputStride)
}).then(function(pose){
console.log(pose);
psData = pose;
})
var im_tensor_pos = []
for (iter = 0; iter < 17; iter++) {
im_tensor_pos.push(psData.keypoints[iter].position.x);
im_tensor_pos.push(psData.keypoints[iter].position.y);
}
for (iter = 0; iter < 17; iter++) {
im_tensor_pos.push(psData.keypoints[iter].score);
}
im_tensor_pos.push(psData.score);
// tensor_vals.push(im_tensor_pos);
psData = null;
delete result;
// console.log(tensor_vals);
}
async function test(){
for (i = 1; i < 270; i++) {
var ImageSrc = 'results/' + i + ".0.jpg";
console.log(ImageSrc)
var imageElements = document.getElementById('faceImg');
imageElements.src = ImageSrc;
result = await makeTensors();
delete result;
}
}
test().then(console.log('done'));
</script>
</body>
</html>
这也是我第一次尝试js。如果您对代码也有想法,请告诉我。
答案 0 :(得分:1)
我遇到了完全相同的问题,但是.dispose
对我不起作用。
不知道您是否已经修复它,但是对于将来的引用,它是可行的:
tf.engine().startScope()
// do the Tensorflow / Posenet stuff
tf.engine().endScope()
一旦完成,这将破坏张量
答案 1 :(得分:0)
我没有看到要放置张量的任何空间。请记住,如果您不对已完成的张量调用.dispose
,它仍将保留在内存中。
处理逻辑: https://js.tensorflow.org/api/latest/#dispose
要调试内存问题,请查看使用tf.memory
来查看问题的根源:https://js.tensorflow.org/api/latest/#memory