Импортируйте изображения в массив Numpy, затем разделите на обучающие и тестовые наборы - PullRequest
0 голосов
/ 26 мая 2020

У меня есть набор из 20000 изображений, которые я импортирую с диска, как показано ниже.

imgs_dict={}
path="Documents/data/img"
os.listdir(path)
valid_images =[".png"]

for f in os.listdir(path):
    ext= os.path.splitext(f)[1]
    if ext.lower() not in valid_images:
        continue
    img_name=os.path.basename(f)
    img_name=os.path.splitext(img_name)[0]
    img=np.asarray(Image.open(os.path.join(path,f)))
    imgs_dict.update([(img_name,img)])

Причина, по которой я конвертирую это в словарь в конце, заключается в том, что у меня также есть два других словаря, определяющих идентификатор изображения, классификация и то, является ли оно частью набора для обучения или проверки. Один из этих словарей соответствует всем данным, которые должны быть частью обучающих данных, а другой определяет те, которые должны быть частью данных проверки. После того, как я их разделю, мне нужно вернуть их в стандартный формат массива для изображений (высота, ширина, каналы). Как мне взять словарь изображений и преобразовать его обратно в формат, который мне нужен? Когда я делаю следующее, он создает массив с формой (8500,), что является количеством изображений в моем обучающем наборе, но, очевидно, не отражает высоту, ширину и каналы.

x_train=np.array(list(training_images.values()))
np.shape(x_train)
(8500,)

Или, во-вторых, я все неправильно говорю? Есть ли более простой способ обработки изображений, чем этот? Казалось бы, намного лучше просто сохранить изображения в массиве numpy с самого начала, но, насколько я могу судить, нет способа, чтобы массивы имели значение ключа / метку любого типа, поэтому я не могу вытащить специфику c изображений.

Редактировать: в качестве дополнительного контекста я, по сути, пытаюсь преобразовать свои данные в формат, подобный описанному в следующей ссылке.

https://elitedatascience.com/keras-tutorial-deep-learning-in-python

Специфическая часть c, с которой у меня возникли проблемы, заключается в следующем:

from keras.datasets import mnist

# Load pre-shuffled MNIST data into train and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()

Когда мы загружаем данные MNIST, какова связь между X_train и y_train определяется? Как я могу воспроизвести это с моими данными?

1 Ответ

0 голосов
/ 27 мая 2020

Да, в Keras есть более простой способ обработки данных изображений. В частности, при работе с большим набором данных вы хотите использовать генератор вместо загрузки всех изображений в память, поэтому, в частности, обратитесь к классу ImageDataGenerator . Этот класс в генераторе данных уже реализован в Keras, поэтому, если вам не нужны какие-либо специальные операции, et c. это может быть "go -to-guy", по крайней мере, для базовых c проектов. Это также позволит вам определять базовые c дополнения и нормализацию (например, изменение масштаба, нормализацию данных, вращение и т. Д. c.).

В частности, вы можете автоматически загружать изображения для каждого класса, организовав их в подкаталог (поместите все изображения из одной метки в один и тот же подкаталог) или создав фрейм данных, который указывает для каждого пути изображения, что это за метка. Обратитесь к flow_from_directory и flow_from_dataframe соответственно.

Для разделения поездов и тестов самый простой способ - сохранить ваш набор поездов и тестов в разных каталогах (например, data / train и data / test) и создать 2 разных генератора. Например, цифра из этого учебника:

using ImageDataGenerator

На случай, если вы не хотите ставить поезд и тестовые данные в разных каталогах, вы можете использовать аргумент validation_split при инициализации генератора (например, validation_split=0.2), затем при вызове flow_from_directory добавьте аргумент subset='validation' or subset='training'.

Имея сказал все это, в случае, если вы хотите загрузить все изображения в память, как вы это сделали, и просто легко их разделить, вы можете использовать scikit learn - train_test_split, например, как описано здесь .

PS

относительно MNIST - это хорошо зарекомендовавший себя тест, который строго определен для обучения и тестирования, поэтому каждый сможет сравнить свои оценки на одних и тех же изображениях. По этой причине он уже разделен заранее.

...