OCR——光学字符识别

OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。

最近对人工智能很有兴趣,OCR应该是大家开始接触最多的一个应用场景,我希望通过开源的OCR项目去实现一个小应用,使用的是Tesseract OCR,遵循the Apache License, Version 2.0 。我仅以此文总结回忆一下这一个星期来的学习与领悟,也希望对感兴趣的朋友起到入门作用,更希望有大师斧正与引导。

1. OCR原理

本着知其然知其所以然的教诲,在开始具体操作之前,我们先了解一下OCR原理。光学字符识别,字面上理解就分为先后两个步骤,图像处理和文字识别。

1.1 图像处理

为什么要先进行图像处理?我们可以从人类的角度来倒推分析这一技术过程,人类大脑的发育是从后部向前部开始的,顺序依次枕叶、顶叶、颞叶、额叶,枕叶作为最先发育的大脑区域负责的就是视觉,也就是图像处理。婴儿视觉的训练过程就是图像处理的过程,开始我们可以接收到视觉信号范围很小,重点在色彩对比很大的黑白图像上,通过训练我们逐渐可以接收更大范围的视觉信号,处理更复杂的色彩图像。

GLENN DOMAN 博士,一位早在1940年就开始进行人类研究的先驱,他在幼儿成长教育方面提出了很多系统的训练方法,其中最早期的视觉训练方法——杜曼闪卡,影响最大,世界上很多幼儿早教机构都采用这套训练方法对刚出生的婴幼儿进行训练。
doman闪卡简单示意图上图是简单的杜曼闪卡训练过程,根据本文的目的,我省略了很多步骤。首先是从黑白强烈对比的单个简单结构的字开始,例如“门”;其次暗一些的黑底白字,但依然是单个简单结构的字;然后变为对比相对较弱的白底红字且结构复杂的字,例如“舅”;再是颜色丰富结构复杂的单一内容的百科图像;最后发展成内容多行、字体多变、字号较小的故事。

总结,我们可以看到人类视觉发育成长的过程,是先从对比鲜明、结构简单、内容单一的图像开始,慢慢成长到色彩丰富、结构复杂、多行信息的图像。我们首先掌握了处理简单图像的方法,记录了图像的特征,然后无论这个图像如何变换或组合,我们只需要通过关注图像的特征就可以准确的识别图像信息。

这个过程就是我们要教会人工智能的图像处理技术,即当接收到图像信息时,可以抽取其中关键信息。当然,人类的视觉往往处理的图像都是多层次的,这更加复杂,对于OCR我们先暂且理解到这一层。

图像识别技术是属于人工智能的一项重要能力,因此为了实现程序模拟人类视觉的能力,人类设计了很多图像识别模型帮助程序实现这一能力,最初的“模板匹配模型”,直接将图像作为模板记忆,识别过程就是图像与模板的匹配过程;后来出现以记录图像的相似点进行匹配的“原型匹配模型”;再就是更加复杂的“泛魔识别模型”,通过多层次的特征分析去识别图像。我们可以结合前面杜曼博士对婴幼儿视觉训练的过程来分析下图像识别模型所做的事情。
泛魔识别模型基于这些理论,我们就明白了为什么先进行图像处理,目的就是将原始图片的特征提取出来。而这个提取的过程也是相当繁琐的,包含了灰度化、二值化、降噪、倾斜矫正、文字切分等等。
以下为模拟图片:
原图原图:存在色彩等多种元素。
灰度化灰度化:将图像黑白化。
二值化二值化:图像只存在黑白,没有灰色。
降噪降噪:将干扰项去除。

这里只是一个图像处理的模拟过程,每一项处理都包含复杂的算法,后面还要对文字进行切分,切分前先要将文字进行矫正以保证切分时直线标记,切分过程又分为多行与字符等等。

1.2 文字识别

图像处理后就要进行文字识别了,这个阶段就是图像识别模型中提到的认知层,将从图像中提取的特征进行匹配,最终决定图像对应文字。

图像特征提取存在多个维度,而维度多少也决定了文字识别效率。英文字符一共大小写52个,特征相对明确,而中文本身字集多且字体结构复杂,更有形近字,特征较多维度很高,因此再提取后为了识别效率提高需要降维,算法过程一般既要降低特征维度提高效率又要保证有足够的特征维度识别文字。

文字识别的结果很有可能出现多种情况,这时候还会有分类器,对识别的文字进行分类处理,分类器的作用就类似于阅读理解上下文来确定文字,例如根据图像处理得到特征维度,文字可能是“太”和“大”,而上下文词汇是“太阳”,那么通过训练分类器程序就可以决定这个字符识别为“太”。另外,还有各种不同的排版造成的横纵直线标记不规律,前后段落不清晰等等情况都需要特殊处理。

总之,OCR实现原理大致如此,其中细节及算法那是相当复杂和繁琐的!

2. Tesseract

Tesseract是一个开源光学字符识别(OCR)引擎,可在Apache 2.0许可下使用。
Tesseract最初是在1985年至1994年期间在惠普布里斯托尔实验室、惠普公司(Hewlett-Packard Laboratories Bristol)和科罗拉多州格里利市(Greeley Colorado)开发的。
1996年又进行了一些移植到Windows的更改。
1998年又进行了一些c++化。
2005年,Tesseract被惠普开源。
自2006年起,由谷歌维护开发。
它包含一个OCR引擎- libtesseract和一个命令行程序- tesseract。Tesseract 4增加了一个新的基于神经网络(LSTM)的OCR引擎,该引擎专注于行识别 ,但仍然支持Tesseract 3的遗留的Tesseract OCR引擎,该引擎通过识别字符模式工作。与Tesseract 3的兼容性是通过使用遗留的OCR引擎模式(—oem 0)实现的。
首席开发人员是Ray Smith,维护者是Zdenko Podobny。
Tesseract支持unicode (UTF-8),可以“开箱即用”地识别100多种语言,其中包括简体、繁体中文。
Tesseract支持多种输出格式:纯文本、hOCR (HTML)、PDF、隐形文本PDF、TSV。主分支还对ALTO (XML)输出提供实验性支持。
您应该注意到,在许多情况下,为了获得更好的OCR结果,您需要改进正在提供Tesseract的图像的质量。
该项目不包含GUI应用程序。
Tesseract可以通过训练来识别其他语言。
最新的(基于LSTM的)稳定版本是4.1.0(RC1),于2019年03月14日发布。

2.1 安装

windows版官方下载地址 :https://github.com/UB-Mannheim/tesseract/wiki
其它系统安装说明:https://github.com/tesseract-ocr/tesseract/wiki
windows版安装过程就是next,在最后一步记得添加语言库:
Tesseract安装过程选择语言库
默认包含英文库,选择添加中文简繁体语言库。下一步完成安装,开始下载选择添加的语言库,最后可以在安装目录下…/tessdata目录中看到如下文件:
语言库
后期也可以在官方下载新的语言库文件或者将自己训练的语言库添加到该目录使用。
tessdata语言库:https://github.com/tesseract-ocr/tessdata

2.2 命令行操作

tesseract可以直接通过命令行使用,也可以通过API供程序调用,但是它没有GUI的操作方式。
演示操作环境:windows10
目录结构:…/Tesseract-OCR
——————————|- 根目录 - 包含执行程序。
——————————|- tessdata - 存放语言库。
——————————|- pic - 自定义的目录,用来存放待识别图片。
我将之前的身份证原图放入了pic目录,名称为sfz.png。
原图
执行以下命令:

tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile...]

tesseract (待识别图片路径及名称) (输出文本路径及名称 )(-l 使用语言库) (-psm 执行模式)

示例图:
命令行执行效果
上图为正常执行效果,表示使用chi_sim简体中文字库识别pic目录下sfz.png图片,将结果输出到根目录下的out.text文件中,没有填写-psm,默认采用3模式。
psm模型列表:
psm列表识别效果如下图:
识别效果
这在我找到的开源项目中属于识别率很高的,错误的地方可以通过训练来提高它的识别效率。

2.3 训练

训练可以使用jTessBoxEditor工具。
下载地址:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
下载后直接解压运行train.bat进入GUI界面,前提是系统配置好jre环境变量,java运行环境。

  1. 准备多个训练样本(越多自然越准确,但同时训练也越耗时),将待训练的图片转换成tiff格式,windows系统直接用画图工具另存为其他格式选择tiff就可以了。

  2. 打开jTessBoxEditor,选择Tools>Merge TIFF…,将训练样本合并另存为一个tiff文件,但是文件名必须按照格式[lang].[fontname].exp[num].tif(lang是语言名称,fontname是字体名称,num是序号)。
    训练工具1选择样本:
    训练工具2
    点击打开,弹出保存界面,注意文件名称按格式定义:
    训练工具3
    提示成功:
    训练工具4
    得到文件sfz.font.exp0.tif,将它放入tesseract安装目录下。

  3. 执行命令行,生成box文件。

tesseract [tifname] [boxname] [-l lang] batch.bochop makebox

训练工具5
Tesseract根目录下生成box文件。
训练工具6

  1. 定义字符配置文件font_properties,内容:
[fontname] [italic] [bold] [fixed] [serif] [fraktur] 

fontname为字体名称,italic为斜体,bold为黑体字,fixed为默认字体,serif为衬线字体,fraktur德文黑字体,值只有0和1作为开关(0为否,1为是)。
例如:
训练工具7

  1. 纠正样本字符识别错误

训练工具8如下图所示,图像处理文字切分后,左侧列表列出了识别的字符及其坐标、宽高属性,我们可以将识别错误的字符进行纠正,这就是训练学习的过程。
9
注意上面有三页需要纠正训练的,因为有三个样板合并,修改完成后记得保存。

  1. 生成训练语言库文件.traineddata
    这里直接在网上找到一个批处理执行文件,感谢@小LiAn。
    新建.bat文件内容为以下代码,如果你使用的目录结构一直和我保持一致,就将bat文件放在Tesseract根目录下执行即可。
echo Run Tesseract for Training.. 
tesseract.exe sfz.font.exp0.tif sfz.font.exp0 -l chi_sim nobatch box.train 
 
echo Compute the Character Set.. 
unicharset_extractor.exe sfz.font.exp0.box 
mftraining -F font_properties -U unicharset -O sfz.unicharset sfz.font.exp0.tr 


echo Clustering.. 
cntraining.exe sfz.font.exp0.tr 

echo Rename Files.. 
rename normproto sfz.normproto 
rename inttemp sfz.inttemp 
rename pffmtable sfz.pffmtable 
rename shapetable sfz.shapetable  

echo Create Tessdata.. 
combine_tessdata.exe sfz. 

echo. & pause

生成如下文件,其中就包括sfz.traineddata,将该文件放入tessdata目录下。
训练工具10
最后,再次按照2.2 命令行操作执行得到新的out文件,查看结果:
训练工具11

3. 思考

  1. 感觉项目不稳定,暂没有观察到原因,执行步骤及样本都一致,可有时中间会报错,重新执行后又正常执行了?
  2. 第一次,样本为身份证时,涉及到多行文本、混合字体、色彩层次多噪声大等等,但结果很满意未进行训练识别率已经很高了。第二次,准备了单行、黑白字体、纯数字的样本,识别率100%。第三次,准备了多行、白底黑字、纯数字样本,识别率也很高。第四次,准备了多行、不规则(每行数字长短不一致)、背景有较浅的填充色及90%透明图案,黑色粗体字,纯数字样本,识别率相当低,经过训练也很低,使用PS工具对图片进行灰度化、二值化、降噪处理,依然识别率很低?
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值