【学习笔记】tensorflow图片读取
图像基本概念
在图像数字化表示当中,分为黑白和彩色两种。在数字化表示图片的时候,有三个因素。分别是图片的长、图片的宽、图片的颜色通道数。那么黑白图片的颜色通道数为1,它只需要一个数字就可以表示一个像素位;而彩色照片就不一样了,它有三个颜色通道,分别为RGB,通过三个数字表示一个像素位。TensorFlow支持JPG、PNG图像格式,RGB、RGBA颜色空间。图像用与图像尺寸相同(height*width*chnanel)张量表示。图像所有像素存在磁盘文件,需要被加载到内存。
图像基本操作
目的:
- 增加图片数据的统一性
- 所有图片转换成指定大小
- 缩小图片数据量,防止增加开销
操作:
- 缩小图片大小
图像基本操作API
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格式图片
图像读取API
图像读取器:
tf.WholeFileReader:将文件的全部内容作为值输出的读取器
- return:读取器实例
- read(file_queue):输出将是一个文件名(key)和该文件的内容(值)
图像解码器:
tf.image.decode_jpeg(contents):将JPEG编码的图像解码为uint8张量
- return:uint8张量,3-D形状[height, width, channels]
tf.image.decode_png(contents):将PNG编码的图像解码为uint8或uint16张量
- return:张量类型,3-D形状[height, width, channels]
狗图片读取
import tensorflow as tf
import os
def readpic(filelist):
"""
狗图片读取
"""
# 构建文件队列
file_queue = tf.train.string_input_producer(filelist)
# 构造阅读器
reader = tf.WholeFileReader()
key, value = reader.read(file_queue)
print(value)
# 对读取到的图片进行解码
image = tf.image.decode_jpeg(value)
print(image)
# 处理图片的大小
img_resize = tf.image.resize_images(image, [250, 250])
print(img_resize)
img_resize.set_shape([250, 250, 3])
# 批处理
image_batch = tf.train.batch([img_resize], batch_size=10, num_threads=1, capacity=10)
print(image_batch)
return image_batch
if __name__ == '__main__':
filelist = os.listdir("./data/dogs")
filelist = ["./data/dogs/{}".format(i) for i in filelist]
image_batch = readpic(filelist)
with tf.Session() as sess:
# 线程协调器
coord = tf.train.Coordinator()
# 开启读取文件线程
threads = tf.train.start_queue_runners(sess, coord=coord)
# 打印数据
print(sess.run([image_batch]))
coord.request_stop()
coord.join()
案例流程:
- 构造图片文件队列
- 构造阅读器
- 读取图片数据
- 处理图片数据
CIFAR-10二进制数据读取
网站:https://www.cs.toronto.edu/~kriz/cifar.html
import tensorflow as tf
import os
# 定义cifar命令相关参数
tf.app.flags.DEFINE_string("cifar_dir", "./data/cifar-10-batches-bin", "cifar目录")
FLAGS = tf.app.flags.FLAGS
class CifarReader(object):
"""
读取二进制文件,写入tfrecords,读取tfrecords
"""
def __init__(self, filelist):
self.filelist = filelist
# 定义读取的二进制图片的一些属性
self.width = 32
self.height = 32
self.channel = 3
self.label_bytes = 1
self.image_bytes = self.width * self.height * self.channel
self.bytes = self.label_bytes + self.image_bytes
def read_and_decode(self):
# 构造文件队列
file_queue = tf.train.string_input_producer(self.filelist)
# 构造二进制文件阅读器
reader = tf.FixedLengthRecordReader(self.bytes)
key, value = reader.read(file_queue)
# 解码
label_image = tf.decode_raw(value, tf.uint8)
print(label_image)
# 分离出图片和标签数据
label = tf.cast(tf.slice(label_image, [0], [self.label_bytes]), tf.int32)
image = tf.slice(label_image, [self.label_bytes], [self.image_bytes])
# 改变图片的形状 [3072] -> [32, 32, 3]
image_reshape = tf.reshape(image, [self.height, self.width, self.channel])
print(label, image_reshape)
# 批处理数据
label_batch, image_batch = tf.train.batch([label, image_reshape], batch_size=20, num_threads=1, capacity=20)
print(label_batch, image_batch)
return label_batch, image_batch
if __name__ == '__main__':
filelist = os.listdir(FLAGS.cifar_dir)
filelist = [os.path.join(FLAGS.cifar_dir, i) for i in filelist if i.endswith(".bin")]
cf = CifarReader(filelist)
label_batch, image_batch = cf.read_and_decode()
with tf.Session() as sess:
# 线程协调器
coord = tf.train.Coordinator()
# 开启读取文件线程
threads = tf.train.start_queue_runners(sess, coord=coord)
# 打印数据
print(sess.run([label_batch, image_batch]))
coord.request_stop()
coord.join()
TFRecords
TFRecords是Tensorflow设计的一种内置文件格式,是一种二进制文件,它能更好的利用内存,更方便复制和移动。为了将二进制数据和标签(训练的类别标签)数据存储在同一个文件中。
TFRecords存储
- 建立TFRecord存储器:tf.python_io.TFRecordWriter(path)
- path: TFRecords文件的路径
- return:写文件
- 方法:
- write(record):向文件中写入一个字符串记录
- close():关闭文件写入器
- 注:字符串是一个序列化的Example:Example.SerializeToString()
- 构造每个样本的Example协议块
- tf.train.Example(features=None)
- 写入tfrecords文件
- features:tf.train.Features类型的特征实例
- return:example格式协议块
- tf.train.Features(feature=None)
- 构建每个样本的信息键值对
- features:字典数据,key为要保存的名字,value为tf.train.Feature实例
- return:Features类型
- tf.train.Feature(**options)
- **options:例如:
bytes_list=tf.train. BytesList(value=[Bytes])
int64_list=tf.train. Int64List(value=[Value])
- **options:例如:
- tf.train.Example(features=None)
对于上例中【CIFAR-10二进制数据读取】读取到的数据进行存储:
import tensorflow as tf
import os
# 定义cifar命令相关参数
tf.app.flags.DEFINE_string("cifar_dir", "./data/cifar-10-batches-bin", "cifar目录")
tf.app.flags.DEFINE_string("cifar_tfrecords", "./temp/cifar.tfrecords", "保存的tfrecords文件路径")
FLAGS = tf.app.flags.FLAGS
class CifarReader(object):
"""
读取二进制文件,写入tfrecords,读取tfrecords
"""
def __init__(self, filelist):
self.filelist = filelist
# 定义读取的二进制图片的一些属性
self.width = 32
self.height = 32
self.channel = 3
self.label_bytes = 1
self.image_bytes = self.width * self.height * self.channel
self.bytes = self.label_bytes + self.image_bytes
def read_and_decode(self):
# 构造文件队列
file_queue = tf.train.string_input_producer(self.filelist)
# 构造二进制文件阅读器
reader = tf.FixedLengthRecordReader(self.bytes)
key, value = reader.read(file_queue)
# 解码
label_image = tf.decode_raw(value, tf.uint8)
print(label_image)
# 分离出图片和标签数据
label = tf.cast(tf.slice(label_image, [0], [self.label_bytes]), tf.int32)
image = tf.slice(label_image, [self.label_bytes], [self.image_bytes])
# 改变图片的形状 [3072] -> [32, 32, 3]
image_reshape = tf.reshape(image, [self.height, self.width, self.channel])
print(label, image_reshape)
# 批处理数据
label_batch, image_batch = tf.train.batch([label, image_reshape], batch_size=20, num_threads=1, capacity=20)
print(label_batch, image_batch)
return label_batch, image_batch
def write_to_tfrecords(self, label_batch, image_batch):
"""
存储图片的目标值和特征值
:param label_batch: 图片的目标值
:param image_batch: 图片的特征值
:return: None
"""
# 建立tfrecords存储器
writer = tf.python_io.TFRecordWriter(FLAGS.cifar_tfrecords)
# 将所有样本写入文件
for i in range(label_batch.shape[0]):
label = int(label_batch[i].eval()[0])
image = image_batch[i].eval().tostring()
example = tf.train.Example(features=tf.train.Features(feature={
"label": tf.train.Feature(int64_list=tf.train.Int64List(value=[label])),
"image": tf.train.Feature(bytes_list=tf.train.BytesList(value=[image]))
}))
writer.write(example.SerializeToString())
writer.close()
if __name__ == '__main__':
filelist = os.listdir(FLAGS.cifar_dir)
filelist = [os.path.join(FLAGS.cifar_dir, i) for i in filelist if i.endswith(".bin")]
cf = CifarReader(filelist)
label_batch, image_batch = cf.read_and_decode()
with tf.Session() as sess:
# 线程协调器
coord = tf.train.Coordinator()
# 开启读取文件线程
threads = tf.train.start_queue_runners(sess, coord=coord)
# 存为tfrecords文件
cf.write_to_tfrecords(label_batch, image_batch)
# 打印数据
print(sess.run([label_batch, image_batch]))
coord.request_stop()
coord.join()
TFRecords读取方法
同文件阅读器流程,中间需要解析过程
解析TFRecords的example协议内存块:
- tf.parse_single_example(serialized,features=None,name=None)
- 解析一个单一的Example原型
- serialized:标量字符串Tensor,一个序列化的Example
- features:dict字典数据,键为读取的名字,值为FixedLenFeature
- return:一个键值对组成的字典,键为读取的名字
- tf.FixedLenFeature(shape,dtype)
- shape:输入数据的形状,一般不指定,为空列表
- dtype:输入数据类型,与存储进文件的类型要一致,类型只能是float32,int64,string
读取上例保存的tfrecords文件:
# 定义cifar命令相关参数
tf.app.flags.DEFINE_string("cifar_dir", "./data/cifar-10-batches-bin", "cifar目录")
tf.app.flags.DEFINE_string("cifar_tfrecords", "./temp/cifar.tfrecords", "保存的tfrecords文件路径")
FLAGS = tf.app.flags.FLAGS
class CifarReader(object):
"""
读取二进制文件,写入tfrecords,读取tfrecords
"""
def __init__(self, filelist):
self.filelist = filelist
# 定义读取的二进制图片的一些属性
self.width = 32
self.height = 32
self.channel = 3
self.label_bytes = 1
self.image_bytes = self.width * self.height * self.channel
self.bytes = self.label_bytes + self.image_bytes
def read_from_cfrecords(self):
"""
读取cfrecords
:return: None
"""
# 构建文件队列
file_queue = tf.train.string_input_producer([FLAGS.cifar_tfrecords])
# 构建文件阅读器
reader = tf.TFRecordReader()
key, value = reader.read(file_queue)
# 解析example
features = tf.parse_single_example(value, features={
"label": tf.FixedLenFeature([], tf.int64),
"image": tf.FixedLenFeature([], tf.string)
})
# 解码
image = tf.decode_raw(features["image"], tf.uint8)
image_reshape = tf.reshape(image, [self.height, self.width, self.channel])
label = tf.cast(features["label"], tf.int32)
print(label, image_reshape)
# 批处理
label_batch, image_batch = tf.train.batch([label, image_reshape], batch_size=20, num_threads=1, capacity=20)
print(label_batch, image_reshape)
return label_batch, image_reshape
if __name__ == '__main__':
label_batch, image_batch = cf.read_from_cfrecords()
with tf.Session() as sess:
# 线程协调器
coord = tf.train.Coordinator()
# 开启读取文件线程
threads = tf.train.start_queue_runners(sess, coord=coord)
# 打印数据
print(sess.run([label_batch, image_batch]))
coord.request_stop()
coord.join()
【学习笔记】tensorflow图片读取的更多相关文章
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
- Webpack4 学习笔记五 图片解析、输出的文件划分目录
前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 webpack打包图片和划分文件路径 使用图片的方式 通过 new Image() 在 css中设置 background-imag ...
- [Python学习笔记]文件的读取写入
文件与文件路径 路径合成 os.path.join() 在Windows上,路径中以倒斜杠作为文件夹之间的分隔符,Linux或OS X中则是正斜杠.如果想要程序正确运行于所有操作系统上,就必须要处理这 ...
- Android学习笔记之图片轮播...
PS:一个bug又折腾了一个下午....哎... 学习内容: 1.Android利用ViewPager和PagerAdapter实现图片轮播... 2.使用反射机制获取Android的资源信息... ...
- TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络
转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 官方教程地址 视频/字幕下载 全 ...
- tensorflow学习笔记----tensorflow在windows的安装及TensorBoard中mnist样例
前言: ...
- 3.2html学习笔记之图片
<img src="" width="50%" alt="加载时候或无法显示时候显示的文字" height="让浏览器预先给 ...
- css3学习笔记之图片
圆角图片 border-radius: 圆角图片: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <!DOCTYPE html> <htm ...
- [转载]mongoDB学习笔记——存取图片(C#)
作为一个NoSql数据库的代表,存取多媒体数据,应该是强项吧?那么,图片在mongoDB里是如何存取的呢?(其实,关系型数据库存取图片也一点问题没有,所以我看NoSql的强项不在于是否存储多媒体,而在 ...
随机推荐
- git 本地同步分支数,删除远程已经删除掉的多余分支
git remote show orgin (展示当前本地分支和远程上的分支差异,多余分支后会被标注 use 'git remote prune' to remove.) git remote pr ...
- Data Center手册(2): 安全性
有个安全性有下面几种概念: Threat:威胁 Vulnerability: 安全隐患 Attack: 攻击 有关Threat 常见的威胁有下面几种 DoS(Denial of Service拒绝服务 ...
- LeetCode编程训练 - 合并查找(Union Find)
Union Find算法基础 Union Find算法用于处理集合的合并和查询问题,其定义了两个用于并查集的操作: Find: 确定元素属于哪一个子集,或判断两个元素是否属于同一子集 Union: 将 ...
- 微信小程序用户信息解密失败导致的内存泄漏问题。
微信小程序获取用户解密的Session_key 然后对 encryptedData进行解密 偶尔报错 时间长了之后会报内存溢出: java.lang.OutOfMemoryError: GC over ...
- 在ASP.NET Core中使用brotli压缩
Brotli是一种全新的数据格式,可以提供比Zopfli高20-26%的压缩比.据谷歌研究,Brotli压缩速度同zlib的Deflate实现大致相同,而在Canterbury语料库上的压缩密度比LZ ...
- mantisbt的配置与安装
下载并安装wampserver; 安装时,提示SMTP服务器时,应正确填写邮箱的SMTP的服务器地址: 安装完成后,登录phpMyAdmin; 给原有的root用户创建密码,所有root用户: 创建一 ...
- 【RL-TCPnet网络教程】第13章 RL-TCPnet之TCP服务器
第13章 RL-TCPnet之TCP服务器 本章节为大家讲解RL-TCPnet的TCP服务器实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...
- [Swift]LeetCode978. 最长湍流子数组 | Longest Turbulent Subarray
A subarray A[i], A[i+1], ..., A[j] of A is said to be turbulent if and only if: For i <= k < j ...
- Python基础综合运用——搭建名片管理系统
综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ************ ...
- HBase之Table.put客户端流程
首先,让我们从HTable.put方法开始.由于这一节有很多方法只是简单的参数传递,我就简单略过,但是,关键的方法我还是会截图讲解,所以希望大家尽可能对照源码进行流程分析.另外,在这一节,我单单介绍p ...