您好,登錄后才能下訂單哦!
這篇文章主要介紹關于Keras數據增強ImageDataGenerator多輸入多輸出的案例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
我就廢話不多說了,大家還是直接看代碼吧~
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, 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,X2, batch_size=batch_size,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, X, Y1, Y2), epochs=epochs)
def batch_generator(generator,X,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多輸入多輸出的案例的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。