1. 程式人生 > 程式設計 >Keras 資料增強ImageDataGenerator多輸入多輸出例項

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,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多輸入多輸出例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。