Я пытаюсь запустить предварительно обученную модель 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.