Files
rpa_vision_v3/docs/BENCH_OCR_PPOCRV5_2026-07-02.md
Dom fd9efdbbf5 docs(bench): PP-OCRv5 vs docTR vs EasyOCR CPU — PP-OCRv5 BLOCKED, docTR reste roi
Bench candidat PP-OCRv5 (veille OCR 02/07) : CPU BLOCKED (bug upstream
paddlepaddle 3.3.1 PIR/OneDNN, non contournable). docTR CPU = meilleur
rapport qualité/latence (0.7s, 10/11, word-level bboxes). PaddleOCR venv =
confirmé ORPHAN. Bench GPU = action séparée si on veut ré-évaluer PP-OCRv5.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 18:45:36 +02:00

171 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Benchmark OCR PP-OCRv5 CPU — 02/07/2026
> **Label**: baseline CPU, non verdict GPU
> **Machine**: Ryzen 9 9950X 32 threads, 123GB RAM, RTX 5070 12GB VRAM, CUDA driver 580.159.03/13.0
> **Image**: `shot_0172_full.png` (2560×1600, 721K, RGB) — capture écran Windows Léa
> **PaddleOCR**: 3.4.0, paddlepaddle 3.3.1 CPU-only (non compilé CUDA)
---
## 1. Résultats synthèse
| Engine | Cold (s) | Warm (s) | Detections | Mem init (MB) | Mem peak (MB) | Statut |
|--------|----------|----------|------------|---------------|---------------|--------|
| **docTR CPU** | 0.776 | 0.717 | 139 | 263.2 | 263.2 | ✅ OK |
| **EasyOCR CPU** | 4.878 | 4.856 | 54 | 0.6 | 156.9 | ✅ OK |
| **PP-OCRv5 CPU** | — | — | — | — | — | ❌ BLOCKED |
---
## 2. PP-OCRv5 CPU — VERDICT: BLOCKED
### Crash récurrent
Toute inference PaddleOCR sur paddlepaddle 3.3.1 CPU-only crash systématiquement :
```
(Unimplemented) ConvertPirAttribute2RuntimeAttribute not support
[pir::ArrayAttribute<pir::DoubleAttribute>]
(at /paddle/paddle/fluid/framework/new_executor/instruction/onednn/onednn_instruction.cc:116)
```
### Root cause
Bug dans le **PIR new executor** de paddlepaddle 3.3.1 CPU-only : l'instruction OneDNN
tente de convertir un `ArrayAttribute<DoubleAttribute>` en runtime attribute, opération
non implémentée. Ce bug est :
- **NON model-spécifique** : v3_mobile_det, v4_mobile_det, v5_mobile_det crashent tous
- **NON version-spécifique** : PP-OCRv3, v4 (fr absent), v5 crashent tous
- **NON API-spécifique** : `ocr()` (deprecated) et `predict()` crashent identiquement
- **NON contournable** par flags : `FLAGS_use_mkldnn=0`, `FLAGS_use_pir_api=0` n'ont aucun effet
### 7 approches testées — TOUTES FAILED
| # | Approche | Résultat |
|---|----------|----------|
| 1 | `FLAGS_use_mkldnn=0` via `os.environ` | Same crash |
| 2 | `det='PP-OCRv5_mobile_det'` param | ValueError "Unknown argument: det" (PaddleOCR 3.4.0 rejette ce param) |
| 3 | `FLAGS_use_mkldnn=0` shell-level avant Python | Same crash |
| 4 | `text_detection_model_name='PP-OCRv5_mobile_det'` | mobile_det DL OK → inference crash (same OneDNN) |
| 5 | `ocr_version='PP-OCRv4', lang='fr'` | ValueError "No models available for language 'fr' and PP-OCRv4" |
| 6 | PP-OCRv3 + `ocr(img, cls=True)` legacy | DeprecationWarning → TypeError sur `cls` kwarg → predict() → same crash |
| 7 | `FLAGS_use_pir_api=0` shell + os level | Same crash |
### PaddleOCR 3.4.0 __init__ params inspectés
28 paramètres au total. **Pas** de `enable_mkldnn`, `use_pir`, ou `det`. Param de détection
remplacé par `text_detection_model_name`. API v3.4.0 : `use_angle_cls` deprecated
`use_textline_orientation=True`, `show_log` supprimé (ValueError si utilisé).
### Incompatibilité downgrade
paddlepaddle 2.6.2 existe mais **incompatible** avec PaddleOCR 3.4.0 (requires ≥3.x).
PaddleOCR 2.x serait compatible avec paddlepaddle 2.6.2 mais API/outils complètement
différents — non évalué dans ce bench.
### Conclusion
**PP-OCRv5 CPU = BLOCKED**. Bug upstream dans paddlepaddle CPU-only binary, aucune
workaround applicative possible. Seules alternatives :
1. **paddlepaddle GPU binary** (RTX 5070 + CUDA 13.0 compatible) → bench GPU séparé
2. **Fix upstream** paddlepaddle (PR PIR executor OneDNN)
3. **Downgrade PaddleOCR 2.x + paddlepaddle 2.6.2** (API legacy, non testé)
---
## 3. docTR CPU — Résultats détaillés
- **Cold latency**: 0.776s (incl. model loading)
- **Warm latency**: 0.717s
- **Detections**: 139 (mot-level, agressif — fragmente "Dites", "Sortie", "de", "veille")
- **Mémoire**: 263.2MB stable (init = peak)
- **Qualité**: haute sur mots courts, fragmente les phrases longues
- **Confiance**: variable (0.26→0.99), nombreux tokens <0.7
### Observations docTR
- Word-level detection = 139 items → beaucoup de fragments 1-2 lettres
- Bonne qualité sur labels UI ("Mode", "veille", "RPA", "VWB", "Python", "proxmox")
- Fragmente les phrases ("Sortie de veille de l'accès vocal ou appuyez..." → 12 mots isolés)
- IP correctement détecté : "192.168.1.40:3002" (conf 0.90)
- Faux positifs : "0", "E03", "E", "€" isolés avec conf <0.4
---
## 4. EasyOCR CPU — Résultats détaillés
- **Cold latency**: 4.878s (heavy model loading)
- **Warm latency**: 4.856s
- **Detections**: 54 (line-level, plus conservatif)
- **Mémoire**: 0.6MB init → 156.9MB peak
- **Qualité**: bonne sur lignes complètes, plus robuste sur phrases
### Observations EasyOCR
- Line-level detection = 54 items → phrases plus cohérentes
- Cold start très lent (5x docTR) mais warm identique
- Meilleur sur textes longs, moins de fragmentation
- Peak mémoire plus élevé que docTR (156.9 vs 263.2 MB init docTR)
---
## 5. Comparaison avec baselines Mai 2026
> Bench Mai 2026 — image `landing_wide.png`, critère 11 items de référence
| Engine | Score Mai (11 ref) | Score Juillet (detections) | Latency warm | Commentaire |
|--------|-------------------|---------------------------|--------------|-------------|
| Tesseract | **11/11** | — (non re-benché) | — | Référence May, non retesté |
| EasyOCR brut | 8/11 | 54 det (shot_0172) | 4.856s | Fragmente moins, score < Tesseract |
| EasyOCR preproc | 9/11 | — | — | +1 vs brut May |
| docTR CPU | 10/11 | 139 det (shot_0172) | 0.717s | **Meilleur rapport qualité/latence** |
| PP-OCRv5 CPU | non testé May | BLOCKED | — | Bug PIR/OneDNN, 0 inference possible |
### Hierarchie CPU confirmée
```
docTR CPU (0.7s, 10/11) > EasyOCR preproc (4.9s, 9/11) > EasyOCR brut (4.9s, 8/11) > PP-OCRv5 CPU (BLOCKED)
```
docTR reste le **meilleur moteur OCR CPU** pour Léa en termes de latence + qualité.
Tesseract reste le plus précis (11/11) mais sans bounding boxes exploitables.
---
## 6. Recommandations
1. **docTR = moteur OCR CPU de production** — latence <1s, qualité 10/11, word-level bboxes
2. **PP-OCRv5 GPU bench = action séparée** — requiere paddlepaddle GPU binary sur RTX 5070
3. **PaddleOCR 3.4.0 = ORPHAN** — 0 imports dans le projet, pas dans requirements.txt,
CPU-only install sans CUDA → retirer du venv si cleanup D2 (C-MORT)
4. **Ne pas dépendre de PaddleOCR** pour POC T1 — docTR suffisant
5. **Bug report upstream** — paddlepaddle PIR executor OneDNN, repro: any model + CPU binary
---
## 7. Annexes
### A. Script bench
`scripts/bench_ppocrv5_cpu.py` — compare PP-OCRv5, docTR, EasyOCR sur shot_0172_full.png.
PP-OCRv5 crash → résultats JSON avec error field.
### B. Résultats JSON
`scripts/bench_ppocrv5_results.json` — 4522 lignes, contient tous texts + bboxes pour
docTR (139 items) et EasyOCR (54 items). PP-OCRv5 = error only.
### C. Machine specs
- CPU: Ryzen 9 9950X, 32 threads
- RAM: 123 GB
- GPU: RTX 5070 12GB VRAM (non utilisé — bench CPU)
- CUDA driver: 580.159.03 / runtime 13.0
- OS: Linux (Ubuntu)
- paddlepaddle: 3.3.1 CPU-only (pip install)
- PaddleOCR: 3.4.0
- docTR: (version installée dans venv)
- EasyOCR: (version installée dans venv)