Утечка памяти при использовании posenet в тензорном потоке JavaScript - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь поэкспериментировать с тензорным потоком, используя 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 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.Пожалуйста, дайте мне знать, если ваши мысли о коде тоже.

1 Ответ

0 голосов
/ 27 мая 2019

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

Утилизировать логику: https://js.tensorflow.org/api/latest/#dispose

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

...