【保姆级教程】PaddleOCR v4 Slim 基于 Docker-Compose 一键部署与使用

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服务脚本

三、核心配置文件编写

  1. 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"]
  1. 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个日志文件
  1. 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
  1. 验证服务
    健康检查:访问http://localhost:8000/health,返回{"status":"healthy"}即成功;
    查看日志:
powershell 复制代码
docker-compose -f docker-compose-ai.yml logs -f
相关推荐
MicrosoftReactor10 小时前
技术速递|利用 SLM 创建多智能体的 Podcast 解决方案
microsoft·ai·agent·slm
红桃Jk11 小时前
关于开发文档向 Markdown(Docs-as-Code)转型的可行性研究报告
ai·mermaid
云雾J视界11 小时前
AI+IoT双轮驱动:构建风电设备预测性维护数字孪生体的全栈技术实践
人工智能·物联网·ai·lstm·iot·scada·金风科技
越努力越幸运~11 小时前
AMD AI MAX +395迷你主机 架构1151安装 vllm部署大模型操作记录
ai·vllm·rocm·ai max+395
深念Y12 小时前
仿B站项目 前端 3 首页 整体结构
前端·ai·vue·agent·bilibili·首页
imbackneverdie12 小时前
研究生如何高效完成文献综述并提炼创新点?
人工智能·ai·语言模型·自然语言处理·aigc·ai写作
m0_7269659813 小时前
【闲聊】用coze和阿里云搭建agent区别
ai·agent
陈鋆13 小时前
LightRAG应用一:[LightRAG WebUI]
ai
数白13 小时前
Ai开发范式总结
ai·ai开发
不会用AI的老炮14 小时前
【AI coding 智能体设计系列-05】上下文治理:清空压缩摘要与预算控制
人工智能·ai·ai编程