長期以來,從影象中提取文字一直是軟體工程中的一個熱門問題。光學字元識別(OCR)是廣泛用於解決這一問題的先驅技術。OCR 能夠將包含文字的影象轉化為機器可讀的資料,它給從文件處理自動化到語言翻譯等各個行業帶來了革命性的變化。
雖然商業 OCR 解決方案已經存在,但使用 Python(一種通用且功能強大的程式語言)建立自己的 OCR API 具有多種優勢,包括定製化、資料隱私控制和潛在的成本節約。
本指南將指導您使用 Python 建立自己的 OCR API。它探討了開發有效的 OCR API 所需的必要庫、技術和注意事項,使您能夠在自己的應用程式中利用 OCR 的強大功能。
前提條件
要繼續學習,您需要對 Python 和 Flask 有基本的瞭解,並在系統中安裝 Python 的本地副本。
建立 OCR API
在本指南中,您將學習如何構建一個 Flask 應用程式,允許使用者通過 POST 端點上傳圖片,然後使用 Pillow 載入圖片,並使用 PyTesseract 封裝器(用於 Tesseract OCR 引擎)進行處理。最後,它將提取的文字作為對請求的響應返回。
您可以進一步自定義此 API,以提供基於模板的分類(從發票中提取細列專案、稅表中的輸入等)或 OCR 引擎選擇等選項(您可以在此處找到更多 OCR 引擎)。
首先,為專案建立一個新目錄。然後,執行以下命令在資料夾中建立一個新的虛擬環境:
python3 -m venv env source env/bin/activate
接下來,執行以下命令安裝 Flask、PyTesseract、Gunicorn 和 Pillow:
pip3 install pytesseract flask pillow gunicorn
安裝完成後,您需要在主機上安裝 Tesseract OCR 引擎。Tesseract 的安裝說明因主機作業系統而異。你可以在這裡找到相應的說明。
例如,在 MacOS 上,可以使用 Homebrew 執行以下命令安裝 Tesseract:
brew install tesseract
一旦完成,PyTesseract 包裝器就能與 OCR 引擎通訊並處理 OCR 請求。
注:這僅在開發環境中執行。當您將應用程式部署到 Kinsta 等遠端託管平臺時,您需要再次執行此操作(儘管託管平臺要求的方式不同–您稍後會明白)。
現在,您可以編寫 Flask 應用程式了。新建一個名為 ocrapi 的目錄,並在該目錄下新建一個名為 main.py 的檔案。儲存以下內容:
from flask import Flask, request, jsonify from PIL import Image import pytesseract app = Flask(__name__) @app.route('/ocr', methods=['POST']) def ocr_process(): if request.method == 'POST': image_file = request.files['image'] image_data = Image.open(image_file) # Perform OCR using PyTesseract text = pytesseract.image_to_string(image_data) response = { 'status': 'success', 'text': text } return jsonify(response)
上面的程式碼建立了一個基本的 Flask 應用程式,它只有一個端點 – /ocr
。當你向該端點傳送帶有影象檔案的 POST 請求時,它會提取檔案,使用 pytesseract
封裝器的 code_too_string()
方法執行 OCR,並將提取的文字作為響應的一部分發回。
在同一 ocrapi 目錄下建立 wsgi.py 檔案,並儲存以下內容:
from ocrapi.main import app as application if __name__ == "__main__": application.run()
現在,您可以使用以下命令執行應用程式:
gunicorn ocrapi.wsgi
您的基本 OCR API 已準備就緒,是時候進行測試了!
本地測試 OCR API
您可以使用內建的 cURL CLI 向您的 API 傳送請求,也可以改用 Postman 等詳細的 API 測試工具。要測試 API,你需要下載一個包含一些文字的示例圖片。你可以使用這張簡單的圖片,也可以暫時使用這張潦草的圖片。
將這兩種圖片下載到專案目錄中,並根據你選擇的圖片給它起一個簡單的名字,如 simple-image.png 或 scribbled-image.png。
接下來,開啟終端並導航到專案目錄。執行以下命令測試 API:
curl -X POST -F “image=@scribbled-image.png” localhost:5000/ocr
這將向您的 OCR API 傳送請求,並返回類似的響應:
{ "status": "success", "text": "This looks like it was written in a hucry\n\n" }
這證明您的 OCR API 設定正確。您也可以嘗試使用簡單的圖片,下面是響應的樣子:
{ "status": "success", "text": "This looks like it was written with a steady hand\n\n" }
這也證明了 Tesseract OCR 引擎的準確性。現在,您可以繼續在應用程式託管伺服器上託管您的 OCR API,以便線上訪問。
部署 OCR API
要將應用程式部署到 Kinsta,首先需要將專案程式碼推送到 Git 提供商(Bitbucket、GitHub 或 GitLab)。
在推送程式碼之前,您需要在主機系統上單獨設定 Tesseract,以便使用 PyTesseract 封裝器。要在 Kinsta 應用程式平臺(或任何其他環境)上使用封裝器,還需要在那裡進行設定。
如果您使用的是遠端計算例項(如 AWS EC2),您可以通過 SSH 進入計算例項,然後執行相應的命令在其上安裝軟體包。
但是,應用程式平臺不提供直接訪問主機的許可權。您需要使用 Nixpacks、Buildpacks 或 Dockerfiles 等解決方案來設定應用程式環境的初始要求(其中包括在本地設定 Tesseract 軟體包),然後安裝應用程式。
在專案目錄中新增一個 nixpacks.toml 檔案,內容如下:
# nixpacks.toml providers = ["python"] [phases.setup] nixPkgs = ["...", "tesseract"] [phases.build] cmds = ["echo building!", "pip install -r requirements.txt", "..."] [start] cmd = "gunicorn ocrapi.wsgi"
這將指示構建平臺
- 使用 Python 執行時構建和執行應用程式
- 在應用程式的容器中設定 Tesseract 軟體包。
- 使用
gunicorn
啟動應用程式。
此外,執行以下命令生成 requirements.txt
檔案,以便應用平臺在構建過程中安裝所需的 Python 軟體包:
pip3 freeze > requirements.txt
Git 倉庫準備就緒後,請按照以下步驟將 OCR API 部署到伺服器(以 Kinsta 為例):
- 登入或建立賬戶,檢視 MyKinsta 面板。
- 使用 Git 提供商授權 Kinsta。
- 在左側邊欄單擊 Applications,然後單擊 Add Application。
- 選擇要部署的版本庫和分支。
- 從 35 個選項列表中選擇一個可用的資料中心位置。Kinsta 會通過 Nixpack 檔案自動檢測應用程式的構建設定,因此請將開始命令欄位留空。
- 選擇應用程式資源,如 RAM 和磁碟空間。
- 單擊 Add Application。
部署完成後,複製已部署應用程式的連結,並在 CLI 上執行以下命令:
curl -x POST -F “image=@simple-image.png” <your-deployed-app-link>/ocr
返回的響應應與本地收到的響應相同:
{"status":"success","text":"This looks like it was written with a steady hand\n\n"}
您還可以使用 Postman 測試 API。
在 Postman 中試用應用程式
至此,基本 OCR API 開發完成。您可以訪問 GitHub 上該專案的完整程式碼。
小結
現在,您已經擁有了一個可執行的自託管 OCR API,您可以根據自己的喜好對其進行定製!該 API 可以從影象中提取文字,為資料提取、文件數字化和其他應用提供了寶貴的工具。
在您繼續開發和完善 OCR API 的過程中,可以考慮探索一些高階功能,如多語言支援、影象預處理技術,以及與雲端儲存服務整合以儲存和訪問影象。
評論留言