3.8 KiB
Aggiornamento 2026-05-18 14:18
Obiettivo
Avviare la pista PaddleOCR come alternativa OCR tarabile sui crop etichetta, lasciando per ora da parte YOLO caratteri e senza integrare nulla in flywms.
Decisione tecnica
Per PaddleOCR non usiamo le annotazioni bbox cifra-per-cifra.
Usiamo invece l'etichetta intera:
crop_etichetta.jpg<TAB>codice_completo
Questo e' piu' coerente con l'obiettivo demo: dato un crop dell'etichetta, ottenere direttamente il codice UDC.
Dataset creato
Creato script:
C:\devel\yolo-ocr\tools\prepare_paddleocr_dataset.py
Generata cartella:
C:\devel\yolo-ocr\paddleocr-recognizer
Dataset:
C:\devel\yolo-ocr\paddleocr-recognizer\dataset
Conteggi:
train: 475 immagini
val: 5 immagini
test: 2 immagini
Il train contiene varianti aumentate dell'intera etichetta. Validation e test restano crop originali.
File prodotti:
dataset\train_list.txt
dataset\val_list.txt
dataset\test_list.txt
digit_dict.txt
preprocessed_preview\
README.md
README_OPERATIVO.md
Preprocessing/augmentation
Lo script genera varianti controllate:
- upscale a altezza standard;
- contrasto/luminosita';
- CLAHE;
- sharpening;
- blur leggero;
- rumore;
- compressione JPEG;
- rotazione leggera.
Le preview dei preprocessing per validation/test sono in:
C:\devel\yolo-ocr\paddleocr-recognizer\preprocessed_preview
Baseline multi-pass
Creato script:
C:\devel\yolo-ocr\tools\paddleocr_multipass_eval.py
Scopo:
- provare piu' preprocessing sullo stesso crop;
- passare ogni variante a PaddleOCR;
- tenere solo le cifre;
- preferire codici della lunghezza attesa;
- salvare CSV e immagini varianti.
Blocco tecnico
PaddleOCR e' installato:
paddleocr 3.5.0
paddlex 3.5.2
paddlepaddle 3.3.1
paddlepaddle-gpu 3.3.1
Ma l'esecuzione fallisce prima dell'OCR:
OSError: [WinError 127] Impossibile trovare la procedura specificata.
Error loading C:\Python313\Lib\site-packages\paddle\..\nvidia\cudnn\bin\cudnn_cnn64_9.dll or one of its dependencies.
Ho provato ad aggiungere esplicitamente le cartelle nvidia\*\bin al loader DLL Windows nello script, ma non basta.
Il problema sembra nello stack Paddle GPU/CUDA/cuDNN globale, non nel dataset.
Ambiente isolato
Per non modificare lo stack globale, creato un virtualenv dedicato:
C:\devel\yolo-ocr\.venv-paddle-cpu
Installati nel virtualenv:
paddlepaddle==3.3.1
paddleocr==3.5.0
opencv-python-headless
In questo ambiente PaddleOCR parte correttamente e usa i modelli gia' presenti in cache:
PP-OCRv5_server_det
en_PP-OCRv5_mobile_rec
Correzione parser
L'API PaddleOCR 3.5 restituisce i risultati in chiavi:
rec_texts
rec_scores
Lo script paddleocr_multipass_eval.py e' stato corretto per leggere questo formato.
Baseline OCR PaddleOCR
Validation:
images=5
ok=5
accuracy=1.0000
Test:
images=2
ok=2
accuracy=1.0000
File risultati:
C:\devel\yolo-ocr\paddleocr-recognizer\outputs\multipass_val_venv_fixed\multipass_results.csv
C:\devel\yolo-ocr\paddleocr-recognizer\outputs\multipass_test_venv_fixed\multipass_results.csv
Esempi:
182430 -> 182430
182242 -> 182242
182519 -> 182519
182511 -> 182511
187184 -> 187184
182368 -> 182368
Conclusione
La pista PaddleOCR e' molto piu' promettente del previsto per il demo.
Il dataset e gli script sono pronti, e la baseline standard con preprocessing multi-pass legge correttamente tutti i crop disponibili in validation/test.
Il campione e' pero' molto piccolo, quindi non e' ancora una prova di robustezza.
Per il prossimo passo non farei subito fine-tuning: integrerei prima nel server WMS una modalita' OCR sperimentale basata su PaddleOCR multi-pass, con fallback UDC_NON_DETERMINATO quando non c'e' un candidato numerico credibile.