图片与TFRecord 数据格式的相互转换(一)

一、实现图片向TFRecord的转换

(1)假设文件夹G:\Exercise\Python\tfrecord中有两张图片,分别为:0.jpg, 1.jpg,如下图所示:


(2)新建命名为:”image_information.txt_bak“的文件夹,其中内容为:

它存取了图片所在的文件夹信息,以及每张图片的label

(3)并新建命名为“Img2Tfrecord.py”的python文件,用于编程实现jpeg格式向TFRecord格式的转换,并新建“data”的文件夹,以保存变换得到的“**.tfrecords”的文件.


Img2Tfrecord.py”的具体代码如下:

# -*- coding:utf-8 -*-

__author__="David Chow"

# 将图片保存成 TFRecord  
import tensorflow as tf
import numpy as np


savedir="G:/Exercise/Python/tfrecord/data/data.tfrecords"  #希望在data/文件夹中生成“data.tfrecords"的TFRecord格式文件

def  _int64_feature(value):
	return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
	
def  _bytes_feature(value):
	return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
	
def load(imgdir,width,height,method=0):
    # 准备一个 writer 用来写 TFRecord 文件  
	writer=tf.python_io.TFRecordWriter(savedir)
	imglist=open(imgdir,'r')
	with tf.Session() as sess:
		for line in imglist:             #open 打开的文件返回对象是一个可迭代对象,直接用 for 迭代访问
		   # 获得图片的路径和类型
			tmp=line.strip().split(' ')  #str.strip([chars])用于去除头尾的字符chars,为空时默认删除空白符;
			                             #str.split(' ')通过指定一个空格对字符串进行切片,返回分割后的字符串列表tmp
			imgpath=tmp[0]               #字符串列表tmp中tmp[0]代表该图像的路径
			label=int(tmp[1])            #字符串列表tmp中tmp[1]代表该图像的标签
			
			# 读取图片 
			img=tf.gfile.FastGFile(imgpath,'r').read()
			
			# 解码图片(如果是 png 格式就使用tf.image.decode_png))
			img=tf.image.decode_jpeg(img)

			# 图片归一化,[0,1],浮点类型数据。因为为了将图片数据能够保存到 TFRecord 结构体中,所以需要将其图片矩阵转换成 string,
			# 所以为了在使用时能够转换回来,这里确定下数据格式为 tf.float32 
			img=tf.image.convert_image_dtype(img,dtype=tf.float32)
			
			# 把图片转换成希望的大小,由于本例子中两张图片大小都是650*434,所以此步骤可以省略。要注意的时候resize_images中输入图片的宽、高顺序
			img=tf.image.resize_images(img,[height,width],method)
			
			# 执行op:image  
			img=sess.run(img)
			
			# 将其图片矩阵转换成string  
			img_raw=img.tostring()
			
			# 将数据整理成 TFRecord 需要的数据结构 
			example=tf.train.Example(features=tf.train.Features(feature= \
			{'imge_raw':_bytes_feature(img_raw),'label':_int64_feature(label)}))
			
			
			# 写 TFRecord  
			writer.write(example.SerializeToString())  #SerializeToString()作用:把example序列化为一个字符串,因为在写入到TFRcorde的时候,write方法的参数是字符串的.
	writer.close()

			
if __name__=='__main__':
	load("G:/Exercise/Python/tfrecord/image_information.txt_bak",650,434)


(4)执行上述.py程序后,可以在data/文件夹中看到生成“data.tfrecords"的TFRecord格式文件,如图所示:



  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

David-Chow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值