mirror of
https://github.com/macaodha/batdetect2.git
synced 2025-06-29 14:41:58 +02:00
Added a targets protocol
This commit is contained in:
parent
f353aaa08c
commit
dfd14df7b9
132
batdetect2/targets/types.py
Normal file
132
batdetect2/targets/types.py
Normal file
@ -0,0 +1,132 @@
|
||||
"""Defines the core interface (Protocol) for the target definition pipeline.
|
||||
|
||||
This module specifies the standard structure and methods expected from an object
|
||||
that encapsulates the configured logic for processing sound event annotations
|
||||
within the `batdetect2.targets` system.
|
||||
|
||||
The main component defined here is the `TargetEncoder` protocol. This protocol
|
||||
acts as a contract, ensuring that components responsible for applying
|
||||
filtering, transformations, encoding annotations to class names, and decoding
|
||||
class names back to tags can be interacted with in a consistent manner
|
||||
throughout BatDetect2. It also defines essential metadata attributes expected
|
||||
from implementations.
|
||||
"""
|
||||
|
||||
from typing import List, Optional, Protocol
|
||||
|
||||
from soundevent import data
|
||||
|
||||
__all__ = [
|
||||
"TargetProtocol",
|
||||
]
|
||||
|
||||
|
||||
class TargetProtocol(Protocol):
|
||||
"""Protocol defining the interface for the target definition pipeline.
|
||||
|
||||
This protocol outlines the standard attributes and methods for an object
|
||||
that encapsulates the complete, configured process for handling sound event
|
||||
annotations to determine their target class for model training, and for
|
||||
interpreting model predictions back into annotation tags.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
class_names : List[str]
|
||||
An ordered list of the unique names of the specific target classes
|
||||
defined by the configuration represented by this object.
|
||||
generic_class_tags : List[data.Tag]
|
||||
A list of `soundevent.data.Tag` objects representing the
|
||||
generic class category (e.g., the default 'Bat' class tags used when
|
||||
no specific class matches).
|
||||
"""
|
||||
|
||||
class_names: List[str]
|
||||
"""Ordered list of unique names for the specific target classes."""
|
||||
|
||||
generic_class_tags: List[data.Tag]
|
||||
"""List of tags representing the generic (unclassified) category."""
|
||||
|
||||
def filter(self, sound_event: data.SoundEventAnnotation) -> bool:
|
||||
"""Apply the filter to a sound event annotation.
|
||||
|
||||
Determines if the annotation should be included in further processing
|
||||
and training based on the configured filtering rules.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
sound_event : data.SoundEventAnnotation
|
||||
The annotation to filter.
|
||||
|
||||
Returns
|
||||
-------
|
||||
bool
|
||||
True if the annotation should be kept (passes the filter),
|
||||
False otherwise. Implementations should return True if no
|
||||
filtering is configured.
|
||||
"""
|
||||
...
|
||||
|
||||
def transform(
|
||||
self,
|
||||
sound_event: data.SoundEventAnnotation,
|
||||
) -> data.SoundEventAnnotation:
|
||||
"""Apply tag transformations to an annotation.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
sound_event : data.SoundEventAnnotation
|
||||
The annotation whose tags should be transformed.
|
||||
|
||||
Returns
|
||||
-------
|
||||
data.SoundEventAnnotation
|
||||
A new annotation object with the transformed tags. Implementations
|
||||
should return the original annotation object if no transformations
|
||||
were configured.
|
||||
"""
|
||||
...
|
||||
|
||||
def encode(
|
||||
self,
|
||||
sound_event: data.SoundEventAnnotation,
|
||||
) -> Optional[str]:
|
||||
"""Encode a sound event annotation to its target class name.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
sound_event : data.SoundEventAnnotation
|
||||
The (potentially filtered and transformed) annotation to encode.
|
||||
|
||||
Returns
|
||||
-------
|
||||
str or None
|
||||
The string name of the matched target class if the annotation matches
|
||||
a specific class definition. Returns None if the annotation does not
|
||||
match any specific class rule (indicating it may belong to a generic
|
||||
category or should be handled differently downstream).
|
||||
"""
|
||||
...
|
||||
|
||||
def decode(self, class_label: str) -> List[data.Tag]:
|
||||
"""Decode a predicted class name back into representative tags.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
class_label : str
|
||||
The class name string (e.g., predicted by a model) to decode.
|
||||
|
||||
Returns
|
||||
-------
|
||||
List[data.Tag]
|
||||
The list of tags corresponding to the input class name according
|
||||
to the configuration. May return an empty list or raise an error
|
||||
for unmapped labels, depending on the implementation's configuration
|
||||
(e.g., `raise_on_unmapped` flag during building).
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError, KeyError
|
||||
Implementations might raise an error if the `class_label` is not
|
||||
found in the configured mapping and error raising is enabled.
|
||||
"""
|
||||
...
|
Loading…
Reference in New Issue
Block a user