点击蓝字?关注【测试先锋】,不再迷路!
一起成为互联网测试精英,前瞻测试技术~
导语 最近题主遇到了一个需要识别图片中的数字的问题,在网上冲浪时发现了tesseract可以做到ocr识别内容。但是经过实验发现对数字的准确率堪忧,需要自己训练。这篇文章主要讲的是自己摸索在mac环境下训练一个属于自己的ocr数字识别库的过程。因为遇到了太多的环境问题,从环境配置到组织素材再到训练,大概需要2d左右,这里值得写写。希望大家可以通过这篇文章快速的拿到属于自己的模型集✌️
一、背景
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.自带的识别准确率如何?
背景:识别图片中某个地方数字的准确性,如下图,视频中的每一帧我都将帧序列号标注在了视频的左上角:
我的目标:可以准确的识别这个左上角的标记的数字是多少,方便我后续的一系列的图像操作。
随后我找了一些教程,当你成功安装上了tesseract以后,你就可以用自带的原生tesseract模型来使用了:
tesseract TargetYourPicture.jpg - --psm 6
识别的准确率,就我这个case而言是不太好的,具体表现在:“1,2,7不分”(对于只有10个数字的识别,这已经占了30%的混乱率),“4,A”不分等一系列的情况,部分脚本结果如下:
因此,我们得到结论:使用原生的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
:
结果发现,tesseract的识别其实和图片大小没什么关系。图片就算改大了以后,识别依然是不准确的。
2)我的尝试B:检查混乱的规律,将规律写为hard code尝试通过外层逻辑来控制预测结果,比如if str(num) == ‘A’ num = 4
,但是没法解决数字混乱的问题。因此以上两种尝试都是行不通,看来一定要自己训练一个模型才行。
二、搭建流程介绍(mac环境)
1.全流程图
搭建全流程图如下:
如果你需要训练自定义的模型,那你大概需要准备“tesseract训练工具”,“样本校正工具”,并在确认环境正确的情况下通过生成一系列的文件,最后组成自己的traineddata文件,作为最后的训练结果。
2.windows环境下的安装指引
因为笔者这次的实践全在mac环境下完成,windows读者可以参考这两篇博客(这里感谢eriel:)
https://blog.csdn.net/u012555556/article/details/80666809
https://blog.csdn.net/yasi_xi/article/details/8763385
三、具体实践
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
报错中有提到“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
configure执行成功的标志,你将在./configure
的最后的输出看到,你可以执行 make training
了 ,恭喜,那你就是可以安装了训练工具了,如下图所示:
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 相关的报错:
查阅了相关资料发现,这里需要增加psm
参数 于是将命令改为:
tesseract num.font.exp2.tif num.font.exp0 --psm 7 batch.nochop makebox
成功生成box以后的命令行是这样的:
d.校准每个标注
选中图片以后是这样的:
如果有不准确,可以通过下面截图的指引调整,直到每个page都有至少1个标注。
到这里,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打开如下:
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
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
绝对路径/combine_tessdata num.font. exp2
6)期间可能遇到的问题
a.tr文件生成失败
tr文件会在280页暂停并生成失败。这里的原因是280页的box文件没有标注:
将这页内容补齐(记得点击save),就可以成功生成。
b.unicharset文件查找失败
Failed to load unicharset from file unicharset
错误原因:过早的改名了。在上述的步骤里面,改名(最后有一步需要改名)时最好也要保留原文件,因为每一步骤都几乎要用到之前的文件。所以改名最好使用副本的方式,而不是替换。
解决方案:unicharset文件保留即可。正确的输出应该是:
c.unicharset_extractor 等命令失败
一直无法unicharset_extractor command not found
的原因:
这不是一个命令,这是一个可执行文件,需要在他的文件夹里用。make training
以后,没有发现错误(error warning都拉出来看看) 没什么问题就是应该安装好了的,安装好了以后全局搜一下 看看你的unicharset_extractor
在哪(macOS 可以使用mdfind
命令搜索文件)
类似的问题:
同样的,也是增加路径就可以解决。只要你的make training
是没有任何错误的,你这些执行文件一定都在你的电脑里。最后再执行mftraining
命令,如果没配置环境路径,还是要加绝对路径。
5.检验正确率
使用自己训练的模型,做预测时使用如下命令:
tesseract ./cut-BasketballDrillText-3.jpg stdout -l num.font.exp2 --psm 6
肉眼可以感觉到准确率有了很高的提升,基本上不会有识别成字母或者符号的情况了
参考链接:
tesseract-ocr-github tesseract 代码仓库:
https://github.com/tesseract-ocr/tesseract
Python实例:利用pytesseract库进行图片文字识别:
http://www.inimei.cn/archives/297.html
编译可训练的tesseract遇到的问题:
https://blog.csdn.net/aaa_aaa1sdf/article/details/95324522
mac文字识别:https://blog.csdn.net/u010670689/article/details/78374623