camstack-trainer / tests /test_floors.py
apocaliss92's picture
camstack-train 0.1.0: YOLOv9 root detector fine-tune (job.json in, result.json + bundle.tar out)
ebeed67 verified
Raw History Blame Contribute Delete
2.75 kB
from __future__ import annotations
from camstack_train._vendor.camstack_eval.floors import FloorPolicy, ScoredDetection
from camstack_train.floors import floors_block, floors_from_report, propose
POLICY = FloorPolicy(min_support=20, clamp=0.15)
BASE = {"person": 0.6, "vehicle": 0.4, "animal": 0.55}
def fps(*scores: float) -> list[ScoredDetection]:
return [ScoredDetection(s, False) for s in scores]
def test_lowest_floor_within_the_baseline_fp_budget():
# baseline: 1 FP at or above its floor 0.6; the candidate makes FPs at 0.52 and 0.66
baseline = fps(0.62, 0.3)
candidate = fps(0.52, 0.66)
p = propose(baseline, 0.6, candidate, positives=30, policy=POLICY)
assert p.reason == "fp-budget" and p.value == 0.55 and p.fp_budget == 1
def test_low_support_inherits_the_baseline():
p = propose(fps(0.9), 0.6, fps(0.2), positives=8, policy=POLICY)
assert (p.value, p.reason) == (0.6, "low-support")
def test_clamped_to_plus_minus_clamp():
# a candidate with no false positives would fit the grid minimum 0.25; clamp to 0.45
p = propose(fps(), 0.6, fps(), positives=50, policy=POLICY)
assert (p.value, p.reason, p.fitted) == (0.45, "clamped", 0.25)
# no grid floor meets the budget → the top of the clamp band
q = propose(fps(), 0.6, fps(0.99), positives=50, policy=POLICY)
assert (q.value, q.reason) == (0.75, "clamped")
def report(person: dict) -> dict:
fit = {"value": 0.4, "reason": "fp-budget", "fpBudget": 2, "fitted": 0.4}
return {"frames": 10, "classes": {
"person": {"positives": person.get("positives", 30), "proposedFloor": person},
"vehicle": {"positives": 40, "proposedFloor": fit},
"animal": {"positives": 5, "proposedFloor": {"value": 0.55, "reason": "low-support", "fpBudget": 0, "fitted": None}},
}}
def test_report_to_floors_with_notes():
floors, notes = floors_from_report(report({"value": 0.5, "reason": "fp-budget", "fpBudget": 1, "fitted": 0.5}), BASE, POLICY)
assert floors == {"person": 0.5, "vehicle": 0.4, "animal": 0.55}
assert notes == ["animal: 5 holdout positives < 20, inherits 0.55"]
def test_no_holdout_inherits_everything():
floors, notes = floors_from_report(None, BASE, POLICY)
assert floors == BASE and "inherits the baseline" in notes[0]
def test_floors_block_int8_only_when_kept():
r = report({"value": 0.5, "reason": "fp-budget", "fpBudget": 1, "fitted": 0.5})
block = floors_block(r, r, BASE, POLICY, int8_present=False)
assert block["candidateInt8"] is None and block["baseline"] == BASE
block = floors_block(r, r, BASE, POLICY, int8_present=True)
assert block["candidateInt8"]["person"] == 0.5
assert any(n.startswith("int8 animal") for n in block["notes"])