以下内容大部分从以下链接的博客摘抄下来的,把自己按按照步骤操作踩过的坑记录下,也供他人参考。
软件下载、java环境下载参照原博客,直接写下训练方法步骤:
1、双击jTessBoxEditor,jar运行,点击Tools
2、点击Merge TIFF
3、文件类型选择All Image Files,选择样本图片,点击打开。
4、文件名输入num.font.exp0.tif,文件类型选择TIFF,点击保存。弹出创建成功的窗口后点击确定。
文件名格式为:[lang].[fontname].exp[num].tif
其中lang为语言名称,fontname为字体名称,num为序号
不明所以然,应该符合这个格式就行吧,建议只改前面的num(我自己就改成了test.font.exp0.tif),来区分不同的训练集即可,后面还有一些命名,与此处要统一
5、将test.font.exp0.tif文件复制到指定的目录,最好新建一个目录(我建了一个tesserract_test目录),因为后面还生成好多文件。
6、以管理员身份运行,打开cmd命令行,通过cd进入第5步的目录。执行命令:
tesseract.exe test.font.exp0.tif test.font.exp0 -psm 7 batch.nochop makebox
这一步需要将你安装的tesseract.exe目录添加到环境变量中,关于添加环境变量百度一大堆,不赘述,如果不想添加环境变量,可像原博客那样,把est.font.exp0.tif复制到tesseract.exe安装的目录。
另外,要加上粗的这个参数,原博客没有加。网上说,加上这个参数,生成box文件的时候tesseract就会把图片当作单行文本进行处理。不知道是什么意思,反证不加执行命令时会出现Empty page,也不知道出现Empty page有没有影响。
执行完成后,在目录中多出test.font.exp0.box这个文件
7、运行jTessBoxEditor工具,点击Box Editor,再点击Open
8、到你的目录中,选择之前生成的num.font.exp0.tif,点击打开。
9、可以看出有些字符识别的位置不准确,可以通过该工具手动对每张图片中识别错误的字符和位置进行校正。校正完成后Save即可(可以校正完一个点击Save,也可以全部校正完后再点Save)。如下图,可以看到图片是7UF4,识别的是7UFA,因此需要双击红框中A那里,把A改成4。下面两个小箭头可以看上一个或下一个,像我选择了20个图片,就要把这20个图片一一核对完成。
如果图片中的框位置明显不对,可以通过上边的X\Y\W\H来调整,
如果像下图只识别出3个字符,可以选中包含两个字符的那个框,点击上边的Split,即可分开成两个字符,其他的三个是合并、插入、删除,原理类似
10、 定义字体特征文件。创建一个名称为font_properties的字体特征文件。font_properties不含有BOM头(应该不不用后辍的意思,我这样理解),文件内容格式如下:
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
其中fontname为字体名称,必须与[lang].[fontname].exp[num].box中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具有这些属性。
这里在样本图片所在目录下创建一个名称为font_properties的文件,用记事本打开,输入以下下内容,然后保存,把txt的后辍去掉:
11、生成语言文件。在样本图片所在目录下创建一个批处理文件,输入如下内容(可以先在txt文档中输入,保存时把后辍改.bat就行。代码我也看不懂,从字面意思大概是生成几个文件,改名等。注意,代码中涉及到文件名时,一定要改成你前面定义的文件名,就是test.font.exp0这个东西):
rem 执行改批处理前先要目录下创建font_properties文件
echo Run Tesseract for Training..
tesseract.exe test.font.exp0.tif test.font.exp0 nobatch box.train
echo Compute the Character Set..
unicharset_extractor.exe test.font.exp0.box
mftraining -F font_properties -U unicharset -O test.unicharset test.font.exp0.tr
echo Clustering..
cntraining.exe test.font.exp0.tr
echo Rename Files..
rename normproto test.normproto
rename inttemp test.inttemp
rename pffmtable test.pffmtable
rename shapetable test.shapetable
echo Create Tessdata..
combine_tessdata.exe test.
12、执行批处理文件,执行时,把.bat文件放在你创建的目录中,双击运行。或者在cmd命令后中进入你创建的目录,输入.bat的文件名回车(我的是test.bat,这个文件名随意取)。建议用后一种运行,这个如果出现错误,你可以在cmd命令行中看出是哪里错了,第一种方式运行,出错会一闪而过。
13、执行完.bat文件,如果没有错,会生成很多个test.开关的文件,其他文件不知道有啥用没,我们要的是红框这个文件。
14、把上图中红框这个文件放到Tesseract-OCR安装路径中的tessdata文件夹中,这样就完训练集的制作了:
15、然后修改python代码里面的识别命令,修改字符库为我们训练出来的库文件。其中”lang=test“,test就是我训练的库文件的名字。
pytesseract.image_to_string(image, lang="test", config="-psm 7")
这样,就会用我们创建的数据去识别了,这样识别率会大幅提高,只能说是提高识别率,即使你识别的图片就是你制作字集库的图片,也不一定能识别出来。另外,在识别之前,可以对图片做如下处理,大概就是去除背景干涉,灰度处理,至于代码中enhance(n),这个n怎么取值,是什么意思,暂时不清楚:
image = Image.open("code.png")
image = image.convert("RGB")
eh = ImageEnhance.Color(image)
eh = eh.enhance(0)
eh = ImageEnhance.Brightness(eh)
eh = eh.enhance(2)
eh = ImageEnhance.Contrast(eh)
eh = eh.enhance(8)
eh = ImageEnhance.Sharpness(eh)
image = eh.enhance(20)
# image.show ()
image = image.convert("L")
# image.save ("test.png")
print(pytesseract.image_to_string(image, lang="test", config="-psm 7"))
如下两张图,左边是没处理的,右边是处理的,处理过清晰了许多,这样,你把处理过的图片保存下来,制作字集库时,就应该用处理的图片去制作,而不是原图。
最后有一个疑问,不知道有没有其他方法,同时使用自代的字集库和我们创建的库,也就是同时使用多个字集库,欢迎留言。