Demo of target-analyzer, photo-based scoring of paper targets, from this case study. Synthetic targets and readings. On the held-out target, cv_blob and yolo at 0.10 and 0.25 are matched to the real measured run; every other number is illustrative.

target-analyzer

demo range

2026-06-06 · shooter A · 10 m · held-out target

readingproposedmatchedmissedspuriousoffset
cv_blob23231400.74 mm
yolo ≥ 0.1044343100.44 mm

move the threshold

yolo cut atproposedmatchedmissedspuriousoffset
yolo ≥ 0.0551343170.44 mm
yolo ≥ 0.10 (the default)44343100.44 mm
yolo ≥ 0.153933460.45 mm
yolo ≥ 0.253232500.46 mm
yolo ≥ 0.4024241300.45 mm

A detector only proposes: a person confirms every target, so a spurious hole costs one click to remove and a missed one costs a click to place. Lowering the threshold trades misses for spurious holes. 0.10 is the default the real app ships with. Two readings are the same hole within 4 mm.

confirmed by a person

ring 7ring 10ring 6ring 5ring 7ring 6ring 6ring 3ring 7ring 9ring 9ring 9ring 7ring 6ring 7ring 8ring 10ring 5ring 8ring 8ring 5ring 6ring 7ring 7ring 9ring 7ring 9ring 9ring 8ring 8ring 9ring 8ring 5ring 6ring 8ring 8ring 4

the truth every reading is scored against

cv_blob

ring 6ring 5ring 7ring 7ring 9ring 9ring 6ring 7ring 5ring 8ring 8ring 6ring 7ring 7ring 9ring 8ring 10ring 8ring 5ring 6ring 8ring 8ring 5

classic blob detection, no threshold to move

yolo ≥ 0.10

ring 7ring 9ring 8ring 5ring 5ring 9ring 7ring 5ring 3ring 8ring 8ring 10ring 7ring 7ring 6ring 8ring 5ring 8ring 6ring 6ring 6ring 9ring 7ring 10ring 9ring 8ring 8ring 9ring 8ring 7ring 8ring 6ring 9ring 5ring 4ring 3ring 6ring 5ring 1ring 2ring 4ring 3ring 2ring 4

the trained detector, cut at the threshold chosen above