- 苏格团队
- 做者:MaDaima
前段时间工做中发现若是可以将一些相同标准的图片中文字识别出来,能提高很多咱们的用户体验。因而就看了一下图片文字识别相关的功能。linux
首先就是了解了一下各大厂的api,那识别率天然是很高,效果很是的不错,但问题就是,限制调用次数而且模型不受本身的控制,或者就须要充钱使你变强。 (这里贴一个别人的分享吧:Java-基于百度API的图片文字识别(支持中文,英文和中英文混合) - TheLoveFromWSK - CSDN博客)git
而后就本身了解了下ocr和tesseract。本文主要是一个helloworld版本的tesseract入门使用教程...因此还请大佬轻拍github
OCR:光学字符识别(英语:Optical Character Recognition,OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。windows
本文主要讲的是Tesseract-OCR:Tesseract是Ray Smith于1985到1995年间在惠普布里斯托实验室开发的一个OCR引擎,曾经在1995 UNLV精确度测试中名列前茅。但1996年后基本中止了开发。2006年,Google邀请Smith加盟,重启该项目。目前项目的许可证是Apache 2.0。该项目目前支持Windows、Linux和Mac OS 等主流平台。但做为一个引擎,它只提供命令行工具。api
有兴趣研究源码的同窗能够看下GitHub地址:GitHub - tesseract-ocr/tesseract: Tesseract Open Source OCR Engine (main repository) 下载连接,mac、windows、linux都有,可取所需:Downloads · tesseract-ocr/tesseract Wiki · GitHubbash
在Path中新增环境变量,地址是Tesseract-ocr的安装目录 编辑器
在系统变量中添加TESSDATA_PREFIX,变量值为Tesseract-ocr目录中的tessdata文件夹 工具
tesseract -v
复制代码
安装成功以后呢,天然是要try一下的 1.准备个图片PNG,JPG都是能够的(具体支持哪些格式就不一一列举了,这里我就用png了) 测试
tesseract imagename outputbase [-l lang] [--oem ocrenginemode] [--psm pagesegmode] [configfiles...]
复制代码
这里解释一下,就是tesseract [图片的地址+名字+后缀] [输出的地址+名字] 例如: 字体
3.这样就会在目录下申城一个DemoAnswer.txt的文件
可是这里若是是中文呢?重复上面的操做试下
4.中文识别
tesseract imagename outputbase [-l lang]
复制代码
这句命令中的 [-l lang] 是设置识别语言的,默认是英语,因此若是须要识别中文还须要去下载中文的字库 (其实细心的同窗可能在安装的时候有注意到,就已经自动安装了字库) 去到tesseract-ocr的安装目录中的tessdata目录下查看***.traineddata就是字库
若是安装的时候没有下载的话,能够来这里找本身须要的字库下载 Data Files · tesseract-ocr/tesseract Wiki · GitHub
将下载的字库放到tessdata目录中便可
4.2敲命令
tesseract HelloWorldDemo.png DemoAnswer -l chi_sim
复制代码
这是由于使用的字库跟咱们的字体是有差别的,因此若是须要能识别咱们图片中的字体,须要去训练咱们本身的字库
步骤:(转自tesseract的github)
Prepare training text. 准备你的训练文本
Render text to image + box file. (Or create hand-made box files for existing image data.) 将文本转为image+box文件.(若是你已经有image文件的话,只须要手动生成box文件)
Make unicharset file. 生成unicharset文件
Optionally make dictionary data. 有选择性的生成字典数据
Run tesseract to process image + box file to make training data set. 运行tesseract来处理以前的image+box文件生成一个训练数据集合
Run training on training data set. 在训练数据集合的基础上进行训练
Combine data files. 合并数据文件
1.将图片的命名改成[lang].[fontname].exp[num].tif(改后缀建议经过另存为的方法来选择tif)
例如:BlackLang.HelloWorldDemo.exp0.tif
2.生成box文件
提一张官网的图
tesseract BlackLang.HelloWorldDemo.exp0.tif BlackLang.HelloWorldDemo.exp0 -l chi_sim batch.nochop makebox
复制代码
这样就会在目标目录中生成一个.box的文件,以下图
3.使用jTessBoxEditor
这里为了方便咱们矫正box文件,这里使用一个工具jTessBoxEditor: VietOCR - Browse /jTessBoxEditor at SourceForge.net
安装好了以后,打开jTessBoxEditor,点击open,选择对应的tif(若是这里tif和box不在一个目录中会有问题哦)
3.2在Box View中能够看到每一个字的放大图,来确认是否彻底选中
4.训练
4.1生成tr文件
输入命令:tesseract.exe [tif图片文件名] [生成的tr文件名] nobatch box.train t
tesseract.exe BlackLang.HelloWorldDemo.exp0.tif BlackLang.HelloWorldDemo.exp0 nobatch box.train
复制代码
输入命令:unicharset_extractor.exe [box文件名]
unicharset_extractor.exe BlackLang.HelloWorldDemo.exp0.box
复制代码
这里若是你有多个图片须要去生成字库的话,就须要合并成一个char集合
输入命令:unicharset_extractor.exe [第一个box文件名] [第二个box文件名] ··· 这里演示demo就只用一个box
4.3定义字体特征文件font_properties
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
复制代码
这里的tontname必需要和[lang].[fontname].exp[num].box保持一致; <italic> 、<bold> 、<fixed> 、<serif>、<fraktur>的取值为1或0,表示字体是否具备这些属性。
这里咱们在目录中建立一个名字为font_properties的文件,内容以下:
HelloWorldDemo 0 0 0 0 0
复制代码
这是咱们的目录中的文件以下: 一个目标图片.tif,一个分析.box,一个训练结果.tr,一个字符集unicharset,一个特征文件font_properties
4.4生成字典 输入命令:
mftraining.exe -F font_properties -U unicharset -O BlackLang.unicharset BlackLang.HelloWorldDemo.exp0.tr
#这里若是有多个tr就连在后面写多个tr便可
复制代码
cntraining.exe BlackLang.HelloWorldDemo.exp0.tr
#这里若是有多个tr就连在后面写多个tr便可
复制代码
如图:
有兴趣的同窗能够经过编辑器打开看看里面都是啥,会发现里面都是一些蛮有意思的乱码哈哈哈
4.5 合并文件 输入命令:
combine_tessdata BlackLang.
#combine_tessdata [lang].
复制代码
而后将刚刚生成的[lang].traineddata复制到tesseract-ocr的tessdata中 再来执行命令:
tesseract HelloWorldDemo.png answer -l BlackLang
复制代码
这只是一个很是demo的训练,正常如今生产中使用这个仍是万万不够的,须要对某个字体的所有的汉子进行大量的训练才行 总的来讲,tesseract对中文的识别能力仍是不好的,更别说是手写的中文了,那识别率基本是没有。可是对英文还有数字的识别率仍是很可观的。 这里也只是一个简单的对于tesseract分享记录而已~
如今已经有不少被封装后的ocr例如pyocr啊,tess4J啊之类的,或者各大厂提供的api这些的识别率就很高了毕竟模型已经训练的很好了,这些就下次再说吧