def evaluate(
data,
detector=None,
reid=None,
tracker=None,
*,
metrics: bool = True,
speed: bool = True,
verbose: bool = False,
) -> dict[str, Any]:
"""Aggregate run metrics over one or more tracking results."""
runs = _coerce_results(
data,
detector=detector,
reid=reid,
tracker=tracker,
verbose=verbose,
track_fn=track,
)
summaries = [run.summary() for run in runs]
total_frames = sum(summary["frames"] for summary in summaries)
total_detections = sum(summary["detections"] for summary in summaries)
total_tracks = sum(summary["tracks"] for summary in summaries)
total_det_ms = sum(summary["timings_ms"]["det"] for summary in summaries)
total_reid_ms = sum(summary["timings_ms"]["reid"] for summary in summaries)
total_track_ms = sum(summary["timings_ms"]["track"] for summary in summaries)
total_ms = sum(summary["timings_ms"]["total"] for summary in summaries)
response: dict[str, Any] = {
"sources": len(summaries),
"runs": summaries,
}
if metrics:
response["metrics"] = {
"frames": total_frames,
"detections": total_detections,
"tracks": total_tracks,
"avg_tracks_per_frame": (total_tracks / total_frames) if total_frames else 0.0,
}
if speed:
response["speed"] = {
"det_ms": total_det_ms,
"reid_ms": total_reid_ms,
"track_ms": total_track_ms,
"total_ms": total_ms,
"avg_total_ms": (total_ms / total_frames) if total_frames else 0.0,
"fps": (1000.0 * total_frames / total_ms) if total_ms else 0.0,
}
return response