Keras 数据增强ImageDataGenerator多输入多输出实例
时间:2022-07-27
本文章向大家介绍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多输入多输出实例就是小编分享给大家的全部内容了,希望能给大家一个参考。
- 高通Audio中ASOC的machine驱动
- 《Redis设计与实现》读书笔记(三十五) ——Redis 二进制位数组及SWAR汉明重量算法
- Android TabWidget底部显示
- 《Redis设计与实现》读书笔记(三十六) ——Redis 慢查询日志实现
- 概率学中的随机变量与分布
- 神马?SQL竟然可以解脑筋急转弯的题目?
- android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值
- 基于SpringBoot的任务管理平台v1.0正式发布
- 大数据系统的Lambda架构
- AKKA中的事件流
- Java初涉感悟
- Android 6.0 Permission权限与安全机制
- SpringBoot工作机制
- Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python无头爬虫下载文件的实现
- Python基于stuck实现scoket文件传输
- Python %r和%s区别代码实例解析
- Python基础类继承重写实现原理解析
- python torch.utils.data.DataLoader使用方法
- Android自定义橡皮擦效果
- Android Canvas drawText文字居中的一些事(图解)
- Nginx+keepalived一主一从高可用,手把手带你一步一步配置!
- Behave!:一款针对页面活动的浏览器监控插件
- R可视化 | 地理信息空间(上)
- Nautilus:一款基于语法的反馈式模糊测试工具
- R可视化 | 地理信息空间(下)
- 21页优雅读博指南:佐治亚理工学院助理教授Eric Gilbert撰写,入坑前必读
- Too old resource version 引起 Flink JobManager 崩溃的问题定位
- SharpHose:一款基于C#开发的Windows异步密码喷射工具