開發字符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介紹