mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-12-06 13:34:13 +03:00
Improve enrichments grouping
This commit is contained in:
parent
a29e41617e
commit
4bc7462012
@ -362,7 +362,7 @@ def stats_snapshot(
|
|||||||
stats["embeddings"]["review_description_speed"] = round(
|
stats["embeddings"]["review_description_speed"] = round(
|
||||||
embeddings_metrics.review_desc_speed.value * 1000, 2
|
embeddings_metrics.review_desc_speed.value * 1000, 2
|
||||||
)
|
)
|
||||||
stats["embeddings"]["review_descriptions"] = round(
|
stats["embeddings"]["review_description_events_per_second"] = round(
|
||||||
embeddings_metrics.review_desc_dps.value, 2
|
embeddings_metrics.review_desc_dps.value, 2
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -370,7 +370,7 @@ def stats_snapshot(
|
|||||||
stats["embeddings"]["object_description_speed"] = round(
|
stats["embeddings"]["object_description_speed"] = round(
|
||||||
embeddings_metrics.object_desc_speed.value * 1000, 2
|
embeddings_metrics.object_desc_speed.value * 1000, 2
|
||||||
)
|
)
|
||||||
stats["embeddings"]["object_descriptions"] = round(
|
stats["embeddings"]["object_description_events_per_second"] = round(
|
||||||
embeddings_metrics.object_desc_dps.value, 2
|
embeddings_metrics.object_desc_dps.value, 2
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -378,7 +378,7 @@ def stats_snapshot(
|
|||||||
stats["embeddings"][f"{key}_classification_speed"] = round(
|
stats["embeddings"][f"{key}_classification_speed"] = round(
|
||||||
embeddings_metrics.classification_speeds[key].value * 1000, 2
|
embeddings_metrics.classification_speeds[key].value * 1000, 2
|
||||||
)
|
)
|
||||||
stats["embeddings"][f"{key}_classification"] = round(
|
stats["embeddings"][f"{key}_classification_events_per_second"] = round(
|
||||||
embeddings_metrics.classification_cps[key].value, 2
|
embeddings_metrics.classification_cps[key].value, 2
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -169,6 +169,7 @@
|
|||||||
"enrichments": {
|
"enrichments": {
|
||||||
"title": "Enrichments",
|
"title": "Enrichments",
|
||||||
"infPerSecond": "Inferences Per Second",
|
"infPerSecond": "Inferences Per Second",
|
||||||
|
"averageInf": "Average Inference Time",
|
||||||
"embeddings": {
|
"embeddings": {
|
||||||
"image_embedding": "Image Embedding",
|
"image_embedding": "Image Embedding",
|
||||||
"text_embedding": "Text Embedding",
|
"text_embedding": "Text Embedding",
|
||||||
@ -180,7 +181,13 @@
|
|||||||
"plate_recognition_speed": "Plate Recognition Speed",
|
"plate_recognition_speed": "Plate Recognition Speed",
|
||||||
"text_embedding_speed": "Text Embedding Speed",
|
"text_embedding_speed": "Text Embedding Speed",
|
||||||
"yolov9_plate_detection_speed": "YOLOv9 Plate Detection Speed",
|
"yolov9_plate_detection_speed": "YOLOv9 Plate Detection Speed",
|
||||||
"yolov9_plate_detection": "YOLOv9 Plate Detection"
|
"yolov9_plate_detection": "YOLOv9 Plate Detection",
|
||||||
|
"review_description": "Review Description",
|
||||||
|
"review_description_speed": "Review Description Speed",
|
||||||
|
"review_description_events_per_second": "Review Description",
|
||||||
|
"object_description": "Object Description",
|
||||||
|
"object_description_speed": "Object Description Speed",
|
||||||
|
"object_description_events_per_second": "Object Description"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,13 +67,14 @@ export default function EnrichmentMetrics({
|
|||||||
|
|
||||||
// features stats
|
// features stats
|
||||||
|
|
||||||
const embeddingInferenceTimeSeries = useMemo(() => {
|
const groupedEnrichmentMetrics = useMemo(() => {
|
||||||
if (!statsHistory) {
|
if (!statsHistory) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
const series: {
|
const series: {
|
||||||
[key: string]: {
|
[key: string]: {
|
||||||
|
rawKey: string;
|
||||||
name: string;
|
name: string;
|
||||||
metrics: Threshold;
|
metrics: Threshold;
|
||||||
data: { x: number; y: number }[];
|
data: { x: number; y: number }[];
|
||||||
@ -90,6 +91,7 @@ export default function EnrichmentMetrics({
|
|||||||
|
|
||||||
if (!(key in series)) {
|
if (!(key in series)) {
|
||||||
series[key] = {
|
series[key] = {
|
||||||
|
rawKey,
|
||||||
name: t("enrichments.embeddings." + rawKey),
|
name: t("enrichments.embeddings." + rawKey),
|
||||||
metrics: getThreshold(rawKey),
|
metrics: getThreshold(rawKey),
|
||||||
data: [],
|
data: [],
|
||||||
@ -99,7 +101,57 @@ export default function EnrichmentMetrics({
|
|||||||
series[key].data.push({ x: statsIdx + 1, y: stat });
|
series[key].data.push({ x: statsIdx + 1, y: stat });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return Object.values(series);
|
|
||||||
|
// Group series by category (extract base name from raw key)
|
||||||
|
const grouped: {
|
||||||
|
[category: string]: {
|
||||||
|
categoryName: string;
|
||||||
|
speedSeries?: {
|
||||||
|
name: string;
|
||||||
|
metrics: Threshold;
|
||||||
|
data: { x: number; y: number }[];
|
||||||
|
};
|
||||||
|
eventsSeries?: {
|
||||||
|
name: string;
|
||||||
|
metrics: Threshold;
|
||||||
|
data: { x: number; y: number }[];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} = {};
|
||||||
|
|
||||||
|
Object.values(series).forEach((s) => {
|
||||||
|
// Extract base category name from raw key
|
||||||
|
// All metrics follow the pattern: {base}_speed and {base}_events_per_second
|
||||||
|
let categoryKey = s.rawKey;
|
||||||
|
let isSpeed = false;
|
||||||
|
|
||||||
|
if (s.rawKey.endsWith("_speed")) {
|
||||||
|
categoryKey = s.rawKey.replace("_speed", "");
|
||||||
|
isSpeed = true;
|
||||||
|
} else if (s.rawKey.endsWith("_events_per_second")) {
|
||||||
|
categoryKey = s.rawKey.replace("_events_per_second", "");
|
||||||
|
isSpeed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get translated category name
|
||||||
|
const categoryName = t("enrichments.embeddings." + categoryKey);
|
||||||
|
|
||||||
|
if (!(categoryKey in grouped)) {
|
||||||
|
grouped[categoryKey] = {
|
||||||
|
categoryName,
|
||||||
|
speedSeries: undefined,
|
||||||
|
eventsSeries: undefined,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSpeed) {
|
||||||
|
grouped[categoryKey].speedSeries = s;
|
||||||
|
} else {
|
||||||
|
grouped[categoryKey].eventsSeries = s;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return Object.values(grouped);
|
||||||
}, [statsHistory, t, getThreshold]);
|
}, [statsHistory, t, getThreshold]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -110,35 +162,42 @@ export default function EnrichmentMetrics({
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className={cn(
|
className={cn(
|
||||||
"mt-4 grid w-full grid-cols-1 gap-2 sm:grid-cols-3",
|
"mt-4 grid w-full grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-4",
|
||||||
embeddingInferenceTimeSeries && "sm:grid-cols-4",
|
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{statsHistory.length != 0 ? (
|
{statsHistory.length != 0 ? (
|
||||||
<>
|
<>
|
||||||
{embeddingInferenceTimeSeries.map((series) => (
|
{groupedEnrichmentMetrics.map((group) => (
|
||||||
<div className="rounded-lg bg-background_alt p-2.5 md:rounded-2xl">
|
<div
|
||||||
<div className="mb-5 smart-capitalize">{series.name}</div>
|
key={group.categoryName}
|
||||||
{series.name.endsWith("Speed") ? (
|
className="rounded-lg bg-background_alt p-2.5 md:rounded-2xl"
|
||||||
<ThresholdBarGraph
|
>
|
||||||
key={series.name}
|
<div className="mb-5 smart-capitalize">
|
||||||
graphId={`${series.name}-inference`}
|
{group.categoryName}
|
||||||
name={series.name}
|
</div>
|
||||||
unit="ms"
|
<div className="space-y-4">
|
||||||
threshold={series.metrics}
|
{group.speedSeries && (
|
||||||
updateTimes={updateTimes}
|
<ThresholdBarGraph
|
||||||
data={[series]}
|
key={`${group.categoryName}-speed`}
|
||||||
/>
|
graphId={`${group.categoryName}-inference`}
|
||||||
) : (
|
name={t("enrichments.averageInf")}
|
||||||
<EventsPerSecondsLineGraph
|
unit="ms"
|
||||||
key={series.name}
|
threshold={group.speedSeries.metrics}
|
||||||
graphId={`${series.name}-fps`}
|
updateTimes={updateTimes}
|
||||||
unit=""
|
data={[group.speedSeries]}
|
||||||
name={t("enrichments.infPerSecond")}
|
/>
|
||||||
updateTimes={updateTimes}
|
)}
|
||||||
data={[series]}
|
{group.eventsSeries && (
|
||||||
/>
|
<EventsPerSecondsLineGraph
|
||||||
)}
|
key={`${group.categoryName}-events`}
|
||||||
|
graphId={`${group.categoryName}-fps`}
|
||||||
|
unit=""
|
||||||
|
name={t("enrichments.infPerSecond")}
|
||||||
|
updateTimes={updateTimes}
|
||||||
|
data={[group.eventsSeries]}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</>
|
</>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user