image和TFRecord互相转换

关说不练假把式。手上正好有车牌字符的数据集,想把他们写成TFRecord格式,然后读进来,构建一个简单的cnn训练看看。然后发现准确率只有0.0x。随机猜也比这要好点吧。只能一步步检查整个过程。暂时想到问题可能出现的地方:

  • 数据编码解码错误
  • 网络构建问题
  • 学习步长问题
  • 数据量太小
  • label设置

不确定是不是这些问题先检查下,tensorboard能给我们很多信息。今天先检查了图片解码编码问题。在读取数据的时候为image增加一个summary,这样就能在tensorboard上看到图片了。

img=tf.summary.image(‘input‘,x,batch_size)

tensorboard的使用之前有说过。出现的结果说我没有图片记录,大约是这个意思。所以我的解码编码程序还是有问题。图片编码成tfreord无非就是把图片数据按照tfrecord的格式填进去。tfrecord是example的集合,example的格式:

message Example {#message类似于类
  Features features = 1;
};

而 Features 是字典集合,(key,value)。下面直接上tfrecord编码解码代码,改好过的。

 1 import tensorflow as tf
 2 import numpy as np
 3 import glob
 4 import os
 5 from PIL import Image
 6 def _int64_feature(value):
 7     if not isinstance(value,list):
 8         value=[value]
 9     return tf.train.Feature(int64_list=tf.train.Int64List(value=value))
10 def _byte_feature(value):
11     return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
12 def encode_to_tfrecords(data_path,name,rows=24,cols=16):#从图片路径读取图片编码成tfrecord
13     folders=os.listdir(data_path)#这里都和我图片的位置有关
14     folders.sort()
15     numclass=len(folders)
16     i=0
17     npic=0
18     writer=tf.python_io.TFRecordWriter(name)
19     for floder in folders:
20         path=data_path+"/"+floder
21         img_names=glob.glob(os.path.join(path,"*.bmp"))
22         for img_name in img_names:
23             img_path=img_name
24             img=Image.open(img_path).convert(‘P‘)
25             img=img.resize((cols,rows))
26             img_raw=img.tobytes()
27             labels=[0]*34#我用的是softmax,要和预测值的维度一致
28             labels[i]=1
29             example=tf.train.Example(features=tf.train.Features(feature={#填充example
30                 ‘image_raw‘:_byte_feature(img_raw),
31                 ‘label‘:_int64_feature(labels)}))
32             writer.write(example.SerializeToString())#把example加入到writer里,最后写到磁盘。
33             npic=npic+1
34         i=i+1
35     writer.close()
36     print npic
37
38 def decode_from_tfrecord(filequeuelist,rows=24,cols=16):
39     reader=tf.TFRecordReader()#文件读取
40     _,example=reader.read(filequeuelist)
41     features=tf.parse_single_example(example,features={‘image_raw‘:#解码
42             tf.FixedLenFeature([],tf.string),
43             ‘label‘:tf.FixedLenFeature([34,1],tf.int64)})
44     image=tf.decode_raw(features[‘image_raw‘],tf.uint8)
45     image.set_shape(rows*cols)
46     image=tf.cast(image,tf.float32)*(1./255)-0.5
47     label=tf.cast(features[‘label‘],tf.int32)
48     return image,label
49
50
51 def get_batch(filename_queue,batch_size):
52     with tf.name_scope(‘get_batch‘):
53         [image,label]=decode_from_tfrecord(filename_queue)
54         images,labels=tf.train.shuffle_batch([image,label],batch_size=batch_size,num_threads=2,
55                  capacity=100+3*batch_size,min_after_dequeue=100)
56         return images,labels
57
58
59 def generate_filenamequeue(filequeuelist):
60     filename_queue=tf.train.string_input_producer(filequeuelist,num_epochs=5)
61     return filename_queue
62
63 def test(filename,batch_size):
64     filename_queue=generate_filenamequeue(filename)
65     [images,labels]=get_batch(filename_queue,batch_size)
66     init_op = tf.group(tf.global_variables_initializer(),
67                        tf.local_variables_initializer())
68     sess=tf.InteractiveSession()
69     sess.run(init_op)
70     coord=tf.train.Coordinator()
71     threads=tf.train.start_queue_runners(sess=sess,coord=coord)
72     i=0
73     try:
74         while not coord.should_stop():
75             image,label=sess.run([images,labels])
76             i=i+1
77             if i%1000==0:
78                 for j in range(batch_size):#之前tfrecord编码的时候,数据范围变成[-0.5,0.5],现在相当于逆操作,把数据变成图片像素值
79                     image[j]=(image[j]+0.5)*255
80                     ar=np.asarray(image[j],np.uint8)
81                     #image[j]=tf.cast(image[j],tf.uint8)
82                     print ar.shape
83                     img=Image.frombytes("P",(16,24),ar.tostring())#函数参数中宽度高度要注意。构建24×16的图片
84                     img.save("/home/wen/MNIST_data/reverse_%d.bmp"%(i+j),"BMP")#保存部分图片查看
85             ‘‘‘if(i>710):
86                 print("step %d"%(i))
87                 print image
88                 print label‘‘‘
89     except tf.errors.OutOfRangeError:
90         print(‘Done training -- epoch limit reached‘)
91     finally:
92     # When done, ask the threads to stop.
93         coord.request_stop()
94
95 # Wait for threads to finish.
96     coord.join(threads)
97     sess.close()

在文件夹中:

在tensorboard里:

终于看见熟悉的图片了,现在数据编码解码没问题,效果依然0.0x。。。。

错误改掉一个少一个,接着检查其他部分。

debug过程中,一直在google,stackoverflow,官网documents,度娘略微鸡肋。

时间: 2024-10-21 17:14:40

image和TFRecord互相转换的相关文章

学习笔记TF016:CNN实现、数据集、TFRecord、加载图像、模型、训练、调试

AlexNet(Alex Krizhevsky,ILSVRC2012冠军)适合做图像分类.层自左向右.自上向下读取,关联层分为一组,高度.宽度减小,深度增加.深度增加减少网络计算量. 训练模型数据集 Stanford计算机视觉站点Stanford Dogs http://vision.stanford.edu/aditya86/ImageNetDogs/ .数据下载解压到模型代码同一路径imagenet-dogs目录下.包含的120种狗图像.80%训练,20%测试.产品模型需要预留原始数据交叉验

TFRecord 的使用

什么是 TFRecord PS:这段内容摘自 http://wiki.jikexueyuan.com/project/tensorflow-zh/how_tos/reading_data.html 一种保存记录的方法可以允许你讲任意的数据转换为TensorFlow所支持的格式, 这种方法可以使TensorFlow的数据集更容易与网络应用架构相匹配.这种建议的方法就是使用TFRecords文件,TFRecords文件包含了tf.train.Example 协议内存块(protocol buffer

将图片数据转化为TFRecord格式与读取

将图片数据转化为TFRecord格式与读取 一.问题情景描述 目录下有一个叫做"Original"的文件夹,文件夹里有十个子文件,分别命名为1,2···一直到10(为了做10轮取平均),这10个子文件夹里还有四个子文件夹,分别命名为"train0","train1","test0","test1".其中含义如其命名所示.这四个子文件夹里一共有若干张JPG格式图像数据.现欲将这份图像数据转化为TFRecord

TensorFlow高效读取数据的方法——TFRecord的学习

关于TensorFlow读取数据,官网给出了三种方法: 供给数据(Feeding):在TensorFlow程序运行的每一步,让python代码来供给数据. 从文件读取数据:在TensorFlow图的起始,让一个输入管线从文件中读取数据. 预加载数据:在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况). 对于数据量较小而言,可能一般选择直接将数据加载进内存,然后再分batch输入网络进行训练(tip:使用这种方法时,结合yeild 使用更为简洁).但是如果数据量较

generate_tfrecord.py生成tfrecord出错记录

本文是笔者在Windows 10上用python3.6 + Tensorflow gpu 1.9.0以egohand(一份手部检测数据集)训练过程中遇到的问题:从头开始说起,笔者看到github上的一份已训练实现的手部识别源码https://github.com/victordibia/handtracking跑通一遍.实际已经运行成功了.只是用的是原有已训练完的模型. 第二步,是希望在源训练数据集上用Tensorflow重新训练一遍. 简述一下步骤: 下载手部检测数据来自于http://vis

TFRecord数据处理

一.TFRecord数据格式 对于深度学习的物体检测等任务,比较常用的数据集是PASCAL VOC数据集.对于PASCAL VOC数据集,主要有两个文件夹,分别为:Annotations和JPEGImages.其中,Annotations文件夹存储了图片物体的label,格式为XML格式,而JPEGImages文件夹下存放的是图片.这种数据集需要将图像数据和标签分开放置,比较不友好. 对于使用tensorflow框架进行训练深度神经网络时,tensorflow提供了对图像数据进行处理的工具——T

WORD2010如何把全角字母和数字批量转换成半角

个人觉得全角字符看起来相当别扭,如果文档中存在大量全角形式的字母和数字,要如何把它们全部转化成半角的呢? 全角和半角 全角是指一个字符占用两个标准字符位置的状态.汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符. 半角的显示内码都是一个字节,英文字母.罗马数字.西方语言的符号都是半角形式. END 如何实现全角半角间的转换 全角字符占用更多字符,看起来也不够美观,如何将全角字符转换成半角的呢?这里我们可以利用word来实现.   不论是txt文档还是其他什

经济动能转换现万亿商机,腾讯云造人工智能数字商业

2017年6月,发改委印发<服务业创新发展大纲(2017-2025年)>(以下简称<大纲>),大纲指出我国正处于工业转型升级.新型城镇化推进和消费结构升级的大趋势中.预计到2025年,服务业增加值占GDP比重提高到60%. 根据国家统计局,2016年我国服务业增加值占GDP的比重达到51.6%.按2016年中国74万亿GDP估算,未来8年我国服务业增加值将有6.2万亿的增长空间.而数字经济和数字服务则是服务业增加值新增长的来源,对于企业来说则要把握历史机遇.加快推动数字商业创新发展

JSON与Javabean转换的几种形式

JSON格式的数据传递是最常用的方法之一,以下列出了常用的几种形态以及与Javabean之间的转换: String json1="{'name':'zhangsan','age':23,'interests':[{'interest':'篮球','colors':['绿色','黄色']},{'interest':'足球','colors':['红色','蓝色']}]}"; String json2="[{'name':'zhangsan'},{'name':'lisi'},{