Tensorflow显示图片
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中的数据读取。如图,假设我们在当前文件夹中已经有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显示图片的更多相关文章
- python实现读取并显示图片的两种方法
https://www.cnblogs.com/lantingg/p/9259840.html 在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片. ...
- img只显示图片一部分 或 css设置背景图片只显示图片指定区域
17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...
- python将图片转换为Framebuffer裸数据格式(终端显示图片)
要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口,直接写入像素信息即可. 但普通的图片带有头部信息或者编码格式不同,直接送入Framebuffer是显 ...
- Chrome 控制台新玩法-console显示图片以及为文字加样式
有兴趣的同学可以文章最后的代码复制贴到控制台玩玩. Go for Code 在正常模式下,一般只能向console 控制台输出简单的文字信息.但为了把信息输出得更优雅更便于阅读,除了cosole.lo ...
- 如何使用SOIL在VS2012的 C++环境下显示图片
先看下效果. 这是一个很无聊的功能....首先说下,我做这个功能的初衷并不是为了实现在控制台中显示图片...(这貌似很无聊) 而是因为自己想做用C做一个游戏:http://q.cnblogs.com/ ...
- Qt自适应大小显示图片,添加菜单
由于后面的图像处理需要UI,OpenCV自带也不怎么会,MFC实在懒得学的.听同学说Qt不错,就用Qt做UI了. 本文主要介绍三个内容:在Qt Creator中使用OpenCV2.Qt中自适应显示图片 ...
- EmguCV控件Emgu.CV.UI.ImageBox及C# picturebox显示图片连续刷新出现闪烁问题
在上一篇里,EmguCV(OpenCV)实现高效显示汉字及叠加 实现了视频叠加及显示,但存在问题,就是 Emgu.CV.UI.ImageBox及C# picturebox显示图片时都会出现闪烁,尤其 ...
- 显示图片的(自定义)吐司Toast
一般我们提示的时候都是直接提示文字的,其实Toast也可以显示图片 常用方法 Toast.makeText(context,text,duration)这返回一个Toast对象 toast.setDu ...
- python 读取并显示图片的两种方法
在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...
随机推荐
- youtube-dl更新出错解决办法
youtube-dl更新命令: youtube-dl -U 更新报错:无法识别当前版本 ERROR: can't find the current version. Please try again ...
- MySQL表按月切割
按月份切割MySQL表数据: 千万级别的数据量也可在毫秒内完成切割操作 注:数据无价请提前自行备份 #!/bin/bash USERNAME=MySQL_user PASSWORD=MySQL_pwd ...
- 封装cuda/cudnn写卷积网络前向计算程序
目录 基本编译配置 一些常识 BN层的坑 cuda基础 向cuda核函数传入结构体指针? 参考:http://galoisplusplus.coding.me/blog/2018/05/22/cuda ...
- 分库分表之后全局id怎么生成
数据库自增id: 这个就是说你的系统里每次得到一个id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个id.拿到这个id之后再往对应的分库分表里去写入. 这个方案的好 ...
- nginx的with-http_sub_module模块使用之替换字符串
一.介绍 该ngx_http_sub_module模块是一个过滤器,通过将一个指定的字符串替换为另一个字符串来修改响应.该模块不是默认生成的,它应该使用--with-http_sub_module 配 ...
- 如何扩展Orchard
翻译自: http://msdn.microsoft.com/en-us/magazine/hh708754.aspx 动态类型系统 Content item是Orchard中的原子, 比如b ...
- 通过awk获取netstat命令中的进程号
需要如下: 获取进程号
- Python学习(二十四)—— 前端基础之Bookstrap
转载自:http://www.cnblogs.com/liwenzhou/p/8214637.html 一.Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.Jav ...
- Codeforces 912C Perun, Ult!
Perun, Ult! 恶心题, 好多细节... 啊, 好恶心啊. #include<bits/stdc++.h> #define LL long long #define fi firs ...
- BZOJ1009 [HNOI2008]GT考试 矩阵
去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...