在Tensorflow图片数据读入的时候,往往会遇到各种数据类型上的subtle problem,今天遇到的是在将图片转换成tfrecord过程中,读取图片的问题。最后竟然发现。。。错误发生在Numpy对字符串的处理上。原来是为了与C兼容,np.array 会把末string末尾的‘\x00’截掉,要将图片数据(十进制的string格式存储)用tobytes()转换为十六进制,并存成用字符串'\x92\x99\...‘这样,我需要将图片list转换为array来进行后面的乱序处理。在这个把list变成ndarray的过程中,出现了一些问题。
图片数据读取发现保存的图片数据与这是图片数据维数(227×227×3=154587)不相符,总是会错在一些图像像素数小于154587。使用assert(len(img) ==154587)语句后运行,控制台如下报错:
Traceback (most recent call last):
File "/home/mokii/RGB-D/SUN-AlexNet/tmp.py", line 280, in <module>
img2tfrecords(['/home/mokii/RGB-D/SUNRGBD/statistic/trainrgblist.csv'])
File "/home/mokii/RGB-D/SUN-AlexNet/tmp.py", line 96, in img2tfrecords
ndarray2tfrecords(train, '/home/mokii/RGB-D/SUNRGBD/data/train/rgb/trainrgb.tfrecords')
File "/home/mokii/RGB-D/SUN-AlexNet/tmp.py", line 53, in ndarray2tfrecords
assert (len(img) == 154587)
AssertionError
代码如下,其实这是用经典方法改编的,其他地方都是对的,main函数包括了tfrecords的制作和debug时对decode出的数据的长度的检验代码,最后发现错误就是出在注释代码处啦:
# -*- coding: utf-8 -*- import os import csv import numpy as np from PIL import Image import tensorflow as tf import sys reload(sys) sys.setdefaultencoding('utf8') # todo wait to write NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN = 300 Test_num = 0 file_num = 1 image_size = 227 def createcsv(folderlist): for imgfolder in folderlist: csvfile = file(imgfolder + '.csv', 'w+') imglist = os.listdir(imgfolder) writer = csv.writer(csvfile) for filename in imglist: writer.writerow([(imgfolder + '/' + filename), filename[0:3] + "\n"]) csvfile.close() def ndarray2tfrecords(ndarray, tfpath): writer = tf.python_io.TFRecordWriter(tfpath) for img in ndarray: example = tf.train.Example(features=tf.train.Features(feature={ "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[int(img[1])])), 'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img[0]])) # 这里通过改成[img[0:1].tobytes()}或[img[0:1].tostring()]就对了 })) writer.write(example.SerializeToString()) # BEGIN TODO: print('Here in nda