From 28ee147cc7d9b11511bb390914363a268076a307 Mon Sep 17 00:00:00 2001 From: Siddharth Kumar Sah Date: Sun, 12 Apr 2026 18:38:40 +0800 Subject: [PATCH] feat(ocr): upgrade PaddleOCR to v3.x with PP-OCRv5 and VL model in Docker --- docker/Dockerfile | 7 ++++--- docker/download_models.py | 34 +++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 49b3f82d..91522f89 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -91,6 +91,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libimage-exiftool-perl \ python3 python3-pip python3-venv python3-dev \ tesseract-ocr tesseract-ocr-eng tesseract-ocr-deu tesseract-ocr-fra tesseract-ocr-spa \ + tesseract-ocr-chi-sim tesseract-ocr-jpn tesseract-ocr-kor \ build-essential \ libgl1 libglib2.0-0 \ libegl1 libwayland-egl1 libwayland-client0 libwayland-cursor0 \ @@ -120,13 +121,13 @@ RUN if [ "$TARGETARCH" = "amd64" ]; then \ /opt/venv/bin/pip install rembg==2.0.62 && \ /opt/venv/bin/pip install realesrgan==0.3.0 \ --extra-index-url https://download.pytorch.org/whl/cu126 && \ - /opt/venv/bin/pip install paddlepaddle-gpu==3.0.0 \ + /opt/venv/bin/pip install paddlepaddle-gpu>=3.2.1 \ --extra-index-url https://www.paddlepaddle.org.cn/packages/stable/cu126/ && \ - /opt/venv/bin/pip install paddleocr==2.9.1 \ + /opt/venv/bin/pip install "paddleocr[doc-parser]>=3.4.0,<3.5.0" \ ; else \ /opt/venv/bin/pip install "rembg[cpu]==2.0.62" && \ /opt/venv/bin/pip install realesrgan==0.3.0 && \ - /opt/venv/bin/pip install paddlepaddle==3.0.0 paddleocr==2.9.1 \ + /opt/venv/bin/pip install paddlepaddle>=3.2.1 "paddleocr[doc-parser]>=3.4.0,<3.5.0" \ ; fi # mediapipe 0.10.21 only has amd64 wheels; arm64 maxes out at 0.10.18 diff --git a/docker/download_models.py b/docker/download_models.py index b3da74e9..1549c4aa 100644 --- a/docker/download_models.py +++ b/docker/download_models.py @@ -91,24 +91,43 @@ def download_realesrgan_model(): def download_paddleocr_models(): - """Pre-download PaddleOCR models for all supported languages.""" - print("=== Downloading PaddleOCR models ===") + """Pre-download PaddleOCR PP-OCRv5 models for all supported languages.""" + print("=== Downloading PaddleOCR PP-OCRv5 models ===") try: from paddleocr import PaddleOCR except ImportError as e: if "libcuda" in str(e): - # paddlepaddle-gpu can't import without CUDA driver at build time. - # Models will be downloaded on first use at runtime instead. print(f" Skipping PaddleOCR model pre-download (no CUDA driver at build time)") print(f" Models will download on first use at runtime.\n") return raise for lang in PADDLEOCR_LANGUAGES: - print(f" Downloading models for lang={lang}...") - PaddleOCR(lang=lang, use_gpu=False, show_log=False) + print(f" Downloading PP-OCRv5 models for lang={lang}...") + PaddleOCR(lang=lang, use_gpu=False, show_log=False, ocr_version="PP-OCRv5") print(f" {lang} ready") - print(f"All {len(PADDLEOCR_LANGUAGES)} PaddleOCR languages downloaded.\n") + print(f"All {len(PADDLEOCR_LANGUAGES)} PaddleOCR PP-OCRv5 languages downloaded.\n") + + +def download_paddleocr_vl_model(): + """Pre-download PaddleOCR-VL 1.5 model weights.""" + print("=== Downloading PaddleOCR-VL 1.5 model ===") + try: + from paddleocr import PaddleOCRVL + except ImportError as e: + if "libcuda" in str(e): + print(f" Skipping PaddleOCR-VL pre-download (no CUDA driver at build time)") + print(f" Model will download on first use at runtime.\n") + return + raise + + print(" Downloading PaddleOCR-VL 1.5 weights (~1.93 GB)...") + try: + PaddleOCRVL(device="cpu") + print(" PaddleOCR-VL 1.5 ready\n") + except Exception as e: + print(f" Warning: PaddleOCR-VL pre-download failed: {e}") + print(f" Model will download on first use at runtime.\n") def verify_mediapipe(): @@ -164,6 +183,7 @@ def main(): download_rembg_models() download_realesrgan_model() download_paddleocr_models() + download_paddleocr_vl_model() verify_mediapipe() smoke_test() print("All models downloaded and verified.")