keras中有很多封装好的API可以帮助我们实现对图片数据的读取和处理。
比如 : keras.preprocessing.image.ImageDataGenerator.flow_from_directory( ) 这个函数
这个函数的参数包括:
flow_from_directory(self, directory,
target_size=(256, 256), color_mode='rgb',
classes=None, class_mode='categorical',
batch_size=32, shuffle=True, seed=None,
save_to_dir=None,
save_prefix='',
save_format='jpeg',
follow_links=False)
使用flow_from_directory最值得注意的是directory这个参数:
directory: path to the target directory. It should contain one subdirectory per class. Any PNG, JPG, BMP, PPM or TIF images inside each of the subdirectories directory tree will be included in the generator.
这是官方文档的定义,它的目录格式一定要注意是包含一个子目录下的所有图片这种格式,driectoty路径只要写到标签路径上面的那个路径即可。
target_size:可是实现对图片的尺寸转换,是预处理中比较常用的方法
save_to_dir: 可以设置保存处理后图片的路径。
save_prefix: 可以对处理后图片设置前缀。
举个例子:
这个路径结构,注意train路径
import matplotlib.pyplot as plt
import glob
from PIL import Image
from keras.preprocessing import image
path = 'train/'
gen_path = 'result/'
def print_result(path):
name_list = glob.glob(path)
fig = plt.figure()
for i in range(9):
img = Image.open(name_list[i])
# add_subplot(331) 参数一:子图总行数,参数二:子图总列数,参数三:子图位置
sub_img = fig.add_subplot(331 + i)
sub_img.imshow(img)
plt.show()
return fig
# 打印图片列表
name_list = glob.glob(path + '*/*')
print(name_list)
# ['train\\00a366d4b4a9bbb6c8a63126697b7656.jpg', 'train\\00f34ac0a16ef43e6fd1de49a26081ce.jpg', 'train\\0a5f744c5077ad8f8d580081ba599ff5.jpg', 'train\\0a70f64352edfef4c82c22015f0e3a20.jpg', 'train\\0a783538d5f3aaf017b435ddf14cc5c2.jpg', 'train\\0a896d2b3af617df543787b571e439d8.jpg', 'train\\0abdda879bb143b19e3c480279541915.jpg', 'train\\0ac12f840df2b15d46622e244501a88c.jpg', 'train\\0b6c5bc46b7a0e29cddfa45b0b786d09.jpg']
# 打印图片
fig = print_result(path + '*/*')
# 保存图片
fig.savefig(gen_path + '/original_0.png', dpi=200, papertype='a5')
# 原图
datagen = image.ImageDataGenerator()
gen_data = datagen.flow_from_directory(path, batch_size=1, shuffle=False, save_to_dir=gen_path ,
save_prefix='dog_gen', target_size=(224, 224))
for i in range(9):
gen_data.next()
fig = print_result(gen_path + '/*')
fig.savefig(gen_path + '/original_1.png', dpi=200, papertype='a5')
--------------------- 有了上面的基础,咱们来个难点的------------------------------------
接下来,给出我自己目前积累的代码,从目录中自动读取图像,并产生generator:
第一步:建立好目录结构和图像
可以看到目录images_keras_dict下有次级目录,次级目录下就直接包含照片了
第二步:写代码建立预处理程序
# 先进行预处理图像
train_datagen = ImageDataGenerator(rescale=1./255,
rotation_range=50,
height_shift_range=[-0.005, 0, 0.005],
width_shift_range=[-0.005, 0, 0.005],
horizontal_flip=True,
fill_mode='reflect')
#再对预处理图像指定从目录中读取数据,可以看到我的目录最核心的地方是images_keras_dict(可以对照上一张图片)
train_generator = train_datagen.flow_from_directory('AgriculturalDisease_trainingset/images_keras_dict',
target_size=(height, width), batch_size=16)
val_datagen = ImageDataGenerator(rescale=1./255)
val_generator = val_datagen.flow_from_directory('AgriculturalDisease_validationset/images_keras_dict', target_size=(height, width),
batch_size=64)
save_weights = ModelCheckpoint(filepath='models/best_weights.hdf5',monitor='val_loss', verbose=1, save_best_only=True)
# 最后在fit_generator 中放入生成器的函数train_generator
model.fit_generator(train_generator,
steps_per_epoch=times_train,
verbose=1,
epochs=300,
initial_epoch=0,
validation_data=val_generator,
validation_steps=times_val,
callbacks=[save_weights, TrainValTensorBoard(write_graph=False)])
第三步:写入fit_generator进行训练
已经写在第二步的代码中。
第四步:写predict_generator进行预测**
首先我们需要建立同样的目录结构。把包含预测图片的次级目录放在一个文件夹下,这个文件夹名就是关键文件夹。
这里我的关键文件夹是test文件夹
# 建立预处理
predict_datagen = ImageDataGenerator(rescale=1./255)
predict_generator = predict_datagen.flow_from_directory('AgriculturalDisease_validationset/test',
target_size=(height, width), batch_size=128)
# predict_generator.reset()
# 利用predict_generator进行预测
pred = model.predict_generator(predict_generator, max_queue_size=10, workers=1, verbose=1)
# 利用几个属性来读取文件夹和对应的分类
train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=40, fill_mode='wrap')
train_generator = train_datagen.flow_from_directory('new_images', target_size=(height, width), batch_size=96)
labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
# 还可以知道图片的名字
filenames = predict_generator.filenames
原文:https://blog.csdn.net/u012193416/article/details/79368855