создать набор данных тензорного потока из огромного количества изображений (*. jpg) и меток (*. mat) - PullRequest
0 голосов
/ 24 октября 2018

У меня есть огромное количество изображений с файлом меток (.mat) (я не могу использовать tf.data.Dataset.from_tensor_slices()), и я хочу использовать tf.data API для создания набора данных с тензорным потоком.

КакЯ прочитал в документации, я могу использовать tf.data.TextLineDataset для большого количества данных (мне нужно иметь текстовый файл с адресом всех изображений и отправить путь текстового файла в качестве аргумента tf.data.TextLineDataset).Затем я могу использовать метод map, чтобы прочитать текстовый файл (tf.read_file), декодировать изображение JPG (tf.image.decode_jpeg) и выполнить некоторые базовые преобразования изображения.

Однако я не могу использовать scipy.io.loadmat влюбая часть метода map, потому что у меня нет строки, указывающей путь к файлу мата.Все, что у меня есть, это tf.Tensor.

Я не думаю, что чтение всех изображений и создание из них TFRecord настолько эффективно в этом случае, потому что тогда я в основном делаю каждую вещь два раза.Однажды, прочитав все изображения и сделав TFRecord, и еще раз, прочитав TFRecord, чтобы создать набор данных tenorflow.

Есть идеи, как мне решить эту проблему?

Это мой код:

dataset = tf.data.TextLineDataset(txt_file).map(read_img_and_mat)

, а затем:

def read_img_and_mat(path):
    image_string = tf.read_file(path)
    image_decoded = tf.image.decode_jpeg(image_string, channels=3)
    label = ... # get label from mat file
    return image_decoded, label

1 Ответ

0 голосов
/ 25 октября 2018

Я нашел способ сделать это, используя tf.data.from_generator Уловка, которую я нашел, заключалась в том, чтобы создать два отдельных набора данных (один для файла mat и один для файла jpg), а затем объединить их, используя tf.data.Dataset.zip

Вот как это работает:

mat_dataset = tf.data.Dataset.from_generator(read_mat_file, tf.int64)

def read_mat_file():
    while True:
        with open('mat_addresses.txt', 'r') as input_:
            for line in input_:
                # open file and extract info from it as np.array
                yield tuple(label)  # why tuple? https://github.com/tensorflow/tensorflow/issues/13101

, чтобы получить следующую партию, которую нужно сделать:

iter = mat_dataset.make_one_shot_iterator()
sess.run(iter.get_next())

однако можно сделать img_dataset и объединить его сmat_dataset вот так:

img_dataset = tf.data.TextLineDataset('img_addresses.txt').map(read_img)

def read_img(path):
    image_string = tf.read_file(path)
    image_decoded = tf.image.decode_jpeg(image_string, channels=3)
    return image_decoded

dataset = tf.data.Dataset.zip((mat_dataset, img_dataset))

и теперь, получая следующую партию, как указано.

PS.Я понятия не имею, насколько эффективен код по сравнению с feed_dict

...