专栏首页机器学习AI算法工程【OCR技术】大批量生成文字训练集

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

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

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

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

本文完整源码 获取方式:

关注微信公众号 datayx 然后回复 文字 即可获取。

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

  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,再进行相应的数据增强,效果会更好。

噪点增加

适当腐蚀

def add_erode(cls,img):
   kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))    
   img = cv2.erode(img,kernel)
   return img

适当膨胀

def add_dilate(cls,img):
   kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))    
   img = cv2.dilate(img,kernel)
   return img

然后做随机扰动

def do(self,img_list=[]):
   aug_list= copy.deepcopy(img_list)    for i in range(len(img_list)):
       im = img_list[i]        if self.noise and random.random()<0.5:
           im = self.add_noise(im)        if self.dilate and random.random()<0.25:
           im = self.add_dilate(im)        if self.erode and random.random()<0.25:
           im = self.add_erode(im)    
       aug_list.append(im)    return aug_list

输入指令

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

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

本文分享自微信公众号 - 机器学习AI算法工程(datayx)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OMAF4CLOUD:启用标准的360°视频创建服务

    原标题:OMAF4CLOUD: STANDARDS-ENABLED 360° VIDEO CREATION AS A SERVICE

    用户1324186
  • Creator3D图文教程【打砖块】终于撸出来了,附送最新源码!

    上面图中是打砖块游戏的主要 3D 节点元素,Shawn这两天在学习 Unity 与 Creator3D 感受到制作 3D 游戏与 2D 游戏最大的不同是 3D ...

    张晓衡
  • 只要200行JavaScript代码,就能把特斯拉汽车带到您身边

    Jerry的前一篇文章 如何使用JavaScript开发AR(增强现实)移动应用 (一) 介绍了用React-Native + ViroReact开发增强现实应...

    Jerry Wang
  • ICCV 2019 Oral | 期望最大化注意力网络 EMANet 详解

    本文转自知乎,作者立夏之光。AI科技评论获授权转载,如需转载请联系原作者。原文链接:https://dwz.cn/3BFMz8pW

    AI科技评论
  • MLOD:基于鲁棒特征融合方法的多视点三维目标检测

    注:这是一篇2019年9月发表在arXiv【1】激光雷达和摄像头数据融合的目标检测论文。

    SIGAI学习与实践平台
  • 高级视频压缩和渲染的高度沉浸式8K+应用程序

    原标题:ADVANCED VIDEO COMPR ESSION AND RENDERING FOR HIGHLY IMMERSIVE 8K+ APPLICATI...

    用户1324186
  • python3 openpyxl操作excel

    在日常工作中,避免不了需要操作excel文件的情况,如果还带有需要对excel的内容进行格式设定、合并单元格等需求,那么可以使用openxl来解决处理。

    Devops海洋的渔夫
  • Cocos 引擎 UI 全新升级:进一步提升编辑器体验

    Cocos Creator 3D 全面公测已有一段时间,距离正式发布已经不远了。为了迎接即将发布的 Cocos Creator 3D,我们对 Cocos Cre...

    张晓衡
  • 多视角、体素、XR等新型视频服务技术(IBC2019)

    本文是来自 IBC 2019 五篇技术文章的阅读总结,涉及多视角、体素和VR/AR等新型视频技术,翻译整理:郭帅。

    用户1324186
  • 线性代数在数据科学中的十大强大应用(二)

    本篇主要介绍自然语言处理(NLP)中的线性代数与计算机视觉(CV)中的线性代数。涵盖主成分分析(PCA)与奇异值分解(SVD)背后的线性代数知识。相信这也是各位...

    石晓文

扫码关注云+社区

领取腾讯云代金券