batdetect2/tests/test_evaluate/test_tasks/conftest.py
2026-03-18 00:01:35 +00:00

87 lines
2.2 KiB
Python

from typing import Literal
import numpy as np
import pytest
from soundevent import data
from batdetect2.postprocess.types import Detection
@pytest.fixture
def clip(recording: data.Recording) -> data.Clip:
return data.Clip(recording=recording, start_time=0, end_time=100)
@pytest.fixture
def create_detection():
def factory(
detection_score: float = 0.5,
start_time: float = 0.1,
duration: float = 0.01,
low_freq: float = 40_000,
bandwidth: float = 30_000,
pip_score: float = 0,
myo_score: float = 0,
):
return Detection(
detection_score=detection_score,
class_scores=np.array(
[
pip_score,
myo_score,
]
),
features=np.zeros([32]),
geometry=data.BoundingBox(
coordinates=[
start_time,
low_freq,
start_time + duration,
low_freq + bandwidth,
]
),
)
return factory
@pytest.fixture
def create_annotation(
clip: data.Clip,
bat_tag: data.Tag,
myomyo_tag: data.Tag,
pippip_tag: data.Tag,
):
def factory(
start_time: float = 0.1,
duration: float = 0.01,
low_freq: float = 40_000,
bandwidth: float = 30_000,
is_target: bool = True,
class_name: Literal["pippip", "myomyo"] | None = None,
):
tags = [bat_tag] if is_target else []
if class_name is not None:
if class_name == "pippip":
tags.append(pippip_tag)
elif class_name == "myomyo":
tags.append(myomyo_tag)
return data.SoundEventAnnotation(
sound_event=data.SoundEvent(
geometry=data.BoundingBox(
coordinates=[
start_time,
low_freq,
start_time + duration,
low_freq + bandwidth,
]
),
recording=clip.recording,
),
tags=tags,
)
return factory