Tensorflow在处理数据时,经常加载图像数据,有的时候是直接读取文件,有的则是读取二进制文件,为了更好的理解Tensorflow数据处理模式,先简单讲解显示图片机制,就能更好掌握是否读取正确了。

一、结合opencv读取显示图片

1、变量

使用tf.Variable初始化为tensor,加载到tensorflow对图片进行显示

def showimage_variable_opencv(filename):
image = cv2.imread(filename) # Create a Tensorflow variable
image_tensor = tf.Variable(image, name = 'image') with tf.Session() as sess:
# image_flap = tf.transpose(image_tensor, perm = [1,0,2])
sess.run(tf.global_variables_initializer())
result = sess.run(image_tensor) cv2.imshow('result', result)
cv2.waitKey(0)

2、placeholder

OpenCV读入图片,使用tf.placeholder符号变量加载到tensorflow里,然后tensorflow对图片进行显示

def showimage_placeholder_opencv(filename):
image = cv2.imread(filename) # Create a Tensorflow variable
image_tensor = tf.placeholder('uint8', [None, None, 3]) with tf.Session() as sess:
# image_flap = tf.transpose(image_tensor, perm = [1,0,2])
# sess.run(tf.global_variables_initializer())
result = sess.run(image_tensor, feed_dict = {image_tensor:image}) cv2.imshow('result', result)
cv2.waitKey(0)

上面两个内容非常简单,opencv读取图像数据,成为图像矩阵,然后直接转化成tensorflow的tensor形式,之后通过会话窗口输出图像,进而显示。

参考文献:TensorFlow与OpenCV,读取图片,进行简单操作并显示

二、tensorflow内部读取文件显示

1、tensorflow的gfile

直接使用tensorflow提供的函数image = tf.gfile.FastGFile('PATH')来读取一副图片:

def showimage_gfile(filename):

#    读物文件
    image = tf.gfile.FastGFile(filename, 'r').read()
     #        #图像解码
    image_data = tf.image.decode_jpeg(image)
     #改变图像数据的类型
    image_show = tf.image.convert_image_dtype(image_data, dtype = tf.uint8)    
     plt.figure(1)
    
     with tf.Session() as sess:
         plt.imshow(image_show.eval())
         sess.run(image_show)

2.string_input_producer

将图像加载到创建好的队列中使用tf.train.string_input_producer(),然后再加载到变量当中:

def showimage_string_input(filename):
# 函数接受文件列表,如果是文件名需要加[]
file_queue = tf.train.string_input_producer([filename]) # 定义读入器,并读入文件缓存器
image_reader = tf.WholeFileReader()
_, image = image_reader.read(file_queue)
image = tf.image.decode_jpeg(image) with tf.Session() as sess:
# 初始化协同线程
coord = tf.train.Coordinator()
# 启动线程
threads = tf.train.start_queue_runners(sess = sess, coord = coord)
result = sess.run(image)
coord.request_stop()
coord.join(threads)
image_uint8 = tf.image.convert_image_dtype(image, dtype = tf.uint8)
plt.imshow(image_uint8.eval())

cv2.imshow('result', result)
     cv2.waitKey(0)

string_input_producer来生成一个先入先出的队列, 文件阅读器会需要它来读取数据。

string_input_producer 提供的可配置参数来设置文件名乱序和最大的训练迭代数, QueueRunner会为每次迭代(epoch)将所有的文件名加入文件名队列中, 如果shuffle=True的话, 会对文件名进行乱序处理。这一过程是比较均匀的,因此它可以产生均衡的文件名队列。

这个QueueRunner的工作线程是独立于文件阅读器的线程, 因此乱序和将文件名推入到文件名队列这些过程不会阻塞文件阅读器运行。

这个函数在tensorflow应用非常重要,用函数目的是为了将文件列表预先加载文件内出表中,方便文件读取,减少读取数据的时间,具体简介可以参考这篇文章:

十图详解TensorFlow数据读取机制(附代码)

文章中对文件保存和读取讲解很清晰,此处重点引用过来

我们用一个具体的例子感受TensorFlow中的数据读取。如图,假设我们在当前文件夹中已经有A.jpg、B.jpg、C.jpg三张图片,我们希望读取这三张图片5个epoch并且把读取的结果重新存到read文件夹中。

# 导入TensorFlow
import TensorFlow as tf # 新建一个Session
with tf.Session() as sess:
# 我们要读三幅图片A.jpg, B.jpg, C.jpg
filename = ['A.jpg', 'B.jpg', 'C.jpg']
# string_input_producer会产生一个文件名队列
filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5)
# reader从文件名队列中读数据。对应的方法是reader.read
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
# tf.train.string_input_producer定义了一个epoch变量,要对它进行初始化
tf.local_variables_initializer().run()
# 使用start_queue_runners之后,才会开始填充队列
threads = tf.train.start_queue_runners(sess=sess)
i = 0
while True:
i += 1
# 获取图片数据并保存
image_data = sess.run(value)
with open('read/test_%d.jpg' % i, 'wb') as f:
f.write(image_data)

运行代码后,我们得到就可以看到read文件夹中的图片,正好是按顺序的5个epoch:

如果我们设置filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5)中的shuffle=True,那么在每个epoch内图像就会被打乱,如图所示:

我们这里只是用三张图片举例,实际应用中一个数据集肯定不止3张图片,不过涉及到的原理都是共通的。

3、slice_input_producer

从众多tensorlist里面,随机选取一个tensor

def saveimages_slice_input(filenames):
labels = [1,2,3]
images_tensor = tf.convert_to_tensor(filenames, dtype=tf.string)
labels_tensor = tf.convert_to_tensor(labels, dtype=tf.uint8) file = tf.train.slice_input_producer([images_tensor, labels_tensor])
image_content = tf.read_file(file[0])
index = file[1]
image_data = tf.image.convert_image_dtype(tf.image.decode_jpeg(image_content), tf.uint8) with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess = sess, coord = coord)
sess.run(image_data)
print(sess.run(index))
coord.request_stop()
coord.join(threads)
plt.imshow(image_data.eval())

其实这个是每次只能抽取一个图片,如果需要读取多个图片还是需要构建batch,后面讲对其进行详细的讲解。

其中image_content = tf.read_file(file[0]),必须添加为file[0]才能正确图像数据,进而显示图像。file[1]则是输出数字。

Tensorflow显示图片的更多相关文章

  1. python实现读取并显示图片的两种方法

    https://www.cnblogs.com/lantingg/p/9259840.html 在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片. ...

  2. img只显示图片一部分 或 css设置背景图片只显示图片指定区域

    17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...

  3. python将图片转换为Framebuffer裸数据格式(终端显示图片)

    要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口,直接写入像素信息即可. 但普通的图片带有头部信息或者编码格式不同,直接送入Framebuffer是显 ...

  4. Chrome 控制台新玩法-console显示图片以及为文字加样式

    有兴趣的同学可以文章最后的代码复制贴到控制台玩玩. Go for Code 在正常模式下,一般只能向console 控制台输出简单的文字信息.但为了把信息输出得更优雅更便于阅读,除了cosole.lo ...

  5. 如何使用SOIL在VS2012的 C++环境下显示图片

    先看下效果. 这是一个很无聊的功能....首先说下,我做这个功能的初衷并不是为了实现在控制台中显示图片...(这貌似很无聊) 而是因为自己想做用C做一个游戏:http://q.cnblogs.com/ ...

  6. Qt自适应大小显示图片,添加菜单

    由于后面的图像处理需要UI,OpenCV自带也不怎么会,MFC实在懒得学的.听同学说Qt不错,就用Qt做UI了. 本文主要介绍三个内容:在Qt Creator中使用OpenCV2.Qt中自适应显示图片 ...

  7. EmguCV控件Emgu.CV.UI.ImageBox及C# picturebox显示图片连续刷新出现闪烁问题

    在上一篇里,EmguCV(OpenCV)实现高效显示汉字及叠加  实现了视频叠加及显示,但存在问题,就是 Emgu.CV.UI.ImageBox及C# picturebox显示图片时都会出现闪烁,尤其 ...

  8. 显示图片的(自定义)吐司Toast

    一般我们提示的时候都是直接提示文字的,其实Toast也可以显示图片 常用方法 Toast.makeText(context,text,duration)这返回一个Toast对象 toast.setDu ...

  9. python 读取并显示图片的两种方法

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

随机推荐

  1. 重建控制文件报错 ORA-01503 ORA-01192

    1. 错误信息 ORA-: CREATE CONTROLFILE failed ORA-: must have at least one enabled thread 2. 重建脚本 CREATE C ...

  2. 使用sysbench 0.5 对mysql 进行性能、压力测试

    sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.目前sysbench代码托管在launchpad上,项目地址:https://launc ...

  3. Lua中assert( )函数的使用

    当Lua遇到不期望的情况时就会抛出错误,比如:两个非数字进行相加:调用一个非函数的变量:访问表中不存在的值等.你也可以通过调用error函数显示的抛出错误,error的参数是要抛出的错误信息. ass ...

  4. 【APUE | 03】文件I/O

    博客链接: inux中的文件描述符与打开文件之间的关系 #include <stdio.h> #include <unistd.h> #include <sys/stat ...

  5. [转] history.back()和history.go()的区别

    Javascript:history.go()和history.back()的用法和区别 go(-1): 返回上一页,原页面表单中的内容会丢失:history.go(-1):后退+刷新:history ...

  6. Java-把日期字符串转换成另一种格式的日期字符串

    package com.example.demo.utils; import java.text.ParseException; import java.text.SimpleDateFormat; ...

  7. [转]利用ssh传输文件

    利用ssh传输文件 http://www.cnblogs.com/jiangyao/archive/2011/01/26/1945570.html 在linux下一般用scp这个命令来通过ssh传输文 ...

  8. GGTalk ——C#开源即时通讯系统

    http://www.cnblogs.com/justnow/ GGTalk ——C#开源即时通讯系统 下载中心   GGTalk(简称GG)是可在广域网部署运行的QQ高仿版,2013.8.7发布GG ...

  9. 原 HTML5 requestFullScreen&exitFullscreen全屏兼容方案

                         摘要: html5 video全屏实现方式 首先来说,这个标题具有误导性,但这样设置改标题也是主要因为video使用的比较多 在html5中,全屏方法可以适用 ...

  10. Python_datetime模块

    datetime模块重新封装了time模块,提供更多的接口,提供的类有: date,表示日期的类 time,表示时间的类 datetime,表示日期和时间的类 timedelta,表示时间间隔,即两个 ...