(第二章第二部分)TensorFlow框架之读取图片数据
系列博客链接:
(第二章第一部分)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框架之读取图片数据的更多相关文章
- (第二章第三部分)TensorFlow框架之读取二进制数据
系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html (第二章第二部分)Tens ...
- Ionic 入门与实战之第二章第二节:Ionic 环境搭建之 Ionic Lab 使用
原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第二节,主要对 Ionic Lab 工具作了介绍,并讲解了其使用方法,这也是一个开发 Ionic 比较好的调试工具. 原文发表于 ...
- ios 向sqlite数据库插入和读取图片数据
向sqlite数据库插入和读取图片数据 (for ios) 假定数据库中存在表 test_table(name,image), 下面代码将图片文件test.png的二进制数据写到sqlite数据库: ...
- 第二章 第二个spring-boot程序
上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入spring-boot官方文档推荐的方式来开发代码,并引入我们在spring开发中service层等的调用. 1. ...
- 第二章 第二个spring-boot程序(转载)
本编博客转发自:http://www.cnblogs.com/java-zhao/p/5336369.html 上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入s ...
- 第二章——第二节 IPC机制的概述和使用
一.Serialiable与Paracle ①.作用 ②.使用 二.Binder与AIDL ①.各自的作用 三.如何使用IPC机制 举例 四.IPC机制的原理 ①.流程图 ②.自己编译自动生成 ...
- 《数据结构与算法Python语言描述》习题第二章第二题(python版)
ADT Date: #定义日期对象的抽象数据类型 Date(self, int year, int month, int day) #构造表示year/month/day的对象 difference( ...
- Spring3实战第二章第二小节 IOC依赖注入 list和map集合
Spring有多种依赖注入的形式,本篇文章仅介绍Spring通过xml进行IOC配置的方式. 1.Set注入 2.构造器注入 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new ...
- tensorflow2.0学习笔记第二章第二节
2.2复杂度和学习率 指数衰减学习率可以先用较大的学习率,快速得到较优解,然后逐步减少学习率,使得模型在训练后期稳定指数衰减学习率 = 初始学习率 * 学习率衰减率^(当前轮数/多少轮衰减一次) 空间 ...
随机推荐
- springboot 使用select的注解,来查询数据库。
package com.aaa.zxf.mapper; import com.aaa.zxf.model.Book; import org.apache.ibatis.annotations.*; i ...
- 「JOISC 2014 Day4」两个人的星座
首先突破口肯定在三角形不交,考虑寻找一些性质. 引理一:两个三角形不交当且仅当存在一个三角形的一条边所在直线将两个三角形分为异侧 证明可以参考:三角形相离充要条件,大致思路是取两个三角形重心连线,将其 ...
- 对线面试官,凭借nginx能一战封神吗?
面试官:小伙子,你对nginx熟悉吗? 我:当然熟悉了,请听我慢慢道来. 心里想,我能吊打面试官吗?今天非得灭一灭面试官的威风,平时都被怼的狗血淋头. 面试官:就你那点花花肠子,咱还不清楚. 我:.. ...
- 理解java线程的中断(interrupt)
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等. 所以你看到Thread.suspend, Threa ...
- Linux防火墙(iptables/firewalld)
Linux防火墙(iptables/firewalld) 目录 Linux防火墙(iptables/firewalld) 一.iptables 1. iptables概述 2. netfilter和i ...
- suging闲谈-netty 的异步非阻塞IO线程与业务线程分离
前言 surging 对外沉寂了一段时间了,但是作者并没有闲着,而是针对于客户的需要添加了不少功能,也给我带来了不少外快收益, 就比如协议转化,consul 的watcher 机制,JAVA版本,sk ...
- opencv笔记--ORB
ORB detector 使用 FAST detector 和 BRIEF descriptor 基本思路.在介绍 ORB 之前,首先对 FAST 与 BRIEF 进行说明. 1 FAST FAST( ...
- time模块以及datetime模块
内容概要 time模块 **timestamp时间戳 **struct_time结构化时间 **format time格式化时间 datetime模块 **date **time **datetime ...
- Solution -「CF 917D」Stranger Trees
\(\mathcal{Description}\) Link. 给定一棵包含 \(n\) 个点的有标号树,求与这棵树重合恰好 \(0,1,\cdots,n-1\) 条边的树的个数,对 \(10 ...
- RISC-V 特权指令结构
机器模式 机器模式(缩写为 M 模式,M-mode)是 RISC-V 中 hart(hardware thread,硬件线 程)可以执行的最高权限模式.在 M 模式下运行的 hart 对内存,I/O ...