图片与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格式文件,如图所示:



猜你喜欢

转载自blog.csdn.net/qq_23981335/article/details/80525642