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

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

1. OCR原理

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

1.1 图像处理

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

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

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

这个过程就是我们要教会人工智能的图像处理技术,即当接收到图像信息时,可以抽取其中关键信息。当然,人类的视觉往往处理的图像都是多层次的,这更加复杂,对于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,在最后一步记得添加语言库:

默认包含英文库,选择添加中文简繁体语言库。下一步完成安装,开始下载选择添加的语言库,最后可以在安装目录下…/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模型列表:
识别效果如下图:

这在我找到的开源项目中属于识别率很高的,错误的地方可以通过训练来提高它的识别效率。

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是序号)。
    选择样本:

    点击打开,弹出保存界面,注意文件名称按格式定义:

    提示成功:

    得到文件sfz.font.exp0.tif,将它放入tesseract安装目录下。

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

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


Tesseract根目录下生成box文件。

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

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

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

如下图所示,图像处理文字切分后,左侧列表列出了识别的字符及其坐标、宽高属性,我们可以将识别错误的字符进行纠正,这就是训练学习的过程。

注意上面有三页需要纠正训练的,因为有三个样板合并,修改完成后记得保存。

  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目录下。

最后,再次按照2.2 命令行操作执行得到新的out文件,查看结果:

3. 思考

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

OCR——光学字符识别相关推荐

  1. DL之CNN:利用CNN(keras, CTC loss, {image_ocr})算法实现OCR光学字符识别

    DL之CNN:利用CNN(keras, CTC loss)算法实现OCR光学字符识别 目录 输出结果 实现的全部代码 输出结果 更新-- 实现的全部代码 部分代码源自:GitHub https://r ...

  2. Ocrad.js – JS 实现 OCR 光学字符识别

    Ocrad.js 相当于是 Ocrad 项目的纯 JavaScript 版本,使用 Emscripten 自动转换.这是一个简单的 OCR (光学字符识别)程序,可以扫描图像中的文字回文本. 不像 G ...

  3. OCR:光学字符识别技术

    OCR:光学字符识别技术 所谓OCR (Optical Character Recognition光学字符识别)技术,是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其 ...

  4. OCR光学字符识别方法汇总(附开源代码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 文本是人类最重要的信息来源之一,自然场景中充满了形形色色的文字符号 ...

  5. OCR光学字符识别(一)

     所谓OCR (Optical Character Recognition光学字符识别)技术,是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别 ...

  6. OCR光学字符识别技术及其应用场景

    最近因为一个标准pdf文件内容都是扫描图像,要转为word文档以便编辑修改.最方便的就是依靠目前比较火的图像识别技术OCR了,如果没有这个技术,我们只有老老实实一字一字地打印到word文档中去,这样就 ...

  7. 6 个优秀的开源 OCR 光学字符识别工具

    申明:本文非笔者原创,原文转载自:http://sigvc.org/bbs/thread-870-1-1.html 纸张在许多地方已日益失宠,无纸化办公谈论40多年,办公环境正限制纸山的生成.而过去几 ...

  8. 开源OCR光学字符识别

    纸张在 许多地方已日益失宠,无纸化办公谈论40多年,办公环境正限制纸山的生成.而过去几年,无纸化办公的概念发生了显着的转变.在计算机软件的帮助 下,包含大量重要管理数据和资讯的文档可以更方便的以电子形 ...

  9. OCR光学字符识别方法汇总

    编者荐语 OCR英文全称是Optical Character Recognition,中文叫做光学字符识别.它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机能够接受.人又 ...

最新文章

  1. pythonyield详解_Python yield生成器详解
  2. 文献学习(part39)--Cross-view semantic projection learning for person re-identification
  3. react-native 显示html,react-native-webview加载本地H5
  4. C++ 一篇文章让你知道智能指针的魅力
  5. 电脑硬件知识大扫盲:CPU技术参数集锦
  6. 如何保养与维护笔记本硬盘
  7. 数据库的基本概念(三大范式,数据)
  8. java,mysql,hadoop,cdh,hive,spark,ntp,zookeeper,kafka,storm,redis,flume,git 安装详解
  9. 新手购买基金的买入策略
  10. manjaro 安装 tim 后无法输入中文
  11. 【技巧】vs2019调试
  12. 全排列回溯算法C语言,回溯算法(以全排列为例)
  13. CentOS7转发非3306端口到3306端口
  14. Windows PE 第四章 导入表
  15. Libgdx slg游戏进程记录
  16. 牛客小白月赛5 D.阶乘(factorial)
  17. Vijos 1166题:木牛流马
  18. 球状空心介孔硫化铋/二氧化硅纳米微球/全无机铯铅卤化物钙钛矿纳米晶修饰二氧化硅微球相关制备
  19. C#上位机——倒计时计时器
  20. Delphi 函数大全

热门文章

  1. html5 2d小游戏,cax: HTML5 Canvas 2D Rendering Engine - 小程序、小游戏以及 Web 通用 Canvas 渲染引擎...
  2. 备用内存 释放_系统备用内存怎么除掉
  3. PLC信号处理系列之滤波器设计(MATLAB滤波器设计工具箱介绍)
  4. 货运APP开发面临市场的考验
  5. pix2pixhd_[重要模型解读]pix2pixHD
  6. Unity 打包和读取AB资源,并播放打包的AB序列图!
  7. 程序员如何用一个脚本每天定时给多个女友发微信暖心话
  8. 排查MongoDB CPU使用率高的问题
  9. x230可以装win10吗_联想x230i笔记本U盘安装win10系统的操作教程
  10. 模糊搜索下拉框(可输入+自动匹配)