Как читать вывод из модели тензорного потока в java

Я пытаюсь использовать TensorflowLite с моделью ssdlite_mobilenet_v2_coco из /github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md преобразован в файл tflite для обнаружения объектов из потока камеры в моем приложении для Android (java). Я выполняю

    interpreter.run(input, output);

где вход - изображение, преобразованное в ByteBuffer, выход - массив с плавающей запятой - размер [1] [10] [4] для соответствия тензору.

Как преобразовать этот массив с плавающей запятой в какой-либо читаемый вывод? - например, получить координаты ограничивающего прямоугольника, название объекта, вероятность.


person akuba    schedule 15.02.2019    source источник
comment
По предоставленной вами ссылке, какую модель вы использовали?   -  person Shubham Panchal    schedule 16.02.2019
comment
ssdlite_mobilenet_v2_coco   -  person akuba    schedule 17.02.2019


Ответы (1)


Хорошо, я разобрался. Сначала я запускаю в Python следующие команды:

>>> import tensorflow as tf
>>> interpreter = tf.contrib.lite.Interpreter("detect.tflite")

Затем загружается модель Tflite:

>>> interpreter.allocate_tensors()
>>> input_details = interpreter.get_input_details()
>>> output_details = interpreter.get_output_details()

Теперь у меня есть подробности о том, как должны выглядеть ввод и вывод.

>>> input_details
[{'name': 'normalized_input_image_tensor', 'index': 308, 'shape': array([  1, 300, 300,   3], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}]

Итак, на входе преобразовано изображение - форма 300 x 300

>>> output_details
[{'name': 'TFLite_Detection_PostProcess', 'index': 300, 'shape': array([ 1, 10,  4], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}, {'name': 'TFLite_Detection_PostProcess:1', 'index': 301, 'shape': array([ 1, 10], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}, {'name': 'TFLite_Detection_PostProcess:2', 'index': 302, 'shape': array([ 1, 10], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}, {'name': 'TFLite_Detection_PostProcess:3', 'index': 303, 'shape': array([1], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}]

И теперь у меня есть спецификация нескольких выходов в этой модели. Мне нужно было изменить

interpreter.run(input, output) 

to

interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);

где "входы":

private Object[1] inputs;
inputs[0] = imgData; //imgData - image converted to bytebuffer 

И map_of_indices_to_outputs:

private Map<Integer, Object> output_map = new TreeMap<>();
private float[1][10][4] boxes;
private float[1][10] scores;
private float[1][10] classes;
output_map.put(0, boxes);
output_map.put(1, classes);
output_map.put(2, scores);

теперь после запуска у меня есть координаты 10 объектов в коробках, индекс объектов (в файле меток кокоса) в классах, вы должны добавить 1, чтобы получить правильный ключ! и вероятность в баллах.

Надеюсь, это поможет кому-то в будущем.

person akuba    schedule 17.02.2019
comment
Это помогло мне, и я ценю, что вы вернулись и разместили свои выводы! Спасибо! У вас все еще есть вопрос, если вы можете помочь - моя форма ввода - [1,15000,1], и по сути это просто массив чисел с плавающей запятой - (тот факт, что это трехмерный, является некоторой другой проблемой Keras) - как я могу структурировать мою форму ввода в JAVA, чтобы соответствовать ожидаемой форме? - person ace; 30.05.2019
comment
Это должен быть просто массив формы [1] [15000] [1]. Так что, возможно, вы сможете преобразовать свой обычный массив в эту форму. Например, вы вводите [1.444; 2.447; 5,678 ...], и вы создаете этот массив [[[1.444]; [2.447]; [5.678]; ...]]. Теперь вы сможете пройти его. - person akuba; 02.06.2019
comment
Спасибо за продолжение! tf.contrib.lite.Interpreter теперь tf.lite.Interpreter в tf2 - person Iorek; 23.06.2020