pipeline in linea single thread
This commit is contained in:
166
aggiornamento-2026-05-17-20-57.md
Normal file
166
aggiornamento-2026-05-17-20-57.md
Normal file
@@ -0,0 +1,166 @@
|
||||
# Aggiornamento 2026-05-17 20:57
|
||||
|
||||
## Obiettivo
|
||||
|
||||
Provare la strada del dataset aumentato per il riconoscimento OCR numerico via YOLO, senza integrare ancora nulla in `flywms`.
|
||||
|
||||
## Dataset aumentato
|
||||
|
||||
Creato lo script:
|
||||
|
||||
```text
|
||||
C:\devel\yolo-ocr\tools\augment_yolo_dataset.py
|
||||
```
|
||||
|
||||
Generato il dataset:
|
||||
|
||||
```text
|
||||
C:\devel\yolo-ocr\dataset_augmented
|
||||
```
|
||||
|
||||
Composizione:
|
||||
|
||||
```text
|
||||
train: 247 immagini, 1482 bbox
|
||||
val: 5 immagini, 30 bbox
|
||||
test: 2 immagini, 12 bbox
|
||||
```
|
||||
|
||||
Nota importante: l'aumento dati e' applicato solo al train. Validation e test restano immagini originali, quindi sono utili per misurare se il modello generalizza.
|
||||
|
||||
Augmentation applicate:
|
||||
|
||||
- piccole rotazioni;
|
||||
- piccole traslazioni;
|
||||
- scala leggera;
|
||||
- contrasto/luminosita';
|
||||
- CLAHE;
|
||||
- sharpening;
|
||||
- blur leggero;
|
||||
- rumore;
|
||||
- compressione JPEG simulata.
|
||||
|
||||
## Training GPU
|
||||
|
||||
Addestramento eseguito sulla RTX 3050:
|
||||
|
||||
```powershell
|
||||
yolo detect train data=C:\devel\yolo-ocr\dataset_augmented\data.yaml model=yolov8n.pt epochs=120 imgsz=640 batch=16 workers=0 device=0 project=C:\devel\yolo-ocr\training_runs name=digits_yolov8n_aug_gpu patience=30 seed=42
|
||||
```
|
||||
|
||||
Il training e' terminato con early stopping:
|
||||
|
||||
```text
|
||||
Best epoch: 11
|
||||
Epoch completate: 41
|
||||
Durata: circa 0.098 ore
|
||||
```
|
||||
|
||||
Metriche YOLO finali su validation:
|
||||
|
||||
```text
|
||||
precision: 0.826
|
||||
recall: 0.873
|
||||
mAP50: 0.990
|
||||
mAP50-95: 0.745
|
||||
```
|
||||
|
||||
Velocita' indicativa:
|
||||
|
||||
```text
|
||||
preprocess: 0.6 ms
|
||||
inference: 7.7 ms
|
||||
postprocess: 4.1 ms
|
||||
```
|
||||
|
||||
## Artefatti
|
||||
|
||||
Peso PyTorch:
|
||||
|
||||
```text
|
||||
C:\devel\yolo-ocr\models\udc_digits_yolov8n_aug.pt
|
||||
```
|
||||
|
||||
Export ONNX:
|
||||
|
||||
```text
|
||||
C:\devel\yolo-ocr\models\udc_digits_yolov8n_aug.onnx
|
||||
```
|
||||
|
||||
Run originale:
|
||||
|
||||
```text
|
||||
C:\devel\yolo-ocr\training_runs\digits_yolov8n_aug_gpu
|
||||
```
|
||||
|
||||
## Valutazione codice intero
|
||||
|
||||
Con soglia standard:
|
||||
|
||||
```powershell
|
||||
python C:\devel\yolo-ocr\tools\evaluate_code_accuracy.py --model C:\devel\yolo-ocr\training_runs\digits_yolov8n_aug_gpu\weights\best.pt --dataset C:\devel\yolo-ocr\dataset_augmented --split test --device 0 --conf 0.25 --iou 0.50 --output C:\devel\yolo-ocr\outputs\code_eval_aug_test
|
||||
```
|
||||
|
||||
Risultato su test:
|
||||
|
||||
```text
|
||||
images=2
|
||||
code_ok=0
|
||||
code_accuracy=0.0000
|
||||
char_accuracy=0.3333
|
||||
```
|
||||
|
||||
Il problema era una cifra mancante nei due codici:
|
||||
|
||||
```text
|
||||
187184 -> 17184
|
||||
182368 -> 18268
|
||||
```
|
||||
|
||||
Abbassando la soglia a `conf=0.15`, sui 2 test il codice completo diventa corretto:
|
||||
|
||||
```text
|
||||
conf=0.15, iou=0.35..0.65
|
||||
code_accuracy=1.0000
|
||||
char_accuracy=1.0000
|
||||
```
|
||||
|
||||
Pero' sulla validation originale, sempre con `conf=0.15`, il risultato resta insufficiente:
|
||||
|
||||
```text
|
||||
images=5
|
||||
code_ok=1
|
||||
code_accuracy=0.2000
|
||||
char_accuracy=0.7812
|
||||
```
|
||||
|
||||
Esempi validation:
|
||||
|
||||
```text
|
||||
187184 -> 187184 OK
|
||||
182430 -> 18243601 NO
|
||||
182519 -> 182610 NO
|
||||
182511 -> 182611 NO
|
||||
182242 -> 18224 NO
|
||||
```
|
||||
|
||||
## Conclusione
|
||||
|
||||
La strada del dataset aumentato e' utile: le metriche YOLO sugli oggetti sono migliorate molto e la GPU funziona bene.
|
||||
|
||||
Pero' il problema reale non e' ancora risolto, perche' noi non dobbiamo solo rilevare cifre: dobbiamo ricostruire un codice numerico affidabile. Il modello ora e' sensibile alla soglia di confidenza e produce ancora cifre duplicate, mancanti o confuse.
|
||||
|
||||
Non conviene integrare questo OCR in `flywms` in questa forma.
|
||||
|
||||
## Prossimo passo tecnico
|
||||
|
||||
Prima di altro training, serve migliorare il post-processing del codice:
|
||||
|
||||
- soglia bassa controllata;
|
||||
- ordinamento sinistra-destra;
|
||||
- clustering/merge dei bbox vicini;
|
||||
- vincolo codice a 6 cifre;
|
||||
- gestione duplicati;
|
||||
- report per capire quali cifre sono davvero ambigue.
|
||||
|
||||
Solo dopo questa fase ha senso decidere se aumentare ancora il dataset o cambiare architettura.
|
||||
Reference in New Issue
Block a user