Для этого я действительно рекомендую использовать инструменты из Keras
, специально предназначенные для предварительной обработки изображений с высокой масштабируемостью и эффективностью.
from keras.preprocessing.image import ImageDataGenerator
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
1 Определите целевой размер ваших новых изображений
h,w = 150,150 # desired height and width
batch_size = 32
N_images = 100 #total number of images
Keras
работает в пакетном режиме, поэтому batch_size
просто определяет, сколько снимков будет обработано за один раз (это не влияет на конечный результат, только на скорость).
2 Создайте генератор изображений
train_datagen = ImageDataGenerator(
rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'Pictures_dir',
target_size=(h, w),
batch_size=batch_size,
class_mode = 'binary')
Объект, который будет извлекать изображение, - ImageDataGenerator
.У него есть метод flow_from_directory
, который, я считаю, может быть полезен для вас здесь.Он будет читать содержимое папки Pictures_dir
и ожидать, что ваши изображения будут находиться в папках по классам (например: Pictures_dir / class0 и Pictures_dir / class1).Генератор при вызове создаст изображения из этих папок, а также импортирует их метки (в этом примере 'class0' и 'class1').
Существует множество других аргументов для этого генератора, вы можете проверить их в документации Keras
(особенно, если вы хотите увеличить данные).
Примечание: для этого потребуется любойimage, будь то PNG или JPG, как вы и просили
Если вы хотите получить отображение имен классов на метки индексов, выполните:
train_generator.class_indices
# {'class0': 0, 'class1': 1}
Вы можете проверить, что происходит
plt.imshow(train_generator[0][0][0])
3 Извлеките все изображения с измененным размером из генератора
Теперь вы готовы извлечь изображения из ImageGenerator
:
def extract_images(generator, sample_count):
images = np.zeros(shape=(sample_count, h, w, 3))
labels = np.zeros(shape=(sample_count))
i = 0
for images_batch, labels_batch in generator: # we are looping over batches
images[i*batch_size : (i+1)*batch_size] = images_batch
labels[i*batch_size : (i+1)*batch_size] = labels_batch
i += 1
if i*batch_size >= sample_count:
# we must break after every image has been seen once, because generators yield indifinitely in a loop
break
return images, labels
images, labels = extract_images(train_generator, N_images)
print(labels[0])
plt.imshow(images[0])
Теперь у вас естьвсе изображения одного размера в images
и соответствующие им метки в labels
, которые затем можно передать в любой классификатор scikit-learn
по вашему выбору.