Утечка памяти при использовании posenet в tensorflow JavaScript

#javascript #memory-leaks #tensorflow.js

#javascript #утечки памяти #tensorflow.js

Вопрос:

Я пытаюсь поэкспериментировать с тензорным потоком, используя javascript. Я хочу запустить модель 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 resu<
      // 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 resu<
      }
    }
    test().then(console.log('done'));

   </script>
  </body>
  </html>
 

Это тоже моя первая попытка в js. Пожалуйста, дайте мне знать, если у вас тоже есть свои мысли по поводу кода.

Ответ №1:

У меня была точно такая же проблема, но .dispose у меня это не сработало.

Не знаю, исправили ли вы это уже, но для будущих ссылок это сработало:

 tf.engine().startScope()

// do the Tensorflow / Posenet stuff

tf.engine().endScope()
 

Это уничтожит тензор после завершения

Ответ №2:

Я не вижу места, где вы размещаете свои тензоры. Помните, что если вы не вызываете .dispose тензор, с которым покончили, он все равно останется в памяти.

Логика удаления: https://js.tensorflow.org/api/latest/#dispose

Для отладки проблемы memmory, пожалуйста, ознакомьтесь с using tf.memory , чтобы увидеть, где может возникнуть проблема: https://js.tensorflow.org/api/latest/#memory