mirror of
https://github.com/macaodha/batdetect2.git
synced 2026-07-07 21:00:10 +02:00
Rename plot_clip_detections to plot_clip_evals and add plot_detection
This commit is contained in:
parent
67aee0b79c
commit
5c300d883f
@ -21,7 +21,7 @@ from batdetect2.core import ImportConfig, Registry, add_import_config
|
|||||||
from batdetect2.evaluate.metrics.common import compute_precision_recall
|
from batdetect2.evaluate.metrics.common import compute_precision_recall
|
||||||
from batdetect2.evaluate.metrics.detection import ClipEval
|
from batdetect2.evaluate.metrics.detection import ClipEval
|
||||||
from batdetect2.evaluate.plots.base import BasePlot, BasePlotConfig
|
from batdetect2.evaluate.plots.base import BasePlot, BasePlotConfig
|
||||||
from batdetect2.plotting.detections import plot_clip_detections
|
from batdetect2.plotting.detections import plot_clip_evaluation
|
||||||
from batdetect2.plotting.metrics import plot_pr_curve, plot_roc_curve
|
from batdetect2.plotting.metrics import plot_pr_curve, plot_roc_curve
|
||||||
from batdetect2.preprocess import PreprocessingConfig, build_preprocessor
|
from batdetect2.preprocess import PreprocessingConfig, build_preprocessor
|
||||||
from batdetect2.preprocess.types import PreprocessorProtocol
|
from batdetect2.preprocess.types import PreprocessorProtocol
|
||||||
@ -276,7 +276,7 @@ class ExampleDetectionPlot(BasePlot):
|
|||||||
fig = self.create_figure()
|
fig = self.create_figure()
|
||||||
ax = fig.subplots()
|
ax = fig.subplots()
|
||||||
|
|
||||||
plot_clip_detections(
|
plot_clip_evaluation(
|
||||||
clip_eval,
|
clip_eval,
|
||||||
ax=ax,
|
ax=ax,
|
||||||
audio_loader=self.audio_loader,
|
audio_loader=self.audio_loader,
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
|
import numpy as np
|
||||||
from matplotlib import axes, patches
|
from matplotlib import axes, patches
|
||||||
|
from soundevent.geometry import compute_bounds
|
||||||
from soundevent.plot import plot_geometry
|
from soundevent.plot import plot_geometry
|
||||||
|
|
||||||
from batdetect2.evaluate.metrics.detection import ClipEval
|
from batdetect2.evaluate.metrics.detection import ClipEval
|
||||||
@ -8,13 +10,111 @@ from batdetect2.plotting.clips import (
|
|||||||
plot_clip,
|
plot_clip,
|
||||||
)
|
)
|
||||||
from batdetect2.plotting.common import create_ax
|
from batdetect2.plotting.common import create_ax
|
||||||
|
from batdetect2.postprocess import ClipDetections, Detection
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"plot_clip_detections",
|
"plot_clip_evaluation",
|
||||||
|
"plot_detection",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def plot_clip_detections(
|
def plot_detection(
|
||||||
|
detection: Detection,
|
||||||
|
figsize: tuple[int, int] = (10, 10),
|
||||||
|
ax: axes.Axes | None = None,
|
||||||
|
fill: bool = False,
|
||||||
|
linewidth: float = 1.0,
|
||||||
|
linestyle: str = "--",
|
||||||
|
color: str = "red",
|
||||||
|
show_class: bool = True,
|
||||||
|
class_names: list[str] | None = None,
|
||||||
|
fontsize: float | str = "small",
|
||||||
|
):
|
||||||
|
ax = create_ax(figsize=figsize, ax=ax)
|
||||||
|
|
||||||
|
plot_geometry(
|
||||||
|
detection.geometry,
|
||||||
|
ax=ax,
|
||||||
|
add_points=False,
|
||||||
|
facecolor="none" if not fill else color,
|
||||||
|
alpha=detection.detection_score,
|
||||||
|
linewidth=linewidth,
|
||||||
|
linestyle=linestyle,
|
||||||
|
color=color,
|
||||||
|
)
|
||||||
|
|
||||||
|
if not show_class:
|
||||||
|
return ax
|
||||||
|
|
||||||
|
start_time, low_freq, _, _ = compute_bounds(detection.geometry)
|
||||||
|
|
||||||
|
top_class = np.argmax(detection.class_scores)
|
||||||
|
score = detection.class_scores[top_class]
|
||||||
|
|
||||||
|
if class_names is not None:
|
||||||
|
class_name = class_names[top_class]
|
||||||
|
else:
|
||||||
|
class_name = f"class {top_class}"
|
||||||
|
|
||||||
|
ax.text(
|
||||||
|
start_time,
|
||||||
|
low_freq,
|
||||||
|
f"{class_name}={score:.2f}",
|
||||||
|
va="top",
|
||||||
|
ha="left",
|
||||||
|
color=color,
|
||||||
|
fontsize=fontsize,
|
||||||
|
alpha=detection.detection_score,
|
||||||
|
)
|
||||||
|
return ax
|
||||||
|
|
||||||
|
|
||||||
|
def plot_clip_detection(
|
||||||
|
clip_detections: ClipDetections,
|
||||||
|
figsize: tuple[int, int] = (10, 10),
|
||||||
|
ax: axes.Axes | None = None,
|
||||||
|
audio_loader: AudioLoader | None = None,
|
||||||
|
preprocessor: PreprocessorProtocol | None = None,
|
||||||
|
threshold: float | None = None,
|
||||||
|
spec_cmap: str = "gray",
|
||||||
|
fill: bool = False,
|
||||||
|
linewidth: float = 1.0,
|
||||||
|
linestyle: str = "--",
|
||||||
|
color: str = "red",
|
||||||
|
show_class: bool = True,
|
||||||
|
class_names: list[str] | None = None,
|
||||||
|
fontsize: float | str = "small",
|
||||||
|
):
|
||||||
|
ax = create_ax(figsize=figsize, ax=ax)
|
||||||
|
|
||||||
|
plot_clip(
|
||||||
|
clip_detections.clip,
|
||||||
|
audio_loader=audio_loader,
|
||||||
|
preprocessor=preprocessor,
|
||||||
|
ax=ax,
|
||||||
|
spec_cmap=spec_cmap,
|
||||||
|
)
|
||||||
|
|
||||||
|
for detection in clip_detections.detections:
|
||||||
|
if threshold and detection.detection_score < threshold:
|
||||||
|
continue
|
||||||
|
|
||||||
|
ax = plot_detection(
|
||||||
|
detection,
|
||||||
|
ax=ax,
|
||||||
|
class_names=class_names,
|
||||||
|
fontsize=fontsize,
|
||||||
|
fill=fill,
|
||||||
|
linewidth=linewidth,
|
||||||
|
linestyle=linestyle,
|
||||||
|
color=color,
|
||||||
|
show_class=show_class,
|
||||||
|
)
|
||||||
|
|
||||||
|
return ax
|
||||||
|
|
||||||
|
|
||||||
|
def plot_clip_evaluation(
|
||||||
clip_eval: ClipEval,
|
clip_eval: ClipEval,
|
||||||
figsize: tuple[int, int] = (10, 10),
|
figsize: tuple[int, int] = (10, 10),
|
||||||
ax: axes.Axes | None = None,
|
ax: axes.Axes | None = None,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user