mac brew 安装_“自己动手,丰衣足食”——训练一个属于自己的OCR文字识别库(mac环境)...

点击蓝字?关注【测试先锋】,不再迷路!

一起成为互联网测试精英,前瞻测试技术~

81c75359eaed82ecea54e2adc05073e1.png

导语 最近题主遇到了一个需要识别图片中的数字的问题,在网上冲浪时发现了tesseract可以做到ocr识别内容。但是经过实验发现对数字的准确率堪忧,需要自己训练。这篇文章主要讲的是自己摸索在mac环境下训练一个属于自己的ocr数字识别库的过程。因为遇到了太多的环境问题,从环境配置到组织素材再到训练,大概需要2d左右,这里值得写写。希望大家可以通过这篇文章快速的拿到属于自己的模型集✌️

0d073cc33eaf16b408589975fb2819b3.png

一、背景

1.什么是tesseract

Tesseract was originally developed at Hewlett-Packard Laboratories Bristol and at Hewlett-Packard Co, Greeley Colorado between 1985 and 1994, with some more changes made in 1996 to port to Windows, and some C++izing in 1998. In 2005 Tesseract was open sourced by HP. Since 2006 it is developed by Google.

Tesseract最初是在1985年至1994年间由Hewlett-Packard Laboratories Bristol和Hewlett-Packard Co,Greeley Colorado开发的,经过了几轮迭代,1996年移植到Windows,并在1998年推出了C++版本。2005年,Tesseract由惠普开源。2006年以后,谷歌团队在维护这个项目至今。

2.自带的识别准确率如何?

背景:识别图片中某个地方数字的准确性,如下图,视频中的每一帧我都将帧序列号标注在了视频的左上角:

d5ddb9fdae754cc6d7965176f4095c3b.png

我的目标:可以准确的识别这个左上角的标记的数字是多少,方便我后续的一系列的图像操作。
随后我找了一些教程,当你成功安装上了tesseract以后,你就可以用自带的原生tesseract模型来使用了:

tesseract TargetYourPicture.jpg - --psm 6
识别的准确率,就我这个case而言是不太好的,具体表现在:“1,2,7不分”(对于只有10个数字的识别,这已经占了30%的混乱率),“4,A”不分等一系列的情况,部分脚本结果如下:

c8a54a10d1ee6c88e0134bcbe969698f.png

因此,我们得到结论:使用原生的tesseract模型来做预测是不能完成这次的需求的。

3.如何提高识别的准确率?

1)我的尝试A:将样本的数字变大,再来做预测
我构造样本的方法是:将视频左上角标记上序列帧号以后,再使用截帧的操作:
a.序列帧构造,使用ffmpeg命令可以做到:

ffmpeg -i input.mp4 -vf drawtext=fontcolor=black:box=1:boxcolor=white:fontsize=40:fontfile=msyh.ttf:line_spacing=7:text=%{n}:x=0:y=0 -vframes 600  -y -qscale 0  out.mp4

可以将fontsize参数改大,这样你就可以拿到一组很大个的样本库,下图左边是fontsize=160,右边是fontsize=40

b11ff66896a6ea6aafcddcd81d813ccc.png

结果发现,tesseract的识别其实和图片大小没什么关系。图片就算改大了以后,识别依然是不准确的。
2)我的尝试B:检查混乱的规律,将规律写为hard code尝试通过外层逻辑来控制预测结果,比如if str(num) == ‘A’ num = 4,但是没法解决数字混乱的问题。因此以上两种尝试都是行不通,看来一定要自己训练一个模型才行。

0d073cc33eaf16b408589975fb2819b3.png

二、搭建流程介绍(mac环境)

1.全流程图

搭建全流程图如下:

db17239c0262dce61686750af482d65c.png

如果你需要训练自定义的模型,那你大概需要准备“tesseract训练工具”,“样本校正工具”,并在确认环境正确的情况下通过生成一系列的文件,最后组成自己的traineddata文件,作为最后的训练结果。

2.windows环境下的安装指引

因为笔者这次的实践全在mac环境下完成,windows读者可以参考这两篇博客(这里感谢eriel:)

https://blog.csdn.net/u012555556/article/details/80666809
https://blog.csdn.net/yasi_xi/article/details/8763385

0d073cc33eaf16b408589975fb2819b3.png

三、具体实践

1.tesseract的安装

1)不带自训练库的安装:

brew install tesseract

2)带训练库的安装:

注意,下面这个命令很久之前就已经失效了:

brew install tesseract --with-training-tools

现在mac确认安装的方式是需要将tesseract的代码下载下来。通过gcc编译在自己的电脑上(如果你之前已经用brew安装了tesseract,但是没装上training-tools没关系,也可以将源码下载下来,它会重复安装)。

A.下载源码

源码链接:

https://github.com/tesseract-ocr/tesseract/wiki/Compiling#macos-with-homebrew

B.依赖库的安装

根据以往tesseract教程博主的经验,他们可能遇到的依赖大概有如下几个:

brew install automake autoconf libtool
brew install pkgconfig
brew install icu4c
brew install leptonica
brew install gcc
brew install pango

我遇到的有问题的库是 libffi和icu4u,这个库在我安装完了以后,在后续的./configure环节一直都找不到在哪,后续在环境路径里面添加了提示的这几个路径后,再次./configure以后就成功装上了:libffi报错添加这些到系统路径:

export LDFLAGS="-L/usr/local/opt/libffi/lib"
export CPPFLAGS="-I/usr/local/opt/libffi/include"
export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"

icu4u报错:

brew install cairo pango icu4c autoconf libffi libarchive
export PKG_CONFIG_PATH=\
$(brew --prefix)/lib/pkgconfig:\
$(brew --prefix)/opt/libarchive/lib/pkgconfig:\
$(brew --prefix)/opt/icu4c/lib/pkgconfig:\
$(brew --prefix)/opt/libffi/lib/pkgconfig
./configure

再执行brew install 相关指令,以及 ./configure

C. 编译

具体命令(转移到你下载的源码文件夹):

./autogen.sh

./configure

75234f5da548925d47926b74fbd70de5.png

报错中有提到“Documentation will not be built because asciidoc or xsltproc is missing.”
解决这个错的方法:执行这些临时配置命令:

brew install cairo pango icu4c autoconf libffi libarchive
export PKG_CONFIG_PATH=\
$(brew --prefix)/lib/pkgconfig:\
$(brew --prefix)/opt/libarchive/lib/pkgconfig:\
$(brew --prefix)/opt/icu4c/lib/pkgconfig:\
$(brew --prefix)/opt/libffi/lib/pkgconfig
./configure

51d722663354d54f5782477a15686149.png

configure执行成功的标志,你将在./configure的最后的输出看到,你可以执行 make training 了 ,恭喜,那你就是可以安装了训练工具了,如下图所示:

efff523daa4c192849fea0375597d6ea.png

D.安装训练工具
make training

成功安装训练工具,至此,训练工具就安装完毕了。

E.安装一个语言库

语言库:https://github.com/tesseract-ocr/tessdata
这里安装一个英文的就行(如果有其他需求,可以自行取用)注意,下载好的traineddata文件,需要放在指定的tessdata目录下。我的tessdata目录是:/usr/local/share/tessdata

2.tesseract原生的使用

tesseract TargetYourPicture.jpg - --psm 6`

这里,关于psm的参数含义可以参考这篇blog:https://blog.csdn.net/fire669842703/article/details/103009578,也可以 tesseract --help看看具体参数的用法。

3.训练工具jTessBoxEditor的使用

1)下载工具

这个软件是开源的,是java代码写的所以运行时是需要执行jar包的。首先要装好java环境。然后在执行打开jar包的命令。训练工具源码:

https://mac.softpedia.com/get/Graphics/jTessBoxEditor.shtml

2)使用工具教程

a.打开工具:
sudo java -jar ./jTessBoxEditorFX.jar
b.素材tif合成

tools-Merge TIFF 选中图片,mac这里按住shift可以拖动选中框,可以选中大量的图片,我这里选择了500张。

c.生成box文件
tesseract num.font.exp2.tif num.font.exp0 batch.nochop makebox

但是这里遇到一个错 出现了 empty page 相关的报错:

d76502c4eed61dcea93eb2b72fe5afbb.png

查阅了相关资料发现,这里需要增加psm参数 于是将命令改为:

tesseract num.font.exp2.tif num.font.exp0 --psm 7 batch.nochop makebox

成功生成box以后的命令行是这样的:

4f5403475217a41ef7818764a13f1275.png

d.校准每个标注

选中图片以后是这样的:

4d893ac40f4131ccebb29b9720d6c70a.png

如果有不准确,可以通过下面截图的指引调整,直到每个page都有至少1个标注。6f5b595769ca42689fcd69216249a793.png

到这里,box文件就构造完毕了。记得点击上图中间的 Box Editor - Save 来保存自己的调整结果。当然,其实这只是一个帮助你来写*.box的工具。如果你可以用脚本批量生成box的内容,那也可以不用这个工具。比如:每个数字的大小都是固定的84*116 ,那么第一个数字就一定是 :num 0 0 84 116;第二个数字就一定是 num2 84 0 168 116;第三个数字就一定是:num3 168 0 252 116.box文件用txt打开如下:

883e3cf8e39bc2028d188b887e11cc75.png

4.一系列的文件生成

1) 生成tr文件

tesseract num.font.exp2.tif num.font.exp2 -psm 6 nobatch box.train

2) 生成unicharset文件

exactPath/unicharset_extractor num.font.exp2.box

8d41c556fdc38a0f5f4783ba6422abfa.png

3) 创建font_properties文件

touch ./font_properties
txt打开 输入 font 0 0 0 0 0 即可.

fontname italic bold fixed serif fraktur

//翻译
字体名字 倾斜 加粗 固定宽度 衬线体 哥特字体

4) training

Shapeclustering:

绝对路径/shapeclustering -F font_properties -U unicharset num.font.exp2.tr

生成了shapetable文件;
mftraining:

绝对路径/mftraining -F font_properties -U unicharset -O num.font.exp2.unicharset num.font.exp2.tr

num.font.exp2.unicharset、inttemp,pffmtable文件,将inttemp,pffmtable重命名为:num.font.exp2.inttemp,num.font.exp2.pffmtable

执行命令:

绝对路径/cntraining num.font.exp2.tr

生成normproto文件,再重命名为 num.font.exp2.normproto

5)拿到traineddata

combine_tessdata 注意exactPath:

到这里就ok了,然后把生成的traineddata文件,放在tessdata的执行目录下即可。我的路径是:/usr/local/share/tessdata

9007c05167a4187a96049de391a59e0a.png
绝对路径/combine_tessdata num.font.    exp2

6)期间可能遇到的问题

a.tr文件生成失败

904b92a53ce868806a2430885328df13.png

tr文件会在280页暂停并生成失败。这里的原因是280页的box文件没有标注:

82287a556ce520549d041ecf865039be.png

将这页内容补齐(记得点击save),就可以成功生成。

b.unicharset文件查找失败
Failed to load unicharset from file unicharset

错误原因:过早的改名了。在上述的步骤里面,改名(最后有一步需要改名)时最好也要保留原文件,因为每一步骤都几乎要用到之前的文件。所以改名最好使用副本的方式,而不是替换。

003862b4866930eb500a1c249b05c49b.png

解决方案:unicharset文件保留即可。正确的输出应该是:

99c4573138f045880c60643abb5819f6.png

c.unicharset_extractor 等命令失败

一直无法unicharset_extractor command not found的原因:
这不是一个命令,这是一个可执行文件,需要在他的文件夹里用。make training以后,没有发现错误(error warning都拉出来看看) 没什么问题就是应该安装好了的,安装好了以后全局搜一下 看看你的unicharset_extractor在哪(macOS 可以使用mdfind命令搜索文件)

232b64e4b5ec7a854ccf3f82c945fa60.png

类似的问题:

e05e0bb6467f62e7c4b4dba7f1eabdc1.png

同样的,也是增加路径就可以解决。只要你的make training 是没有任何错误的,你这些执行文件一定都在你的电脑里。最后再执行mftraining命令,如果没配置环境路径,还是要加绝对路径。

5.检验正确率

使用自己训练的模型,做预测时使用如下命令:

tesseract ./cut-BasketballDrillText-3.jpg stdout -l num.font.exp2 --psm 6

肉眼可以感觉到准确率有了很高的提升,基本上不会有识别成字母或者符号的情况了

040d6bdad7d5c1e95680ea729c67d4cc.png

参考链接:

  1. tesseract-ocr-github tesseract 代码仓库:

    https://github.com/tesseract-ocr/tesseract

  2.  Python实例:利用pytesseract库进行图片文字识别:

    http://www.inimei.cn/archives/297.html

  3.  编译可训练的tesseract遇到的问题:

    https://blog.csdn.net/aaa_aaa1sdf/article/details/95324522

  4. mac文字识别:https://blog.csdn.net/u010670689/article/details/78374623

0d073cc33eaf16b408589975fb2819b3.png

2e82bc074999584d6ae2d7458c809260.png

5a82646345a019a21f657eb204fc4ad5.gif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值