开发字符OCR识别系统的原因:
众所周知谷歌开源的tesseract-ocr是一套字符识别系统,其最新版本4.00采用了lstm(Long Short-Term Memory,长短时记忆网络)神经网络进行字符的训练与识别,其支持100多种语言(字符),对于比较标准的印刷体字符,其识别准确率非常高(在我们提供的数据集上,准确率可以达到98%)。
如何进行字符识别系统框架搭建:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口【1】。
由于tesseract-ocr目前只支持ubuntu系统安装(4.00版本只支持ubuntu 16.0.4以上系统安装),而且安装过程比较复杂、耗时。鉴于此,我们采用ubuntu 16.0.4的Docker镜像,生成Docker容器,然后将tesseract-ocr字符识别服务安装到Docker容器中,最后部署一个flask服务,暴露服务端口,提供给其他业务系统使用。
考虑到Docker容器中的flask服务需要自启动,以及服务可能由于程序异常而造成停止服务的情况,因此,需要在容器中添加自启动程序以及服务监听程序。自启动以及监听程序可以利用linux的定时器crontab命令,添加一条定时任务(每一分钟检测一次),检测程序是否正常运行,当服务不正常时,重启flask服务。在将该容器的服务移植到其他linux服务器(宿主机)后,考虑到服务器可能断电,或者宕机的情况,也需要在宿主机上利用crontab添加一条定时任务,监测Docker容器是否正常运行,如果运行不正常,需要重启该Docker容器。
考虑到该容器移植的便利性,我们利用Docker的commit和save命令,将该容器提交成新的镜像,并将该镜像保存为tar包,部署该OCR应用容器时,只需要将该tar包拷贝到宿主机上,利用Docker的load以及run命令,启动该容器以及自启动容器内的OCR识别服务。
基于Docker的OCR识别系统的整个部署流程的关键操作步骤如下:
提交容器变化到镜像中
docker commit 【containerId】 ocr_images:ocr_api
保存镜像到tar包中
docker save ocr_images:ocr_api > ocr_images.tar
加载OCR服务镜像
docker load < ocr_images.tar
启动OCR服务容器
docker run -t -d -p 0.0.0.0:8000:8000 --name ocr_api ocr_images:ocr_api
OCR服务框架设计图
OCR识别系统的优点:
将该Docker服务(基于ubuntu
16.0.4,tesseract-ocr
4.00)打包成tar包后,就可以移植到任意linux平台上,包括移植到centos服务器上,移植到低版本的ubuntu上等等,充分发挥Docker容器的移植便利性,使该OCR服务能够非常便利的跨平台使用。
逐步优化的OCR识别系统:
由于该OCR识别系统比较耗时,我们在多台物理机上部署了若干个OCR识别服务,并进行了负载均衡,以满足勤智的字符识别业务需求,例如:实现了证件照、名片上文字的提取,法院判案中证明材料、裁判文书等字符提取任务,大大降低了对人工的依赖,提升工作效率。
[1]百度百科Docker介绍