# 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: ```text crop_etichetta.jpgcodice_completo ``` Questo e' piu' coerente con l'obiettivo demo: dato un crop dell'etichetta, ottenere direttamente il codice UDC. ## Dataset creato Creato script: ```text C:\devel\yolo-ocr\tools\prepare_paddleocr_dataset.py ``` Generata cartella: ```text C:\devel\yolo-ocr\paddleocr-recognizer ``` Dataset: ```text C:\devel\yolo-ocr\paddleocr-recognizer\dataset ``` Conteggi: ```text 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: ```text 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: ```text C:\devel\yolo-ocr\paddleocr-recognizer\preprocessed_preview ``` ## Baseline multi-pass Creato script: ```text 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: ```text paddleocr 3.5.0 paddlex 3.5.2 paddlepaddle 3.3.1 paddlepaddle-gpu 3.3.1 ``` Ma l'esecuzione fallisce prima dell'OCR: ```text 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: ```text C:\devel\yolo-ocr\.venv-paddle-cpu ``` Installati nel virtualenv: ```text 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: ```text PP-OCRv5_server_det en_PP-OCRv5_mobile_rec ``` ## Correzione parser L'API PaddleOCR 3.5 restituisce i risultati in chiavi: ```text rec_texts rec_scores ``` Lo script `paddleocr_multipass_eval.py` e' stato corretto per leggere questo formato. ## Baseline OCR PaddleOCR Validation: ```text images=5 ok=5 accuracy=1.0000 ``` Test: ```text images=2 ok=2 accuracy=1.0000 ``` File risultati: ```text 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: ```text 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.