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. spring cloud Hystix熔断机制--基本熔断配置和Fegin client熔断配置

    所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的提供方出现了问题之后整个的程序将出现错误的信息显示 ...

  2. 爬取文件时,对已经操作过的URL进行过滤

    爬取文件时,对已经操作过的URL进行过滤 1.创建过滤规则文件filter.py在spiders同级目录 class RepeatUrl: def __init__(self): self.visit ...

  3. ElasticSearch搜索解析

    这篇介绍稍多,篇幅可能有点多,下面会针对一些重要的点做一些小测试 搜索返回文档解析 hits搜索返回的结果中最重要的一部分其中包含了 索引信息(_index,_type,_index,_source, ...

  4. 解开一个疑惑,为什么LVS开放的端口,使用netstat或ss命令,不能查找到其监听的端口呢?

    RT, 这个疑问,本周一直在心里,今天找到一个说法. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 另外LVS规则算是内核方法,用netstat -ntulp也显 ...

  5. [转] Mongoose简要API

    Mongoose是在node.js环境下对mongodb进行便捷操作的对象模型工具 因此,要使用mongoose,则必须安装node.js环境以及mongodb数据库.mongoose使mongodb ...

  6. WPF数据爬取小工具-某宝推广位批量生成,及订单爬取 记:接单最痛一次的感悟

    项目由来:上月闲来无事接到接到一个单子,自动登录 X宝平台,然后重定向到指定页面批量生成推广位信息:与此同时自动定时同步订单数据到需求提供方的Java服务. 当然期间遇到一个小小的问题就是界面样式的问 ...

  7. php通过CURL模拟post提交请求

    <?php header("Content-type:text/html;charset=utf-8"); class Test{ public function reque ...

  8. 两个select一个选中,另一个就没有选中的那个值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. .net core cookie登录和session的 DataProtectionProvider 加入 redis

    string redisConnectionString = Configuration.GetSection("Storage:Redis").GetValue<strin ...

  10. LRU缓存,大神写的,值得借鉴

    http://blog.csdn.net/beiyeqingteng/article/details/7010411