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

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

Вот мой код:

import tensorflow as tf

# restore the deep model
sess=tf.Session()
#First let's load meta graph and restore weights
saver = tf.train.import_meta_graph('pretrained/faster_rcnn_inception_resnet_v2_atrous_oid_v4_2018_12_12/model.ckpt.meta')
saver.restore(sess, tf.train.latest_checkpoint('pretrained/faster_rcnn_inception_resnet_v2_atrous_oid_v4_2018_12_12/'))

# Now, let's access and create placeholders variables and
# create feed-dict to feed new data
graph = tf.get_default_graph()
X = graph.get_tensor_by_name('image_tensor:0')
feed_dict ={X: image_raw_feature}

#Now, access the op that we want to run. 
num_detections = graph.get_tensor_by_name('num_detections:0')
detection_scores = graph.get_tensor_by_name('detection_scores:0')
detection_boxes = graph.get_tensor_by_name('detection_boxes:0')
 
x1, x2, x3 = sess.run(
    [num_detections, detection_scores, detection_boxes],
    feed_dict
)

Выходы x1, x2, x3 имеют формы 4, [4, 100] и [4, 100, 4]. Проблема в том, что я не знаю, как преобразовать результат в удобочитаемые метки. Я предполагаю, что общее количество категорий объектов равно 100, как указано в x2? Но это кажется очень маленьким по сравнению с тем, что описано в наборе данных Открытые изображения.

Как я могу расшифровать выходы на метки?


person lenhhoxung    schedule 07.04.2019    source источник


Ответы (1)


person danyfang    schedule 07.04.2019
comment
На самом деле я использую 4 изображения в качестве входных данных. Что означает max_detections? Почему оно равно 100. Обычно я считаю, что это должно быть количество классов (категорий). Например, количество классов в ImageNet равно 1000, поэтому detection_scores должно быть [batch_size, 1000], не так ли? Поскольку модель обучается с использованием набора данных Open Images, содержащего около 600 категорий объектов, я не знаю, почему у меня здесь 100. - person lenhhoxung; 07.04.2019
comment
max_detections - это максимальное количество объектов, которое может быть обнаружено на одном изображении. Если ваше изображение содержит более 100 объектов, которые необходимо обнаружить, то только 100 из них будут обнаружены. max_detections не имеет ничего общего с количеством категорий. Количество классов - 1000, detection_score все еще имеет форму [batch_size, max_detections] (например, [4,100]). 1000 означает, что значения классов находятся в диапазоне от 1 до 1000, например, detection_classes может быть [1,2,52,6,732,7,7, ..., 3,287,832,322,231], но длина detection_classes равна 100. - person danyfang; 07.04.2019
comment
Это имеет смысл для меня. И как мне сопоставить индекс класса (например, 1,2,52) с соответствующей меткой? Есть ли в Tensorflow функция для сопоставления меток, или мне придется ее создать? Например, в Keras есть функция с именем decode_predictions для каждой предварительно обученной модели, поэтому мне просто нужно вызвать эту функцию, чтобы преобразовать выходные вероятности в метки. - person lenhhoxung; 07.04.2019
comment
Я спрашиваю, потому что для одного набора данных (например, Open Images) существуют разные версии, и количество классов меняется в зависимости от версии. Следовательно, если функция сопоставления недоступна, нелегко получить правильные метки (они не упоминали, какая версия набора данных используется для обучения). - person lenhhoxung; 07.04.2019
comment
Я нашел здесь несколько функций, уже реализованных для преобразования между категориями и индексами: github.com/tensorflow/models/blob/master/research/ - person lenhhoxung; 08.04.2019