一、开发背景
图像中的文本识别近几年来备受瞩目。通常来说,图片中的文本能够比图片中其他内容提供更加丰富的信息。因此,图像文本识别能够将图像中的文本区域转化成计算机可以读取和编辑的符号,打通了从图像到文本再到信息的通路。
随着计算机算力的提升,基于深度学习方法的本文识别技术逐渐成为主流,而深度学习中数据集的获取是重中之重。本脚本实现读取语料集中的文本内容,以保存为图像形式的数据集,用于模型训练。
二、脚本效果
1、IDE中的运行界面
(1)选择字体文件
(2)生成数据集
2、生成的图像
不使用数据增强
使用数据增强
3、映射表
存储图像文件名和类别序列标注的对应关系
三、具体开发
1、功能需求
- 根据用户指定的语料数据生成图像文件及映射表
- 用户可自行更改文本长度,图像数量及图像尺寸
- 用户可自行选择是否进行增强处理
2、实际项目
1. 项目结构
(1)根目录下的fonts文件夹用于存放ttf字体文件, imageset文件夹用于存放输出图像和映射表
(2)config中设置相关参数并存放语料文件, dict5990.txt是字典, sentences.txt是语料集
2. 实现思路
3. 代码实现
1. 设置参数
# 语料集
corpus = 'config/sentences.txt'
dict = 'config/dict5990.txt'
# 字体文件路径
FONT_PATH = 'fonts/'
# 输出路径
OUTPUT_DIR = 'imageset/'
# 样本总数
n_samples = 50
# 每行最大长度
sentence_lim = 10
# 画布能容纳的最大序列长度,对应img_w
canvas_lim = 50
2. 构建生成器
1. 加载字体文件
# 选择字体
root = tk.Tk()
root.withdraw()
self.font_path = filedialog.askopenfilename()
def load_fonts(self, factor, font_path):
""" 加载字体文件并设定字体大小
"""
self.fonts = []
# 加载字体文件
font = ImageFont.truetype(font_path, int(self.img_h*factor), 0)
self.fonts.append(font)
2. 构建字典
def build_dict(self):
""" 打开字典,加载全部字符到list
每行是一个字
"""
with codecs.open(self.dictfile, mode='r', encoding='utf-8') as f:
# 按行读取语料
for line in f:
# 当前行单词去除结尾,为了正常读取空格,第一行两个空格
word = line.strip('\r\n')
# 只要没超出上限就继续添加单词
self.dict.append(word)
# 最后一位作为空白符
self.blank_label = len(self.dict)
3. 加载语料
def build_train_list(self, num_rows, max_row_len=None):
# 过滤语料,留下适合的内容组成训练list
assert max_row_len <= self.img_lim
self.num_rows = num_rows
self.max_row_len = max_row_len
sentence_list = []
self.train_list = []
with<