如何将目录中的图像转换为TFRecords

时间:2017-05-14 17:47:58

标签: python tensorflow

我有一个由验证码图像组成的目录,每个图像与验证码上的号码具有相同的名称。验证码的最大长度为5.我想将这些图像转换为TFRecords。为此,我使用以下功能;

def decode_label(label):
    one_hot_label = np.zeros([5, 10])
    index = [[0, 1, 2, 3, 4], map(int, list(label))]
    one_hot_label[index] = 1.0
    return one_hot_label.astype(np.uint8)



def bytes_feature(value):
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))



def convert_to(dir, name, path):
    filenames = map(lambda filename: os.path.join(dir, filename), os.listdir(dir))
    tfrecords_name = os.path.join(path, name + ".tfrecords")
    writer = tf.python_io.TFRecordWriter(tfrecords_name)
    for filename in filenames:
        image = imread(filename)
        label = decode_label(re.findall("_(.*?)\.", filename)[0])
        example = tf.train.Example(features=tf.train.Features(feature={'label': bytes_feature(label.tostring()),
                                                                       'image': bytes_feature(image.tostring())}))
        writer.write(example.SerializeToString())
    writer.close()
    print("successfully convert data to tfrecords!")

但是,由于行

,我收到以下错误
label = decode_label(re.findall("_(.*?)\.", filename)[0])
  

IndexError:列表索引超出范围

2 个答案:

答案 0 :(得分:0)

索引错误是因为你的re.findall没有返回有效的结果,但你正在尝试做listobj [0] ....尝试拆分你的正则表达式,看看它失败的原因。

顺便说一下,列表理解比传递给地图的lambda更容易阅读:

[ os.path.join(dir, filename) for filename in os.listdir(dir) ]

VS

map(lambda filename: os.path.join(dir, filename), os.listdir(dir))

如果你的文件名是/somedir/somedire2/12345.png并且你想要12345:

os.path.splitext( os.path.basename(path) )[0]

如果你想改用正则表达式,你可以这样做:

#p is your full path
>> re.search(r"/(\d+)\.png",p).group(0)
'/12345.png'
>>> re.search(r"/(\d+)\.png",p).group(1)
'12345'

根据您的示例文件名:

>>> p = "something_1243.png"
>>> re.search(r"(\d+)\.png$",p)
<_sre.SRE_Match object at 0x103749198>
>>> re.search(r"(\d+)\.png$",p).group(1)
'1243'

无法解决任何numpy错误,但如果它需要一个整数,你可以看到上面有一个字符串,所以你需要投射你的结果

int(stringval)

答案 1 :(得分:0)

您的正则表达式_(.*?)\.强制dir目录中的文件名以某种方式命名。

<name>_<label>.<ext>

ex: 
captcha1_12345.png
captcha2_67890.png 

您的某些验证码的文件名似乎不符合此惯例。