PaddleOCR 是百度开源的工业级 OCR 工具,而Slim 轻量化版本更适合资源有限的环境(如 CPU 服务器、个人 PC)。本文将带你用 Docker-Compose 快速部署 PaddleOCR v4 Slim,并实现图片文字识别接口调用,全程避坑
一、环境准备
系统:Windows/Linux/macOS(需安装 Docker Desktop,开启 WSL2)
工具:Docker、Docker-Compose
资源:2 核 CPU+2GB 内存(AI395 等轻量硬件完全适配)
二、部署目录结构
先在本地创建如下目录(后续所有文件均放在对应位置):
bash
OCR_Deploy/ # 根目录
├─ docker-compose-ai.yml # Compose编排文件
└─ PaddleOCR_Slim/ # 服务子目录
├─ logs/ # 日志目录(空文件夹)
├─ uploads/ # 图片上传目录(空文件夹)
├─ Dockerfile # 镜像构建文件
├─ simhei.ttf # 字体文件
└─ ocr_service.py # OCR API服务脚本
三、核心配置文件编写
- Dockerfile(镜像构建)
bash
# 基础镜像:Python3.10轻量版
FROM python:3.10-slim
WORKDIR /app
# 环境变量:禁用GPU、关闭冗余日志
ENV CUDA_VISIBLE_DEVICES=-1
ENV GLOG_minloglevel=2
ENV PYTHONIOENCODING=utf-8
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
libglib2.0-0 libgl1-mesa-glx libopencv-dev fontconfig curl \
&& rm -rf /var/lib/apt/lists/*
# 创建挂载目录并授权
RUN mkdir -p /app/logs /app/uploads
RUN chmod 777 /app/logs /app/uploads
# 安装Python依赖(含PaddleOCR+接口服务)
RUN pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install \
paddlepaddle==2.6.2 \
paddleocr==2.8.0 \
fastapi==0.104.1 \
uvicorn==0.24.0 \
pillow==10.1.0 \
opencv-python==4.8.1.78 \
python-multipart==0.0.6 \
requests==2.31.0 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制服务脚本
COPY ocr_service.py /app/
EXPOSE 8000
# 启动服务
CMD ["uvicorn", "ocr_service:app", "--host", "0.0.0.0", "--port", "8000"]
- docker-compose-ai.yml(编排部署)
yaml
# 项目名称为env
name: ai
# 自定义网络:所有服务互通
networks:
app-network:
driver: bridge
# 数据卷:持久化所有服务数据
volumes:
services:
paddleocr-slim:
# 关键:指定Dockerfile所在的子目录(即PaddleOCR_Slim)
build: ./PaddleOCR_Slim
image: paddleocr-slim:v4
container_name: paddleocr-slim
ports:
- "8000:8000" # 主机8000端口映射到容器8000端口
volumes:
# 挂载日志目录:PaddleOCR_Slim/logs → 容器/app/logs
- ./PaddleOCR_Slim/logs:/app/logs
# 挂载上传目录:PaddleOCR_Slim/uploads → 容器/app/uploads
- ./PaddleOCR_Slim/uploads:/app/uploads
environment:
- TZ=Asia/Shanghai # 时区配置,避免日志时间错乱
- CUDA_VISIBLE_DEVICES=-1 # 强制CPU运行,适配AI395
- GLOG_minloglevel=2 # 关闭冗余日志
restart: always # 容器异常自动重启
deploy:
resources:
limits:
cpus: '4' # 限制CPU核心数(适配AI395)
memory: 2G # 限制内存
reservations:
cpus: '1' # 预留CPU核心
memory: 1G # 预留内存
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
logging:
driver: "json-file"
options:
max-size: "100m" # 单日志文件最大100MB
max-file: "3" # 最多保留3个日志文件
- ocr_service.py(API 服务)
python
from fastapi import FastAPI, UploadFile, File, Query
from paddleocr import PaddleOCR
import io
from PIL import Image
import os
from datetime import datetime
app = FastAPI(title="PaddleOCR v4 Slim API")
# 初始化Slim模型(自动下载)
ocr = PaddleOCR(
use_angle_cls=True,
lang='ch',
use_gpu=False,
det_db_score_mode='fast'
)
os.makedirs("/app/logs", exist_ok=True)
def write_log(content: str, log_type: str = "info"):
log_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(f"/app/logs/ocr_{log_type}.log", "a", encoding="utf-8") as f:
f.write(f"[{log_time}] {content}\n")
# 健康检查
@app.get("/health")
async def health_check():
write_log("健康检查成功")
return {"status": "healthy", "service": "PaddleOCR v4 Slim"}
# 上传图片识别
@app.post("/ocr/recognize")
async def recognize_image(file: UploadFile = File(...)):
try:
image = Image.open(io.BytesIO(await file.read())).convert('RGB')
result = ocr.ocr(image, cls=True)
total_text = "\n".join([line[1][0] for line in result[0]])
write_log(f"识别成功:{file.filename}")
return {
"code": 200,
"msg": "成功",
"data": {"total_text": total_text, "detail": result[0]}
}
except Exception as e:
write_log(f"识别失败:{str(e)}", "error")
return {"code": 500, "msg": str(e), "data": None}
四、一键部署与验证
在OCR_Deploy根目录执行:
powershell
docker-compose -f docker-compose-ai.yml up -d --build
- 验证服务
健康检查:访问http://localhost:8000/health,返回{"status":"healthy"}即成功;
查看日志:
powershell
docker-compose -f docker-compose-ai.yml logs -f