我有一个由验证码图像组成的目录,每个图像与验证码上的号码具有相同的名称。验证码的最大长度为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:列表索引超出范围
答案 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
您的某些验证码的文件名似乎不符合此惯例。