[英]how to convert images in a directory to TFRecords
我有一个包含验证码图片的目录,每个图片的名称与验证码上的编号相同。 验证码的最大长度为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:列表索引超出范围
索引错误是因为您的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)
您的正则表达式_(.*?)\\.
将dir
目录中的文件名以某种方式命名。
<name>_<label>.<ext>
ex:
captcha1_12345.png
captcha2_67890.png
您的验证码的某些文件名似乎不遵守此约定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.