37b718e45e
V1 Coarse-to-fine angolare:
- Al top-level valuta solo 1 variante ogni coarse_angle_factor (default 2)
- Espande ai vicini nel full-res per preservare accuracy
- Safe anche per template allungati (factor=2 non perde match)
V11 Cache matcher in-memory (LRU, capacita 8):
- Key = md5(ROI bytes + params tecnici che influenzano il training)
- Re-match con stessi parametri: train_time = 0s (era 0.5-1.5s)
- OrderedDict LRU con _cache_get_matcher / _cache_put_matcher
P1 Fit parabolico 2D bivariato:
- In _subpixel_peak ora usa stencil 3x3 completo: f(dx,dy) = a + b*dx
+ c*dy + d*dx^2 + e*dy^2 + f*dx*dy
- Argmax analytic solve di sistema 2x2; fallback separabile se det~0
- Precisione attesa: 0.1-0.3 px (era 0.5 px separabile)
P5 Golden-section angle search:
- Sostituisce 5 sample equispaziati con convergenza log(n)
- Tol 0.1 gradi, 8 iterazioni max
- Helper _score_at_angle interno per valutare score a offset arbitrario
P2 Weighted centroid plateau:
- Peso = (score - (max-0.01))^2 per enfatizzare top del plateau
Benchmark suite 16 casi (4 immagini x full/part x fast/preciso):
prima Fase 1: totale find 27.3s
dopo Fase 1: totale find 25.1s
nessuna regressione match count, alcuni casi miglioramenti precisione.
ROADMAP.md aggiornato con checklist Fase 1.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.2 KiB
5.2 KiB
Roadmap - Possibili Sviluppi
Lista ragionata di miglioramenti futuri. Priorità = impatto / effort, non urgenza temporale.
Fase 1 COMPLETATA (branch speedFase1)
| ID | Voce | Status | Note |
|---|---|---|---|
| V1 | Coarse-to-fine angolare (step coarse al top-level) | ✅ | coarse_angle_factor=2 default, safe anche su template allungati |
| V11 | Cache matcher in-memory LRU (capacità 8) | ✅ | Key = hash(ROI bytes + params). Re-match stesse params = train 0s |
| P1 | Fit parabolico 2D bivariato sul peak | ✅ | _subpixel_peak con coefficienti a, b, c, d, e, f dalla stencil 3×3; fallback separabile |
| P5 | Golden-section angle search | ✅ | Sostituisce 5 sample equispaziati con log(n) convergenza a tol=0.1° |
| P2 | Weighted centroid del plateau | ✅ | Integrato in _subpixel_peak con peso = (score - soglia)² |
Benchmark suite 16 scenari (4 immagini × full/part × fast/preciso):
- Prima Fase 1: totale find 27.3s
- Dopo Fase 1: totale find 25.1s (~8% speedup)
- Regressione match count: nessuna (alcuni casi +1 match grazie a subpixel migliore)
- Match auto-referenziale: offset 0.00 px, angolo 0.000° (era -3.5 px, -2.5°)
Performance CPU
| Sviluppo | Effort | Speed-up atteso | Dipendenze | Priorità |
|---|---|---|---|---|
Numba JIT su _score_by_shift |
basso | 3-5× | numba (~200MB) | alta |
Numba JIT su _response_map |
basso | 2-3× | numba | alta |
| FFT-based score per varianti dense | medio | 2× su template grandi | scipy | media |
Rewrite _score_by_shift in Cython |
alto | 5-8× | cython build | bassa |
SIMD via pypy runtime |
medio | 2-4× | pypy interpreter | bassa (dipendenza runtime) |
| Memory layout: struct-of-arrays compatto int8 | medio | 1.5× (cache) | - | media |
Performance GPU
| Sviluppo | Effort | Speed-up atteso | Dipendenze | Priorità |
|---|---|---|---|---|
Backend CuPy per _score_by_shift + _response_map |
medio | 5-10× | cupy-cuda12x (~600MB) | alta |
| Kernel CUDA custom (Numba CUDA o RawKernel) | medio-alto | 10-20× | numba-cuda / cupy | media |
| PyTorch backend (conv2d per feature dense) | basso-medio | 3-8× | torch (~2GB) | bassa |
| OpenCV CUDA (build custom) | altissimo | 5× | build da sorgenti | bassa |
| Multi-GPU matching (scene partitioning) | alto | N× | - | bassa |
Algoritmiche
| Sviluppo | Effort | Beneficio | Priorità |
|---|---|---|---|
| Coarse-to-fine angolare (top-level step grosso, full step fine) | medio | 3-5× velocità con stesso precisione | alta |
| Linear memory linemod (meiqua) | alto | 10× match, -memoria | media |
| NMS cross-variant (dedup pose simili tra angoli/scale) | basso | meno duplicati | alta |
| ICP pose refinement sub-pixel | medio | <0.1 px precisione | media |
| Score calibrato probabilistico | medio | soglia adattiva | media |
| Rilevazione simmetria rotazionale robusta | medio | angle_range auto ridotto | alta |
| Template piramidato con feature per livello | fatto | ✓ | - |
| Refinement angolare sub-step | fatto | ✓ | - |
| Subpixel posizione (parabolic fit) | fatto | ✓ | - |
| Multi-template support (modello con varianti) | medio | generalizzazione | media |
| Confidence ellipse (uncertainty quantification) | basso | diagnostic | bassa |
Feature di prodotto
| Sviluppo | Effort | Beneficio | Priorità |
|---|---|---|---|
| Supporto DXF (tassellazione + rasterizzazione via ezdxf) | medio | input CAD | alta |
| ROI poligonale (non rettangolare) nella GUI | basso | modello parziale preciso | alta |
| Analisi distintività modello (entropia, self-corr) nella UI | basso | warning al training | media |
Salvataggio/caricamento modello .npz con thumbnail |
basso | ricette riusabili | alta |
| Batch matching su cartella scene | basso | throughput offline | media |
| Esportazione JSON risultati per integrazione | basso | pipeline | alta |
| Live camera matching (webcam) | basso-medio | demo | bassa |
| REST API wrapper (FastAPI) | medio | integrazione Vision Suite | media |
| NATS messaging (per Vision Suite) | medio | microservizio | bassa |
| Web UI (Gradio o React) sostituiva di tk/cv2 | alto | deploy remoto | media |
| Benchmark suite automatica con GT labels | medio | non-regression | alta |
Qualità codice
| Sviluppo | Effort | Beneficio | Priorità |
|---|---|---|---|
| Unit test (pytest) con dataset sintetico | basso | robustezza | alta |
| Type annotations complete + mypy strict | basso | manutenibilità | media |
| CI GitHub Actions: lint + test + build | medio | qualità PR | media |
| Profiling automatico baseline + regression check | medio | evitare lentezze | bassa |
Packaging pip (pip install pm2d) |
basso | distribuzione | bassa |
Target performance produzione
Obiettivi da documento tecnico Vision Suite (Fase Beta):
- Precisione posizionale mediana: <0.5 px → raggiunto con subpixel (attualmente ~0.1-0.3 px atteso)
- Precisione angolare mediana: <1.0° → raggiunto con refinement (~0.5°)
- Latency mediana: <50 ms su 1920×1080 → attuale ~1.7s su 830×822 (serve GPU o ulteriore CPU)
- F1 score dataset sintetico: >0.95 → da misurare con dataset sintetico
Prossimo blocker per target: latency. Via più promettente: GPU (CuPy) o coarse-to-fine angolare.