系列博客链接:

第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html

本文概述:

  • 目标

    • 说明图片数字化的三要素
    • 说明图片三要素与张量的表示关系
    • 了解张量的存储和计算类型
    • 应用tf.image.resize_images实现图像的像素改变
    • 应用tf.train.start_queue_runners实现读取线程开启
    • 应用tf.train.Coordinator实现线程协调器开启
    • 应用tf.train.batch实现数据的批处理
  • 应用
    • 商品图片读取

1、 图像基本知识

对于图像文件,我们怎么进行转换成机器学习能够理解的数据。对于图片来讲,组成图片的最基本单位是像素,所以我们获取的是每张图片的像素值。接触的图片有两种,一种是黑白图片,另一种是彩色图片。

1.1 图片三要素

组成一张图片特征值是所有的像素值,有这么几个要素。图片长度、图片宽度、图片通道数。什么是图片的通道数呢,描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。如果一个像素点,有RGB三种颜色来描述它,就是三通道。那所以

  • 灰度图片:单通道
  • 彩色图片:三通道

假设一张彩色图片的长200,宽200,通道数为3,那么总的像素数量为200x200x3

1.2 张量形状

读取图片之后,怎么用张量形状来表示呢。一张图片就是一个3D张量,[height, width, channel],height就表示高,width表示宽,channel表示通道数。我们会经常遇到3D和4D的表示

  • 单个图片:[height, width, channel]
  • 多个图片(4D):[batch, height, width, channel],batch表示批数量

1.3 图片特征值处理

在进行图片识别的时候,每个图片样本的特征数量要保持相同(方便神经网络的训练)。所以需要将所有图片张量大小统一转换。另一方面如果图片的像素量太大,也可以通过这种方式适当减少像素的数量,减少训练的计算开销

  • tf.image.resize_images(images, size)

    • 缩小放大图片
    • images:4-D形状[batch, height, width, channels],或3-D形状的张量[height, width, channels]的图片数据
    • size:1-D int32张量:new_height, new_width,图像的新尺寸
    • 返回4-D格式或者3-D格式图片

1.4 数据格式

  • 存储:uint8(节约空间)
  • 矩阵计算:float32(提高精度)

2、案例:商品图片读取

2.1 读取流程分析

  • 构造图片文件队列
  • 读取图片数据并进行解码
  • 处理图片数据形状,批处理返回
  • 开启会话线程运行

2.2 代码

def picture_read(file_list):
"""
商品图片读取,转换成数据张量
:return:
"""
# 1、构造文件队列
# 返回文件队列
file_queue = tf.train.string_input_producer(file_list) # 2、构造一个图片读取器,去文件队列中读取数据
# 返回reader实例,调用read方法读取内容,key, value
reader = tf.WholeFileReader() key, value = reader.read(file_queue) print(value) # 3、对样本内容进行解码
image = tf.image.decode_jpeg(value) print(image) # 处理图片的大小,形状,resize_images图片数据类型变成了float类型,所有图片大小都变成了200x200的
image_resize = tf.image.resize_images(image, [200, 200]) print(image_resize) # 设置固定形状,这里可以使用静态形状API去修改
image_resize.set_shape([200, 200, 3]) # 4、批处理图片数据
# 每个样本的形状必须全部定义,否则会报错
image_batch = tf.train.batch([image_resize], batch_size=100, num_threads=1, capacity=100) print(image_batch) return image_batch
  • 会话逻辑
if __name__ == "__main__":
# 生成路径+文件名的列表
filename = os.listdir("./data/dog/") # 路径+名字拼接
file_list = [os.path.join("./data/dog/", file) for file in filename] # 从原始二进制文件读取
image_batch = picture_read(file_list) # 开启会话打印内容
with tf.Session() as sess:
# 创建线程协调员
coord = tf.train.Coordinator() # 开启子线程去读取数据
# 返回子线程实例
threads = tf.train.start_queue_runners(sess=sess, coord=coord) # 获取样本数据去训练
print(sess.run(image_batch) # 关闭子线程,回收
coord.request_stop() coord.join(threads)

(第二章第二部分)TensorFlow框架之读取图片数据的更多相关文章

  1. (第二章第三部分)TensorFlow框架之读取二进制数据

    系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html (第二章第二部分)Tens ...

  2. Ionic 入门与实战之第二章第二节:Ionic 环境搭建之 Ionic Lab 使用

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第二节,主要对 Ionic Lab 工具作了介绍,并讲解了其使用方法,这也是一个开发 Ionic 比较好的调试工具. 原文发表于 ...

  3. ios 向sqlite数据库插入和读取图片数据

    向sqlite数据库插入和读取图片数据 (for ios) 假定数据库中存在表 test_table(name,image), 下面代码将图片文件test.png的二进制数据写到sqlite数据库: ...

  4. 第二章 第二个spring-boot程序

    上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入spring-boot官方文档推荐的方式来开发代码,并引入我们在spring开发中service层等的调用. 1. ...

  5. 第二章 第二个spring-boot程序(转载)

    本编博客转发自:http://www.cnblogs.com/java-zhao/p/5336369.html 上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入s ...

  6. 第二章——第二节 IPC机制的概述和使用

    一.Serialiable与Paracle ①.作用    ②.使用 二.Binder与AIDL ①.各自的作用 三.如何使用IPC机制 举例 四.IPC机制的原理 ①.流程图  ②.自己编译自动生成 ...

  7. 《数据结构与算法Python语言描述》习题第二章第二题(python版)

    ADT Date: #定义日期对象的抽象数据类型 Date(self, int year, int month, int day) #构造表示year/month/day的对象 difference( ...

  8. Spring3实战第二章第二小节 IOC依赖注入 list和map集合

    Spring有多种依赖注入的形式,本篇文章仅介绍Spring通过xml进行IOC配置的方式. 1.Set注入 2.构造器注入 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new ...

  9. tensorflow2.0学习笔记第二章第二节

    2.2复杂度和学习率 指数衰减学习率可以先用较大的学习率,快速得到较优解,然后逐步减少学习率,使得模型在训练后期稳定指数衰减学习率 = 初始学习率 * 学习率衰减率^(当前轮数/多少轮衰减一次) 空间 ...

随机推荐

  1. 如何在pyqt中使用 QGraphicsView 实现图片查看器

    前言 在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEvent().mouseMoveEvent 等事件,但是如果要在图像上多添加一些形状,那么在 ...

  2. ApacheCN JavaScript 译文集(二) 20211123 更新

    使用 Meteor 构建单页 Web 应用 零.前言 一.制作 Meteor 应用 二.构建 HTML 模板 三.存储数据和处理集合 四.控制数据流 五.使我们的应用与路由通用 六.保持会话状态 七. ...

  3. RealFormer: 残差式 Attention 层的Transformer 模型

    原创作者 | 疯狂的Max 01 背景及动机 Transformer是目前NLP预训练模型的基础模型框架,对Transformer模型结构的改进是当前NLP领域主流的研究方向. Transformer ...

  4. [NOI2020]命运

    显然直接计数是不好计的,只能从 \(dp\) 这个角度来下手. 首先用最原始最直接的方法,直接在 \(dp\) 的过程中满足题目的要求. 既然问题给在一棵树上,那么必然和树脱不了关系,因此我们应该从树 ...

  5. JAVA面向对象特征详解

    1. 封装 封装性的产生目的:保护某些属性和方法不被外部所看见. 封装的实现:为属性和方法进行封装是通过关键字private声明的:实现该属性的set和get方法,为外部所访问 该公开的公开,该私有的 ...

  6. jdk1.5新特性之-------静态导入

    import java.util.ArrayList; import java.util.Collections; /* jdk1.5新特性之-------静态导入 静态导入的作用: 简化书写. 静态 ...

  7. 使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在讨论完GraphQL中的查询需求后,这篇文章我们将演示如何实现GraphQL中的数据添加任务. 思路 在G ...

  8. Redis 学习笔记(六)Redis 如何实现消息队列

    一.消息队列 消息队列(Messeage Queue,MQ)是在分布式系统架构中常用的一种中间件技术,从字面表述看,是一个存储消息的队列,所以它一般用于给 MQ 中间的两个组件提供通信服务. 1.1 ...

  9. netty系列之:不用怀疑,netty中的ByteBuf就是比JAVA中的好用

    目录 简介 ByteBuf和ByteBuffer的可扩展性 不同的使用方法 性能上的不同 总结 简介 netty作为一个优秀的的NIO框架,被广泛应用于各种服务器和框架中.同样是NIO,netty所依 ...

  10. uni-app、Vue3 + ucharts 图表 H5 无法渲染

    文章已收录到 github,欢迎 Watch 和 Star. 简介 从问题定位开始,到给框架(uni-app)提 issue.出解决方案(PR),再到最后的思考,详细记录了整个过程. 前序 当你在业务 ...