symbol_read_trials — SYMBOL read_pod op

• Data kinds: table → table

• Call: import fullseye as fs; fs.ledger.symbol_read_trials(symbol, factor, levels, *, trials=20, reader='auto', symbologies=None, truth=None, module_px=4.0, render=None, capture=None, rotate='random', rotate_jitter_deg=5.0, level_jitter=0.0, refine=False, seed=0) (to call the implementation directly, import symbolpod; symbolpod.symbol_read_trials(symbol, factor, levels, *, trials=20, reader='auto', symbologies=None, truth=None, module_px=4.0, render=None, capture=None, rotate='random', rotate_jitter_deg=5.0, level_jitter=0.0, refine=False, seed=0); from the registry, opssymbol.get("symbol_read_trials"))

• GPU: none (CPU reference implementation only)

Usage

Capture and read the symbol trials times at each degradation level and return one row per attempt (table).

> The detailed description below is the original text — the summary and the headings are translated.

For each level of the degradation factor (see DEGRADATION_FACTORS), render the symbol (symrender.render_symbol), capture it (symrender.capture_degrade) and read it (symbol_read), trials times with fresh nuisance: in-plane rotation (rotate="random": uniform over 360° for 2-D symbols, ±rotate_jitter_deg around 0 for 1-D; a number fixes it), a sub-pixel offset in [0, 1) px and the sensor-noise seed. For a 1-D table the reader is restricted to the table's own symbology unless symbologies is given (a line reader enables only what it expects; all-symbology reading short-reads). render / capture hold the fixed settings of the other knobs; the sensor defaults to full_well_e = 20000, read_noise_e = 10, 8 bits. truth defaults to the table's text.

Returns columns level, trial, hit (1 = read the true text), misread (1 = read a different text), noread, text (object array), plus factor, worse_when_larger, truth, reader, stage.

level_jitter (relative, default 0) multiplies each trial's actual level by 1 + level_jitter · N(0, 1) while the table keeps the nominal level — the process variation of the line (e.g. part height moving the focus). It is a declared assumption, not a fit knob.

refine=True first runs every level with max(4, trials // 4) trials, brackets the transition (the last level read >= 95 % and the first read <= 5 %, in the order of increasing degradation) and then runs len(levels) evenly spaced levels across that bracket with trials each (stage = "coarse" / "fine"; both enter the table). Without it a coarse sweep easily ends in complete separation.

空の入力(levels が 3 未満)は ValueError。拒否(ValueError): 未知の factor、trials < 1、水準の重複・非有限、render / capture に掃引中の因子と同じ鍵、読み取り器を決められない表。

Detailed usage guide

• symbol_reading family guide

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• poc_symbol_package_1d — py -3.11 examples/poc_symbol_package_1d.py

• poc_symbol_part_dpm — py -3.11 examples/poc_symbol_part_dpm.py

Ops the type connects to (they accept table as input)

render_symbol · symbol_read_pod · ocr_classify · ocr_read_line · ocr_read_trials

Same category (read_pod)

symbol_read · symbol_read_pod


*Provenance: symbolpod.py — SYMBOL operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.