我们可以使用带有flow_from_directory方法的ImageDataGenerator生成图像数据集。对于调用类的列表,我们可以使用oject.classes。但是,如何调用值列表?我已经搜索过,但仍未找到任何内容。
谢谢:)
答案 0 :(得分:6)
ImageDataGenerator是一个python生成器,每次都会生成一组数据,其形状与模型输入(如(batch_size,width,height,channels)
)相同。生成器的好处是当您的数据集太大时,您无法将所有数据放入有限的内存中,但是,使用生成器,您每次都可以生成一个批处理数据。 ImageDataGenerator与model.fit_generator(), model.predict_generator()
一起使用。
如果您想获取数字数据,可以使用生成器的next()
函数:
import numpy as np
data_gen = ImageDataGenerator(rescale = 1. / 255)
data_generator = datagen.flow_from_directory(
data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical')
data_list = []
batch_index = 0
while batch_index <= data_generator.batch_index:
data = data_generator.next()
data_list.append(data[0])
batch_index = batch_index + 1
# now, data_array is the numeric data of whole images
data_array = np.asarray(data_list)
或者,您可以自己使用PIL
和numpy
处理图片:
from PIL import Image
import numpy as np
def image_to_array(file_path):
img = Image.open(file_path)
img = img.resize((img_width,img_height))
data = np.asarray(img,dtype='float32')
return data
# now data is a tensor with shape(width,height,channels) of a single image.
然后,您可以使用此功能循环所有图像以获取数字数据。
注意,我建议您使用生成器而不是直接获取所有数据,或者,您可能会耗尽内存。
答案 1 :(得分:0)
“但是,如何调用值列表”-如果我理解正确,我想你想知道数据集中所有文件的内容-如果正确(或不正确),则可以通过多种方式可以从生成器中获取值:
Object.filenames返回目标文件夹中所有文件的列表。我只是使用len(object.filename)函数来获取测试文件夹中的文件总数。然后将该数字传回我的生成器,然后再次运行。
获取测试文件夹中所有项目编号的另一种方法是生成器。n
我只是用它,因为我的测试数据集非常小(60张图像),并且我正在使用提取的特征来训练和预测我的模型(即特征阵列而不是图像阵列)。 如果您要构建普通模型,则使用生成器生成批次是更好的方法。
def generate_test_data_from_directory(folder_path, image_target_size = 224, batch_size = 5, channels = 3, class_mode = 'sparse' ): '''fetch all out test data from directory''' test_datagen = ImageDataGenerator(rescale=1./255) test_generator = test_datagen.flow_from_directory( folder_path , target_size = (image_target_size, image_target_size), batch_size = batch_size, class_mode = class_mode) total_images = test_generator.n steps = total_images//batch_size #iterations to cover all data, so if batch is 5, it will take total_images/5 iteration x , y = [] , [] for i in range(steps): a , b = test_generator.next() x.extend(a) y.extend(b) return np.array(x), np.array(y)