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

news2024/11/30 5:35:23

上一篇: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.coloradmin.cn/o/1165896.html

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

相关文章

Power BI 傻瓜入门 21. 让引人注目的报告变得可访问和用户友好的十种方法

Power BI中读取报告和可视化的能力不应仅限于那些能够区分颜色或能够独立阅读的人。色盲用户,甚至那些需要辅助技术来帮助他们解释数据的用户呢?不应该仅仅因为他们有一个独特的要求就把他们蒙在鼓里。使用Power BI,您可以无缝地整合许多功能…

电脑蓝屏怎么办?3个方法教你快速修复

电脑蓝屏,也被称为蓝屏死机,是计算机用户可能会遇到的一种常见问题。蓝屏通常伴随着错误代码和计算机重新启动,可能导致数据丢失。然而,幸运的是,电脑蓝屏问题通常可以得到解决。在本文中,我们将介绍电脑蓝…

通过51单片机控制28byj48步进电机按角度正反转旋转

一、前言 本项目基于STC89C52单片机,通过控制28BYJ-48步进电机实现按角度正反转旋转的功能。28BYJ-48步进电机是一种常用的电机,精准定位和高扭矩输出,适用于许多小型的自动化系统和机械装置。 在这个项目中,使用STC89C52单片机…

IP地址证书申请注意事项

IP地址证书申请跟常见的域名证书有所区别,首先确保80端口或者443端口处于开放状态,让CA机构在验签过程中能够正确访问到验证值,其实IP地址证书只能采用服务器文件验证,即把CA机构生成的服务器文件TXT文本上传到服务器根目录&#…

VueJs各个版本— 判断当前是开发、生产环境

VueJs各个版本— 判断当前是开发、生产环境 文章目录 VueJs各个版本— 判断当前是开发、生产环境vue项目分类VueCLI21,判断样例2,判断原理 Vue CLI 3 和 Vue CLI 41,判断样例2, 判断原理手动设置-json文件手动设置- .env 文件单个 .env 文件多…

python 数据挖掘库orange3 介绍

orange3 是一个非常适合初学者的data mining library. 它让使用者通过拖拽内置的组件来形成工作流。让你不需要写任何代码就可以体验到数据挖掘和可视化的魅力。 它的桌面如下,这里我创建了 3 个节点,分别是数据集、小提琴图,散点图 其中 …

数据结构与算法:使用数组模拟队列Java版

逻辑分析 代码实现 package com.haimeng.queue;import java.util.Scanner;public class ArrayQueueDemo {public static void main(String[] args) {//测试一把//创建一个队列ArrayQueue queue new ArrayQueue(3);char key ; //接收用户输入Scanner scanner new Scanner(S…

使用 Appilot 部署 Llama2,会聊天就行!

Walrus 是一款基于平台工程理念的应用管理平台,致力于解决应用交付领域的深切痛点。借助 Walrus 将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设施的复杂度,为研发和运维团队提供易用…

最常见的激活函数

文章目录 1. 激活函数2. Sigmoid函数3. RelU函数4. Softmax函数 1. 激活函数 1. 神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输…

软件开发项目文档系列之九如何撰写测试用例

目录 1 概述1.1 编写目的1.2 定义1.3 使用范围1.4 参考资料1.5 术语定义 2 测试用例2.1 功能测试2.1.1 用户登录功能2.1.2 商品搜索功能 2.2 性能测试2.2.1 网站响应时间2.2.2 并发用户测试 附件: 测试用例撰写的要素和注意事项附件1 测试用例要素附件2 测试用例的注…

全志XR806实现简单的家用环境监测传感器

XR806是一款支持WiFi和BLE的高集成度无线MCU芯片, 以其集成度高、硬件设计简单、BOM成本低、安全可靠等优点, 成为极客们进行小开发创作的首选. 恰好最近获得了XR806开发板的试用资格,因此决定基于此开发板制作一个简单的家用环境监测传感器. 1.功能介绍 作为一个环境监测传感…

在一个循环链队中只有尾指针(记为rear,结点结构为数据域data,指针域next),请给出这种队列的入队和出队操作实现过程

在一个循环链队中只有尾指针(记为rear,结点结构为数据域data,指针域next),请给出这种队列的入队和出队操作实现过程 入队过程如下图: 先创一个结点,用于存储要插入的结点数据 然后就是老套路了…

开槌在即:陈可之油画|《我的星辰》

《我的星辰》 尺寸:46x46cm 陈可之2020年绘 “星辰大海,梦想自有梦想的力量,仰望在银河的想象,我们启航。”读着画名,凝视着画,脑海里回荡着《星辰大海》的旋律。油画《我的星辰》是陈可之先生“心宇宙”系…

React 项目结构小结

React 项目结构小结 简单的记录一下目前 React 项目用的依赖和实现 摸索了大半年了大概构建一套用起来还算轻松的体系……?基本上应该是说可以应对大部分的项目了 使用的依赖 目前项目还在 refactoring 的阶段,所以乱得很,这里是新建一个…

如何理解API?API 是如何工作的呢?

大家可能最近经常听到 API 这个概念,那什么是API,它又有什么特点和好处呢? wiki 百科镇楼 APIs are] a set of subroutine definitions, protocols, and tools for building application software. In general terms, it’s a set of clear…

ZKP10.2 Efficient Recursion via Statement Folding (Nova)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 10: Recursive SNARKs, Aggregation and Accumulation (Dan Boneh) 10.3 Efficient Recursion via Statement Folding: Nova, Supernova, and generalizations The difficulty with full recursion Prover P needs to build a…

严重的软件漏洞,你都知道和修复了吗?

有一些漏洞,影响深远而且影响重大。以下的严重软件漏洞,你都知道和修复了吗? 1. Log4Shell Log4Shell软件漏洞存在于Apache Log4j中,这种流行的Java日志框架被全球数千万人使用。 2021年11月,阿里云安全团队成员陈兆军发现了一个严重的代码漏洞。陈兆军最先注意到了Mi…

怎样提取视频提取的人声或伴奏?

有些小伙伴们进行音视频创作时,可能会需要提取音频的人声或者是伴奏。这里给大家推荐一个音分轨人声分离软件,支持一键提取音频人声和一键提取伴奏功能,可批量导入文件同步提取,简单高效,是音视频创作者的不二选择&…

分体式离子风刀和整体式离子风刀分别有哪些优缺点

离子风刀是一种利用高速旋转的离子风扇产生的离子风来清洁和干燥物体表面的设备。根据离子风扇的安装方式,离子风刀可以分为分体式离子风刀和整体式离子风刀。下面是它们各自的优缺点: 分体式离子风刀的优点: 安装方便:分体式离子…

首发scitb包,一个为制作统计表格而生的R包

目前,本人写的第3个R包scitb包已经正式在R语言官方CRAN上线,scitb包是一个为生成专业化统计表格而生的R包。 可以使用以下代码安装 install.packages("scitb")scitb包对我而言是个很重要的R包,我的很多想法需要靠它做平台来实现&a…