长期以来,从图像中提取文本一直是软件工程中的一个热门问题。光学字符识别(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 的过程中,可以考虑探索一些高级功能,如多语言支持、图像预处理技术,以及与云存储服务集成以存储和访问图像。
评论留言