mirror of
https://github.com/macaodha/batdetect2.git
synced 2025-06-29 14:41:58 +02:00
Add iterators module
This commit is contained in:
parent
ebc89af4c6
commit
84a13c65a7
79
batdetect2/data/iterators.py
Normal file
79
batdetect2/data/iterators.py
Normal file
@ -0,0 +1,79 @@
|
||||
from collections.abc import Generator
|
||||
from typing import Optional, Tuple
|
||||
|
||||
from soundevent import data
|
||||
|
||||
from batdetect2.data.datasets import Dataset
|
||||
from batdetect2.targets.types import TargetProtocol
|
||||
|
||||
|
||||
def iterate_over_sound_events(
|
||||
dataset: Dataset,
|
||||
targets: TargetProtocol,
|
||||
apply_filter: bool = True,
|
||||
apply_transform: bool = True,
|
||||
exclude_generic: bool = True,
|
||||
) -> Generator[Tuple[Optional[str], data.SoundEventAnnotation], None, None]:
|
||||
"""Iterate over sound events in a dataset, applying filtering and
|
||||
transformations.
|
||||
|
||||
This generator function processes sound event annotations from a given
|
||||
dataset, allowing for optional filtering, transformation, and exclusion of
|
||||
unclassifiable (generic) events based on the provided target definitions.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
dataset : Dataset
|
||||
The dataset containing clip annotations, each of which may contain
|
||||
multiple sound event annotations.
|
||||
targets : TargetProtocol
|
||||
An object implementing the `TargetProtocol`, which provides methods
|
||||
for filtering, transforming, and encoding sound events.
|
||||
apply_filter : bool, optional
|
||||
If True, sound events will be filtered using `targets.filter()`.
|
||||
Only events for which `targets.filter()` returns True will be yielded.
|
||||
Defaults to True.
|
||||
apply_transform : bool, optional
|
||||
If True, sound events will be transformed using `targets.transform()`
|
||||
before being yielded. Defaults to True.
|
||||
exclude_generic : bool, optional
|
||||
If True, sound events that result in a `None` class name after
|
||||
`targets.encode()` will be excluded. This is typically used to
|
||||
filter out events that cannot be mapped to a specific target class.
|
||||
Defaults to True.
|
||||
|
||||
Yields
|
||||
------
|
||||
Tuple[Optional[str], data.SoundEventAnnotation]
|
||||
A tuple containing:
|
||||
- The encoded class name (str) for the sound event, or None if it
|
||||
cannot be encoded to a specific class.
|
||||
- The sound event annotation itself, after passing all specified
|
||||
filtering and transformation steps.
|
||||
|
||||
Notes
|
||||
-----
|
||||
The processing order for each sound event is:
|
||||
1. Filtering (if `apply_filter` is True). Events failing the filter are
|
||||
skipped.
|
||||
2. Transformation (if `apply_transform` is True).
|
||||
3. Encoding to determine class name and check for genericity (if
|
||||
`exclude_generic` is True). Events with a `None` class name are skipped
|
||||
if `exclude_generic` is True.
|
||||
"""
|
||||
for clip_annotation in dataset:
|
||||
for sound_event_annotation in clip_annotation.sound_events:
|
||||
if apply_filter:
|
||||
if not targets.filter(sound_event_annotation):
|
||||
continue
|
||||
|
||||
if apply_transform:
|
||||
sound_event_annotation = targets.transform(
|
||||
sound_event_annotation
|
||||
)
|
||||
|
||||
class_name = targets.encode(sound_event_annotation)
|
||||
if class_name is None and exclude_generic:
|
||||
continue
|
||||
|
||||
yield class_name, sound_event_annotation
|
Loading…
Reference in New Issue
Block a user