怎么用 FastAPI和Tesseract 构建本地 OCR 服务器?

光学字符识别(OCR)技术能将图像中的文本转换为机器可读数据,在文档处理、信息提取等场景中应用广泛。虽然已有商业 OCR 解决方案,但使用 Python 的 FastAPI 框架构建自定义 OCR 服务器,可获得更高的灵活性、数据控制权和成本优势。
本文将指导你使用 FastAPI,构建一个高效的本地 OCR 服务器,实现图像上传与文本提取功能。
前提条件
- 基本的 Python 编程知识
- 了解 FastAPI 框架的基础概念
- 本地安装 Python 3.8 + 环境
技术栈选择
- FastAPI:高性能的现代 Python Web 框架,支持异步操作和自动 API 文档
- Pillow:Python 图像处理库,用于加载和预处理图像
- PyTesseract:Tesseract OCR 引擎的 Python 包装器,核心 OCR 处理工具
- Uvicorn:ASGI 服务器,用于运行 FastAPI 应用
构建步骤
1. 项目初始化
首先创建项目目录并设置虚拟环境:
# 创建项目文件夹mkdir fastapi-ocr-servercd fastapi-ocr-server# 创建并激活虚拟环境python -m venv venv# Windows激活方式venv\Scripts\activate# Mac/Linux激活方式source venv/bin/activate
2. 安装依赖包
安装所需的 Python 库:
pip install fastapi uvicorn pytesseract pillow python-multipart3. 安装 Tesseract OCR 引擎
PyTesseract 仅为包装器,需单独安装 Tesseract 引擎:
- Windows:从UB-Mannheim/tesseract下载安装包,记得勾选 "Add to PATH"
Mac:使用 Homebrew 安装 brew install tesseractLinux:使用包管理器 sudo apt install tesseract-ocr
4. 编写 FastAPI 应用代码
创建main.py文件,编写核心逻辑:
from fastapi import FastAPI, UploadFile, File, HTTPExceptionfrom fastapi.responses import JSONResponsefrom PIL import Imageimport pytesseractimport io# 初始化FastAPI应用app = FastAPI(title="OCR",description="OCR服务",version="1.0.0")@app.post("/ocr", summary="提取图像中的文本")async def ocr_process(image: UploadFile = File(..., description="待处理的图像文件(支持PNG、JPG等格式)")):try:# 验证文件类型if not image.content_type.startswith("image/"):raise HTTPException(status_code=400, detail="请上传有效的图像文件")# 读取图像数据contents = await image.read()image_data = Image.open(io.BytesIO(contents))# 执行OCR识别extracted_text = pytesseract.image_to_string(image_data)# 返回结果return JSONResponse({"status": "success","text": extracted_text.strip(),"filename": image.filename})except Exception as e:raise HTTPException(status_code=500, detail=f"处理失败: {str(e)}")@app.get("/", summary="服务健康检查")async def health_check():return {"status": "running", "message": "OCR服务正常运行中"}
5. 运行本地服务器
使用 Uvicorn 启动 FastAPI 应用:
uvicorn main:app --reload --host 0.0.0.0 --port 8000参数说明:
--reload:开发模式下自动重载(生产环境移除)--host 0.0.0.0:允许局域网内其他设备访问--port 8000:指定端口号
测试 OCR 服务
1. 使用自动生成的 API 文档
FastAPI 自动生成交互式文档,启动服务后可通过以下地址访问:
- Swagger UI:http://localhost:8000/docs
- ReDoc:http://localhost:8000/redoc
在 Swagger UI 中,可直接上传图像测试/ocr接口。
2. 使用 curl 命令测试
在终端执行以下命令(替换test-image.png为你的图像路径):
curl -X POST "http://localhost:8000/ocr" -F "image=@test-image.png"成功响应示例:
{"status": "success","text": "这是图像中提取的文本内容","filename": "test-image.png"}
3. 使用 Python 脚本测试
创建test_client.py:
import requestsurl = "http://localhost:8000/ocr"files = {"image": open("test-image.png", "rb")}response = requests.post(url, files=files)print(response.json())
运行脚本:python test_client.py
功能扩展建议
- 1.图像预处理:添加灰度转换、降噪、锐化等处理,提高识别准确率:
from PIL import ImageOps, ImageFilter# 预处理示例image_data = image_data.convert('L') # 转为灰度图image_data = image_data.filter(ImageFilter.SHARPEN) # 锐化
2.多语言支持:指定识别语言(需安装对应语言包):
# 识别中英文混合文本extracted_text = pytesseract.image_to_string(image_data, lang='chi_sim+eng')
- 3.批量处理:支持多文件上传接口
- 4.格式转换:添加 PDF 转图像功能,支持 PDF 文件的 OCR 识别
生产环境部署注意事项
- 1.移除--reload参数,使用生产模式启动:
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 42.考虑使用 Gunicorn 作为进程管理器:
pip install gunicorngunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
- 3.添加身份验证机制(如 API 密钥),防止未授权访问
- 4.限制文件大小和请求频率,防止滥用
总结
FastAPI 提供了更高的性能(支持异步操作)、自动生成的 API 文档和更严格的类型检查,非常适合构建高性能 OCR 服务。通过本文的步骤,你已成功搭建了一个基础的本地 OCR 服务器,可根据实际需求进一步扩展功能。
这个轻量级 OCR 服务可集成到各类应用中,如自动化办公系统、内容管理系统或移动应用后端,实现图像文本的快速提取与处理。
本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。



