tensorflow2.0 读取图片数据总结

大部分的教程讲解的都是MNIST等已经为用户打包封装好的数据集,用户只需要load_data即可实现数据导入。但是在我们平时使用时,无论您是做分类还是检测或者分割任务,我们不可能每次都能找到打包好的数据集使用,大多数时候我们使用的都是自己的数据集,也就是我们需要从本地读取文件。因此我们是很有必要学会数据预处理这个本领的。本篇文章,我们就聊聊如何使用TensorFlow2.0对自己的数据集进行处理。
在TensorFlow2.0中,对数据处理的方法有很多种,下面我主要介绍两种我自认为最好用的数据预处理的方法。关于之前1.x版本的管道方式,在tf2.0中已经被取消。

1. 使用Keras API对数据进行预处理
在TensorFlow2.0的高级API Keras中有个比较好用的图像处理的类ImageDataGenerator,它可以将本地图像文件自动转换为处理好的张量。

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_data_dir = r"D://Learning//tensorflow_2.0//smile//data//train"

val_data_dir = r"D://Learning//tensorflow_2.0//smile//data//val"

img_width,img_height = 48,48

batch_size = 16

train_datagen = ImageDataGenerator(

       rescale=1./255,

       shear_range=0.2,

       horizontal_flip=True)

val_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(

       train_data_dir,

       target_size=(img_width, img_height),

       batch_size=batch_size)

val_generator = val_datagen.flow_from_directory(

       val_data_dir,

       target_size=(img_width, img_height),

       batch_size=batch_size)

在上面的代码中,我们首先导入ImageDataGenerator,即下面代码:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

ImageDataGenerator是tensorflow.keras.preprocessing.image模块中的图片生成器,同时也可以使用它在batch中对数据进行增强,扩充数据集大小,从而增强模型的泛化能力。

ImageDataGenerator中有众多的参数,如下:

tf.keras.preprocessing.image.ImageDataGenerator(

featurewise_center=False,

samplewise_center=False,

featurewise_std_normalization=False,

samplewise_std_normalization=False,

zca_whitening=False,

zca_epsilon=1e-6,

rotation_range=0.,

width_shift_range=0.,

height_shift_range=0.,

brightness_range,

shear_range=0.,

zoom_range=0.,

channel_shift_range=0.,

fill_mode=‘nearest’,

cval=0.,

horizontal_flip=False,

vertical_flip=False,

rescale=None,

preprocessing_function=None,

data_format=K.image_data_format())

具体含义如下:

featurewise_center:布尔值,使输入数据集去中心化(均值为0)

samplewise_center:布尔值,使输入数据的每个样本均值为0。

featurewise_std_normalization:布尔值,将输入除以数据集的标准差以完成标准化。

samplewise_std_normalization:布尔值,将输入的每个样本除以其自身的标准差。

zca_whitening:布尔值,对输入数据施加ZCA白化。

rotation_range:整数,数据增强时图片随机转动的角度。随机选择图片的角度,是一个0180的度数,取值为0180。

width_shift_range:浮点数,图片宽度的某个比例,数据增强时图片随机水平偏移的幅度。

height_shift_range:浮点数,图片高度的某个比例,数据增强时图片随机竖直偏移的幅度。

shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)。是用来进行剪切变换的程度。

zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range,1+zoom_range]。用来进行随机的放大。

channel_shift_range:浮点数,随机通道偏移的幅度。

fill_mode:‘constant’,‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理。

cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值。

horizontal_flip:布尔值,进行随机水平翻转。随机的对图片进行水平翻转,这个参数适用于水平翻转不影响图片语义的时候。

vertical_flip:布尔值,进行随机竖直翻转。

rescale: 值将在执行其他处理前乘到整个图像上,我们的图像在RGB通道都是0255的整数,这样的操作可能使图像的值过高或过低,所以我们将这个值定为01之间的数。

preprocessing_function: 将被应用于每个输入的函数。该函数将在任何其他修改之前运行。该函数接受一个参数,为一张图片(秩为3的numpy array),并且输出一个具有相同shape的numpy array。

我们再看下ImageGenerator类下的函数flow_from_diectory。从这个函数名,我们也明白其就是从文件夹中读取图像。

train_generator = train_datagen.flow_from_directory(

   train_data_dir,

   target_size=(img_width, img_height),

   batch_size=batch_size)

flow_from_diectory中有如下参数:

directory:目标文件夹路径,对于每一个类,该文件夹都要包含一个子文件夹。

target_size:整数tuple,默认为(256, 256)。图像将被resize成该尺寸

color_mode:颜色模式,为"grayscale"和"rgb"之一,默认为"rgb",代表这些图片是否会被转换为单通道或三通道的图片。

classes:可选参数,为子文件夹的列表,如[‘smile’,‘neutral’],默认为None。若未提供,则该类别列表将从directory下的子文件夹名称/结构自动推断。每一个子文件夹都会被认为是一个新的类。(类别的顺序将按照字母表顺序映射到标签值)。

class_mode: “categorical”, “binary”, "sparse"或None之一。默认为"categorical。该参数决定了返回的标签数组的形式,"categorical"会返回2D的one-hot编码标签,"binary"返回1D的二值标签。"sparse"返回1D的整数标签,如果为None则不返回任何标签,生成器将仅仅生成batch数据。

batch_size:batch数据的大小,默认32。

shuffle:是否打乱数据,默认为True。

seed:可选参数,打乱数据和进行变换时的随机数种子。

save_to_dir:None或字符串,该参数能让你将数据增强后的图片保存起来,用以可视化。

save_prefix:字符串,保存数据增强后图片时使用的前缀, 仅当设置了save_to_dir时生效。

save_format:“png"或"jpeg"之一,指定保存图片的数据格式,默认"jpeg”。

这些参数中的directory一定要弄清楚,它是指类别文件夹的上一层文件夹,在该数据集中,类别文件夹为smile和neutral,它的上一级文件夹是train。所以director为 r"D://Learning//tensorflow_2.0//smile//data//train"

另外,class这个参数也要注意,通常我们就采用默认None,directory的子文件夹就是标签。在该分类任务中标签就是smile和neutral。

另外有几个ImageDataGenerator 有几点需要说明一下 ImageDataGenerator 作为一个图片生成器,默认情况下会打乱数据,并且数据会无限循环。ImageDataGenerator生成的onehot编码,ImageDataGenerator.class_indices可以查看到每个编码对应的分类。包括所有的文件名,都可以自行debug在ImageDataGenerator对象中找出相对应的属性。

2、第二种方法就是使用传统的dataset 构建数据集,这种方法,必须自定义的去读取文件夹中图片资源,并且去自定义图片的分类等,所有数据需要自行封装,

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值