как включить файлы с tf.data.Dataset - PullRequest
0 голосов
/ 04 августа 2020

Я обучаю модель распознавания лиц, поэтому для Triplet Loss я должен сгенерировать пакет таким образом, чтобы он содержал фиксированное количество изображений с каждой метки. Например, Я говорю, что берет 8 изображений из 3 случайных меток каждый раз, когда он генерирует пакет для обучения, как предлагается в этом Проблема Github .

В моей папке набора данных У меня есть подпапка, которая переименована в ярлык и содержит изображения этой папки.

В данной проблеме представлено решение,

import numpy as np
import cv2

num_labels = len(path_list)
num_classes_per_batch = 3
num_images_per_class = 8

image_dirs = ["/content/drive/My Drive/smalld_processed/train/{:d}".format(i) for i in 
range(num_labels)]

## Create the list of datasets creating filenames

#datasets = [tf.data.Dataset.list_files(f"{image_dir}/*.jpg" for image_dir in image_dirs)]
datasets = [tf.data.Dataset.list_files(f"{image_dir}/*.jpg") for image_dir in image_dirs]
adk = ["{}/*.jpg".format(image_dir) for image_dir in image_dirs]
print(adk)

def generator():
    while True:
     # Sample the labels that will compose the batch
      labels = np.random.choice(range(num_labels),
                               num_classes_per_batch,
                               replace=False)
      for label in labels:
          for _ in range(num_images_per_class):
              yield label

choice_dataset = tf.data.Dataset.from_generator(generator, tf.int64)
dataset = tf.data.experimental.choose_from_datasets(datasets, choice_dataset)

## Now you read the image content
def load_image(filename):
    image = cv2.imread(filename,1)
    image = dataset.map(image, num_parallel_calls=tf.data.experimental.AUTOTUNE)
    image = image[...,::-1]
    label = int(os.path.split(os.path.dirname(filename))[1])
    image=dataset1.append()
    label=dataset2.append
    return image, label
   
dataset = dataset.map(load_image, num_parallel_calls=tf.data.experimental.AUTOTUNE)
batch_size = num_classes_per_batch * num_images_per_class
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(None)

С этим я не может загружать изображения, и он показывает мне эту ошибку.

    SystemError: <built-in function imread> returned NULL without setting an error

Не могли бы вы помочь мне исправить ошибку или любое другое предложение о том, как загружать изображения . Заранее спасибо !!

1 Ответ

0 голосов
/ 04 августа 2020

Я думаю, что в данном случае ваш cv2.imread капризничает. Сначала я бы создал простую программу, которая не выполняет чтение «на лету», а вместо этого предварительно загружает изображения для обучения на небольшом наборе данных.

Также кажется, что вы неправильно используете функцию dataset.map . Я бы порекомендовал этот учебник по функции tf.data.Dataset: http://tensorexamples.com/2020/07/27/Using-the-tf.data.Dataset.html и, возможно, этот учебник по расширению, чтобы вы могли увидеть, как правильно использовать функцию map: http://tensorexamples.com/2020/07/28/Augmentation.html.

Удачи!

...