fix: pruning top adattivo a angle_step (precisione preciso era peggio)
Bug osservato: con precisione "veloce" (10 deg) il matching dava risultati migliori che con "preciso" (2 deg). Causa: con step fine ci sono molte varianti vicine, score top-level ravvicinati e: - top_thresh = min_score * 0.5 troppo aggressivo: scartava varianti valide che sarebbero state scelte al full-res - coarse_angle_factor=2 (skip 1 ogni 2): col fine vicini sono quasi identici, ma il pruning skippava la migliore Fix: quando angle_step <= 3 deg, automatic: - top_score_factor min 0.7 (vs default 0.5) - coarse_angle_factor = 1 (no skip varianti) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+15
-2
@@ -873,7 +873,20 @@ class LineShapeMatcher:
|
|||||||
)
|
)
|
||||||
if nms_radius is None:
|
if nms_radius is None:
|
||||||
nms_radius = max(8, min(self.template_size) // 2)
|
nms_radius = max(8, min(self.template_size) // 2)
|
||||||
top_thresh = min_score * self.top_score_factor
|
# Pruning adattivo allo step angolare: con step piccolo (<= 3 deg)
|
||||||
|
# ci sono molte varianti vicine, gli score top-level sono ravvicinati
|
||||||
|
# e top_thresh*0.5 e' troppo aggressivo: scarta varianti valide che
|
||||||
|
# sarebbero state riprese al full-res. Stessa cosa per
|
||||||
|
# coarse_angle_factor (skip 1 ogni 2): con step fine non e' utile.
|
||||||
|
# Risultato osservato: precisione "veloce" 10° dava risultati
|
||||||
|
# migliori di "preciso" 2° proprio perche evitava il pruning.
|
||||||
|
eff_step = self._effective_angle_step()
|
||||||
|
top_factor = self.top_score_factor
|
||||||
|
cf_eff = max(1, coarse_angle_factor)
|
||||||
|
if eff_step <= 3.0:
|
||||||
|
top_factor = max(top_factor, 0.7)
|
||||||
|
cf_eff = 1
|
||||||
|
top_thresh = min_score * top_factor
|
||||||
|
|
||||||
tw, th = self.template_size
|
tw, th = self.template_size
|
||||||
density_top = _jit_popcount(spread_top)
|
density_top = _jit_popcount(spread_top)
|
||||||
@@ -905,7 +918,7 @@ class LineShapeMatcher:
|
|||||||
|
|
||||||
coarse_idx_list: list[int] = [] # varianti da valutare al top
|
coarse_idx_list: list[int] = [] # varianti da valutare al top
|
||||||
neighbor_map: dict[int, list[int]] = {} # vi_coarse -> indici vicini
|
neighbor_map: dict[int, list[int]] = {} # vi_coarse -> indici vicini
|
||||||
cf = max(1, coarse_angle_factor)
|
cf = cf_eff
|
||||||
for scale_key, vi_list in variants_by_scale.items():
|
for scale_key, vi_list in variants_by_scale.items():
|
||||||
vi_sorted = sorted(vi_list, key=lambda i: self.variants[i].angle_deg)
|
vi_sorted = sorted(vi_list, key=lambda i: self.variants[i].angle_deg)
|
||||||
n = len(vi_sorted)
|
n = len(vi_sorted)
|
||||||
|
|||||||
Reference in New Issue
Block a user