3.0 KiB
Aggiornamento 2026-05-18 14:58
Obiettivo
Integrare PaddleOCR nel server WMS demo, senza modificare la GUI e senza integrare ancora una interfaccia DearPyGUI.
Implementazione
Creato worker persistente:
C:\devel\flywms\flywms_paddleocr_worker.py
Il worker gira con il virtualenv isolato:
C:\devel\yolo-ocr\.venv-paddle-cpu\Scripts\python.exe
Il server WMS resta nel suo ambiente Python attuale e comunica col worker via stdin/stdout JSON. Questo evita il problema del Paddle GPU globale:
WinError 127 su cudnn_cnn64_9.dll
Server WMS
Aggiornato:
C:\devel\flywms\flywms_wms_server.py
Nuovo backend OCR:
--ocr-mode paddleocr
Backend disponibili:
paddleocr
easyocr
tesseract
fake
Il worker PaddleOCR resta caricato tra richieste successive, quindi non ricarica il modello a ogni snapshot.
Parametri INI
Aggiornato:
C:\devel\flywms\flywms_navigation.ini
Nuovi parametri:
wms_ocr_mode = paddleocr
wms_paddle_python = C:\devel\yolo-ocr\.venv-paddle-cpu\Scripts\python.exe
wms_paddle_worker_script = C:\devel\flywms\flywms_paddleocr_worker.py
wms_paddle_target_heights = 96
wms_paddle_variant_set = fast
wms_paddle_expected_digits = 6
wms_paddle_min_votes = 2
wms_paddle_min_confidence = 0.70
Aggiornati anche i timeout, perche' PaddleOCR CPU richiede piu' di 2 secondi:
remote_ack_timeout_sec = 10.0
wms_timeout_sec = 12.0
Logica OCR
La configurazione fast prova 3 varianti:
originale
CLAHE
CLAHE + sharpening
Il codice viene accettato solo se:
- e' numerico;
- ha 6 cifre;
- ha almeno 2 voti tra le varianti;
- supera la confidenza minima.
In caso contrario il server restituisce:
udc non determinato
Test eseguiti
Compilazione:
python -m py_compile flywms_wms_server.py flywms_paddleocr_worker.py
Test worker diretto:
input: snapshot_0019_track_123_label_payload_orig.jpg
output: 182368
votes: 3
backend: paddleocr
Test server locale senza GUI:
python C:\devel\flywms\flywms_wms_server.py --no-ui --port 8098 --received-dir C:\devel\flywms\wms_received_test --ocr-mode paddleocr --paddle-variant-set fast --fake-processing-sec 0
Richiesta 1:
ocr_text: 182368
ocr_backend: paddleocr
ocr_fallback_used: false
ocr_votes: 3
processing_ms: circa 8500 ms
Richiesta 2 con worker gia' caldo:
ocr_text: 187184
ocr_backend: paddleocr
ocr_fallback_used: false
ocr_votes: 3
processing_ms: circa 3200 ms
Nota prestazionale
Il primo snapshot paga il caricamento del worker PaddleOCR. Gli snapshot successivi sono piu' veloci ma restano nell'ordine di qualche secondo su CPU.
Per il demo va bene, ma il timeout del client deve restare piu' alto del vecchio valore da 2 secondi.
Prossimo passo
Avviare il server:
python flywms_wms_server.py
Poi avviare la navigazione:
python flywms_navigation.py --wms-enabled
Verificare nella finestra comandi che compaia il codice OCR restituito dal WMS.