如何用Python構建自己的OCR API

如何用Python構建自己的OCR API

長期以來,從影象中提取文字一直是軟體工程中的一個熱門問題。光學字元識別(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 引擎)。

首先,為專案建立一個新目錄。然後,執行以下命令在資料夾中建立一個新的虛擬環境:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
python3 -m venv env
source env/bin/activate
python3 -m venv env source env/bin/activate
python3 -m venv env
source env/bin/activate

接下來,執行以下命令安裝 Flask、PyTesseract、Gunicorn 和 Pillow:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pip3 install pytesseract flask pillow gunicorn
pip3 install pytesseract flask pillow gunicorn
pip3 install pytesseract flask pillow gunicorn

安裝完成後,您需要在主機上安裝 Tesseract OCR 引擎。Tesseract 的安裝說明因主機作業系統而異。你可以在這裡找到相應的說明。

例如,在 MacOS 上,可以使用 Homebrew 執行以下命令安裝 Tesseract:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
brew install tesseract
brew install tesseract
brew install tesseract

一旦完成,PyTesseract 包裝器就能與 OCR 引擎通訊並處理 OCR 請求。

注:這僅在開發環境中執行。當您將應用程式部署到 Kinsta 等遠端託管平臺時,您需要再次執行此操作(儘管託管平臺要求的方式不同–您稍後會明白)。

現在,您可以編寫 Flask 應用程式了。新建一個名為 ocrapi 的目錄,並在該目錄下新建一個名為 main.py 的檔案。儲存以下內容:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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)
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)
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 檔案,並儲存以下內容:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from ocrapi.main import app as application
if __name__ == "__main__":
application.run()
from ocrapi.main import app as application if __name__ == "__main__": application.run()
from ocrapi.main import app as application
if __name__ == "__main__":
application.run()

現在,您可以使用以下命令執行應用程式:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
gunicorn ocrapi.wsgi
gunicorn ocrapi.wsgi
gunicorn ocrapi.wsgi

您的基本 OCR API 已準備就緒,是時候進行測試了!

本地測試 OCR API

您可以使用內建的 cURL CLI 向您的 API 傳送請求,也可以改用 Postman 等詳細的 API 測試工具。要測試 API,你需要下載一個包含一些文字的示例圖片。你可以使用這張簡單的圖片,也可以暫時使用這張潦草的圖片

將這兩種圖片下載到專案目錄中,並根據你選擇的圖片給它起一個簡單的名字,如 simple-image.pngscribbled-image.png

接下來,開啟終端並導航到專案目錄。執行以下命令測試 API:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -X POST -F “image=@scribbled-image.png” localhost:5000/ocr
curl -X POST -F “image=@scribbled-image.png” localhost:5000/ocr
curl -X POST -F “image=@scribbled-image.png” localhost:5000/ocr

這將向您的 OCR API 傳送請求,並返回類似的響應:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
"status": "success",
"text": "This looks like it was written in a hucry\n\n"
}
{ "status": "success", "text": "This looks like it was written in a hucry\n\n" }
{
"status": "success",
"text": "This looks like it was written in a hucry\n\n"
}

這證明您的 OCR API 設定正確。您也可以嘗試使用簡單的圖片,下面是響應的樣子:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
"status": "success",
"text": "This looks like it was written with a steady hand\n\n"
}
{ "status": "success", "text": "This looks like it was written with a steady hand\n\n" }
{
"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 檔案,內容如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# nixpacks.toml
providers = ["python"]
[phases.setup]
nixPkgs = ["...", "tesseract"]
[phases.build]
cmds = ["echo building!", "pip install -r requirements.txt", "..."]
[start]
cmd = "gunicorn ocrapi.wsgi"
# nixpacks.toml providers = ["python"] [phases.setup] nixPkgs = ["...", "tesseract"] [phases.build] cmds = ["echo building!", "pip install -r requirements.txt", "..."] [start] cmd = "gunicorn ocrapi.wsgi"
# nixpacks.toml
providers = ["python"]
[phases.setup]
nixPkgs = ["...", "tesseract"]
[phases.build]
cmds = ["echo building!", "pip install -r requirements.txt", "..."]
[start]
cmd = "gunicorn ocrapi.wsgi"

這將指示構建平臺

  1. 使用 Python 執行時構建和執行應用程式
  2. 在應用程式的容器中設定 Tesseract 軟體包。
  3. 使用 gunicorn 啟動應用程式。

此外,執行以下命令生成 requirements.txt 檔案,以便應用平臺在構建過程中安裝所需的 Python 軟體包:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pip3 freeze > requirements.txt
pip3 freeze > requirements.txt
pip3 freeze > requirements.txt

Git 倉庫準備就緒後,請按照以下步驟將 OCR API 部署到伺服器(以 Kinsta 為例):

  1. 登入或建立賬戶,檢視 MyKinsta 面板。
  2. 使用 Git 提供商授權 Kinsta。
  3. 在左側邊欄單擊 Applications,然後單擊 Add Application
  4. 選擇要部署的版本庫和分支。
  5. 從 35 個選項列表中選擇一個可用的資料中心位置。Kinsta 會通過 Nixpack 檔案自動檢測應用程式的構建設定,因此請將開始命令欄位留空。
  6. 選擇應用程式資源,如 RAM 和磁碟空間。
  7. 單擊 Add Application

部署完成後,複製已部署應用程式的連結,並在 CLI 上執行以下命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -x POST -F “image=@simple-image.png” <your-deployed-app-link>/ocr
curl -x POST -F “image=@simple-image.png” <your-deployed-app-link>/ocr
curl -x POST -F “image=@simple-image.png” <your-deployed-app-link>/ocr

返回的響應應與本地收到的響應相同:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{"status":"success","text":"This looks like it was written with a steady hand\n\n"}
{"status":"success","text":"This looks like it was written with a steady hand\n\n"}
{"status":"success","text":"This looks like it was written with a steady hand\n\n"}

您還可以使用 Postman 測試 API。

在 Postman 中試用應用程式

在 Postman 中試用應用程式

至此,基本 OCR API 開發完成。您可以訪問 GitHub 上該專案的完整程式碼

小結

現在,您已經擁有了一個可執行的自託管 OCR API,您可以根據自己的喜好對其進行定製!該 API 可以從影象中提取文字,為資料提取、文件數字化和其他應用提供了寶貴的工具。

在您繼續開發和完善 OCR API 的過程中,可以考慮探索一些高階功能,如多語言支援、影象預處理技術,以及與雲端儲存服務整合以儲存和訪問影象。

評論留言