初试tesseract-ocr

最近需要做一个有关验证码识别的项目,文字字体是Courier New加粗版,每个字母都有可能倾斜、偏离位置,伴有不同位置的各种颜色的噪点。我使用阀值过滤和连通区域分析法(参考:http://blog.csdn.net/icvpr/article/details/10259577)去除所有的噪点,并将不同的字符准确分割开来,现在剩下的唯一的问题就是准确地识别每一个字符了。我尝试了许多商业OCR系统,效果都不甚理想;最终,tesseract-ocr成了我尝试的对象。

其实很久之前我尝试过tesseract-ocr,感觉其效果也蛮不咋地。这一次最先尝试的是其3.02版,已经编译好的Win32版本,支持exe和dll调用。我在网上尝试了下训练方法,结果用训练数据的时候主程序总是提示软件崩溃,我靠……用它默认的eng库吧,外加限制白名单字符,识别结果倒实在是太勉强了(网站给了三个备选答案,靠模糊匹配能够实现一些正确率,但是没有达到要求。)从另一个网站上找到了越南字体库,里面恰好含有Courier New字体。使用后正确率也有所提高,可是仍然不够高。事情就只能这样了吗?

当然没有。最近,tesseract-ocr的官网(https://code.google.com/p/tesseract-ocr/)放出来了其3.03RC版的源代码,据说提高了准确率,还有了更为便捷的训练工具(text2image等。)这种好东西可是不能放过。

用SVN软件同步了一下源码(超过1G了,主要是语言库很大),发现里面有VS2008和VS2010目录,好开心有没有……按照网上的编译教程,下载了leptonica 1.68(这是它的依赖库之一)的win32版本,然后开开心心地开始了Build……等等,什么,你需要leptonica 1.70!?好吧,去leptonica网站下载了其1.70版本的源码(它是2014年1月发布的,只有源码…),解压后却发现…尼玛,没有VS的工程文件夹。再去官网翻下载,倒是得到了一份1.68版本的VS2008工程目录,可是至于用它来编译1.70的源码,那可是爆出了一堆错误。不甘心,再去问Google,结果从Google网络论坛里发现了这些东西:

Project Member #3 tomp2…@gmail.com

I have NOT released a Visual Studio 2008 Solution yet for Leptonica 1.70. Please be patient. A temporary VS2008 solution was sent to the tesseract project for their use only. I have yet to hear back directly from them. (No news is good news?)

Using VS2008 (and my new VS2008 Solution files), I have successfully build v1.70 many times over the past 2 weeks.

I’m not sure when I will release an official v1.70 VS2008 solution. For one thing, it depends on when leptonica itself stops changing (there were changes just yesterday). It will probably be at least a week from now.

这TM是在逗我吗……Windows上直接编译就不行了吗……

算了,先把东西搞出来再说。找了一台Linux VPS,系统是CentOS 6.4。编译leptonica和tesseract-ocr的主程序貌似很顺利的说(鸡冻啊)然后是编译训练工具(training文件夹下面的。)然后嘛……

 fatal error: pango/pango.h: No such file or directory

我明明装了pango-devel,这又是什么鸟问题!!跑到/usr/include/下看了看,有一个pango-1.0文件夹,再里面有个pango,还里面就是pango.h了……立即为pango文件夹建立了一个软链接,此错误消失,继而又来一大片错误代码-_-||| 仔细一看,原来又是glib.h找不着了,尼玛我不是也装glib-devel了吗……再次新建了个软链,并且改了下源文件,再尝试编译,错误代码又多了不少。

⊙﹏⊙b狂汗!

突然想起来开发团队是用Ubuntu编译的,那我换成Ubuntu是不是就可以了呢?(好天真的想法)于是我在服务器上又开了个虚拟机,下载了Ubuntu Server 13.10,然后是手动安装的……按照编译说明下载完毕所有开发组件,然后就是同步SVN了。同步了一小会……咦,为什么SSH连接直接断掉了?尝试ping一下?不通!吓吓……赶紧跑到宿主机上去看,原来是虚拟机直接关掉了,可这是为什么!!再次启动、同步,没多久虚拟机又一次罢工。靠,SVN这么牛B,能不动声色地硬关机?!

没办法,再次装了回Ubuntu(这次用的VMware的自动安装),然后先SVN,成功……然后apt-get所有依赖项,成功……编译leptonica,成功……编译tesseract的主程序,成功……胜利的曙光仿佛即将到来…然后又开始编译训练程序…一切都是那么的美好……

 fatal error: pango/pango.h: No such file or directory

无语了,又是找不到pango的问题。编译几个小破程序有那么难吗到底!!

快没耐心了,这次还是简单粗暴点好了:直接把pango扔到/usr/include下面。glib.h?一样扔过去,文件结构乱不乱早就不管了,看你还敢不敢说找不到。

在扔了4-5次后,所有的程序终于编译过去了,我的天啊……赶紧用训练工具生成粗Courier New字体库,然后用新版tesseract程序识别下……嗯,结果强多了!这次终于完全可以达到要求了!

可是这还没完,因为我需要在Windows下运行识别软件。我尝试了用tesseract-ocr 3.02的程序+新语言库识别,结果则差了不少。可是VS那边不给力,除了等,还能怎么办呢?

对,用交叉编译,Cygwin还是官方推荐的编译方法之一呢!赶紧搞定Cygwin,然后开始在Windows上面编译。Leptonica很快倒是OK了,不过这次tesseract非常不走运,一上来就是非常严重的问题:

error: ‘snprintf’ was not declared in this scope

error: ‘strtok_r’ was not declared in this scope

好吧,原来是找不到这个函数了,可是这怎么可能!!搜了一下含有strtok_r的文件,发现VS工程目录下有个port目录,貌似是为了Windows兼容性而准备的,里面有个strtok_r的手动实现版本。不过好奇怪啊,Cygwin不是模拟的UNIX环境吗,怎么会需要Windows的东西?不管了,先加上再说。然后是查找snprintf函数,发现它就躺在Cygwin自带的GCC的stdio.h里面。它被无视了?可这又为什么?

继续Google,这时一个关于此函数的叙述引起了我的注意:

snprintf不是标准中规定的函数,但是很多编译器都自带了这个函数。

原来是这样。还有另一个叙述:

我遇到过这种情况,需要把编译标准改为gnu++11而不是c++11。

哈哈,貌似有救了。打开configure脚本,把所有的c++11改为gnu++11,重新configure重新make。OK,一次通过。不过至于训练工具,我实在是懒得再编译了(好像cygwin不支持它所需要的那几个库。)

终于可以用上exe版本的最新的tesseract-ocr了。哈哈!

喵~本文目前有4条留言,欢迎发表评论!

  1. ke tao

    2014-05-04 00:07 [回复]
  2. :

    lz能把编译好的exe发个链接吗,谢谢

    2014-05-20 21:14 [回复]
    • 很不好意思,我3月底换了电脑,这些文件没有备份,然后就不见了o(╯□╰)o
      不过如果你按照我在本文中提到的方法进行编译的话,肯定是可以成功的。祝你好运!

      2014-05-23 18:50 [回复]
  3. :

    文章很有用,我在编译tesseract主程序的时候就把configure的CXXFLAGS的-std改了,不然一直编译不过去。

    2015-01-12 16:41 [回复]

打破沉默,我来发表评论鸟~