(一)Tensorflow图像数据转化TFRecord数据格式

2023-05-16

1 TFRecord数据格式

Tensorflow提供的TFRecord文件数据是通过tf.train.Example Protocol Buffer的格式存储的,数据格式:

message Example {
	Features features = 1;
};
message Feature {
	map<string, Feature> feature =1;
};
message Feature {
	oneof king {
		BytesList bytes_list = 1;
		FloatList float_list = 2;
		Int64List int64_list = 3;
	}
};

2 数据转化TFRecord

import tensorflow as tf
tf.reset_default_graph()
import os
from os.path import join
import matplotlib.pyplot as plt

def _parse_function(filename):
	'''TFRecord 解析函数
	参数:
	filename: 图片名称
	返回:
	图像Tensor.
	'''
    image_bytes = tf.read_file(filename)
    image_value = tf.image.decode_png(image_bytes, channels=3)
    if image_value.dtype == tf.float32: 
    	'''Image 图像数据转为unsigined integer,避免保存的图像尺寸改变'''
    	image_value = tf.image.convert_image_dtype(image_value, dtype=tf.uint8) 
    return image_value
'''TFRecord数据结构类型转换.'''
def _bytes_feature(value):
	'''字节类型'''
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def _int64_feature(value):
	'''int64类型'''
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))

'''图像路径.'''
image_path = "./CIFAR_images"
image_names = os.listdir(image_path)
'''文件名称'''
file_names = [join(image_path, f) for f in image_names]
'''Dataset建立文件名队列'''
filename_queue = tf.data.Dataset.from_tensor_slices(file_names)
'''通过文件名队列解析图像.'''
image_map = filename_queue.map(_parse_function)
'''遍历图像队列.'''
image_value = image_map.make_one_shot_iterator().get_next()
'''图像数量:100.'''
image_num = len(file_names)
'''存储图像值的list.'''
images = []
def image_info(images):
	'''获取图像信息
	参数:
	images: 图像矩阵列表.
	返回:
	图像:长,宽和通道数.
	'''
    width, height, channels = images[0].shape
#     print("image value: {}".format(images[0]))
    print("width: {}, height: {}, channels: {}".format(width, height, channels))
    
def image_show(sess, image_num, image_value):
	'''图像显示
	参数:
	sess: 会话.
	image_num: 图像数量.
	image_value: 图像队列.
	'''
    plt.figure(figsize=(10, 10))
    for i in range(image_num):
        '''image type: <dtype: 'uint8'>'''
#         print("image type: {}".format(image_value.dtype))
        if image_value.dtype != tf.float32:
            '''
            Convert image to float32 type, and value range in [0,1].
            image type: <dtype: 'float32'>
            '''
            image_value = tf.image.convert_image_dtype(image_value, dtype=tf.float32)
        image_value = tf.image.resize_images(image_value, [28, 28], method=0)
        if image_value.dtype == tf.float32:
            '''Convert image to unsigned integer type, and value range [0, 255]'''
            image_value = tf.image.convert_image_dtype(image_value, dtype=tf.uint8)
        image_values = sess.run(image_value)
        '''Show images.'''
        plt.subplot(10,10,i+1).set_title("fig{}".format(i+1))
        plt.subplots_adjust(hspace=0.1, wspace=0.6)
        plt.imshow(image_values)
        plt.axis("off")
    plt.show()
    
def process_image(sess, image_num, image_value):
	'''图像处理
	参数:
	sess: 会话.
	image_num: 图像数量.
	image_value: 图像队列.
	返回:
	images: 图像矩阵列表.
	'''
    for i in range(image_num):
        if image_value.dtype != tf.float32:
            '''Convert image to float32 type, and value range in [0,1], Tensor'''
            image_value = tf.image.convert_image_dtype(image_value, dtype=tf.float32)
        image_value = tf.image.resize_images(image_value, [28, 28], method=0)
        if image_value.dtype == tf.float32:
            '''Convert image to unsigned integer type, and value range [0, 255], Tensor'''
            image_value = tf.image.convert_image_dtype(image_value, dtype=tf.uint8)
            '''Image matrix.
            [[[ 63  48  18]
              [ 64  53  21]
              [ 62  54  22]
              ...
              [104  76  45]]]
            '''
        image_values = sess.run(image_value)
        images.append(image_values)
    return images
def save_tfrecord(images):
	'''保存图像数据为TFRecord.
	参数:
	images: 图像矩阵列表.
	'''
    if not os.path.exists("outputs/"):
        os.makedirs("outputs/")
    file_name = "./outputs/cifar10.tfrecords"
    writer = tf.python_io.TFRecordWriter(file_name)
    for i in range(image_num):
        image_raw = images[i].tostring()
        example = tf.train.Example(features=tf.train.Features(feature={
            'image_raw':_bytes_feature(image_raw),
            'image_num':_int64_feature(image_num),
            'height':_int64_feature(28),
            'width':_int64_feature(28)
        }))
        writer.write(example.SerializeToString())
    writer.close()
    print("Saved.")
    
'''执行保存.'''    
with tf.Session() as sess:
    images = process_image(sess, image_num, image_value)
    print("image number: {}".format(len(images)))
    '''width: 28, height: 28, channels: 3'''
    image_info(images)
    save_tfrecord(images)

3 读取TFRecord

Dataset方式读取

import tensorflow as tf
tf.reset_default_graph()
import matplotlib.pyplot as plt

def parse(record):
	'''TFRecord文件解析函数.
	参数:
	record: 
	返回:
	features["image_raw"]:图像数据.
	features["image_num"]:图像数量.
	features["height"]:图像高度.
	features["width"]:图像宽度.
	'''
    features = tf.parse_single_example(
        record,
        features={"image_raw":tf.FixedLenFeature([], tf.string),
                  "image_num":tf.FixedLenFeature([], tf.int64),
                  "height":tf.FixedLenFeature([], tf.int64),
                  "width":tf.FixedLenFeature([], tf.int64),
                 }
    )
    image_raw = features["image_raw"]
    image_num = features["image_num"]
    height = features["height"]
    width = features["width"]
    return image_raw, image_num, height, width

'''TFRecord文件路径.'''
input_files = ["./outputs/cifar10.tfrecords"]
'''读取TFRecord文件'''
dataset = tf.data.TFRecordDataset(input_files)
'''数据映射解析.'''
dataset = dataset.map(parse)
'''遍历初始化设置:当有变量时使用此方法.当没有变量是可使用:dataset.make_one_shot_iterator()'''
iterator = dataset.make_initializable_iterator()
'''获取TFRecord存储的数据,使用get_next遍历读取
数据类型:Tensor("IteratorGetNext:0", shape=(), dtype=string)
'''
images, num, height, width = iterator.get_next()
def iterator_data_subplot(sess, num, images, height, width):
	'''可视化读取的图像
	参数:
	sess: 会话.
	num: 显示图像数量.
	images: 图像矩阵列表.
	height:图像高度.
	width: 图像宽度.
	'''
    plt.figure(figsize=(10, 10))
    for i in range(num):
        '''数据恢复:转换为uint8类型.
        Tensor("DecodeRaw:0", shape=(?,), dtype=uint8)
        '''
        image = tf.decode_raw(images, tf.uint8)
        '''图像值:
        Tensor("DecodeRaw:0", shape=(?,), dtype=uint8)
        '''
        height = tf.cast(height, tf.int32)
        width = tf.cast(width, tf.int32)
        '''图像信息.
        image shape: (49152,), height: 28, width: 28
        返回的图形数据为一个列向量,行数为:H*W*C
        需要重新整理为标准图像(h,w,c)
        '''
        image = tf.reshape(image, [height, width, 3])
        '''Image matrix.
        [[[165 170 176]
          [161 167 173]
          ...
          [139 148 155]]]
        '''
        image = sess.run(image)
        '''Show image.'''
        plt.subplot(10,10,i+1).set_title("fig{}".format(i+1))
        plt.subplots_adjust(hspace=0.8)
        plt.axis("off")
        plt.imshow(image)
    plt.show()  
with tf.Session() as sess:
    '''初始化 iterator.'''
    sess.run(iterator.initializer)    
    iterator_data_subplot(sess, 100, images, height, width)

在这里插入图片描述

图2.1 读取结果

3 总结

(1) 图像矩阵数据有两种取值:[0,1]float类型,[0,255]int类型,Tensorflow对图像处理(包括剪裁,变换尺寸等操作)需要将图像转换为float格式;
(2) 图像数据保存为TFRecord格式时,需要将图像数据调整为int类型,否则保存的图像尺寸会扩大一倍,如 32 × 32 32 \times 32 32×32的float类型数据,转换后的尺寸为 64 × 64 64 \times 64 64×64,图像复原后出现错误,CIFAR数据的处理如下图所示;
(3) 读取TFRecord数据有两种方法,一种是直接使用TFRecordReader读取(即将停止维护),另一种是使用Dataset读取,Tensorflow1.3版本后,官方推荐使用Dataset方法。
(4) 主程序中执行一次sess.run即运行了一次get.next。(如TFRecord中保存了图片的数量为100, 通过sess.run获取数量,在遍历数据集,会从第二个数据开始遍历,因为运行一次sess.run已经开始了一次遍历,所以注意数据集读取的完整性。)


[参考文献]
[1]https://tensorflow.google.cn/versions/r1.12/api_docs/python/tf/data/Dataset
[2]https://blog.csdn.net/fu6543210/article/details/80269215


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(一)Tensorflow图像数据转化TFRecord数据格式 的相关文章

  • Settings Preference 的理解

    大纲 xff1a 1 一个简单的Preference例子 2 Preferenece数据的操作 3 xff0c Preferenece XML 4 xff0c Using Preference Fragments 5 xff0c Using
  • 需要看的技术书籍

    语言类 xff1a 深度探索C 43 43 对象模型 xff0c 对应的英文版是 Inside C 43 43 43 Object Model 程序编译 链接 加载类 xff1a 链接器和加载器 xff0c 对应的英文版是 Linker a
  • ASP.NET 自定义控件 自定义属性的使用

    最近在给公司一个老的ASP平台进行改版 xff0c 由于这个平台运行时间太长 xff0c 期间有很多程序员进行过修改 xff0c 导致数据库显得很乱 在实际改版时架构采用了多层架构 xff0c 引入工厂模式 xff0c 面向接口 对于资讯类
  • 启动IDEA找不到Tomcat报错Plugin ErrorProblems found loading plugins:

    解决方法 xff1a 找到IDEA的配置文件夹下的disabled plugins txt xff0c 删除然后重启IDEA即可 xff1b 我的文件在 xff1a C Users admin IntelliJIdea2018 1 conf
  • golang数据类型转换(int/float/string/interface/[]byte)

    文章目录 1 int和float转换1 1 int 61 61 gt float32 641 2 float64 32 61 61 gt int 2 字串和数字的转换 xff08 strconv xff09 2 1 string 61 61
  • yy欢聚时代软件测试笔试题

    1 xff0c 10111001对应的八进制 xff0c 十六进制和十进制 2 xff0c 常见的数据库有那些 xff1f 3 xff0c 常见的协议有哪些 xff1f 4 xff0c 代码运行结果 xff0c c 43 43 题目 xff
  • 黑苹果安装教程,配EFI引导文件+软件!

    买不起苹果电脑 xff0c 那最好的办法 xff0c 就是把我们的普通电脑装成苹果系统 不过安装macos系统 xff0c 没有安装windows那么简单 xff0c 步骤比较复杂 对于新手来说不知道如何下手 xff1f 这里我就来分享一下
  • 用单链表实现的内存管理

    http blog csdn net csynyk article details 2861979 在C语言论坛中看了dgarc发表的一个贴子后 xff0c 按要求写了一段代码 xff0c 可以实现内存分配的管理 xff0c 避免内存泄漏
  • tomcat端口冲突问题

    问题 xff1a 在本地启tomcat xff0c 报错 严重 StandardServer await create 8080 java net BindException Address already in use JVM Bind
  • 云计算的三大服务模式

    根据NIST的权威定义 xff0c 云计算有SPI xff0c 即SaaS PaaS和IaaS三大服务模式 这是目前被业界最广 泛认同的划分 PaaS和IaaS源于SaaS理念 PaaS和IaaS可以直接通过SOA Web Services
  • 使用DISM修复系统

    在win10系统中 xff0c 当系统出现文件受损或丢失后 xff0c 可以使用DISM工具进行联机修复 xff1a 1 使用管理员运行CMD xff1a DISM Online Cleanup image RestoreHealth 命令
  • 解决火狐浏览器提示连接不安全或证书错误的问题

    问题 xff1a 在地址栏输入 xff1a about config 接受风险并继续 xff0c 然后在方框中输入 xff1a security enterprise roots enabled 将false切换为true 测试
  • MacOS没有管理员账号的解决方法

    MacOS没有管理员账号的解决方法 参考文档 xff1a https www jianshu com p 7682230edfba 应用场景 xff1a 员工的Mac内只有一个普通用户 xff0c 没有管理员用户 解决方案 xff1a 1
  • ubuntu18设置不要进入休眠,省去输入密码的麻烦

    1合盖不休眠 Ctrl Alt T 组合键打开终端 xff1b 然后修改配置文件 etc systemd logind conf vim etc systemd logind conf 打开文件后修改下面这行 xff1a HandleLid
  • HP BIOS降级

    应用场景 xff1a 员工电脑型号为HP 280 Pro G2 MT xff0c 为员工加装固态硬盘 xff08 硬盘型号 xff1a Samsung V NAND 860 EVO xff09 时 xff0c bios版本过高会导致电脑在开
  • systemd服务

    Systemd 的简介和特点 Systemd 是 Linux 系统中的初始化系统 xff08 init xff09 xff0c 它主要的设计目标是克服sysvinit 固有的缺点 xff0c 提高系统的启动速度 systemd和ubuntu
  • 重定向

    重定向简介 计算机最基础的功能是可以提供输入输出操作 对于Linux系统来说 xff0c 通常以键盘为默认输入设备 xff0c 又称标准输入设备 xff1b 以显示器为默认的输出设备 xff0c 又称标准输出设备 所谓重定向 xff0c 就
  • Canon imageRUNNER 2525i打印机驱动通过IP地址进行安装

    环境 打印机IP xff1a 192 168 140 251 本机IP xff1a 192 168 141 210 操作 一 下载驱动 方法一 xff1a 佳能ir 2525i驱动下载地址 xff1a https pdisp01 c wss
  • 防火墙firewalld

    RHEL7中有几种防火墙共存 xff1a firewalld iptables ebtables等 基于iptables的防火墙默认不启动 xff0c 但仍然可以继续使用 RHEL7默认使用firewalld作为防火墙 xff0c 管理工具
  • redis报错Unrecoverable error: corrupted cluster config file.

    系统因为做物理硬件迁移硬重启了一次 在启动redis时出现了一下问题 xff1a 启动脚本 xff1a 运行启动脚本 xff1a 提示正在运行但是没有进程出现 在redis conf中将daemonize yes设置为daemonize n

随机推荐

  • vcenter开机报错activating swap-devices in /etc/fstab

    问题 xff1a 昨天IDC机房一台存储断电了 xff0c 恰巧vcenter在这台存储上 xff0c 重启存储后再重启vcenter报了以下错误 xff1a 参考文档 xff1a https www virtualizestuff com
  • IDEA Git 分支branch操作,新建和合并

    简单记录IDEA中Git分支操作 1 xff1a 创建分支 右下角new branch创建分支 创建完成查看右下角当前分支情况 创建一个该分支的MD文件信息 xff0c 进行提交 这样一个分支就创建完成 xff0c 然后merge分支 xf
  • KVM 介绍(1):简介及安装

    转载地址 xff1a http www cnblogs com sammyliu p 4543110 html KVM 介绍 xff08 1 xff09 xff1a 简介及安装 学习 KVM 的系列文章 xff1a xff08 1 xff0
  • 个人面试经验总结

    1 xff0c 海投 2 xff0c 一定要强调自己能留到该地 xff08 这个城市 这个公司 xff09 发展 3 xff0c 简历上出现的技能和项目面试前一天一定要复习 xff0c 因为面试官大部分问题会以简历为主 4 xff0c 要有
  • Java学习笔记4(设计模式、接口)

    设计模式 建造者模式 在类中 xff0c 定义一个静态内部类作为 外部类的 建造者在建造者类中 xff0c 提供多个 方法用来完成 外部类 对象的属性赋值在建造者类中 xff0c 提供一个 build 用来返回一个外部类的对象在类中 xff
  • R语言单因素/多因素 Logistic回归

    变量因子的转换 gt 单因素logistic回归 gt 多因素logistic回归 https mp weixin qq com s NowePGv6DF9 dF4blSyzVQ 两个模型的比较 构造测试集 xff0c 预测概率 xff0c
  • 那一年读过的技术经典书

    转载请注明 xff1a http blog csdn net xinzhangyanxiang article details 10199757 大学刚毕业 xff0c 总结起来读过的书并不算多 xff0c 而且主要集中在大四的时期读的 x
  • Bert: 双向预训练+微调

    最近要开始使用Transformer去做一些事情了 xff0c 特地把与此相关的知识点记录下来 xff0c 构建相关的 完整的知识结构体系 以下是要写的文章 xff0c 文章大部分都发布在公众号 雨石记 上 xff0c 欢迎关注公众号获取最
  • Federated Learning: 问题与优化算法

    工作原因 xff0c 听到和使用Federated Learning框架很多 xff0c 但是对框架内的算法和架构了解不够细致 xff0c 特读论文以记之 这个系列计划要写的文章包括 xff1a Federated Learning 问题与
  • DIN: 阿里点击率预估之深度兴趣网络

    广告推荐算法系列文章 xff1a 莫比乌斯 百度的下一代query ad匹配算法百度凤巢分布式层次GPU参数服务器架构DIN 阿里点击率预估之深度兴趣网络DIEN 阿里点击率预估之深度兴趣进化网络 本文的知识点来源于参考文献 1 xff0c
  • DIEN: 阿里点击率预估之深度兴趣进化网络

    广告推荐算法系列文章 xff1a 莫比乌斯 百度的下一代query ad匹配算法百度凤巢分布式层次GPU参数服务器架构DIN 阿里点击率预估之深度兴趣网络基于Delaunay图的快速最大内积搜索算法DIEN 阿里点击率预估之深度兴趣进化网络
  • 概率矩阵分解模型 PMF

    本文是论文 一种结合推荐对象间关联关系的社会化推荐算法 的笔记 xff08 上 xff09 因为对其中的概率矩阵分解 Probabilistic Matrix Factorization PMF 不够了解 xff0c 因而我先去脑补了PMF
  • 卷积神经网络

    卷积神经网络 转载请注明 xff1a http blog csdn net stdcoutzyx article details 41596663 自今年七月份以来 xff0c 一直在实验室负责卷积神经网络 xff08 Convolutio
  • DeepID人脸识别算法之三代

    DeepID人脸识别算法之三代 转载请注明 xff1a http blog csdn net stdcoutzyx article details 42091205 DeepID xff0c 目前最强人脸识别算法 xff0c 已经三代 如今
  • 理解dropout

    理解dropout 开篇明义 xff0c dropout是指在深度学习网络的训练过程中 xff0c 对于神经网络单元 xff0c 按照一定的概率将其暂时从网络中丢弃 注意是暂时 xff0c 对于随机梯度下降来说 xff0c 由于是随机丢弃
  • MYSQL— perror 错误码详情

    root 64 localhost cat test nothread py import paramiko import threading import os def ssh2 ip username passwd cmd file p
  • 深度卷积对抗生成网络(DCGAN)

    本文是参考文献 1 的论文笔记 卷积神经网络在有监督学习中的各项任务上都有很好的表现 xff0c 但在无监督学习领域 xff0c 却比较少 本文介绍的算法将有监督学习中的CNN和无监督学习中的GAN结合到了一起 在非CNN条件下 xff0c
  • 看图说话——CNN和LSTM的联合应用

    看图说话是深度学习波及的领域之一 其基本思想是利用卷积神经网络来做图像的特征提取 xff0c 利用LSTM来生成描述 但这算是深度学习中热门的两大模型为数不多的联合应用了 本文是参考文献 1 的笔记 xff0c 论文是比较早的论文 xff0
  • 机器学习经典书籍小结

    机器学习经典书籍小结 转载本博客请注明链接 xff1a http blog csdn net xinzhangyanxiang article details 9069045 博客第一篇文章 1 是转载的 xff0c 也算是开始写博客不经意
  • (一)Tensorflow图像数据转化TFRecord数据格式

    1 TFRecord数据格式 Tensorflow提供的TFRecord文件数据是通过tf train Example Protocol Buffer的格式存储的 数据格式 message Example Features features