TFrecord是一个Google提供的用于深度学习的数据格式,个人觉得很方便规范,值得学习。本文主要讲的是怎么存储array,别的数据存储较为简单,举一反三就行。

在TFrecord中的数据都需要进行一个转化的过程,这个转化分成三种

  • int64
  • float
  • bytes

一般来讲我们的图片读进来以后是两种形式,

  1. tf.image.decode_jpeg 解码图片读取成 (width,height,channels)的矩阵,这个读取的方式和cv2.imread以及ndimage.imread一样
  2. tf.image.convert_image_dtype会将读进来的上面的矩阵归一化,一般来讲我们都要进行这个归一化的过程。归一化的好处可以去查。

但是存储在TFrecord里面的不能是array的形式,所以我们需要利用tostring()将上面的矩阵转化成字符串再通过tf.train.BytesList转化成可以存储的形式。

下面给个实例代码,大家看看就懂了

adjust_pic.py : 作用就是转化Image大小

# -*- coding: utf-8 -*-  import tensorflow as tf  def resize(img_data, width, high, method=0):  return tf.image.resize_images(img_data,[width, high], method)

pic2tfrecords.py :将图片存成TFrecord

# -*- coding: utf-8 -*-
# 将图片保存成 TFRecord
import os.path
import matplotlib.image as mpimg
import tensorflow as tf
import adjust_pic as ap
from PIL import Image  SAVE_PATH = 'data/dataset.tfrecords'  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_data(datafile, width, high, method=0, save=False):  train_list = open(datafile,'r')  # 准备一个 writer 用来写 TFRecord 文件  writer = tf.python_io.TFRecordWriter(SAVE_PATH)  with tf.Session() as sess:  for line in train_list:  # 获得图片的路径和类型  tmp = line.strip().split(' ')  img_path = tmp[0]  label = int(tmp[1])  # 读取图片  image = tf.gfile.FastGFile(img_path, 'r').read()  # 解码图片(如果是 png 格式就使用 decode_png)  image = tf.image.decode_jpeg(image)  # 转换数据类型  # 因为为了将图片数据能够保存到 TFRecord 结构体中,所以需要将其图片矩阵转换成 string,所以为了在使用时能够转换回来,这里确定下数据格式为 tf.float32  image = tf.image.convert_image_dtype(image, dtype=tf.float32)  # 既然都将图片保存成 TFRecord 了,那就先把图片转换成希望的大小吧  image = ap.resize(image, width, high)  # 执行 op: image  image = sess.run(image)  # 将其图片矩阵转换成 string  image_raw = image.tostring()  # 将数据整理成 TFRecord 需要的数据结构  example = tf.train.Example(features=tf.train.Features(feature={  'image_raw': _bytes_feature(image_raw),  'label': _int64_feature(label),  }))  # 写 TFRecord  writer.write(example.SerializeToString())  writer.close()  load_data('train_list.txt_bak', 224, 224) 

tfrecords2data.py :读取Tfrecord里的内容

# -*- coding: utf-8 -*-
# 从 TFRecord 中读取并保存图片
import tensorflow as tf
import numpy as np  SAVE_PATH = 'data/dataset.tfrecords'  def load_data(width, high):  reader = tf.TFRecordReader()  filename_queue = tf.train.string_input_producer([SAVE_PATH])  # 从 TFRecord 读取内容并保存到 serialized_example 中  _, serialized_example = reader.read(filename_queue)  # 读取 serialized_example 的格式  features = tf.parse_single_example(  serialized_example,  features={  'image_raw': tf.FixedLenFeature([], tf.string),  'label': tf.FixedLenFeature([], tf.int64),  })  # 解析从 serialized_example 读取到的内容  images = tf.decode_raw(features['image_raw'], tf.uint8)  labels = tf.cast(features['label'], tf.int64)  with tf.Session() as sess:  # 启动多线程  coord = tf.train.Coordinator()  threads = tf.train.start_queue_runners(sess=sess, coord=coord)  # 因为我这里只有 2 张图片,所以下面循环 2 次  for i in range(2):  # 获取一张图片和其对应的类型  label, image = sess.run([labels, images])  # 这里特别说明下:  #   因为要想把图片保存成 TFRecord,那就必须先将图片矩阵转换成 string,即:  #       pic2tfrecords.py 中 image_raw = image.tostring() 这行  #   所以这里需要执行下面这行将 string 转换回来,否则会无法 reshape 成图片矩阵,请看下面的小例子:  #       a = np.array([[1, 2], [3, 4]], dtype=np.int64) # 2*2 的矩阵  #       b = a.tostring()  #       # 下面这行的输出是 32,即: 2*2 之后还要再乘 8  #       # 如果 tostring 之后的长度是 2*2=4 的话,那可以将 b 直接 reshape([2, 2]),但现在的长度是 2*2*8 = 32,所以无法直接 reshape  #       # 同理如果你的图片是 500*500*3 的话,那 tostring() 之后的长度是 500*500*3 后再乘上一个数  #       print len(b)  #  #   但在网上有很多提供的代码里都没有下面这一行,你们那真的能 reshape ?  image = np.fromstring(image, dtype=np.float32)  # reshape 成图片矩阵  image = tf.reshape(image, [224, 224, 3])  # 因为要保存图片,所以将其转换成 uint8  image = tf.image.convert_image_dtype(image, dtype=tf.uint8)  # 按照 jpeg 格式编码  image = tf.image.encode_jpeg(image)  # 保存图片  with tf.gfile.GFile('pic_%d.jpg' % label, 'wb') as f:  f.write(sess.run(image))  load_data(224, 224)

以上代码摘自TFRecord 的使用,觉得挺好的,没改原样照搬,我自己做实验时改了很多,因为我是在im2txt的基础上写的。

tensorflow进阶笔记 --- #3# --- 关于怎么在TFrecord中存储图像的array相关推荐

  1. Angularjs进阶笔记(2)—自定义指令中的数据绑定

    [摘要]有关自定义指令的scope参数,网上很多文章都在讲这3种绑定方式实现的效果是什么,但几乎没有人讲到底怎么使用,本篇希望聊聊到底怎么用这个话题. 一. 自定义指令 自定义指令,是Angularj ...

  2. TensorFlow学习笔记——使用TFRecord进行数据保存和加载

    本篇文章主要介绍如何使用TensorFlow构建自己的图片数据集TFRecord的方法,并使用最新的数据处理Dataset API进行操作. TFRecord TFRecord数据文件是一种对任何数据 ...

  3. TensorFlow学习笔记(二十四)自制TFRecord数据集 读取、显示及代码详解

    在跑通了官网的mnist和cifar10数据之后,笔者尝试着制作自己的数据集,并保存,读入,显示. TensorFlow可以支持cifar10的数据格式, 也提供了标准的TFRecord 格式,而关于 ...

  4. 【Tensorflow教程笔记】TensorFlow Datasets 数据集载入

    Tensorflow教程笔记 基础 TensorFlow 基础 TensorFlow 模型建立与训练 基础示例:多层感知机(MLP) 卷积神经网络(CNN) 循环神经网络(RNN) 深度强化学习(DR ...

  5. TensorFlow学习笔记02:使用tf.data读取和保存数据文件

    TensorFlow学习笔记02:使用tf.data读取和保存数据文件 使用`tf.data`读取和写入数据文件 读取和写入csv文件 写入csv文件 读取csv文件 读取和保存TFRecord文件 ...

  6. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  7. Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题

    Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题 参考文章: (1)Tensorflow学习笔记6:解决tensorflow训练过程中GPU未调用问题 (2)http ...

  8. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  9. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

最新文章

  1. VScode操作记录
  2. 安卓最新系统_你的Windows电脑即将可以运行最新版安卓系统
  3. VisualSVN Server安装过程
  4. 第四次上课 PPT作业
  5. jmeter异步请求测试_使用JMeter对异步HTTP / REST服务进行压力/负载测试
  6. P1372 又是毕业季I
  7. 《Nodejs入门》一书中存在的问题分析[转]
  8. 把js封装到html,什么是javascript封装?
  9. html5毕业论文总结,毕业论文小结(精选多篇)
  10. 体脂的计算Java_简单测试体脂率的两种经验公式
  11. RFID技术在物联网中有哪些应用
  12. 2021 书单推荐 | 15 本高分 AI 书籍,统统免费读
  13. MaskRCNN使用tf-gpu环境搭建实战
  14. 【机器学习】Decision Tree 决策树算法详解 + Python代码实战
  15. SAP BW: 小生长谈Delta - 2 (Update Mode)
  16. Win10已配对成功的蓝牙耳机无法删除怎么办?电脑蓝牙连接不成功、删除失败,显示此项不起作用。请确保你的蓝牙设备仍可以检测到,然后再试一次。
  17. 蓝桥杯.第几个幸运数字(数学_因子)
  18. 自己写php模板引擎,如何用php编写一个简单的模板引擎(附代码)
  19. AUC评价指标的原理和实验
  20. 科技赋能,泰然金融开启上市征程

热门文章

  1. 【设计模式与Android】备忘录模式——在齐太史简
  2. 电脑桌面上做工作计划的便签软件是啥?
  3. Java使用ffmpeg进行视频格式转换、音视频合并、播放、截图
  4. 【Marva Collins' Way】第十章
  5. python3多线程爬虫小说_python3+beautifulSoup4.6抓取某网站小说(四)多线程抓取
  6. 分享一个超好看回忆相册(代码自取)
  7. 世界上第一台电子计算机很大 质量为35吨,世界上第一台电子计算机很大.质量为35吨.比一头大象体重的6倍还多0.2吨.一头大象重多少吨? 题目和参考答案——青夏教育精英家教网——...
  8. cartographer 用自己的机器人建图、保存地图
  9. 如何修改ZBrush 4R7中工作区颜色
  10. openGauss分区表如何实现大数据量的快速转移