如何用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 的过程中,可以考虑探索一些高级功能,如多语言支持、图像预处理技术,以及与云存储服务集成以存储和访问图像。

评论留言