【OCR技术】大批量生成文字训练集

2019 年 3 月 11 日 七月在线实验室

来源 | 博客园

作者 | Madcola


如果是想训练一个手写体识别的模型,用一些前人收集好的手写文字集就好了,比如中科院的这些数据集。

http://www.nlpr.ia.ac.cn/databases/handwriting/Offline_database.html


但是如果我们只是想要训练一个专门用于识别印刷汉字的模型,那么我们就需要各种印刷字体的训练集,那怎么获取呢?借助强大的图像库,自己生成就行了!


GitHub地址:

https://github.com/AstarLight/CPS-OCR-Engine/blob/master/ocr/gen_printed_char.py


先捋一捋思路,生成文字集需要什么步骤:

  1. 确定你要生成多少字体,生成一个记录着汉字与label的对应表。

  2. 确定和收集需要用到的字体文件。

  3. 生成字体图像,存储在规定的目录下。

  4. 适当的数据增强。


第三步的生成字体图像最为重要,如果仅仅是生成很正规的文字,那么用这个正规文字集去训练模型,第一图像数目有点少,第二模型泛化能力比较差,所以我们需要对字体图像做大量的图像处理工作,以增大我们的印刷体文字数据集。


我总结了一下,我们可以做的一些图像增强工作有这些:

  1. 文字扭曲

  2. 背景噪声(椒盐)

  3. 文字位置(设置文字的中心点)

  4. 笔画粘连(膨胀来模拟)

  5. 笔画断裂(腐蚀来模拟)

  6. 文字倾斜(文字旋转)

  7. 多种字体


做完以上增强后,我们得到的数据集已经非常庞大了。

现在开始一步一步生成我们的3755个汉字的印刷体文字数据集。


一、生成汉字与label的对应表

这里的汉字、label映射表的生成我使用了pickel模块,借助它生成一个id:汉字的映射文件存储下来。
这里举个小例子说明怎么生成这个“汉字:id”映射表。

首先在一个txt文件里写入你想要的汉字,如果对汉字对应的ID没有要求的话,我们不妨使用该汉字的排位作为其ID,比如“一二三四五”中,五的ID就是00005。如此类推,把汉字读入内存,建立一个字典,把这个关系记录下来,再使用pickle.dump存入文件保存。


二、收集字体文件

字体文件上网收集就好了,但是值得注意的是,不是每一种字体都支持汉字,所以我们需要筛选出真正适合汉字生成的字体文件才可以。我一共使用了十三种汉字字体作为我们接下来汉字数据集用到的字体,具体如下


图:

当然,如果需要进一步扩大数据集来增强训练得到的模型的泛化能力,可以花更多的时间去收集各类汉字字体,那么模型在面对各种字体时也能从容应对,给出准确的预测。


三、文字图像生成

首先是定义好输入参数,其中包括输出目录、字体目录、测试集大小、图像尺寸、图像旋转幅度等等。



接下来需要将我们第一步得到的对应表读入内存,因为这个表示ID到汉字的映射,我们在做一下转换,改成汉字到ID的映射,用于后面的字体生成。



我们对旋转的角度存储到列表中,旋转角度的范围是[-rotate,rotate].



现在说一下字体图像是怎么生成的,首先我们使用的工具是PIL。PIL里面有很好用的汉字生成函数,我们用这个函数再结合我们提供的字体文件,就可以生成我们想要的数字化的汉字了。我们先设定好我们生成的字体颜色为黑底白色,字体尺寸由输入参数来动态设定。




我们写两个循环,外层循环是汉字列表,内层循环是字体列表,对于每个汉字会得到一个image_list列表,里面存储着这个汉字的所有图像。


我们将image_list中图像按照比例分为训练集和测试集存储。



写好代码后,我们执行如下指令,开始生成印刷体文字汉字集。



解析一下上述指令的附属参数:

  1. --out_dir 表示生成的汉字图像的存储目录

  2. --font_dir 表示放置汉字字体文件的路径

  3. --width --height 表示生成图像的高度和宽度

  4. --margin 表示字体与边缘的间隔

  5. --rotate 表示字体旋转的范围,[-rotate,rotate]

  6. --rotate_step 表示每次旋转的间隔


生成这么一个3755个汉字的数据集的所需的时间还是很久的,估计接近一个小时。其实这个生成过程可以用多线程、多进程并行加速,但是考虑到这种文字数据集只需生成一次就好,所以就没做这方面的优化了。数据集生成完我们可以发现,在dataset文件夹下得到train和test两个文件夹,train和test文件夹下都有3755个子文件夹,分别存储着生成的3755个汉字对应的图像,每个子文件的名字就是该汉字对应的id。随便选择一个train文件夹下的一个子文件夹打开,可以看到所获得的汉字图像,一共634个。


dataset下自动生成测试集和训练集

测试集和训练集下都有3755个子文件夹,用于存储每个汉字的图像。



生成出来的汉字图像


额外的图像增强

第三步生成的汉字图像是最基本的数据集,它所做的图像处理仅有旋转这么一项,如果我们想在数据增强上再做多点东西,想必我们最终训练出来的OCR模型的性能会更加优秀。我们使用opencv来完成我们定制的汉字图像增强任务。


因为生成的图像比较小,仅仅是30*30,如果对这么小的图像加噪声或者形态学处理,得到的字体图像会很糟糕,所以我们在做数据增强时,把图片尺寸适当增加,比如设置为100×100,再进行相应的数据增强,效果会更好。


噪点增加



输入指令


使用这种生成的图像如下图所示,第一数据集扩大了两倍,第二图像的丰富性进一步提高,效果还是明显的。当然,如果要获得最好的效果,还需要调一下里面的参数,这里就不再详细说明了。



至此,我们所需的印刷体汉字数据集已经成功生成完毕,下一步要做的就是利用这些数据集设计一个卷积神经网络做文字识别了!完整的代码可以在GitHub上获取。


再次送上传送门:

https://github.com/AstarLight/CPS-OCR-Engine/blob/master/ocr/gen_printed_char.py


原文链接:https://www.cnblogs.com/skyfsm/p/8436820.html



今日学习推荐

OCR文字识别实战

火热报名中


国内首套全面公开OCR技术的实战课程

四大应用场景  四大课程特色  六大项目实战

有意的亲们抓紧时间喽

咨询/报名可添加微信客服

julyedukefu_02


扫描下方二维码

了解更多课程详情优惠


长按识别二维码



助力“金三银四”

分享一套全体系人工智能学习资料

600G资料 限时限额0元领

小伙伴们可以屯起来,慢慢学习喔~

还有OCR课程优惠券免费赠送喔


扫描下方海报二维码

 立即领取

往期推荐






【实战分享】电影推荐系统项目实战应用

AI offer面经分享:薪资近乎翻倍,题库里的xgboost笔记看了不下十遍

万字长文概述NLP中的深度学习技术

34个最优秀好用的Python开源框架

神经网络P图新神器:摘墨镜戴美瞳都能搞定,加首饰换发型真假难分 | 代码开源

一文详解机器学习中最好用的提升方法:Boosting 与 AdaBoost


咨询,查看课程,请点击“阅读原文

给我【好看

你也越好看!

登录查看更多
9

相关内容

OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。
最新《自然场景中文本检测与识别》综述论文,26页pdf
专知会员服务
69+阅读 · 2020年6月10日
【浙江大学】对抗样本生成技术综述
专知会员服务
89+阅读 · 2020年1月6日
【综述】关键词生成,附10页pdf论文下载
专知会员服务
52+阅读 · 2019年11月20日
[综述]深度学习下的场景文本检测与识别
专知会员服务
77+阅读 · 2019年10月10日
开源OCR文本检测器,基于TextBoxes++和RetinaNet
专知
11+阅读 · 2019年11月15日
文本分析与可视化
Python程序员
8+阅读 · 2019年2月28日
【OCR技术】大批量构造中文文字训练集
数据挖掘入门与实战
7+阅读 · 2018年4月7日
文本识别 OCR 浅析:特征篇
开源中国
16+阅读 · 2018年1月6日
OCR技术浅析
机器学习研究会
40+阅读 · 2017年12月8日
深度学习CTPN+CRNN模型实现图片内文字的定位与识别(OCR)
数据挖掘入门与实战
16+阅读 · 2017年11月25日
tensorflow LSTM + CTC实现端到端OCR
数据挖掘入门与实战
8+阅读 · 2017年11月15日
TensorFlow实例: 手写汉字识别
数据挖掘入门与实战
11+阅读 · 2017年11月10日
用python和Tesseract实现光学字符识别(OCR)
Python程序员
7+阅读 · 2017年7月18日
Image Segmentation Using Deep Learning: A Survey
Arxiv
43+阅读 · 2020年1月15日
Arxiv
11+阅读 · 2018年5月13日
Arxiv
6+阅读 · 2018年1月29日
Arxiv
7+阅读 · 2017年12月28日
Arxiv
3+阅读 · 2012年11月20日
VIP会员
相关资讯
开源OCR文本检测器,基于TextBoxes++和RetinaNet
专知
11+阅读 · 2019年11月15日
文本分析与可视化
Python程序员
8+阅读 · 2019年2月28日
【OCR技术】大批量构造中文文字训练集
数据挖掘入门与实战
7+阅读 · 2018年4月7日
文本识别 OCR 浅析:特征篇
开源中国
16+阅读 · 2018年1月6日
OCR技术浅析
机器学习研究会
40+阅读 · 2017年12月8日
深度学习CTPN+CRNN模型实现图片内文字的定位与识别(OCR)
数据挖掘入门与实战
16+阅读 · 2017年11月25日
tensorflow LSTM + CTC实现端到端OCR
数据挖掘入门与实战
8+阅读 · 2017年11月15日
TensorFlow实例: 手写汉字识别
数据挖掘入门与实战
11+阅读 · 2017年11月10日
用python和Tesseract实现光学字符识别(OCR)
Python程序员
7+阅读 · 2017年7月18日
相关论文
Image Segmentation Using Deep Learning: A Survey
Arxiv
43+阅读 · 2020年1月15日
Arxiv
11+阅读 · 2018年5月13日
Arxiv
6+阅读 · 2018年1月29日
Arxiv
7+阅读 · 2017年12月28日
Arxiv
3+阅读 · 2012年11月20日
Top
微信扫码咨询专知VIP会员