4 Tensorflow图像识别模型——数据预处理

上一篇:3 tensorflow构建模型详解-CSDN博客

本篇开始介绍识别猫狗图片的模型,内容较多,会分为多个章节介绍。模型构建还是和之前一样的流程:

  • 数据集准备
  • 数据预处理
  • 创建模型
  • 设置损失函数和优化器
  • 训练模型

本篇先介绍数据集准备&预处理。


1、了解监督学习

开始前,需要先了解什么是监督学习。机器学习基于学习方式的分类,可分为:

  • 监督学习
  • 无监督学习
  • 强化学习

百度百科对监督学习的定义是使用标记数据集来训练算法,以便对数据进行分类或准确预测结果。

我们要构建的图片识别模型就属于监督学习的方式,模型的输入是“特征-标签”对,特征就是输入的图片,标签是标记该图片的预期结果(比如该图片是猫还是狗)。

2、训练数据集介绍

网上有很多公开的数据集可以用来学习,初学者不用花很多的时间在数据准备上面。下面是猫狗的数据集下载地址:

https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip

下载后,可以将解压的文件夹放在自己项目的根目录,方便后面读取。

(1)数据集的目录结构

数据集下面有两个子目录,一个训练集(train),一个是验证集(validation),训练集和验证集下面都有猫狗的文件夹,里面是收集好的猫、狗照片。

划分train和validation两个子集,主要是用于训练和评估模型,validation的数据可以看看模型在没有训练过的图片效果如何。

(2)查看数据集数量

本人把数据集放在了当前pycharm项目的根目录,读者可以根据自己实际放的位置替换路径。

import os# 获取训练集和验证集目录
train_dir = os.path.join('cats_and_dogs_filtered/train')
validation_dir = os.path.join('cats_and_dogs_filtered/validation')# 获取训练集猫、狗的目录
train_cats_dir = os.path.join(train_dir, 'cats')
train_dogs_dir = os.path.join(train_dir, 'dogs')# 获取验证集猫、狗的目录
validation_cats_dir = os.path.join(validation_dir, 'cats')
validation_dogs_dir = os.path.join(validation_dir, 'dogs')# 查看训练集猫狗的图片数量
print('训练集猫的图片数量:')
print(len(os.listdir(train_cats_dir)))
print('训练集狗的图片数量:')
print(len(os.listdir(train_dogs_dir)))# 查看验证集猫狗的图片数量
print('验证集猫的图片数量:')
print(len(os.listdir(validation_cats_dir)))
print('验证集狗的图片数量:')
print(len(os.listdir(validation_dogs_dir)))

运行结果:

训练集猫的图片数量:
1000
训练集狗的图片数量:
1000
验证集猫的图片数量:
500
验证集狗的图片数量:
500

从运行结果可以了解到训练集一共2000张图片,验证集有1000张。

(3)了解RGB图像

根据百度百科对RGB的定义,RGB是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。

可以用下面的草图辅助理解,比如一张3 X 3 大小的图片,可以解析成由红绿蓝三色通道叠加成的三维数组(图片信息数值仅用于辅助理解,不是该照片的真实值)

大多数彩色图像可以分为RGB三色通道,我们可以选取训练集的其中一张图片看看:

import os
import cv2# 获取训练集和验证集目录
train_dir = os.path.join('cats_and_dogs_filtered/train')
validation_dir = os.path.join('cats_and_dogs_filtered/validation')# 获取训练集猫、狗的目录
train_cats_dir = os.path.join(train_dir, 'cats')
train_dogs_dir = os.path.join(train_dir, 'dogs')# 获取验证集猫、狗的目录
validation_cats_dir = os.path.join(validation_dir, 'cats')
validation_dogs_dir = os.path.join(validation_dir, 'dogs')# 获取训练集-猫文件的所有文件名称
train_cats_name = os.listdir(train_cats_dir)# 获取其中一张图片的路径
picture_1 = os.path.join(train_cats_dir, train_cats_name[0])# 打印该图片名称
print('图片名称:'+train_cats_name[0])# 读取图片的信息值
picture_1 = cv2.imread(picture_1)# 打印该图片的形状
print(picture_1.shape)

运行结果:

图片名称:cat.952.jpg
(375, 499, 3)
 

可以看到图片cat.952.jpg的尺寸大小是375 X 499,深度是3,即该图片解析为RGB三色通道叠加的三维数组。

再选取另外一张,只需更改下面两句代码:

# 获取其中一张图片的路径
picture_1 = os.path.join(train_cats_dir, train_cats_name[0])# 打印该图片名称
print('图片名称:'+train_cats_name[0])

运行结果:

图片名称:cat.946.jpg
(374, 500, 3)

可以看到两张图片的尺寸不一样,神经网络输入需要相同的尺寸大小,所以这些数据集不能直接拿来训练,还需要做数据预处理。

(4)数据预处理

主要有两部分内容:

统一图片大小、按比例缩放

可以先看单张图片的效果,图片尺寸调整为150*150,按1/255比例缩放:

import os
import cv2# 获取训练集和验证集目录
train_dir = os.path.join('cats_and_dogs_filtered/train')
validation_dir = os.path.join('cats_and_dogs_filtered/validation')# 获取训练集猫、狗的目录
train_cats_dir = os.path.join(train_dir, 'cats')
train_dogs_dir = os.path.join(train_dir, 'dogs')# 获取验证集猫、狗的目录
validation_cats_dir = os.path.join(validation_dir, 'cats')
validation_dogs_dir = os.path.join(validation_dir, 'dogs')# 获取训练集-猫文件的所有文件名称
train_cats_name = os.listdir(train_cats_dir)# 获取其中一张图片的路径
picture_1 = os.path.join(train_cats_dir, train_cats_name[0])# 打印该图片名称
print('图片名称:'+train_cats_name[0])# 读取图片的信息值
picture_1 = cv2.imread(picture_1)# 打印该图片的信息值
print(picture_1)picture_2 = cv2.resize(picture_1, (150, 150))
print('调整后的图片形状为:')
print(picture_2.shape)# 除以255缩放图片
picture_2 = picture_1 / 255
print('缩放后的图片信息值矩阵:')
print(picture_2)

运行结果:

图片名称:cat.946.jpg
[[[158 157 143]
  [128 126 115]
  [103  97  92]
  ...
  [ 71  70  66]
  [ 71  70  66]
  [ 71  70  66]]

 [[158 157 143]
  [128 126 115]
  [103  97  92]
  ...
  [ 74  73  69]
  [ 74  73  69]
  [ 74  73  69]]

 [[157 156 142]
  [128 126 115]
  [103  97  92]
  ...
  [ 77  76  72]
  [ 77  76  72]
  [ 77  76  72]]

 ...

 [[128 123 125]
  [126 121 123]
  [124 119 121]
  ...
  [ 40  61  83]
  [ 38  59  81]
  [ 37  58  80]]

 [[135 132 134]
  [132 129 131]
  [130 127 129]
  ...
  [ 39  60  82]
  [ 38  59  81]
  [ 37  58  80]]

 [[140 137 139]
  [138 135 137]
  [135 132 134]
  ...
  [ 39  60  82]
  [ 38  59  81]
  [ 37  58  80]]]
调整后的图片形状为:
(150, 150, 3)
缩放后的图片信息值矩阵:
[[[0.61960784 0.61568627 0.56078431]
  [0.50196078 0.49411765 0.45098039]
  [0.40392157 0.38039216 0.36078431]
  ...
  [0.27843137 0.2745098  0.25882353]
  [0.27843137 0.2745098  0.25882353]
  [0.27843137 0.2745098  0.25882353]]

 [[0.61960784 0.61568627 0.56078431]
  [0.50196078 0.49411765 0.45098039]
  [0.40392157 0.38039216 0.36078431]
  ...
  [0.29019608 0.28627451 0.27058824]
  [0.29019608 0.28627451 0.27058824]
  [0.29019608 0.28627451 0.27058824]]

 [[0.61568627 0.61176471 0.55686275]
  [0.50196078 0.49411765 0.45098039]
  [0.40392157 0.38039216 0.36078431]
  ...
  [0.30196078 0.29803922 0.28235294]
  [0.30196078 0.29803922 0.28235294]
  [0.30196078 0.29803922 0.28235294]]

 ...

 [[0.50196078 0.48235294 0.49019608]
  [0.49411765 0.4745098  0.48235294]
  [0.48627451 0.46666667 0.4745098 ]
  ...
  [0.15686275 0.23921569 0.3254902 ]
  [0.14901961 0.23137255 0.31764706]
  [0.14509804 0.22745098 0.31372549]]

 [[0.52941176 0.51764706 0.5254902 ]
  [0.51764706 0.50588235 0.51372549]
  [0.50980392 0.49803922 0.50588235]
  ...
  [0.15294118 0.23529412 0.32156863]
  [0.14901961 0.23137255 0.31764706]
  [0.14509804 0.22745098 0.31372549]]

 [[0.54901961 0.5372549  0.54509804]
  [0.54117647 0.52941176 0.5372549 ]
  [0.52941176 0.51764706 0.5254902 ]
  ...
  [0.15294118 0.23529412 0.32156863]
  [0.14901961 0.23137255 0.31764706]
  [0.14509804 0.22745098 0.31372549]]]

下面是数据集预处理的代码:

# 模型参数设置
BATCH_SIZE = 100# 图片尺寸统一为150*150
IMG_SHAPE = 150# 处理图像尺寸
train_image_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1. / 255)
validation_image_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1. / 255)train_data_gen = train_image_generator.flow_from_directory(directory=train_dir,batch_size=BATCH_SIZE,target_size=(IMG_SHAPE, IMG_SHAPE),class_mode='binary')
val_data_gen = validation_image_generator.flow_from_directory(directory=validation_dir,batch_size=BATCH_SIZE,target_size=(IMG_SHAPE, IMG_SHAPE),class_mode='binary')

  • target_size=(IMG_SHAPE, IMG_SHAPE), IMG_SHAPE设为150,即读取数据时统一调整尺寸为150*150
  • tf.keras.preprocessing.image.ImageDataGenerator(rescale=1. / 255) 是按1/255比例缩放。因为图片信息的数值矩阵类型为unit8型,在0~255范围内,缩放后将像素值标准化为0-1之间

数据准备好就是成功的一半,后续介绍构建图像识别模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全应急响应工具(系统痕迹采集)-FireKylin

文章目录 网络安全应急响应工具(系统痕迹采集)-FireKylin1.FireKylin介绍【v1.4.0】 2021-12-20【v1.0.1】 2021-08-09 2.客户端界面Agent支持的操作系统FireKylinAgent界面使用方式比较传统方式与FireKylin比较无法可达目标的场景应用对比 3.使用教程设置语言Agent配置&#x…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中,std::thread是一个重要的类,它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…

1822_使用python内置的库进行日期序列的生成

使用python的内置的库进行日期序列的生成 用到的库介绍 datetime 实现这样的功能其实只需要这一个库就够了,但是网络上找到的例程很多都额外增加了对time库的引用。只能说,这样不会出现错误,但是这样肯定会有一些计算资源上的消耗。 #!/u…

零信任网络:一种全新的网络安全架构

随着网络技术的不断发展,网络安全问题日益凸显。传统的网络安全策略往往基于信任和验证,但这种信任策略存在一定的局限性。为了解决这一问题,零信任网络作为一种全新的网络安全架构,逐渐受到人们的关注。本文将对零信任网络的概念…

MATLAB算法实战应用案例精讲-【图像处理】数字图像处理

目录 几个高频面试题目 图像分类、图像识别、目标检测的优缺点分析与算法比较 知识储备

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&…

同步网盘与云盘:哪个更好用?

同步网盘、同步云盘现在是热门的文件管理工具,在回答“同步网盘云盘哪个好用”这个问题之前,我们需要知道什么样的同步网盘、同步云盘算好用? 什么样的同步网盘云盘好用? 1、存储空间大 对于文件管理工具而言,存储空…

ORM-1 字段默认值

当在odoo页面新建一条记录的时候,前端会通过rpc调用后端模型的default_get 函数,根据前端传入的字段列表,来获取相对应的字段默认值。# odoo/models.pyapi.modeldef default_get(self, fields_list):""" default_get(fields_l…

[Hive] Map类型在表中是如何存储的

在 Hive 中,Map 类型是指键值对的集合,其中键和值都可以是任意数据类型。 在 Hive 表中,Map 类型通常被存储为结构体或者键值对列表。 具体来说,在表中,Map 类型通常分为以下两种存储方式: 文章目录 结构…

PCTA认证考试-01_TiDB数据库架构概述

TiDB 数据库架构概述 一、学习目标 理解 TiDB 数据库整体结构。了解 TiDB Server,TiKV,TiFlash 和 PD 的主要功能。 二、TiDB 体系架构 1. TiDB Server 2. TiKV OLTP 3. Placement Driver 4. TiFlash OLAP OLTPOLAPHTAP

思考的起点(一): 事实与判断

事实与判断是思考的主要组成部分,深入理解事实与判断的基本概念,了解其应用可以提升个体的思考质量; 关于事实真相 事实是认知的基础 1.很多事情没有真相, 或者说真相陷入历史的迷雾中, 无法被发现; 2.世界不需要真相,真相往往都是复杂又残…

Go并发编程

一、goroutine 和 通道 在Go语言中,每一个并发执行的活动成为goroutine。通道则是每一个goroutine之间传递消息的工具。 1、Goroutine 在一个Go程序中,只有一个主Goroutine来调用main函数。生成新的goroutine也十分简单,例如有一个函数&…

GZ035 5G组网与运维赛题第9套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项(高职组) 赛题第9套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通(35分) 子任务1:5G公共网络部署与调试(15分) 子…

springboot actuator jvm监控丢失

1、背景 系统接入了监控prometheus和grafana,某天grafana突然发现只有几台机器可以看到指标。 随便点击一个地址http://192.168.0.76:8681/lms/actuator/prometheus访问指标,发现JVM相关指标全部丢失 2、解决方法 从网上查找相关资料,逐一…

【实践篇】一次Paas化热部署实践分享 | 京东云技术团队

前言 本文是早些年,Paas化刚刚提出不久时,基于部门内第一次Paas化热部署落地经验所写,主要内容是如何构建一些热部署代码以及一些避雷经验。 一、设计-领域模型设计 1.首先,确定领域服务所属的领域 2.其次,确定垂直…

leetcode经典面试150题---6.旋转数组

题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步…

2024上海国际合成生物学与绿色生物制造展览会8月7-9号上海举办

2024年8月7日至9日,一场生物制造领域的盛会将在上海新国际博览中心闪亮登场。那就是2024上海国际合成生物学与绿色生物制造展览会。这场盛会将同期举办2024第13届上海国际生物发酵展,形成了一个强大的“生物军团”,展现出生物科技领域的无限魅…

图解系列--理解L3交换机的性能与功能

04.01 何为 L3 交换机 L3交换机是一种在L2 交换机的基础上增加了路由选择功能的网络硬件,能够通过基于ASIC 和 FPGA 的硬件处理高速实现网络功能和转发分组。L2 是指 OSI 参考模型中的L2, 也就是数据链路层。L2 交换机能够基于该层主要编址的 MAC 地址,…

深度学习框架TensorFlow.NET环境搭建1(C#)

测试环境 visual studio 2017 window10 64位 测试步骤如下: 1 新建.net framework控制台项目,工程名称为TensorFlowNetDemo,.net framework的版本选4.7.2,如下图: 2 分别安装TensorFlow.NET包(先装)和SciSharp.…

力扣每日一题100:相同的树

题目描述: 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出&…