API обнаружения объектов Tensorflow - Как читать TFRecord после логического вывода? - PullRequest
0 голосов
/ 12 декабря 2018

Я выполнил вывод для обнаружения объекта, используя:

PYTHONPATH=$PYTHONPATH:$(readlink -f ..) \
python -m object_detection/inference/infer_detections \
  --input_tfrecord_paths=$TF_RECORD_FILES \
  --output_tfrecord_path=${SPLIT}_detections.tfrecord-00000-of-00001 \
  --inference_graph=faster_rcnn_inception_resnet_v2_atrous_oid/frozen_inference_graph.pb \
  --discard_image_pixels

Как я могу прочитать сгенерированный файл TFRecord, чтобы увидеть обнаруженные объекты?

У меня есть следующий код

    def read_decode(fname_queue):
    reader = tf.TFRecordReader()
    key, serialized_example = reader.read(fname_queue)
    features = tf.parse_single_example(serialized_example,
                                  features = {
                                    'image/encoded': tf.FixedLenFeature([], tf.string),
                                    'image/height': tf.FixedLenFeature([],tf.int64),
                                    'image/width': tf.FixedLenFeature([], tf.int64),
                                    'image/detection/bbox/xmin': tf.FixedLenFeature([], tf.float32),
                                    'image/detection/bbox/xmax': tf.FixedLenFeature([], tf.float32),
                                    'image/detection/bbox/ymin': tf.FixedLenFeature([], tf.float32),
                                    'image/detection/bbox/ymax': tf.FixedLenFeature([], tf.float32),
                                    'image/detection/label': tf.FixedLenFeature([], tf.int64),
                                    'image/detection/score': tf.FixedLenFeature([], tf.float32,)
                                              }
                                      )
    image_encoded = features["image/encoded"]
    image_raw = tf.image.decode_png(image_encoded, channels=3)
    height = features['image/height']
    width = features['image/width']
    xmin = features['image/detection/bbox/xmin']
    ymin = features['image/detection/bbox/ymin']
    xmax = features['image/detection/bbox/xmax']
    ymax = features['image/detection/bbox/ymax']
    label = features['image/detection/label']
    score = features['image/detection/score']
    bbox = [ymin,xmin,ymax,xmax]
    return [image_raw,bbox,score,label]

current_image = read_decode(fname_queue)
with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    for i in range(1):
        image_data = sess.run([current_image])
        img = Image.fromarray(image_data[0], "RGB")
        plt.imshow(img)
    coord.request_stop()
    coord.join(threads)
    sess.close()

Но я получаю ошибку:

InvalidArgumentError: Ключ: изображение / обнаружение / bbox / xmin.Не могу разобрать сериализованный пример.[</ обнаружения / bbox / xmin "," изображение / обнаружение / bbox / ymax "," изображение / обнаружение / bbox / ymin "," изображение / обнаружение / метка "," изображение / обнаружение / оценка "," изображение / закодировано ","изображение / высота", "изображение / ширина"], dens_shapes = [[], [], [], [], [], [], [], [], []], num_sparse = 0, sparse_keys =[], sparse_types = [], _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0"] (ReaderReadV2_17: 1, ParseSingleExample_17 / Const, ParseSingleExample_17 / Const, ParseSingleExample_17 / Const, ParseSingleExample_Const, ParseSingleExample_17 / Const_4, ParseSingleExample_17 / Const, ParseSingleExample_17 / Const_6, ParseSingleExample_17 / Const_4, ParseSingleExample_17 / Const_4)]] </p>

1 Ответ

0 голосов
/ 12 декабря 2018

Просто предложение (не связанное с ошибкой), вы можете попробовать модуль tf.data вместо использования потоков, очередей и координатора, если у вас версия Tensorflow> = 1.4.Это поможет удалить строки цикла, потока и координатора из кода.

Ниже приведен комментарий из документации Tensorflow:

Примечание. В версиях TensorFlow до 1.2 мыдля производительности рекомендуется использовать многопоточные конвейеры ввода на основе очередей.Однако, начиная с TensorFlow 1.4, мы> рекомендуем вместо этого использовать модуль tf.data.(Подробнее см. Наборы данных. В TensorFlow 1.2> и 1.3 модуль назывался tf.contrib.data.) Модуль tf.data предлагает более простой в использовании интерфейс для построения эффективных входных конвейеров.Кроме того, мы прекратили> разработку старых многопоточных конвейеров ввода на основе очередей.Мы сохранили> документацию в этом файле, чтобы помочь разработчикам, которые все еще поддерживают старый код.

Подробнее см. На этой странице: https://www.tensorflow.org/guide/datasets

...