Keras 数据增强ImageDataGenerator多输入多输出实例
我就废话不多说了,大家还是直接看代码吧~
importos
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]=""
importsys
importgc
importtime
importcv2
importrandom
importnumpyasnp
importpandasaspd
importseabornassns
importmatplotlib.pyplotasplt
fromtqdmimporttqdm
fromrandom_eraserimportget_random_eraser
fromkeras.preprocessing.imageimportImageDataGenerator,array_to_img,img_to_array,load_img
datagen=ImageDataGenerator(
rotation_range=20,#旋转
width_shift_range=0.1,#水平位置平移
#height_shift_range=0.2,#上下位置平移
shear_range=0.5,#错切变换,让所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移
zoom_range=[0.9,0.9],#单方向缩放,当一个数值时两个方向等比例缩放,参数为list时长宽不同程度缩放。参数大于0小于1时,执行的是放大操作,当参数大于1时,执行的是缩小操作。
channel_shift_range=40,#偏移通道数值,改变图片颜色,越大颜色越深
horizontal_flip=True,#水平翻转,垂直翻转vertical_flip
fill_mode='nearest',#操作导致图像缺失时填充方式。“constant”、“nearest”(默认)、“reflect”和“wrap”
preprocessing_function=get_random_eraser(p=0.7,v_l=0,v_h=255,s_l=0.01,s_h=0.03,r_1=1,r_2=1.5,pixel_level=True)
)
#train_generator=datagen.flow_from_directory(
#'base/Images/',
#save_to_dir='base/fake/',
#batch_size=1
#)
#foriinrange(5):
#train_generator.next()
#!
#df_train=pd.read_csv('base/Annotations/label.csv',header=None)
#df_train.columns=['image_id','class','label']
#classes=['collar_design_labels','neckline_design_labels','skirt_length_labels',
#'sleeve_length_labels','neck_design_labels','coat_length_labels','lapel_design_labels',
#'pant_length_labels']
#!
#classes=['collar_design_labels']
#!
#foriinrange(len(classes)):
#gc.enable()
##单个分类
#cur_class=classes[i]
#df_load=df_train[(df_train['class']==cur_class)].copy()
#df_load.reset_index(inplace=True)
#deldf_load['index']
##print(cur_class)
##加载数据和label
#n=len(df_load)
##n_class=len(df_load['label'][0])
##width=256
##X=np.zeros((n,width,width,3),dtype=np.uint8)
##y=np.zeros((n,n_class),dtype=np.uint8)
#print(f'startingloadtrainset{cur_class}{n}')
#sys.stdout.flush()
#foriintqdm(range(n)):
##tmp_label=df_load['label'][i]
#img=load_img('base/{0}'.format(df_load['image_id'][i]))
#x=img_to_array(img)
#x=x.reshape((1,)+x.shape)
#m=0
#forbatchindatagen.flow(x,batch_size=1):
##plt.imshow(array_to_img(batch[0]))
##print(batch)
#array_to_img(batch[0]).save(f'base/fake/{format(df_load["image_id"][i])}-{m}.jpg')
#m+=1
#ifm>3:
#break
#gc.collect()
#!
img=load_img('base/Images/collar_design_labels/2f639f11de22076ead5fe1258eae024d.jpg')
plt.figure()
plt.imshow(img)
x=img_to_array(img)
x=x.reshape((1,)+x.shape)
i=0
forbatchindatagen.flow(x,batch_size=5):
plt.figure()
plt.imshow(array_to_img(batch[0]))
#print(len(batch))
i+=1
ifi>0:
break
#多输入,设置随机种子 #Definetheimagetransformationshere gen=ImageDataGenerator(horizontal_flip=True, vertical_flip=True, width_shift_range=0.1, height_shift_range=0.1, zoom_range=0.1, rotation_range=40) #Hereisthefunctionthatmergesourtwogenerators #Weusetheexactsamegeneratorwiththesamerandomseedforboththeyandanglearrays defgen_flow_for_two_inputs(X1,X2,y): genX1=gen.flow(X1,y,batch_size=batch_size,seed=666) genX2=gen.flow(X1,X2,batch_size=batch_size,seed=666) whileTrue: X1i=genX1.next() X2i=genX2.next() #Assertarraysareequal-thiswasforpeaceofmind,butslowsdowntraining #np.testing.assert_array_equal(X1i[0],X2i[0]) yield[X1i[0],X2i[1]],X1i[1]
#手动构造,直接输出多label generator=ImageDataGenerator(rotation_range=5., width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True, vertical_flip=True) defgenerate_data_generator(generator,X,Y1,Y2): genX=generator.flow(X,seed=7) genY1=generator.flow(Y1,seed=7) whileTrue: Xi=genX.next() Yi1=genY1.next() Yi2=function(Y2) yieldXi,[Yi1,Yi2] model.fit_generator(generate_data_generator(generator,X,Y1,Y2), epochs=epochs)
defbatch_generator(generator,X,Y): Xgen=generator.flow(X) whileTrue: yieldXgen.next(),Y h=model.fit_generator(batch_generator(datagen,X_all,y_all), steps_per_epoch=len(X_all)//32+1, epochs=80,workers=3, callbacks=[EarlyStopping(patience=3),checkpointer,ReduceLROnPlateau(monitor='val_loss',factor=0.5,patience=1)], validation_data=(X_val,y_val))
补充知识:读取图片成numpy数组,裁剪并保存和数据增强(ImageDataGenerator)
我就废话不多说了,大家还是直接看代码吧~
fromPILimportImage
importnumpyasnp
fromPILimportImage
fromkeras.preprocessingimportimage
importmatplotlib.pyplotasplt
importos
importcv2
#fromscipy.miscimporttoimage
importmatplotlib
#生成图片地址和对应标签
file_dir='../train/'
image_list=[]
label_list=[]
cate=[file_dir+xforxinos.listdir(file_dir)ifos.path.isdir(file_dir+x)]
fornameincate:
temp=name.split('/')
path='../train_new/'+temp[-1]
isExists=os.path.exists(path)
ifnotisExists:
os.makedirs(path)#目录不存在则创建
class_path=name+"/"
forfileinos.listdir(class_path):
print(file)
img_obj=Image.open(class_path+file)#读取图片
img_array=np.array(img_obj)
resized=cv2.resize(img_array,(256,256))#裁剪
resized=resized.astype('float32')
resized/=255.
#plt.imshow(resized)
#plt.show()
save_path=path+'/'+file
matplotlib.image.imsave(save_path,resized)#保存
keras之数据增强
fromPILimportImage
importnumpyasnp
fromPILimportImage
fromkeras.preprocessingimportimage
importos
importcv2
#生成图片地址和对应标签
file_dir='../train/'
label_list=[]
cate=[file_dir+xforxinos.listdir(file_dir)ifos.path.isdir(file_dir+x)]
fornameincate:
image_list=[]
class_path=name+"/"
forfileinos.listdir(class_path):
image_list.append(class_path+file)
batch_size=64
iflen(image_list)<10000:
num=int(10000/len(image_list))
else:
num=0
#设置生成器参数
datagen=image.ImageDataGenerator(fill_mode='wrap',#填充模式
rotation_range=40,#指定旋转角度范围
width_shift_range=0.2,#水平位置平移
height_shift_range=0.2,#上下位置平移
horizontal_flip=True,#随机对图片执行水平翻转操作
vertical_flip=True,#对图片执行上下翻转操作
shear_range=0.2,
rescale=1./255,#缩放
data_format='channels_last')
ifnum>0:
temp=name.split('/')
path='../train_datage/'+temp[-1]
isExists=os.path.exists(path)
ifnotisExists:
os.makedirs(path)
forimage_pathinimage_list:
i=1
img_obj=Image.open(image_path)#读取图片
img_array=np.array(img_obj)
x=img_array.reshape((1,)+img_array.shape)#要求为4维
name_image=image_path.split('/')
print(name_image)
forbatchindatagen.flow(x,
batch_size=1,
save_to_dir=path,
save_prefix=name_image[-1][:-4]+'_',
save_format='jpg'):
i+=1
ifi>num:
break
以上这篇Keras数据增强ImageDataGenerator多输入多输出实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。