在做crnn实验的时候数据的格式是一张图片对应一个标签,比如说 图片名称 1.jpg 内容是 你好呀 那么你的标签就应该是 1.txt
在网上找了一个数据集 https://github.com/YCG09/chinese_ocr
数据集下载地址 数据集:https://pan.baidu.com/s/1QkI7kjah8SPHwOQ40rS1Pw (密码:lu7m)
下载下来发现训练集又360w 测试集3w,它的数据格式是一个字典里面对应的是所有的字符,train.txt test.txt 分别是图片的名称 和十个字符的位置,和我要用的不太一样所以要改成自己的格式。
第一步,分成训练集和测试集,因为我在做crnn的时候需要把数据集转换成lmdb格式,所以需要把训练集和测试集单独分开。
这个地方的i主要是我要看有多少张图片,因为测试集只有3w张所以很快就输出。
import os import shutil rootdir = os.getcwd() #photonames = os.listdir(photodir) f = open('/home/witai/jcy/data_test.txt') lines = f.readlines() i = 0 for line in lines: i = i+1 x=line.split(' ') newpath = rootdir + '/images/' + x[0] newsavedir = '/home/witai/jcy/test/'+x[0] #os.move('newpath','newsavedir') shutil.move(newpath,newsavedir) print i
第二步,生成txt文件并且将字符写入txt
这里需要注意的是字典char_std_5990.txt这个文件夹里面的第一字符是从第一行开始还是第二行,我的是从第一行开始,而下载下来的文件是从第二行。
#!/usr/bin/python2.6 # -*- coding: utf-8 -*- import os import shutil def find(x): a = int(x) f = open('/home/witai/jcy/char_std_5990.txt') lines = f.readlines() i = 0 for line in lines: i = i + 1 if i == a: return line if __name__ == '__main__': f = open('/home/witai/jcy/train2.txt') lines = f.readlines() for line in lines: x = line.split(' ') y = line.split('.') txtname = '/home/witai/jcy/traintxt/' + y[0] + '.txt' f = open(txtname,'a') for i in range(11): if i > 0: a = x[i] b = find(a) f.writelines(b)
第三步,本来以为就ok了,结果打开txt发现所有的字符不在一行,每个字符占一行,一个txt就有10行。这里想了半天没想到解决方案,最后在网上找了一个去除换行和空格的代码
并且将txt放入photo目录下。以后如果找到解决方案了,再重写一个。
import os dir = os.getcwd() inputdir = dir + '\\1\\' outputdir = dir + '\\2\\' txtnames = os.listdir(inputdir) for txt in txtnames: f = open(inputdir+txt) for line in f.readlines(): originfile = open(inputdir+txt) myset = [] for line in originfile.readlines(): # 读取文件每一行 line = line.strip() # 去掉每行前面和后面的空格和换行符 myset.append(line) # 将字符加入 result = ''.join(myset) targetfile = open(outputdir+txt, 'w') targetfile.write(result)