Tesseract OCR 训练和识别总结

Tesseract OCR 训练和识别总结

一直以来都想尝试一下中文识别,直到最近才有点空闲时间,主要目的是证实一下到底可不可行,正确率能否达到 95% 以上。自己从头写起十分费时间,因为图片处理很麻烦,所以我选用了 Tesseract OCR。

读者在继续阅读前请注意这篇文章的局限性,在这里我只针对一个楷体字体进行识别,目的是测试一下中文OCR的可行度,以及测试一下 Tesseract OCR。

安装还是在苹果系统上,Mac OS X 10.8.3。Tesseract OCR 版本是目前最新的 v3.02,除了刚开始编译时遇到了点麻烦,其它都很顺利。

因为我是打算识别楷体或行书字体,Tesseract 网站上提供的简体中文数据不太适用,识别率极低,所以便花了些时间自己训练。最后选择是识别楷书,字体是迷你简启体,之所以选这个是因为我当初在找迷你繁智草的顺便收集了。如果以后有空,也可能会尝试识别草书,这个会很有挑战。

训练的过程有些繁琐,主要是识别率太低,需要逐个字检查然后纠正,不过可以写一个简单的Javascript小程序来帮助修改。总体而言步骤还算简单。同时我还发现 Tesseract 的算法对行距很敏感,如果行距太小,根本不识别。(后来我发现,如果把运行参数 -psm 设置成6,Tesseract 还是可以识别的,虽然准确率会降低)另外,字与字之间的间距太小时也经常错误,很显然,英文里的连字(ligature)不能适用于中文。由此可见 Tesseract 其实不太适用于方块字。下面是训练时用到的一个图片:

图片是用 Photoshop 生成的,每个字大概占50x50像素,DPI是72,字体大小是48点。这个设置是针对识别屏幕抓图。

训练数据总共是3508字符,包括标点符号,基本上就是那些通用字。最后生成的数据是20多兆,识别时的运行速度还算快,一百字大概就一两秒,我的CPU是2.6 GHz Intel Core i7。

由于行距是个大问题,我不得不加一个图片处理步骤,就是增加行距。幸好中文是方块字,增加行距十分简单,不需要考虑上下行交叠的问题。图片处理用 PHP 就可以。

下图是从Mac自带的字体管理器里截取的字体样板:

经过处理后的是这样:

正确识别标点符号需要额外配置,见下文。后来经过更多的测试,我发现识别一篇文章的正确率大概在 95% 左右,主要错误在形状类似的字以及标点符号上,比如怡识别成恬,还有大、太、夫,等等。有些字偶尔会被拆开,比如“把”会被拆成“扌”和“巴”。标点符号经常引起错误,比如“小”会和逗号连在一起错认成一个字。单个字的识别率没有测试过。考虑到我没有用任何复杂的图片处理或者是外带的数据,这样的结果还是不错的。

如果要提高正确率,一个简单的办法是成生一个常用字符表,Tesseract 在预测时可以参考这个表进行判断。另一个简单的办法是组词表,即 fixed-length-dawg。图片处理也可以提高识别率,但是如何处理需要看图像本身,在这里不好讨论。还有一个办法就是更加有针对性的训练,不过这个只是我的猜测。

除了增加行距,我发现把图片二值化(纯黑白化)也可以有效地提高准确率。如果安装了 ImageMagick,只需要一个简单命令就可以,比如:

convert input.png -threshold 50% output.png

下面给出我用的 Tesseract OCR 设置,可以放在 /usr/local/share/tessdata/config 里面,运行 tesseract 的时候用文件名调用,或包括在语言包里面。这些设置有许多是参照 Tesseract OCR 官方中文语言包里的设置。详细设置可以参考这个网页

chop_enable 0
language_model_ngram_space_delimited_language 0
chs_leading_punct            (‘“
chs_trailing_punct1           )。,;:?!
chs_trailing_punct2           )’”
textord_single_height_mode 1
textord_use_cjk_fp_model 0
segment_nonalphabetic_script 1
permute_script_word 0
textord_force_make_prop_words 1
use_new_state_cost              1
enable_new_segsearch            1
segment_segcost_rating          1
heuristic_segcost_rating_base   1.25
heuristic_weight_rating         1
assume_fixed_pitch_char_segment 1
heuristic_max_char_wh_ratio     1.3
segsearch_max_char_wh_ratio     1.9
classify_integer_matcher_multiplier 6
edges_use_new_outline_complexity    1
edges_children_fix                  1
edges_max_children_per_outline     20
edges_max_children_layers           5
edges_children_count_limit      10000
tosp_force_wordbreak_on_punct       0
textord_noise_sizelimit           0.2
textord_noise_normratio             5
textord_max_noise_size              7

最后,有兴趣的读者可以在这里体验一下:mw.gl/sites/ocr,不过速度可能有些慢。(如果要用上面例子的图片,行距是44像素。)

更改纪录