参考博客——tensorflow-TFRecord 文件详解

1. 生成tfrecord文件


代码

#1.创建tfrecord对象
tf_record=tf.python_io.TFRecordWriter(tf_record_name)tf.train.Int64List(value=list_data)
tf.train.FloatList( )
tf.train.BytesList()tf.train.Feature(int64_list=)
tf.train.Feature(float_list=tf.train.FloatList())
tf.train.Feature(bytes_list=tf.train.BytesList())tf.train.Features(feature=dict_data)
ut = tf.train.Features(feature={"suibian": tf.train.Feature(int64_list=tf.train.Int64List(value=[1, 2, 4])),"a":tf.train.Feature(float_list=tf.train.FloatList(value=[5., 7.]))})example=tf.train.Example(features=tf.train.Features(...))#2. 写入example对象序列化后的结果
tfrecord_writer.write(example.SerializeToString())

2. 读取tfrecord文件

从文件读取有 3 大步骤

  1. 生成读取器,不同类型的文件有对应的读取器

  2. 把文件名列表生成队列

  3. 用读取器的 read 方法读取队列中的文件

3 代码

3.1 dataset_to_tfrecord.py

import os
import xml.etree.ElementTree as ET
import tensorflow as tf
from dataset_config import DIRECTORY_ANNOTATIONS,DIRECTORY_IMAGES,NUM_IMAGES_TFRECORD,labels_to_class
from utils.data_process_util import int64_feature,float_feature,bytes_feature
def _convert_to_example(img,img_shape,labels,trunacted,difficult,bndbox_size):'''将一张图片使用example,转换成protobuffer 格式:param img::param img_shape::param labels::param trunacted::param difficult::param bndbox_size::return:'''# 为了转换需求,bbox由单个obj的四个位置值,# 转变成四个位置的单独列表# 即:[[12,120,330,333],[50,60,100,200]]————>[[12,50],[120,60],[330,100],[333,200]]ymin=[]xmin=[]ymax=[]xmax=[]for b in bndbox_size:ymin.append(b[0])xmin.append(b[1])ymax.append(b[2])xmax.append(b[3])img_format = b'JPEG'print(type(labels))for i,label in enumerate(labels):labels[i]=labels_to_class[label]print('trunacted:',trunacted,type(trunacted),len(trunacted))example = tf.train.Example(features=tf.train.Features(feature={'image/height':int64_feature(img_shape[0]),'image/width':int64_feature(img_shape[1]),'image/channels':int64_feature(img_shape[2]),'image/shape':int64_feature(img_shape),'image/object/bbox/xmin':float_feature(xmin),'image/object/bbox/ymin':float_feature(ymin),'image/object/bbox/xmax':float_feature(xmax),'image/object/bbox/ymax':float_feature(ymax),'image/object/bbox/label_text':int64_feature(labels),# 'image/object/bbox/trunacted':bytes_feature(trunacted),# 'image/object/bbox/difficult':bytes_feature(difficult),'image/object/bbox/format':bytes_feature(img_format),'image/object/bbox/data':bytes_feature(img)# 读取的图像值}))print(img_format)return exampledef _process_image(dataset_dir,img_name):'''读取图像和xml文件:param dataset_dir::param img_name::return:'''#1.读取图像#图像路径img_path = os.path.join(dataset_dir,DIRECTORY_IMAGES,img_name+'.jpg')img = tf.gfile.FastGFile(img_path,'rb').read()#tensorflow读取图像#2.读取xml#xml路径xml_path =os.path.join(dataset_dir,DIRECTORY_ANNOTATIONS,img_name+'.xml')tree = ET.parse(xml_path)root = tree.getroot()#获取根节点,'annotation'标签# 2.1获取图像尺寸信息size = root.find('size')img_shape=[int(size.find('height').text),int(size.find('width').text),int(size.find('depth').text)]#2.2 获取bounding box 相关信息# bounding box可能有多个,用多个列表存储相关信息。labels = []trunacted=[]difficult = []bndbox_sizes=[]bboxes = root.findall('object')for obj in bboxes:label = obj.find('name').textif obj.find('trunacted'):trunacted.append(obj.find('trunacted').text)else:trunacted.append('0')if obj.find(''):difficult.append(obj.find('difficult').text)else:difficult.append(0)bndbox = obj.find('bndbox')bndbox_size=(float(bndbox.find('ymin').text)/img_shape[0],float(bndbox.find('xmin').text)/img_shape[1],float(bndbox.find('ymax').text)/img_shape[0],float(bndbox.find('xmax').text)/img_shape[1])labels.append(label)trunacted.append(trunacted)difficult.append(difficult)bndbox_sizes.append(bndbox_size)return img,img_shape,labels,trunacted,difficult,bndbox_sizesdef _add_to_tfrecord(dataset_dir,img_name,tfrecord_writer):'''读取图片和xml文件,保存成一个Example:param dataset_dir:根目录:param img_name:图像名称:param tfrecord_writer::return:'''#1.读取图片内容及相应的xml文件img, img_shape, labels, trunacted, difficult, bndbox_size=_process_image(dataset_dir,img_name)# return img,img_shape,labels,trunacted,difficult,bndbox_size#2.读取的内容封装成Example,example = _convert_to_example(img, img_shape, labels, trunacted, difficult, bndbox_size)#3.Example序列化结果写入指定tfrecord文件tfrecord_writer.write(example.SerializeToString())def _get_output_tfrecord_name(output_dir,name,fdx):""":param output_dir::param name::param fdx:第几个tfrecord文件:return:"""return os.path.join(output_dir,name,'%06d'%fdx+'.tfrecord')def read_tfrecord():slim = tf.contrib.slimdataset = slim.dataset#第一个参数,文件路径file_pattern = os.path.join('tf_records\data','*.record')#第二个参数reader = tf.TFRecordReader# file_pattern = '%s-*  '  # 前面保存的tfrecord文件的文件名类似于“train-00001-of-00004.tfrecord”# file_pattern = os.path.join(dataset_dir, file_pattern % split_name)  # dataset_dir即前面保存的tfrecord文件的路径# 使用slim中的函数tf.FixedLenFeature将tfrecord的example反序列化成存储之前的格式,# 字符串格式的用''表示,整型格式的用0表示,其他确定的信息还原为原来的形式,如'jpeg','png'keys_to_features = {'image/object/bbox/data': tf.FixedLenFeature((), tf.string, default_value=''),'image/object/bbox/format': tf.FixedLenFeature((), tf.string, default_value='jpeg'),'image/height': tf.FixedLenFeature((), tf.int64, default_value=0),'image/width': tf.FixedLenFeature((), tf.int64, default_value=0),'image/object/bbox/label_text': tf.FixedLenFeature((), tf.int64, default_value=0)}# 将反序列化的数据重组为更适合网络读入的格式items_to_handlers = {'image': slim.tfexample_decoder.Image(image_key='image/object/bbox/data',format_key='image/object/bbox/format',channels=3),# 'image_name': tfexample_decoder.Tensor('image/filename'),'height': slim.tfexample_decoder.Tensor('image/height'),'width': slim.tfexample_decoder.Tensor('image/width'),# 'labels_class': tfexample_decoder.Image(#     image_key='image/segmentation/class/encoded',#     format_key='image/segmentation/class/format',#     channels=1)}# 解码器进行解码,定义一个解码器对象,保存到dataset中# 第三个参数decoderdecoder = slim.tfexample_decoder.TFExampleDecoder(keys_to_features, items_to_handlers)# 返回由tfrecord信息所得到的数据集dataset,dataset对象定义了数据集的文件位置,解码方式等元信息dataset = dataset.Dataset(data_sources=file_pattern,  # tfrecord路径reader=tf.TFRecordReader,  # 读取tfrecord文件的方式decoder=decoder,  # 解码tfrecord文件的方式num_samples=1464,  # PASCAL-VOC2012数据集训练样本数items_to_descriptions={  # 样本集图像和标签描述'image': 'A color image of varying height and width.','labels_class': ('A semantic segmentation label whose size matches image.''Its values range from 0 (background) to num_classes.')},num_classes = 3,  # 数据集包含类别数(20个前景类别和1个背景类别)multi_label = True)  # 多标签(具体我也不太清楚)dataset_data_provider = slim.dataset_data_providerprefetch_queue = slim.prefetch_queue# 创建一个DatasetDataProvider类的对象data_provider,根据dataset和其他的一些已知信息读取数据。data_provider = dataset_data_provider.DatasetDataProvider(dataset,num_readers=1,num_epochs=None,shuffle=True)# 通过调用data_provider对象的get实例函数能够根据data_provider中给出的信息解读tfrecord文件,生成图像和标签和图像文件名image, height, width = data_provider.get(['image', 'height', 'width'])# image_name, = data_provider.get(['image_name'])# label = data_provider.get(['label'])# 图像预处理过程,这里具体的处理过程与本文主题无关,因此省略具体的处理过程return image, height, widthdef run(dataset_dir,output_dir,name='data'):"""运行转换代码逻辑。存入多个tfrecord文件,每个文件固定N个样本:param dataset_dir:数据集目录,包含annotations,jpeg文件夹:param output_dir:tfrecords存储目录:param name:数据集名字,指定名字以及train or test:return:"""# 1. 判断数据集目录是否存在,创建一个目录if tf.gfile.Exists(dataset_dir):tf.gfile.MakeDirs(dataset_dir)# 输出路径需要已存在# if tf.gfile.Exists(output_dir):#     tf.gfile.MakeDirs(output_dir)# 2. 读取某个文件夹下的所有文件名字列表dir_path = os.path.join(dataset_dir,DIRECTORY_ANNOTATIONS)files_path = sorted(os.listdir(dir_path))print(files_path)# 3. 循环名字列表,# 每200(NUM_IMAGES_TFRECORD)个图片及xml文件存储到一个tfrecord文件中num = len(files_path)i = 0fdx = 0while i < num:tf_record_name = _get_output_tfrecord_name(output_dir,name,fdx)with tf.python_io.TFRecordWriter(tf_record_name) as tf_record_writer:j = 0while i<num and j < NUM_IMAGES_TFRECORD:xml_path = files_path[i]img_name = xml_path.split('.')[0]#每个图像构建一个Example,保存到tf_record_name中_add_to_tfrecord(dataset_dir,img_name,tf_record_writer)j += 1i += 1fdx += 1print('fdx',fdx)print('数据集%s转换成功'%(dataset_dir))

3.2 tfrecord文件读取

def read_tfrecord():slim = tf.contrib.slimdataset = slim.dataset#第一个参数,文件路径file_pattern = os.path.join('tf_records\data','*.tfrecord')#第二个参数reader = tf.TFRecordReader# file_pattern = '%s-*  '  # 前面保存的tfrecord文件的文件名类似于“train-00001-of-00004.tfrecord”# file_pattern = os.path.join(dataset_dir, file_pattern % split_name)  # dataset_dir即前面保存的tfrecord文件的路径# 使用slim中的函数tf.FixedLenFeature将tfrecord的example反序列化成存储之前的格式,# 字符串格式的用''表示,整型格式的用0表示,其他确定的信息还原为原来的形式,如'jpeg','png'keys_to_features = {'image/object/bbox/data': tf.FixedLenFeature((), tf.string, default_value=''),'image/object/bbox/format': tf.FixedLenFeature((), tf.string, default_value='jpeg'),'image/height': tf.FixedLenFeature((), tf.int64, default_value=0),'image/width': tf.FixedLenFeature((), tf.int64, default_value=0),'image/object/bbox/label_text': tf.FixedLenFeature((), tf.int64, default_value=0)}# 将反序列化的数据重组为更适合网络读入的格式items_to_handlers = {'image': slim.tfexample_decoder.Image(image_key='image/object/bbox/data',format_key='image/object/bbox/format',channels=3),# 'image_name': tfexample_decoder.Tensor('image/filename'),'height': slim.tfexample_decoder.Tensor('image/height'),'width': slim.tfexample_decoder.Tensor('image/width'),# 'labels_class': tfexample_decoder.Image(#     image_key='image/segmentation/class/encoded',#     format_key='image/segmentation/class/format',#     channels=1)}# 解码器进行解码,定义一个解码器对象,保存到dataset中# 第三个参数decoderdecoder = slim.tfexample_decoder.TFExampleDecoder(keys_to_features, items_to_handlers)# 返回由tfrecord信息所得到的数据集dataset,dataset对象定义了数据集的文件位置,解码方式等元信息dataset = dataset.Dataset(data_sources=file_pattern,  # tfrecord路径reader=tf.TFRecordReader,  # 读取tfrecord文件的方式decoder=decoder,  # 解码tfrecord文件的方式num_samples=1464,  # PASCAL-VOC2012数据集训练样本数items_to_descriptions={  # 样本集图像和标签描述'image': 'A color image of varying height and width.','labels_class': ('A semantic segmentation label whose size matches image.''Its values range from 0 (background) to num_classes.')},num_classes = 3,  # 数据集包含类别数(20个前景类别和1个背景类别)multi_label = True)  # 多标签(具体我也不太清楚)dataset_data_provider = slim.dataset_data_providerprefetch_queue = slim.prefetch_queue# 创建一个DatasetDataProvider类的对象data_provider,根据dataset和其他的一些已知信息读取数据。data_provider = dataset_data_provider.DatasetDataProvider(dataset,num_readers=1,num_epochs=None,shuffle=True)# 通过调用data_provider对象的get实例函数能够根据data_provider中给出的信息解读tfrecord文件,生成图像和标签和图像文件名image, height, width = data_provider.get(['image', 'height', 'width'])# image_name, = data_provider.get(['image_name'])# label = data_provider.get(['label'])# 图像预处理过程,这里具体的处理过程与本文主题无关,因此省略具体的处理过程return image, height, width

tfrecord文件生成与读取相关推荐

  1. Tensorflow—TFRecord文件生成与读取

    Tensorflow-TFRecord文件生成与读取 微信公众号:幼儿园的学霸 个人的学习笔记,关于OpenCV,关于机器学习, -.问题或建议,请公众号留言; 目录 文章目录 Tensorflow- ...

  2. Python先生,你好!(4)——npz、npy文件生成与读取

    Python先生,你好!(4)--npz.npy文件生成与读取 (一)前 言 (二)np.save()函数 (1)生成一个数组 (2)储存数组 (三)np.savez()函数 (1)生成两个数组 (2 ...

  3. 打包tfrecord文件,并读取

    Tfrecord文件是tensorflow专门设计的一种训练样本储存格式,将训练样本打包成tfrecord格式后能够加快文件的读取效率.所以训练网络的第一步就是将自己的训练集样本打包生成tfrecor ...

  4. npz、npy文件生成与读取

    在Numpy中提供了多种文件操作函数,我们可以通过这些文件操作函数,快速地对numpy数组进行存取,十分方便.下面介绍如何生成和读取npz.npy文件 1.np.save()函数可以存储一个np.ar ...

  5. plist文件生成与读取

    废话不多说,这里简明扼要的介绍一下plist文件的生成与读取 1.创建plist文件 2.代码读取plist文件 NSString *plistPath = [[NSBundle mainBundle ...

  6. C#如何实现XML文件生成和读取,XML文件的打开方式,解决方案!!!!!!

    以前对XML文件没什么了解,觉得很神奇,其实C#中的XML文件一般就是你们项目下的配置文件,由根节点和子节点组成. 接下来给大家说说XML文件最基础的读取和生成! 以下为C#程序XML文件生成的控制台 ...

  7. java中RSA数字证书生成,jks文件生成以及读取。

    一.Java代码生成cer证书文件: public class GetCertFile { //证书颁发者     static String CertificateIssuer = "C= ...

  8. ONI文件生成与读取

    之前一直不知道如何实时保存RGB-D数据,每次都写入PCD文件不现实,对于30fps的,每秒就有30个PCD文件,硬盘速度绝逼跟不上.保存color和depth视频吧,总觉得不方便,而且depth压缩 ...

  9. 第五篇:基于深度学习的人脸特征点检测 - 生成TFRecord文件

    在上一篇博文中,我们已经获取到了所有样本的面部区域,并且对面部区域的有效性进行了验证.当使用TensorFlow进行神经网络训练时,涉及到的大量IO操作会成为训练速度的瓶颈.为了加快训练的速度,方便后 ...

最新文章

  1. python环境变量值_如何在python中读取Windows环境变量值?
  2. PHP实现常见排序算法
  3. matlab缩小矩阵尺寸,Matlab中对矩阵使用矩阵尺寸的索引
  4. 什么是Intent? 转
  5. 微信小程序登录页php后台,微信小程序:微信登陆(ThinkPHP作后台)
  6. linux内核源代码_如何从源代码构建和安装最新的Linux内核
  7. 排序数字英文字母交错,由小到大
  8. 如何从0到1搭建物联网系统?
  9. HTML5 Geolocation用来定位用户的位置。
  10. Java EE之Hibernate异常总结【5】java.lang.StackOverflowError[栈溢出]
  11. mssql 设置自增字段的起始值
  12. Android下 使用百度地图sdk
  13. 程序员量子力学-海森堡式BUG
  14. 3D打印技术助力传感器:制造出堪比鹰眼视野的摄像头
  15. October CMS
  16. 鸿蒙系统安兔兔,5摄镜头+鸿蒙系统!华为P40系列曝光
  17. 上下文无关文法的分析树(Context-Free Grammar, CFG)的分析树--编译原理
  18. 产业分析:线上线下融合会展
  19. 中年黑客高考“回忆杀” :如果你想从事安全。。。
  20. iOS-推送自定义提示音

热门文章

  1. 2017java最新面试题_2017年最新java面试题及答案
  2. Java什么时候该加void_平时容易忽视的地方之一:java在抽取方法时,什么时候该用void...
  3. exists的用法 python_10 个 Python 开发技巧
  4. bean validation校验方法参数_SpringBoot参数校验 从入门到精通 解决繁琐的参数验证工作...
  5. python源码精要(2)-C代码规范
  6. numpy(3)-numpy.random.random() ,random_sample()连续均匀分布
  7. 听说GNN大有可为,从这篇开始学以致用
  8. 认仕医生接入云信,医友交流随时随地
  9. 你要的云小信是范爷?柳岩?还是奶茶MM?
  10. 十年磨一剑!SACC带你领略企业大数据平台实践优化!