Source code for crowsetta.bbox
"""A class that represents a bounding box on a spectrogram,
drawn around animal communication or other sounds.
"""
import attrs
from attrs import field
def is_positive(self, attribute, value):
if value < 0.0:
raise ValueError("All input values must be positive")
[docs]
@attrs.define
class BBox:
"""A class that represents a bounding box
on a spectrogram,
drawn around animal communication
or other sounds.
Attributes
----------
onset : float
Time of sound onset, typically in seconds.
offset : float
Time of sound offset, typically in seconds.
low_freq : float
Lowest frequency bounding sound, typically in Hz.
high_freq : float
Highest frequency bounding sound, typically in Hz.
label : str
string label that annotates bounding box
Examples
--------
A toy example of a bounding box-like annotation.
>>> bbox1 = crowsetta.BBox(label='Pinacosaurus grangeri', onset=1.0, offset=2.0, low_freq=3e3, high_freq=1e4)
>>> bbox2 = crowsetta.BBox(label='Pinacosaurus grangeri', onset=3.0, offset=4.0, low_freq=3.25e3, high_freq=1.25e4)
>>> bboxes = [bbox1, bbox2]
>>> annot = crowsetta.Annotation(notated_path='prebird1.wav', annot_path='prebird1.csv', bboxes=bboxes)
>>> print(annot)
Annotation(annot_path=PosixPath('prebird1.csv'), notated_path=PosixPath('prebird1.wav'), bboxes=[BBox(onset=1.0, offset=2.0, low_freq=3000.0, high_freq=10000.0, label='Pinacosaurus grangeri'), BBox(onset=3.0, offset=4.0, low_freq=3250.0, high_freq=12500.0, label='Pinacosaurus grangeri')]) # noqa
"""
onset: float = field(validator=is_positive)
@onset.validator
def lt_offset(self, attribute, value):
if not value < self.offset:
raise ValueError(
"Bounding box onset must be less than offset." f"Onset was {value}, offset was {self.offset}"
)
offset: float = field(validator=is_positive)
low_freq: float = field(validator=is_positive)
@low_freq.validator
def lt_high_freq(self, attribute, value):
if not value < self.high_freq:
raise ValueError(
"Low frequency of bounding box must be less than high frequency."
f"Low frequency was {value}, high frequency was {self.high_freq}"
)
high_freq: float = field(validator=is_positive)
label: str