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多输入多输出实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。