用Python建一個OCR服務器,直接提取圖中的文本
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的話,按照如下步驟操作:
-
用wget下載Leptonica的二進制文件
-
解壓
-
用cd進入解壓後的文件夾
-
運行autobuild和configure腳本安裝
-
執行make命令build
-
Build後安裝
- 執行ldconfig創建相關的鏈接
OK,Leptonica創建好了,接下來就是Tesseract了。
Tesseract
現在下載並安裝Tesseract吧。
此處構建了一個Leptonica的映像,這部分的詳細信息參考Leptonica的解釋。
環境變量
我們需要設置一個環境變量來訪問Tesseract數據:
$ export TESSDATA_PREFIX=/usr/local/share/
Tesseract包
最後安裝一下Tesseract相關的語言包:
OK,Tesseract也安裝好了,可以CLI來測試一下。更多的信息可以參考docs。但是,我們還需要一個Python環境。所以,接下來安裝一個能夠接受以下兩種請求的Flask服務器:
-
接受圖像URL
- 能夠對圖像進行字符識別
搭建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服務器,直接提取圖中的文本