1. 程式人生 > >用Python建一個OCR服務器,直接提取圖中的文本

用Python建一個OCR服務器,直接提取圖中的文本

腳本 stdout 文件的 等等 編程語言 nic 樣本 href 常用工具

技術分享圖片
Why?

OCR(又叫光學字符識別)已經成為Python的一個常用工具。隨著開源庫Tesseract和Ocrad的出現,越來越多的程序員用OCR來編寫自己的庫文件和bot病毒。一個OCR的小例子,如用OCR直接從截圖中提取文本,省去了重新鍵入的麻煩。

開始的步驟

開始之前,我們需要開發一個後端服務層來表示OCR引擎的結果。這樣你就可以用你喜歡的方式來向端用戶表示你的結果。本文之後將會詳細介紹。除此之外,我們還需要添加一點後端代碼來生成HTML表格,以及一些使用這些API的前段代碼。這部分本文沒有講,但是你可以參閱源代碼。

準備好開始吧!

首先,需要安裝一些依賴項。這個過程也是非常有趣的。本文已經在Ubuntu 14.04測試,但是12.x和13.x版本應該也可以。如果你用的是OSX系統,可以用VirtualBox,Docker(註意檢查有沒有包含Dockerfile和install guide),或者是DigitalOcean(推薦使用)來創建相應的環境。

下載依賴項

我們需要Tesseract及其所有依賴項,包括Leptonica及其他相關的包。註意:可以用_run.sh這個shell腳本來快速安裝Leptonica和Tesseract的依賴包。如果這麽做的話,可以直接跳到搭建Web服務器部分。但是為了學習,如果你以前沒有親手構建過庫文件的話,還是建議嘗試一下。

技術分享圖片

發生了什麽?

簡單說,sudo apt-get update意思就是更新包列表。然後就能安裝一些圖像處理的包,如libtiff,libpng等等。除此之外,我們還需要安裝Python 2.7,作為我們的編程語言,以及python-imaging庫。

說起圖像,在將程序裏面編輯圖像之前我們還需要ImageMagick包。

$ sudo apt-get install imagemagick# 構建Leptonica和Tesseract
再說一遍,如果你用_run.sh腳本已經安裝過,就可以直接跳到搭建Web服務器部分。

Leptonica

現在,開始安裝Leptonica。

技術分享圖片
如果這是你第一次用tar的話,按照如下步驟操作:

  1. 用wget下載Leptonica的二進制文件

  2. 解壓

  3. 用cd進入解壓後的文件夾

  4. 運行autobuild和configure腳本安裝

  5. 執行make命令build

  6. Build後安裝

  7. 執行ldconfig創建相關的鏈接

OK,Leptonica創建好了,接下來就是Tesseract了。

Tesseract

現在下載並安裝Tesseract吧。

技術分享圖片
此處構建了一個Leptonica的映像,這部分的詳細信息參考Leptonica的解釋。

環境變量

我們需要設置一個環境變量來訪問Tesseract數據:

$ export TESSDATA_PREFIX=/usr/local/share/

Tesseract包

最後安裝一下Tesseract相關的語言包:

技術分享圖片
OK,Tesseract也安裝好了,可以CLI來測試一下。更多的信息可以參考docs。但是,我們還需要一個Python環境。所以,接下來安裝一個能夠接受以下兩種請求的Flask服務器:

  1. 接受圖像URL

  2. 能夠對圖像進行字符識別

搭建Web服務器

最有趣的事情來了!首先,我們需要構建一種通過Python和Tesseract交互的方式。我們可以使用popen,但是那不是python的風格。所以,我們可以使用一個非常小但是功能非常強大的Python包將Tesseract封裝起來——pytesseract。想要快點的話,就運行_app.sh腳本,否則,就得獲取代碼/結構的模板,然後運行一下命令:

技術分享圖片
註意:Flask模板是一個獲取簡單的具有Python風格的服務器的非常棒的庫。本文將它用來作為基本程序。Python學習關註,每天免費直播課程學習群:839383 765 分享業內最新python學習資料!

安裝OCR引擎

現在,我們需要用pytesseract來創建一個類來讀取圖片。在flask_server目錄下創建一個新的文件ocr.py,寫入如下代碼:

技術分享圖片
非常好!主方法process_image()的功能是銳化圖像文本。現在,這個模塊已經可以用了。

可選項:為你的OCR引擎創建一個CLI工具

做了這麽多繁瑣配置工作,讓我們來創建一個CLI工具來調節一下心情吧。在flask_server目錄下創建一個新的文件cli.py,寫入如下代碼:

技術分享圖片
非常簡單。之後我們就能看到從我們的OCR引擎中輸出到標準輸出STDOUT上的文本了。執行python flask_server/cli.py來試一下吧。

回到服務器

既然我們已經安裝好了OCR引擎,接下來該準備輸出了。講下面的代碼加入到app.py文件:

技術分享圖片
確保引入的下列包是最新的:

技術分享圖片
最後,添加一行API版本號:

_VERSION = 1 # API version
從代碼中可以看到,我們以PIL中Image文件對象的方式把JSON的響應傳入引擎的process_image()方法中。並且,就目前而言,它只支持.jpg圖片。

註意:如果PIL包沒有安裝的話,可以用Pillow包來代替。PIL有一些問題還沒有解決,Python社區對它的看法也不統一,詳細情況可以自行Google。

測試

運行你的程序:

技術分享圖片
然後,在另外一個終端運行:

$ curl -X POST http://localhost:5000/v1/ocr -d ‘{"image_url": "some_url"}‘ -H "Content-Type: application/json"
例子

技術分享圖片
前端

現在後端OCR引擎的API已經準備好了,我們可以增加一個基本的前端來使用這些API,並將結果通過AJAX和jQuery添加到DOM中。這部分內容本文就不講了。

技術分享圖片
用下面的樣本來測試一下:

技術分享圖片

好啦,本文我就分享到這裏,如果你跟我一樣都喜歡python,想成為一名優秀的程序員,也在學習python的道路上奔跑,歡迎你加入python學習群:839383765 群內每天都會分享最新業內資料,分享python免費課程,共同交流學習,讓學習變(編)成(程)一種習慣!

用Python建一個OCR服務器,直接提取圖中的文本