Keras 資料增強ImageDataGenerator多輸入多輸出例項
阿新 • • 發佈:2020-07-05
我就廢話不多說了,大家還是直接看程式碼吧~
import os os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"]="" import sys import gc import time import cv2 import random import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from tqdm import tqdm from random_eraser import get_random_eraser from keras.preprocessing.image import ImageDataGenerator,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 # ) # for i in range(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'] # ! # for i in range(len(classes)): # gc.enable() # # 單個分類 # cur_class = classes[i] # df_load = df_train[(df_train['class'] == cur_class)].copy() # df_load.reset_index(inplace=True) # del df_load['index'] # # print(cur_class) # # 載入資料和label # n = len(df_load) # # n_class = len(df_load['label'][0]) # # width = 256 # # X = np.zeros((n,width,3),dtype=np.uint8) # # y = np.zeros((n,n_class),dtype=np.uint8) # print(f'starting load trainset {cur_class} {n}') # sys.stdout.flush() # for i in tqdm(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 # for batch in datagen.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 # if m>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 for batch in datagen.flow(x,batch_size=5): plt.figure() plt.imshow(array_to_img(batch[0])) # print(len(batch)) i += 1 if i >0: break
#多輸入,設定隨機種子 # Define the image transformations here 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) # Here is the function that merges our two generators # We use the exact same generator with the same random seed for both the y and angle arrays def gen_flow_for_two_inputs(X1,X2,y): genX1 = gen.flow(X1,y,batch_size=batch_size,seed=666) genX2 = gen.flow(X1,seed=666) while True: X1i = genX1.next() X2i = genX2.next() #Assert arrays are equal - this was for peace of mind,but slows down training #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) def generate_data_generator(generator,X,Y1,Y2): genX = generator.flow(X,seed=7) genY1 = generator.flow(Y1,seed=7) while True: Xi = genX.next() Yi1 = genY1.next() Yi2 = function(Y2) yield Xi,[Yi1,Yi2] model.fit_generator(generate_data_generator(generator,Y2),epochs=epochs)
def batch_generator(generator,Y): Xgen = generator.flow(X) while True: yield Xgen.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)
我就廢話不多說了,大家還是直接看程式碼吧~
from PIL import Image import numpy as np from PIL import Image from keras.preprocessing import image import matplotlib.pyplot as plt import os import cv2 # from scipy.misc import toimage import matplotlib # 生成圖片地址和對應標籤 file_dir = '../train/' image_list = [] label_list = [] cate = [file_dir + x for x in os.listdir(file_dir) if os.path.isdir(file_dir + x)] for name in cate: temp = name.split('/') path = '../train_new/' + temp[-1] isExists = os.path.exists(path) if not isExists: os.makedirs(path) # 目錄不存在則建立 class_path = name + "/" for file in os.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之資料增強
from PIL import Image import numpy as np from PIL import Image from keras.preprocessing import image import os import cv2 # 生成圖片地址和對應標籤 file_dir = '../train/' label_list = [] cate = [file_dir + x for x in os.listdir(file_dir) if os.path.isdir(file_dir + x)] for name in cate: image_list = [] class_path = name + "/" for file in os.listdir(class_path): image_list.append(class_path + file) batch_size = 64 if len(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') if num > 0: temp = name.split('/') path = '../train_datage/' + temp[-1] isExists = os.path.exists(path) if not isExists: os.makedirs(path) for image_path in image_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) for batch in datagen.flow(x,batch_size=1,save_to_dir=path,save_prefix=name_image[-1][:-4] + '_',save_format='jpg'): i += 1 if i > num: break
以上這篇Keras 資料增強ImageDataGenerator多輸入多輸出例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。