You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

69 lines
2.0 KiB

import sys
from types import SimpleNamespace
from typing import Any
# The detector only needs NumPy for annotations; keep this unit test independent
# from binary packages and real image/model execution.
_inserted_numpy_stub = "numpy" not in sys.modules
if _inserted_numpy_stub:
sys.modules["numpy"] = SimpleNamespace(
ndarray=object,
isscalar=lambda value: isinstance(value, (int, float)),
)
from src.config_loader import DetectorSettings
from src.detector import PersonDetector
if _inserted_numpy_stub:
sys.modules.pop("numpy", None)
class FakeModel:
def __init__(self) -> None:
self.kwargs: dict[str, Any] = {}
def predict(self, **kwargs: Any) -> list[Any]:
self.kwargs = kwargs
return []
class FakeFrame:
shape = (10, 10, 3)
def make_settings(half_precision: bool) -> DetectorSettings:
return DetectorSettings(
model_path="unused.pt",
device="auto",
confidence_threshold=0.4,
iou_threshold=0.5,
image_size=640,
person_class_id=0,
max_detections=30,
half_precision=half_precision,
use_agnostic_nms=False,
)
def run_detection(half_precision: bool, effective_half: bool) -> dict[str, Any]:
detector = PersonDetector(make_settings(half_precision))
model = FakeModel()
detector._model = model
detector._device_name = "cuda" if effective_half else "cpu"
detector._half = effective_half
detector.detect(FakeFrame()) # type: ignore[arg-type]
return model.kwargs
def test_cpu_does_not_pass_half_when_disabled() -> None:
assert "half" not in run_detection(half_precision=False, effective_half=False)
def test_cpu_does_not_pass_half_when_requested_but_unavailable() -> None:
assert "half" not in run_detection(half_precision=True, effective_half=False)
def test_cuda_passes_half_only_when_effectively_enabled() -> None:
kwargs = run_detection(half_precision=True, effective_half=True)
assert kwargs["half"] is True
assert "quantize" not in kwargs