资讯专栏INFORMATION COLUMN

Tesseract 进行图像识别

Tecode / 1345人阅读

摘要:目前已作为开源项目发布在,其最新版本已经支持中文,并提供了一个命令行工具。他能够用来识别英文,但是不能识别中文。所以要下载中文的识别包这样就能识别中文。至少对印刷的中文字识别效果是很好的。

1. Tesseract 介绍

Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封。

数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。

Tesseract目前已作为开源项目发布在Google Project,其最新版本3.0已经支持中文OCR,并提供了一个命令行工具。

2. Tesseract 安装

Tesseract 可以在 linux、windows 和 macOS 下使用。这里以 macOS 为例。

2.1 使用 homebrew 安装 Tesseract 同时安装训练工具:

</>复制代码

  1. brew install --with-training-tools tesseract

虽然官方提供了多种语言的识别数据包,但是在很多情况下都需要在其基础上自己进行训练,所以记得安装训练工具

2.2 安装语言识别包

从官网地址下载对应的识别包 [官网地址](https://github.com/tesseract-...
) 比如中文识别选择 chi_sim 这个包

再将识别包放置到系统的相应目录中,比如我用 hoembrew 安装,地址位于:

</>复制代码

  1. /usr/local/Cellar/tesseract/3.05.01/share/tessdata

2.3 下载训练工具

tesseract 的好处就在能够自己训练需要识别的字符,如果只是识别印刷字体这样的需求还是调用 API 比较方便,比如说百度云的文字识别 API。

要进行训练就下载 jTessBoxEditor 样本训练工具

3. 基本概念 3.1 基本命令

查看版本

</>复制代码

  1. tesseract -v

查看帮助

</>复制代码

  1. tesseract --help

进行识别的命令

</>复制代码

  1. tesseract in.jpg out.txt -l chi_sim -psm 6
    in.jpg:需要识别的图片
    out.jpg:图片的结果输出到的位置
    -l:后跟用于进行识别的数据包,这里是中文
    -psm:识别方式

3.2 语言识别包

查看已有的语言识别包

</>复制代码

  1. ➜libai tesseract --list-langs
  2. List of available languages (4):
  3. chi_sim
  4. eng
  5. libai
  6. number

语言识别的包是识别的基础,下载之后默认自带的是 eng.traineddata 英文识别包。他能够用来识别英文,但是不能识别中文。所以要下载中文的识别包 ch_sim.traineddata 这样就能识别中文。但是发现准确率不高,不符合需求就要训练自己的包。

总之核心就在 traineddata 文件。

3.3 psm的参数

psm 的参数很重要,表示 tesseract 识别图像的方式,比如说是一行一行识别还是逐字识别。希望逐字识别可以使用 -psm 10,希望逐行识别可以使用 -psm 6,其他没怎么用以后有机会补充。总之,希望有更好的识别效果需要选择合适的 psm。

</>复制代码

  1. tesseract --help-psm
  2. 0 Orientation and script detection (OSD) only.
  3. 1 Automatic page segmentation with OSD.
  4. 2 Automatic page segmentation, but no OSD, or OCR.
  5. 3 Fully automatic page segmentation, but no OSD. (Default)
  6. 4 Assume a single column of text of variable sizes.
  7. 5 Assume a single uniform block of vertically aligned text.
  8. 6 Assume a single uniform block of text.
  9. 7 Treat the image as a single text line.
  10. 8 Treat the image as a single word.
  11. 9 Treat the image as a single word in a circle.
  12. 10 Treat the image as a single character.

谷歌翻译结果,自己尝试一下会有体会

</>复制代码

  1. 方向和脚本检测(OSD)。
  2. 1自动页面分割与OSD。
  3. 2自动页面分割,但没有OSD或OCR。
  4. 3全自动页面分割,但没有OSD。 (默认)
  5. 4假设单列可变大小的文本。
  6. 5假设一个垂直对齐的文本的统一块。
  7. 6假设单个统一的文本块。
  8. 7将图像视为单个文本行。
  9. 8将图像视为单个字。
  10. 9将图像视为一个单个的单词。
  11. 10将图像视为单个字符。
4. 识别与训练

libai

4.1 识别

</>复制代码

  1. tesseract libai.jpg libai -l chi_sim -psm 6

</>复制代码

  1. 抹甫曰月闫充,
  2. 屁是讹上霜;
  3. 亭孰塑明汛
  4. 佃爽崽故歹o

显然准确率不高,进行训练。

4.2 训练

1.生成字体文件

</>复制代码

  1. 打开jTessBoxEditor工具,菜单栏:tools->Merge TIFF...,选中要合成的图片并保存为为:libai.tif

2.生成 box 文件

</>复制代码

  1. tesseract libai.tif libai -l chi_sim -psm 6 batch.nochop makebox

3.利用 jTessBoxEditor 校正

说明
校正之后记得保存。

4.生成.tr文件

</>复制代码

  1. tesseract libai.tif libai -psm 6 nobatch box.train

5.生成unicharset文件

</>复制代码

  1. unicharset_extractor libai.box

6.创建font_properties文件

</>复制代码

  1. echo "font 0 0 0 0 0" > font_properties

7.training

</>复制代码

  1. shapeclustering -F font_properties -U unicharset libai.tr
    mftraining -F font_properties -U unicharset -O l libai.tr

8.Clustering。产生字符形状正常化特征文件normproto

</>复制代码

  1. cntraining libai.tr

9.重命名文件

</>复制代码

  1. mv normproto libai.normproto
  2. mv inttemp libai.inttemp
  3. mv pffmtable libai.pffmtable
  4. mv shapetable libai.shapetable
  5. mv unicharset libai.unicharset

10.合并文件生成 traineddata 文件

</>复制代码

  1. ➜ libai combine_tessdata libai.
  2. Combining tessdata files
  3. TessdataManager combined tesseract data files.
  4. Offset for type 0 (libai.config ) is -1
  5. Offset for type 1 (libai.unicharset ) is 140
  6. Offset for type 2 (libai.unicharambigs ) is -1
  7. Offset for type 3 (libai.inttemp ) is 855
  8. Offset for type 4 (libai.pffmtable ) is 140145
  9. Offset for type 5 (libai.normproto ) is 140274
  10. Offset for type 6 (libai.punc-dawg ) is -1
  11. Offset for type 7 (libai.word-dawg ) is -1
  12. Offset for type 8 (libai.number-dawg ) is -1
  13. Offset for type 9 (libai.freq-dawg ) is -1
  14. Offset for type 10 (libai.fixed-length-dawgs ) is -1
  15. Offset for type 11 (libai.cube-unicharset ) is -1
  16. Offset for type 12 (libai.cube-word-dawg ) is -1
  17. Offset for type 13 (libai.shapetable ) is 141781
  18. Offset for type 14 (libai.bigram-dawg ) is -1
  19. Offset for type 15 (libai.unambig-dawg ) is -1
  20. Offset for type 16 (libai.params-model ) is -1
  21. Output libai.traineddata created successfully.

11.将文件拷贝到目标文件夹

</>复制代码

  1. cp libai.traineddata /usr/local/Cellar/tesseract/3.05.01/share/tessdata

12.再次识别

</>复制代码

  1. tesseract libai.jpg trained -l libai -psm 6

</>复制代码

  1. libai cat trained.txt
  2. 床前明月光,
  3. 疑是地上霜;
  4. 举头望明月,
  5. 低头思故乡.
5. 总结

tesseract 能够进行 OCR 识别,但是对中文的支持不够好。所以如果要更好地识别中文字体需要进行大量的训练,有时间精力当然是一个方案,没有的话还是调用现成的 API 比较好。至少对印刷的中文字识别效果是很好的。

我写好的放在 Tesseract 和百度识别的 Demo

</>复制代码

  1. 参考资料:

  2. Tesseract 3 语言数据的训练方法
    使用Tesseract-OCR训练文字识别记录
    如何使用Tesseract-OCR(v3.02.02)训练字库 - 作业部落 Cmd Markdown 编辑阅读器

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67961.html

相关文章

  • [译]OpenCV OCR and text recognition with Tesseract

    摘要:纳入深度学习模型来进一步提升准确率只是时间问题,事实上,这个时间已经到来。最新版本支持基于深度学习的,准确率显著提高。该函数使用基于深度学习的文本检测器来检测不是识别图像中的文本区域。高效使用概率最高的文本区域,删除其他重叠区域。 By Adrian Rosebrock on September 17, 2018 in Deep Learning, Optical Character ...

    gnehc 评论0 收藏0
  • Python图像处理之图片文字识别(OCR)

    摘要:与介绍将图片翻译成文字一般被称为光学文字识别,。是目前公认最优秀最精确的开源系统。我们以图片为例输入命令识别结果如下只识别错了一个字,识别率还是不错的。最后加一句,对于彩色图片的识别效果没有黑白图片的效果好。 OCR与Tesseract介绍   将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR)。可以实现OCR 的底层库并不多,...

    W4n9Hu1 评论0 收藏0
  • Python图像处理之图片验证码识别

    摘要:在上一篇博客图像处理之图片文字识别中我们介绍了在中如何利用软件来识别图片中的英文与中文,本文将具体介绍如何在中利用软件来识别验证码数字加字母。   在上一篇博客Python图像处理之图片文字识别(OCR)中我们介绍了在Python中如何利用Tesseract软件来识别图片中的英文与中文,本文将具体介绍如何在Python中利用Tesseract软件来识别验证码(数字加字母)。  我们在网...

    kk_miles 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<