Tensorflow 2.4加载处理图片的三种方式详解

目录
  • 前言
  • 数据准备
  • 使用内置函数读取并处理磁盘数据
  • 自定义方式读取和处理磁盘数据
  • 从网络上下载数据

前言

本文通过使用 cpu 版本的 tensorflow 2.4 ,介绍三种方式进行加载和预处理图片数据。

这里我们要确保 tensorflow 在 2.4 版本以上 ,python 在 3.8 版本以上,因为版本太低有些内置函数无法使用,然后要提前安装好 pillow 和 tensorflow_datasets ,方便进行后续的数据加载和处理工作。

由于本文不对模型进行质量保证,只介绍数据的加载、处理过程,所以只将模型简单训练即可。

本文大纲

  • 使用内置函数读取并处理磁盘数据
  • 自定义方式读取和处理磁盘数据
  • 从网络上下载数据

数据准备

首先我们先准备本文的图片数据,这里我们直接使用 tensorflow 的内置函数,从网络上面下载了一份花朵照片数据集,也可以直接用下面的链接使用迅雷下载。

数据目录里面包含 5 个子目录,每个子目录对应一个类,分别是雏菊、蒲公英、玫瑰、向日葵、郁金香,图片总共有 3670 张。

import pathlib
import numpy as np
import os
import PIL
import PIL.Image
import tensorflow as tf
import tensorflow_datasets as tfds
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file(origin=dataset_url, fname='flower_photos', untar=True)
data_dir = pathlib.Path(data_dir)
image_count = len(list(data_dir.glob('*/*.jpg')))

使用内置函数读取并处理磁盘数据

(1)使用 KERAS 内置的函数 image_dataset_from_directory 从本地进行数据的加载,首先定义 batch_size 为 32 ,每张图片维度大小为 (64,64,3) ,也就是长、宽有 64 个像素点,这里的长、宽像素点数量可以自行修改,需要注意的是数字越大图片越清晰但是后续的计算量会越大,数字越小图片越模糊但是后续的计算量越小。

每个像素点是一个 3 维的 RGB 颜色向量。而每个图片对应的标签是一个花朵类别的字符串。

我们使用 image_dataset_from_directory 选用了数据中 80% (2936 张)的图片进行训练,20% (734 张)的图片来进行模型效果的验证。

我们将这 5 种图片类别定义为 daisy、 dandelion、roses、 sunflowers、 tulips 保存于 class_names 。

batch_size = 32
height = 64
width = 64
train_datas = tf.keras.preprocessing.image_dataset_from_directory( data_dir, validation_split=0.2, subset="training", seed=0,
                                                                 image_size=(height, width), batch_size=batch_size)
val_datas = tf.keras.preprocessing.image_dataset_from_directory(  data_dir, validation_split=0.2, subset="validation", seed=0,
                                                                image_size=(height, width), batch_size=batch_size)
class_names = train_datas.class_names

(2)常规的训练流程是我们从磁盘加载好一份数据训练一模型,再去加载下一份数据去训练模型,然后重复这个过程,但是有时候数据集的准备处理非常耗时,使得我们在每次训练前都需要花费大量的时间准备待训练的数据,而此时 CPU 只能等待数据,造成了计算资源和时间的浪费。

(3)在从磁盘加载图片完成后,Dataset.cache() 会将这些图像保留在内存中,这样可以快速的进行数据的获取,如果数据量太大也可以建立缓存。

(4)我们使用 prefetch() 方法,使得我们可以让 Dataset 在训练时预先准备好若干个条数据样本,每次在模型训练的时候都能直接拿来数据进行计算,避免了等待耗时,提高了训练效率。

AUTOTUNE = tf.data.AUTOTUNE
train_datas = train_datas.cache().prefetch(buffer_size=AUTOTUNE)
val_datas = val_datas.cache().prefetch(buffer_size=AUTOTUNE)

(5)这里主要是完成模型的搭建、编译和训练:

  • 第一层使用缩放函数 Rescaling 来将 RGB 值压缩,因为每个像素点上代表颜色的 RGB 的三个值范围都是在 0-255 内,所以我们要对这些值进行归一化操作,经过此操作 RGB 三个值的范围被压缩到 0-1 之间,这样可以加速模型的收敛
  • 第二、三、四层都是使用了卷积函数,卷积核大小为 3 ,输出一个 32 维的卷积结果向量,并使用 relu 激活函数进行非线性变换,并在卷积之后加入了最大池化层
  • 第五层完成了将每张照片的卷积结果向量从三维重新拼接压缩成一维
  • 第六层是一个输出为 128 的全连接层,并使用 relu 激活函数进行非线性变换
  • 第七层室一个输出为 5 的全连接层,也就是输出层,输出该图片分别属于这 5 种类别的概率分布

优化器选择 Adam

损失函数选择 SparseCategoricalCrossentropy

评估指标选择 Accuracy

  model = tf.keras.Sequential([   tf.keras.layers.experimental.preprocessing.Rescaling(1./255),
                                  tf.keras.layers.Conv2D(32, 3, activation='relu'), tf.keras.layers.MaxPooling2D(),
                                  tf.keras.layers.Conv2D(32, 3, activation='relu'), tf.keras.layers.MaxPooling2D(),
                                  tf.keras.layers.Conv2D(32, 3, activation='relu'), tf.keras.layers.MaxPooling2D(),
                                  tf.keras.layers.Flatten(),
                                  tf.keras.layers.Dense(128, activation='relu'),
                                  tf.keras.layers.Dense(5) ])
  model.compile( optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
  model.fit( train_datas, validation_data=val_datas, epochs=5 )

输出结果:

Epoch 1/5
92/92 [==============================] - 10s 101ms/step - loss: 1.5019 - accuracy: 0.3167 - val_loss: 1.1529 - val_accuracy: 0.5177
Epoch 2/5
92/92 [==============================] - 6s 67ms/step - loss: 1.1289 - accuracy: 0.5244 - val_loss: 1.0833 - val_accuracy: 0.5736
...
Epoch 5/5
92/92 [==============================] - 6s 65ms/step - loss: 0.8412 - accuracy: 0.6795 - val_loss: 1.0528 - val_accuracy: 0.6172

自定义方式读取和处理磁盘数据

(1)上面的过程都是内置的工具包直接将数据进行处理,虽然比较方便,但是可能不够灵活,而在这里我们可以自己手动操作,按照自己的想法将数据进行处理。

(2)从硬盘中读取指定目录中的所有的花朵图片的绝对路径,也就是读取出来的只是图片的绝对路径字符串,如在我的计算机上第一张图片的绝对路径是

C:\Users\QJFY-VR\.keras\datasets\flower_photos\roses\24781114_bc83aa811e_n.jpg

然后先将这些数据进行打乱,取 20% 为验证集,取 80% 为训练集。

datas = tf.data.Dataset.list_files(str(data_dir/'*/*'), shuffle=False)
datas = datas.shuffle(image_count, reshuffle_each_iteration=False)
val_size = int(image_count * 0.2)
train_datas = datas.skip(val_size)
val_datas = datas.take(val_size)

(3)对训练集和测试集中的每条数据都进行处理,获得最终的图片内容和对应的图片标签:

每张图片的标签,都是通过对每张图片的绝对路径中提取出来的,使用 \ 分隔符将绝对路径分割成列表,然后取倒数第二个字符串就是其类别标签,并将其转换成 one-hot 向量

每张图片的内容都是通过加载绝对路径,将加载出来的图片内容像素进行指定 height、width 的大小调整进行变化的

  def get_label(file_path):
      parts = tf.strings.split(file_path, os.path.sep)
      return tf.argmax(parts[-2] == class_names)
  def decode_img(img):
      return tf.image.resize(tf.io.decode_jpeg(img, channels=3), [height, width])
  def process_path(file_abs_path):
      label = get_label(file_abs_path)
      img = decode_img(tf.io.read_file(file_abs_path))
      return img, label
  train_datas = train_datas.map(process_path, num_parallel_calls=AUTOTUNE)
  val_datas = val_datas.map(process_path, num_parallel_calls=AUTOTUNE)

(4)将获得的测试集和训练集通过 cache() 保存于内存中,并同样使用 prefetch() 提前加载要使用的数据,使用 shuffle() 将数据进行打散,使用 batch() 每次获取 batch_size 个样本。

(5)使用训练数据训练 5 个 epoch ,并使用验证集进行指标评估 。由于 model 已经被上面的数据进行过训练,所以这里训练过程中从一开始就能看出来 val_accuracy较高。

def configure_for_performance(ds):
    ds = ds.cache().prefetch(buffer_size=AUTOTUNE)
    ds = ds.shuffle(buffer_size=1000).batch(batch_size)
    return ds
train_datas = configure_for_performance(train_datas)
val_datas = configure_for_performance(val_datas)
model.fit( train_datas, validation_data=val_datas, epochs=5 )

结果输出:

Epoch 1/5
92/92 [==============================] - 11s 118ms/step - loss: 0.1068 - accuracy: 0.9680 - val_loss: 0.1332 - val_accuracy: 0.9537
Epoch 2/5
92/92 [==============================] - 10s 113ms/step - loss: 0.0893 - accuracy: 0.9721 - val_loss: 0.0996 - val_accuracy: 0.9673
...
Epoch 5/5
92/92 [==============================] - 10s 112ms/step - loss: 0.0328 - accuracy: 0.9939 - val_loss: 0.1553 - val_accuracy: 0.9550

从网络上下载数据

上面的两个方式都是从本地读取磁盘数据,除此之外我们还可以通过网络来获取数据并进行处理,tfds 中为我们准备了很多种类的数据,包括音频、文本、图片、视频、翻译等数据,通过内置函数 tfds.load 从网络上即可下载指定的数据,这里我们从网络上下载了 tf_flowers 数据,其实就是我们上面用到的磁盘中的花朵磁盘数据数据。

(train_datas, val_datas, test_datas), metadata = tfds.load(  'tf_flowers', split=['train[:70%]', 'train[70%:90%]', 'train[90%:]'], with_info=True, as_supervised=True)
train_datas = configure_for_performance(train_datas)
val_datas = configure_for_performance(val_datas)
test_datas = configure_for_performance(test_datas)

加载出来数据之后,后面处理的方式可以自行选择,和上面的两种大同小异。

以上就是Tensorflow 2.4加载处理图片的三种方式详解的详细内容,更多关于Tensorflow 加载处理图片的资料请关注我们其它相关文章!

(0)

相关推荐

  • Tensorflow高性能数据优化增强工具Pipeline使用详解

    目录 安装方法 功能 高级用户部分 用例1,为训练创建数据Pipeline 用例2,为验证创建数据Pipeline 初学者部分 Keras 兼容性 配置 增强: GridMask MixUp RandomErase CutMix Mosaic CutMix , CutOut, MixUp Mosaic Grid Mask 安装方法 给大家介绍一个非常好用的TensorFlow数据pipeline工具. 高性能的Tensorflow Data Pipeline,使用SOTA的增强和底层优化. pi

  • python深度学习tensorflow卷积层示例教程

    目录 一.旧版本(1.0以下)的卷积函数:tf.nn.conv2d 二.1.0版本中的卷积函数:tf.layers.conv2d 一.旧版本(1.0以下)的卷积函数:tf.nn.conv2d 在tf1.0中,对卷积层重新进行了封装,比原来版本的卷积层有了很大的简化. conv2d( input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None ) 该函数定义在tensorflow/pytho

  • python深度学习tensorflow训练好的模型进行图像分类

    目录 正文 随机找一张图片 读取图片进行分类识别 最后输出 正文 谷歌在大型图像数据库ImageNet上训练好了一个Inception-v3模型,这个模型我们可以直接用来进来图像分类. 下载链接: https://pan.baidu.com/s/1XGfwYer5pIEDkpM3nM6o2A 提取码: hu66 下载完解压后,得到几个文件: 其中 classify_image_graph_def.pb 文件就是训练好的Inception-v3模型. imagenet_synset_to_huma

  • python深度学习tensorflow1.0参数初始化initializer

    目录 正文 所有初始化方法定义 1.tf.constant_initializer() 2.tf.truncated_normal_initializer() 3.tf.random_normal_initializer() 4.random_uniform_initializer = RandomUniform() 5.tf.uniform_unit_scaling_initializer() 6.tf.variance_scaling_initializer() 7.tf.orthogona

  • Tensorflow2.4使用Tuner选择模型最佳超参详解

    目录 前言 实现过程 1. 获取 MNIST 数据并进行处理 2. 搭建超模型 3. 实例化调节器并进行模型超调 4. 训练模型获得最佳 epoch 5. 使用最有超参数集进行模型训练和评估 前言 本文使用 cpu 版本的 tensorflow 2.4 ,选用 Keras Tuner 工具以 Fashion 数据集的分类任务为例,完成最优超参数的快速选择任务. 当我们搭建完成深度学习模型结构之后,我们在训练模型的过程中,有很大一部分工作主要是通过验证集评估指标,来不断调节模型的超参数,这是比较耗

  • Tensorflow2.1 完成权重或模型的保存和加载

    目录 前言 实现方法 1. 读取数据 2. 搭建深度学习模型 3. 使用回调函数在每个 epoch 后自动保存模型权重 4. 使用回调函数每经过 5 个 epoch 对模型权重保存一次 5. 手动保存模型权重到指定目录 6. 手动保存整个模型结构和权重 前言 本文主要使用 cpu 版本的 tensorflow-2.1 来完成深度学习权重参数/模型的保存和加载操作. 在我们进行项目期间,很多时候都要在模型训练期间.训练结束之后对模型或者模型权重进行保存,然后我们可以从之前停止的地方恢复原模型效果继

  • python深度学习tensorflow1.0参数和特征提取

    目录 tf.trainable_variables()提取训练参数 具体实例 tf.trainable_variables()提取训练参数 在tf中,参与训练的参数可用 tf.trainable_variables()提取出来,如: #取出所有参与训练的参数 params=tf.trainable_variables() print("Trainable variables:------------------------") #循环列出参数 for idx, v in enumera

  • 基于vue中css预加载使用sass的配置方式详解

    1.安装sass的依赖包 npm install --save-dev sass-loader //sass-loader依赖于node-sass npm install --save-dev node-sass 2.在build文件夹下的webpack.base.conf.js的rules里面添加配置,如下红色部分 { test: /\.sass$/, loaders: ['style', 'css', 'sass'] } <span style="color:#454545;"

  • Python图片存储和访问的三种方式详解

    目录 前言 数据准备 一个可以玩的数据集 图像存储的设置 LMDB HDF5 单一图像的存储 存储到 磁盘 存储到 LMDB 存储 HDF5 存储方式对比 多个图像的存储 多图像调整代码 准备数据集对比 单一图像的读取 从 磁盘 读取 从 LMDB 读取 从 HDF5 读取 读取方式对比 多个图像的读取 多图像调整代码 准备数据集对比 读写操作综合比较 数据对比 并行操作 前言 ImageNet 是一个著名的公共图像数据库,用于训练对象分类.检测和分割等任务的模型,它包含超过 1400 万张图像

  • Pandas保存csv数据的三种方式详解

    目录 方法一 方法二 方法三 补充 方法一 import os import pandas as pd path = 'data/train/' img_label_list=[] testList = os.listdir(path) for file in testList: label='aa' img_label_list.append([file, label]) df1 = pd.DataFrame(data=img_label_list, columns=['id', 'label

  • Python绘制散点密度图的三种方式详解

    目录 方式一 方式二 方式三 方式一 import matplotlib.pyplot as plt import numpy as np from scipy.stats import gaussian_kde from mpl_toolkits.axes_grid1 import make_axes_locatable from matplotlib import rcParams config = {"font.family":'Times New Roman',"fo

  • Python写入MySQL数据库的三种方式详解

    目录 场景一:数据不需要频繁的写入mysql 场景二:数据是增量的,需要自动化并频繁写入mysql 方式一 方式二 总结 大家好,Python 读取数据自动写入 MySQL 数据库,这个需求在工作中是非常普遍的,主要涉及到 python 操作数据库,读写更新等,数据库可能是 mongodb. es,他们的处理思路都是相似的,只需要将操作数据库的语法更换即可. 本篇文章会给大家分享数据如何写入到 mysql,分为两个场景,三种方式. 场景一:数据不需要频繁的写入mysql 使用 navicat 工

  • Java实现AOP代理的三种方式详解

    目录 1.JDK实现 2.CGLIB实现 3.boot注解实现[注意只对bean有效] 业务场景:首先你有了一个非常好的前辈无时无刻的在“教育”你.有这么一天,它叫你将它写好的一个方法进行改进测试,这时出现了功能迭代的情况.然后前辈好好“教育”你的说,不行改我的代码!改就腿打折!悲催的你有两条路可走,拿出你10年跆拳道的功夫去火拼一波然后拍拍屁股潇洒走人,要么就是悲催的开始百度...这时你会发现,我擦怎么把AOP代理这种事给忘了?[其实在我们工作中很少去手写它,但是它又是很常见的在使用(控制台日

  • Android Flutter实现搜索的三种方式详解

    目录 示例 1 :使用搜索表单创建全屏模式 编码 示例 2:AppBar 内的搜索字段(最常见于娱乐应用程序) 编码 示例 3:搜索字段和 SliverAppBar 编码 结论 示例 1 :使用搜索表单创建全屏模式 我们要构建的小应用程序有一个应用程序栏,右侧有一个搜索按钮.按下此按钮时,将出现一个全屏模式对话框.它不会突然跳出来,而是带有淡入淡出动画和幻灯片动画(从上到下).在圆形搜索字段旁边,有一个取消按钮,可用于关闭模式.在搜索字段下方,我们会显示一些搜索历史记录(您可以添加其他内容,如建

  • 命令行运行Python脚本时传入参数的三种方式详解

    如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. python script.py 0,1,2 10 python script.py -gpus=0,1,2 --batch-size=10 python script.py -gpus=0,1,2 --batch_size=10 这三种格式对应不同的参数解析方式,分别为sys.argv, argparse, tf.app.run, 前两者是python自带的功能,最后一个是tensorfl

  • CodeIgniter中使用cookie的三种方式详解

    cookie在php程序设计中应用十分广泛,本文所述CodeIgniter中使用cookie主要有以下三种方式,读者可以根据自身项目需求酌情采用. 第一种方式:采用php原生态的方法设置的cookie的值 setcookie("user_id",$user_info['user_id'],86500); setcookie("username",$user_info['username'],86500); setcookie("password"

  • 基于java解析JSON的三种方式详解

    本文实例分析了基于java解析JSON的三种方式.分享给大家供大家参考,具体如下: 一.什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的符号标注. {} 双括号表示对象 [] 中括号表示数组 "" 双引号内是属性或值 : 冒号表示后者是前者的值(这个值可以是字符串.数字.也可以是另一个数组或对象) 所以 {"name"

随机推荐

其他