TensorFlow2实战-系列教程4:数据增强:keras工具包/Data Augmentation

本文主要是介绍TensorFlow2实战-系列教程4:数据增强:keras工具包/Data Augmentation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🧡💛💚TensorFlow2实战-系列教程 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Jupyter Notebook中进行
本篇文章配套的代码资源已经上传

对于图像数据,将其进行翻转、放缩、平移、旋转操作就可以得到一组新的数据:
在这里插入图片描述

1、展示输入输出

import matplotlib.pyplot as plt
from PIL import Image
%matplotlib inline
from keras.preprocessing import image
import keras.backend as K
import os
import glob
import numpy as np
def print_result(path):name_list = glob.glob(path)fig = plt.figure(figsize=(12,16))for i in range(3):img = Image.open(name_list[i])sub_img = fig.add_subplot(131+i)sub_img.imshow(img)
img_path = './img/superman/*'
in_path = './img/'
out_path = './output/'
name_list = glob.glob(img_path)
print(name_list)
print_result(img_path)
  1. img_path 就是存放3张图像数据的路径,in_path 、out_path 暂时没用到
  2. name_list 查看一下三张数据的路径字符信息
  3. print_result就是一个专门用来打印3张图像的函数

打印结果:

[‘./img/superman\00000008.jpg’,
‘./img/superman\00000009.jpg’,
‘./img/superman\00000010.jpg’]

在这里插入图片描述

2、调整图像大小

datagen = image.ImageDataGenerator()
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False,  save_to_dir=out_path+'resize',save_prefix='gen', target_size=(224, 224))
  1. 创建一个数据增强的实例
  2. 指定参数加载图像数据
  3. save_to_dir=out_path+‘resize’,用到了前面的输出路径
  4. 指定了target_size参数后图像都会被重置成这个尺寸
for i in range(3):gen_data.next()
print_result(out_path+'resize/*')

从数据生成器中获取数据,将图像打印出来
打印结果:
在这里插入图片描述

3、旋转图像

datagen = image.ImageDataGenerator(rotation_range=45)
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(in_path, batch_size=1, class_mode=None, shuffle=True, target_size=(224, 224))
np_data = np.concatenate([data.next() for i in range(data.n)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False, save_to_dir=out_path+'rotation_range',save_prefix='gen', target_size=(224, 224))
for i in range(3):gen_data.next()
print_result(out_path+'rotation_range/*')
  1. 创建一个旋转的数据增强实例,
  2. 创建一个数据增强实例,实际上就是直接加载数据
  3. 将加载的图像数据重置尺寸
  4. 将重置尺寸的图像转换成ndarray格式
  5. 将旋转数据增强应用到重置尺寸的图像数据中
  6. 使用数据增强生成器重新从目录加载数据
  7. 保存加载的数据
  8. 使用for循环:
  9. 生成并处理三个图像,由于设置了 save_to_dir,这些图像将被保存。
  10. 打印三个图像

打印结果:

Found 3 images belonging to 1 classes.
Found 3 images belonging to 1 classes.

在这里插入图片描述

4、平移变换

datagen = image.ImageDataGenerator(width_shift_range=0.3,height_shift_range=0.3)
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(in_path, batch_size=1, class_mode=None, shuffle=True, target_size=(224, 224))
np_data = np.concatenate([data.next() for i in range(data.n)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False, save_to_dir=out_path+'shift',save_prefix='gen', target_size=(224, 224))
for i in range(3):gen_data.next()
print_result(out_path+'shift/*')

与3中不同的是,这段代码是进行平移变换进行数据增强,指定了平移变换的参数,width_shift_range=0.3,height_shift_range=0.3,这两个参数分别表示会在水平方向和垂直方向±30%的范围内随机移动

打印结果:

Found 3 images belonging to 1 classes.
Found 3 images belonging to 1 classes.

在这里插入图片描述

datagen = image.ImageDataGenerator(width_shift_range=-0.3,height_shift_range=0.3)
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(in_path, batch_size=1, class_mode=None, shuffle=True, target_size=(224, 224))
np_data = np.concatenate([data.next() for i in range(data.n)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False, save_to_dir=out_path+'shift2',save_prefix='gen', target_size=(224, 224))
for i in range(3):gen_data.next()
print_result(out_path+'shift2/*')

由于是随机的,这两段代码完全一样,但是结果却不同
打印结果:

Found 3 images belonging to 1 classes.
Found 3 images belonging to 1 classes.
在这里插入图片描述

5、缩放

datagen = image.ImageDataGenerator(zoom_range=0.5)
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(in_path, batch_size=1, class_mode=None, shuffle=True, target_size=(224, 224))
np_data = np.concatenate([data.next() for i in range(data.n)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False, save_to_dir=out_path+'zoom',save_prefix='gen', target_size=(224, 224))
for i in range(3):gen_data.next()
print_result(out_path+'zoom/*')

这段代码与3中不同的就是,这里指定缩放参数来进行缩放数据增强
打印结果:

Found 3 images belonging to 1 classes.
Found 3 images belonging to 1 classes.

在这里插入图片描述

6、channel_shift

datagen = image.ImageDataGenerator(channel_shift_range=15)
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(in_path, batch_size=1, class_mode=None, shuffle=True, target_size=(224, 224))
np_data = np.concatenate([data.next() for i in range(data.n)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False, save_to_dir=out_path+'channel',save_prefix='gen', target_size=(224, 224))
for i in range(3):gen_data.next()
print_result(out_path+'channel/*')

这段代码与3中不同的就是,这里指定通道偏移参数来进行通道偏移数据增强
打印结果:

Found 3 images belonging to 1 classes.
Found 3 images belonging to 1 classes.
在这里插入图片描述

7、水平翻转

datagen = image.ImageDataGenerator(horizontal_flip=True)
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(in_path, batch_size=1, class_mode=None, shuffle=True, target_size=(224, 224))
np_data = np.concatenate([data.next() for i in range(data.n)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False, save_to_dir=out_path+'horizontal',save_prefix='gen', target_size=(224, 224))
for i in range(3):gen_data.next()
print_result(out_path+'horizontal/*')

这段代码与3中不同的就是,这里指定水平翻转参数来进行水平翻转数据增强
在这里插入图片描述

8、rescale重新缩放

datagen = image.ImageDataGenerator(rescale= 1/255)
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(in_path, batch_size=1, class_mode=None, shuffle=True, target_size=(224, 224))
np_data = np.concatenate([data.next() for i in range(data.n)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False, save_to_dir=out_path+'rescale',save_prefix='gen', target_size=(224, 224))
for i in range(3):gen_data.next()
print_result(out_path+'rescale/*')

这段代码与3中不同的就是,这里指定rescale重新缩放参数来进行rescale重新缩放数据增强
通常用于归一化图像数据。将图像像素值从 [0, 255] 缩放到 [0, 1] 范围,有助于模型的训练
在这里插入图片描述

9、填充方法

  • ‘constant’: kkkkkkkk|abcd|kkkkkkkk (cval=k)
  • ‘nearest’: aaaaaaaa|abcd|dddddddd
  • ‘reflect’: abcddcba|abcd|dcbaabcd
  • ‘wrap’: abcdabcd|abcd|abcdabcd
datagen = image.ImageDataGenerator(fill_mode='wrap', zoom_range=[4, 4])
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(in_path, batch_size=1, class_mode=None, shuffle=True, target_size=(224, 224))
np_data = np.concatenate([data.next() for i in range(data.n)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False, save_to_dir=out_path+'fill_mode',save_prefix='gen', target_size=(224, 224))
for i in range(3):gen_data.next()
print_result(out_path+'fill_mode/*')
  • fill_mode='wrap':当应用几何变换后,图像中可能会出现一些新的空白区域。fill_mode 定义了如何填充这些空白区域。在这种情况下,使用 'wrap' 模式,意味着空白区域将用图像边缘的像素“包裹”填充。
  • zoom_range=[4, 4]:这设置了图像缩放的范围。在这里,它被设置为在 4 倍范围内进行随机缩放。由于最小和最大缩放因子相同,这将导致所有图像都被放大 4 倍

用原图像填充,任何超出原始图像边界的区域将被图像的对边界像素填充
在这里插入图片描述

datagen = image.ImageDataGenerator(fill_mode='nearest', zoom_range=[4, 4])
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(in_path, batch_size=1, class_mode=None, shuffle=True, target_size=(224, 224))
np_data = np.concatenate([data.next() for i in range(data.n)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(in_path, batch_size=1, shuffle=False, save_to_dir=out_path+'nearest',save_prefix='gen', target_size=(224, 224))
for i in range(3):gen_data.next()
print_result(out_path+'nearest/*')

使用最近点填充,每个空白区域的像素将取其最近的非空白区域的像素值
在这里插入图片描述

这篇关于TensorFlow2实战-系列教程4:数据增强:keras工具包/Data Augmentation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656671

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转