Проблемы с печатью прогнозов с использованием tenorflow. js - PullRequest
1 голос
/ 15 января 2020

Я переобучил модель mobilenet_v2, используя инструмент командной строки make_image_classifier , чтобы переобучить модель, и tf js -конвертер , чтобы подготовить модель для браузера.

make_image_classifier \
  --image_dir image_data \
  --tfhub_module https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4 \
  --saved_model_dir trained_models/1 \
  --labels_output_file class_labels.txt \
  --tflite_output_file trained_model.tflite
tensorflowjs_converter \
    --input_format=tf_saved_model \
    --output_format=tfjs_graph_model \
    --signature_name=serving_default \
    --saved_model_tags=serve \
    ./trained_models/1 \
    ./web_model

Для тестирования модели TF Lite я использовал пример кода tflite . Я следовал инструкциям инструментов и поэтому использовал предоставленный код.

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

const MODEL_URL = 'model/model.json';
const model = await tf.loadGraphModel(MODEL_URL);

var canvas = document.getElementById("canvas").getContext("2d");;
const img = canvas.getImageData(0,0, 224,224)

const tfImg = tf.browser.fromPixels(img).expandDims(0);
const smalImg = tf.image.resizeBilinear(tfImg, [224, 224]);

let result = await model.predict(smalImg);

console.log(result.print())

вывод: Тензор [[0,0022475, 0,0040588, 0,0220788, 0,0032885, 0,000126, 0,0030831, 0,8462179, 0,1188994],]

Тестирование модели с python работает хорошо, и я получил ожидаемый результат с метками и вероятностями. Я что-то не так делаю?

1 Ответ

1 голос
/ 15 января 2020

В коде python после условия имеется следующее:

  # output_data is the predition result
  results = np.squeeze(output_data)
  top_k = results.argsort()[-5:][::-1]
  labels = load_labels(args.label_file)
  for i in top_k:
    if floating_model:
      print('{:08.6f}: {}'.format(float(results[i]), labels[i]))
    else:
      print('{:08.6f}: {}'.format(float(results[i] / 255.0), labels[i]))

Та же обработка должна быть выполнена после прогнозирования в js. Массив labels содержит все метки набора данных. Он должен быть загружен в js, как он был загружен в коде python из файла labels.txt.

const topkIndices = result.topk(5) 
const topkIndices = await topk.indices.data();
const categories = (Array.from(topkIndices)).map((p: number) => labels[p]);

const topkValues = await topk.values.data()
const data = Array.from(topkValues).map(p => p * 100);
// categories will contain the top5 labels and
// data will contain their corresponding probabilities
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...