Tensorflow图像预处理,Numpy读取数据踩坑

在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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值