модель. json создает пустой тензор в приложении Javascript - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь запустить предварительно обученную модель ssd_mobilenet_v1_coco_2018_01_28 в приложении Javascript с использованием API Tensorflow. Модель загружается с помощью tf.loadGraphModel, но когда я запускаю model.executeAsyn c, он выдает пустой тензор.

пустой тензор, отображаемый в Chrome console

Это команды, которые я выполнил, чтобы преобразовать предоставленный frozen_inference_graph.pb в дружественную веб-модель. Формат json , следуя инструкциям tf js -converter .

conda create -n tfjs python=3.6.8
conda activate tfjs
pip install tensorflowjs==0.8.6
tensorflowjs_converter --input_format=tf_frozen_model --output_json=true --output_node_names='detection_boxes,detection_classes,detection_scores,num_detections' --saved_model_tags=serve ~/PATH/frozen_inference_graph.pb ~/Desktop/ 

Я также получаю тот же пустой тензорный результат, если использую последнюю версию tenorflow js.

Приложение имеет версию @ tenorflow / tf js версии 1.4.0. Согласно приведенной выше ссылке ssd_mobil enet, «замороженные графы вывода создаются с использованием версии Tensorflow v1.12.0». Я не уверен, какая версия tf js соответствует этому, но tf js v1.2.0 вызывает неподдерживаемые ошибки операций, а v1.5.2 и v1.7.4 также выдают одинаковый пустой тензор.

Вот соответствующий код приложения:

import * as tf from '@tensorflow/tfjs'
import { loadGraphModel } from '@tensorflow/tfjs'
const MODEL_URL = 'http://127.0.0.1:8080/web_model_graph/model.json'

const loadlModelPromise = loadGraphModel(MODEL_URL)
    .then((model) => {
      console.log('model loaded: ', model)
      this.detectObjects()
    })
    .catch((error) => {
      console.log('failed to load the model', error)
    })

 async detectObjects () {
    let video = document.getElementById("video")
    const tfImg = tf.browser.fromPixels(video)
    const smallImg = tf.image.resizeBilinear(tfImg, [300, 300]) 
    let tf_img2 = smallImg.expandDims(0); //[1, 300, 300, 3] as float32 dtype
    tf_img2 = tf_img2.asType('int32')
    let predictions = await this.state.model.executeAsync({ 'image_tensor': tf_img2 }, ['detection_boxes', 'num_detections', 'detection_classes', 'detection_scores'])
    predictions.forEach(t => t.print()) // log out the data of all tensors
    const data = []
    for (let i = 0; i < predictions.length; i++)
      data.push(predictions[i].dataSync())
    console.log(data)
}

Чтобы еще больше усложнить ситуацию, я обнаружил, что мог бы реально заставить его работать, если бы вместо использования tf.loadGraphModel с моделью. json , Я использовал tf.loadFrozenModel с tenorflowjs_model.pb и weights_manifest. json, созданный таким же образом с помощью tenzflowflowjs_converter, но без --output_json = true. Однако, похоже, что Tensorflow больше не поддерживает эту функцию, и я хотел бы в конечном итоге собрать информацию из моей собственной обученной модели, используя tf.loadGraphModel.

...