前言
这几天在玩图片文字识别,找到了惠普开源谷歌维护的Tesseract
OCR识别项目。
它支持上百种语言的文字识别,对于英文来说,准确率非常之高,但是对于中文来说,就真的是不容乐观了。
其次识别速度也是过慢。
速度问题是由训练文件决定的,到了4.0版本以上,官方提供了三种训练好的文件供大家下载:best
、fast
还有个就是适中的了。
但是在用的时候会发现各种蛋疼的问题,有时fast
能识别的best
竟然识别不了。
最好的解决办法就是自己来训练字库了。
难题
自己训练字库,必定存在困难,首先,文字有不同的字体,Tesseract
提供的训练字库据说默认包含了三种中文字体,这也是它为什么慢的原因,如果我们知道要识别的图片上文字的字体,并且将每种字体训练结果单独打包,那么识别时速度肯定会有所提升。
那么我们自己重新训练难道把每个中文汉字都弄成图片重新识别校正搞一遍?
我想这是不太现实的,当然了官方提供的肯定也是别人这么从头训练出来的。
对于个人来说,这个工作量太大了,于是折中一点,我的做法就是先用官方提供的fast
版本字库去识别,每次将识别错误的图片文字自己重新训练校正,最后再合并到官方的chi_sim.traineddata
中去。
考虑性能速度问题的话,我们可以将自己训练校正的文字不同字体单独分开迭代更新字库,这样的好处就是如果知道了需要识别的图片的字体,那么可以直接指定字体训练库来进行识别,提高识别速度。
还有就是如果有需要,最后也还是可以将不同字体的训练库合并成一个。
上面所说的这里暂且不说中文的训练,说下关键的地方:如何将训练校正后的样本合并到已有的chi_sim.traineddata
中去。
假设我们在当前训练好的文件夹目录下:
将官方训练字库复制过来进行解包:
combine_tessdata -u chi_sim.traineddata chi_sim
然后重新打包:
combine_tessdata chi_sim
这样就搞定了,需要注意的是,训练的时候请最好以chi_sim
开头指定语言,避免打包失败,等打包好了之后就随便你自己修改训练库文件的名称了。
PS:此方法貌似只有第一次有效,后面再次使用上一次该方法生成的
traineddata解压再次打包会发现大小没变,应该是没合并成功,所以对于这种训练还是打包另外取个名字,然后在
tesseract命令中指定多语言吧。