在tensorflow javscript中使用posenet时发生内存泄漏

时间:2019-04-14 12:20:33

标签: javascript memory-leaks tensorflow.js

我正在尝试使用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。如果您对代码也有想法,请告诉我。

2 个答案:

答案 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