系列博客链接:

第二章第一部分)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. spring 定时任务?

    一.什么是定时任务? 我们在项目中遇到的需求: 需要定时送异步请求. 二.怎么实现? 2.1  mvc中启用定时任务. <?xml version="1.0" encodin ...

  2. FreeSWITCH 对接RTSP和RTMP视频

    在某些场景需要把摄像头或者其它推流视频加入FreeSWITCH.因此可以采用如下方式处理: 安装mod_vlc 然后在配置文件中加入 < action applicaiton="pla ...

  3. <input type="file"> 标签详解

    详见:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input/file#attr-multiple 使用 type=" ...

  4. xargs、sort、uniq命令

    xargs.sort.uniq命令,我们由LeetCode的一道题来引入,并使用加以理解: 题目是这样的:写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率. word ...

  5. notify()和wait()

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11398563.html notify() 和 wait() 主要是用来多个线程之间的协作. 它 ...

  6. iOS中处理时间的类

      登录|注册     sakulafly的专栏       目录视图 摘要视图 订阅 Markdown博文大赛清新开启    天天爱答题 一大波C币袭来    中国云计算大会演讲议题公布     大 ...

  7. 啥叫IP地址及子网掩码?

    啥叫IP地址及子网掩码 ??? 1.IP地址的定义及分类 1.1IP地址的定义 1.2IP地址的分类 2.子网掩码 1.1  互联网上连接的网络设备和计算机都有唯一的地址,此作为该主机在Interne ...

  8. Kubernetes二进制(单/多节点)部署

    Kubernetes二进制(单/多节点)部署 目录 Kubernetes二进制(单/多节点)部署 一.常见的K8S部署方式 1. Minikube 2. Kubeadmin 3. 二进制安装部署 4. ...

  9. elasticsearch按URL查询

    排序查询:localhost:9200/get-together/_search?sort=date:asc, 排序以及按字段查询:localhost:9200/get-together/_searc ...

  10. C# 实例解释面向对象编程中的开闭原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...