mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-15 15:45:27 +03:00
Drop significant_motion
This commit is contained in:
parent
be68e3690c
commit
81f75551cc
@ -3,7 +3,7 @@ from typing import Union
|
||||
from pydantic import BaseModel
|
||||
from pydantic.json_schema import SkipJsonSchema
|
||||
|
||||
from frigate.api.defs.severity_enum import SeverityEnum
|
||||
from frigate.review.maintainer import SeverityEnum
|
||||
|
||||
|
||||
class ReviewQueryParams(BaseModel):
|
||||
|
||||
@ -3,7 +3,7 @@ from typing import Dict
|
||||
|
||||
from pydantic import BaseModel, Json
|
||||
|
||||
from frigate.api.defs.severity_enum import SeverityEnum
|
||||
from frigate.review.maintainer import SeverityEnum
|
||||
|
||||
|
||||
class ReviewSegmentResponse(BaseModel):
|
||||
@ -20,7 +20,6 @@ class ReviewSegmentResponse(BaseModel):
|
||||
class Last24HoursReview(BaseModel):
|
||||
reviewed_alert: int
|
||||
reviewed_detection: int
|
||||
reviewed_motion: int
|
||||
total_alert: int
|
||||
total_detection: int
|
||||
total_motion: int
|
||||
@ -30,7 +29,6 @@ class DayReview(BaseModel):
|
||||
day: datetime
|
||||
reviewed_alert: int
|
||||
reviewed_detection: int
|
||||
reviewed_motion: int
|
||||
total_alert: int
|
||||
total_detection: int
|
||||
total_motion: int
|
||||
@ -45,8 +43,3 @@ class ReviewActivityMotionResponse(BaseModel):
|
||||
start_time: int
|
||||
motion: float
|
||||
camera: str
|
||||
|
||||
|
||||
class ReviewActivityAudioResponse(BaseModel):
|
||||
start_time: int
|
||||
audio: int
|
||||
|
||||
@ -1,7 +0,0 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class SeverityEnum(str, Enum):
|
||||
alert = "alert"
|
||||
detection = "detection"
|
||||
significant_motion = "significant_motion"
|
||||
@ -1,7 +1,6 @@
|
||||
"""Review apis."""
|
||||
|
||||
import datetime
|
||||
import json
|
||||
import logging
|
||||
from functools import reduce
|
||||
from pathlib import Path
|
||||
@ -24,7 +23,6 @@ from frigate.api.defs.review_query_parameters import (
|
||||
ReviewSummaryQueryParams,
|
||||
)
|
||||
from frigate.api.defs.review_responses import (
|
||||
ReviewActivityAudioResponse,
|
||||
ReviewActivityMotionResponse,
|
||||
ReviewSegmentResponse,
|
||||
ReviewSummaryResponse,
|
||||
@ -185,18 +183,6 @@ def review_summary(params: ReviewSummaryQueryParams = Depends()):
|
||||
0,
|
||||
)
|
||||
).alias("reviewed_detection"),
|
||||
fn.SUM(
|
||||
Case(
|
||||
None,
|
||||
[
|
||||
(
|
||||
(ReviewSegment.severity == "significant_motion"),
|
||||
ReviewSegment.has_been_reviewed,
|
||||
)
|
||||
],
|
||||
0,
|
||||
)
|
||||
).alias("reviewed_motion"),
|
||||
fn.SUM(
|
||||
Case(
|
||||
None,
|
||||
@ -221,18 +207,6 @@ def review_summary(params: ReviewSummaryQueryParams = Depends()):
|
||||
0,
|
||||
)
|
||||
).alias("total_detection"),
|
||||
fn.SUM(
|
||||
Case(
|
||||
None,
|
||||
[
|
||||
(
|
||||
(ReviewSegment.severity == "significant_motion"),
|
||||
1,
|
||||
)
|
||||
],
|
||||
0,
|
||||
)
|
||||
).alias("total_motion"),
|
||||
)
|
||||
.where(reduce(operator.and_, clauses))
|
||||
.dicts()
|
||||
@ -294,18 +268,6 @@ def review_summary(params: ReviewSummaryQueryParams = Depends()):
|
||||
0,
|
||||
)
|
||||
).alias("reviewed_detection"),
|
||||
fn.SUM(
|
||||
Case(
|
||||
None,
|
||||
[
|
||||
(
|
||||
(ReviewSegment.severity == "significant_motion"),
|
||||
ReviewSegment.has_been_reviewed,
|
||||
)
|
||||
],
|
||||
0,
|
||||
)
|
||||
).alias("reviewed_motion"),
|
||||
fn.SUM(
|
||||
Case(
|
||||
None,
|
||||
@ -330,18 +292,6 @@ def review_summary(params: ReviewSummaryQueryParams = Depends()):
|
||||
0,
|
||||
)
|
||||
).alias("total_detection"),
|
||||
fn.SUM(
|
||||
Case(
|
||||
None,
|
||||
[
|
||||
(
|
||||
(ReviewSegment.severity == "significant_motion"),
|
||||
1,
|
||||
)
|
||||
],
|
||||
0,
|
||||
)
|
||||
).alias("total_motion"),
|
||||
)
|
||||
.where(reduce(operator.and_, clauses))
|
||||
.group_by(
|
||||
@ -495,71 +445,6 @@ def motion_activity(params: ReviewActivityMotionQueryParams = Depends()):
|
||||
return JSONResponse(content=normalized)
|
||||
|
||||
|
||||
@router.get("/review/activity/audio", response_model=list[ReviewActivityAudioResponse])
|
||||
def audio_activity(params: ReviewActivityMotionQueryParams = Depends()):
|
||||
"""Get motion and audio activity."""
|
||||
cameras = params.cameras
|
||||
before = params.before or datetime.datetime.now().timestamp()
|
||||
after = (
|
||||
params.after
|
||||
or (datetime.datetime.now() - datetime.timedelta(hours=1)).timestamp()
|
||||
)
|
||||
# get scale in seconds
|
||||
scale = params.scale
|
||||
|
||||
clauses = [(Recordings.start_time > after) & (Recordings.end_time < before)]
|
||||
|
||||
if cameras != "all":
|
||||
camera_list = cameras.split(",")
|
||||
clauses.append((Recordings.camera << camera_list))
|
||||
|
||||
all_recordings: list[Recordings] = (
|
||||
Recordings.select(
|
||||
Recordings.start_time,
|
||||
Recordings.duration,
|
||||
Recordings.objects,
|
||||
Recordings.dBFS,
|
||||
)
|
||||
.where(reduce(operator.and_, clauses))
|
||||
.order_by(Recordings.start_time.asc())
|
||||
.iterator()
|
||||
)
|
||||
|
||||
# format is: { timestamp: segment_start_ts, motion: [0-100], audio: [0 - -100] }
|
||||
# periods where active objects / audio was detected will cause audio to be scaled down
|
||||
data: list[dict[str, float]] = []
|
||||
|
||||
for rec in all_recordings:
|
||||
data.append(
|
||||
{
|
||||
"start_time": rec.start_time,
|
||||
"audio": rec.dBFS if rec.objects == 0 else 0,
|
||||
}
|
||||
)
|
||||
|
||||
# resample data using pandas to get activity on scaled basis
|
||||
df = pd.DataFrame(data, columns=["start_time", "audio"])
|
||||
df = df.astype(dtype={"audio": "float16"})
|
||||
|
||||
# set date as datetime index
|
||||
df["start_time"] = pd.to_datetime(df["start_time"], unit="s")
|
||||
df.set_index(["start_time"], inplace=True)
|
||||
|
||||
# normalize data
|
||||
df = df.resample(f"{scale}S").mean().fillna(0.0)
|
||||
# FIXME: If min/max audio is the same then we get division by 0 and as such audio is 'nan'
|
||||
df["audio"] = (
|
||||
(df["audio"] - df["audio"].max())
|
||||
/ (df["audio"].min() - df["audio"].max())
|
||||
* -100
|
||||
)
|
||||
|
||||
# change types for output
|
||||
df.index = df.index.astype(int) // (10**9)
|
||||
normalized = json.loads(df.reset_index().to_json(orient="records"))
|
||||
return JSONResponse(content=normalized)
|
||||
|
||||
|
||||
@router.get("/review/event/{event_id}", response_model=ReviewSegmentResponse)
|
||||
def get_review_from_event(event_id: str):
|
||||
try:
|
||||
|
||||
@ -93,7 +93,7 @@ class ReviewSegment(Model): # type: ignore[misc]
|
||||
start_time = DateTimeField()
|
||||
end_time = DateTimeField()
|
||||
has_been_reviewed = BooleanField(default=False)
|
||||
severity = CharField(max_length=30) # alert, detection, significant_motion
|
||||
severity = CharField(max_length=30) # alert, detection
|
||||
thumb_path = CharField(unique=True)
|
||||
data = JSONField() # additional data about detection like list of labels, zone, areas of significant motion
|
||||
|
||||
|
||||
@ -407,10 +407,6 @@ export default function Events() {
|
||||
review.severity == "detection"
|
||||
? item.reviewed_detection + 1
|
||||
: item.reviewed_detection,
|
||||
reviewed_motion:
|
||||
review.severity == "significant_motion"
|
||||
? item.reviewed_motion + 1
|
||||
: item.reviewed_motion,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
@ -42,7 +42,6 @@ type ReviewSummaryDay = {
|
||||
day: string;
|
||||
reviewed_alert: number;
|
||||
reviewed_detection: number;
|
||||
reviewed_motion: number;
|
||||
total_alert: number;
|
||||
total_detection: number;
|
||||
total_motion: number;
|
||||
|
||||
@ -117,13 +117,11 @@ export default function EventView({
|
||||
return {
|
||||
alert: summary.total_alert ?? 0,
|
||||
detection: summary.total_detection ?? 0,
|
||||
significant_motion: summary.total_motion ?? 0,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
alert: summary.total_alert - summary.reviewed_alert,
|
||||
detection: summary.total_detection - summary.reviewed_detection,
|
||||
significant_motion: summary.total_motion - summary.reviewed_motion,
|
||||
};
|
||||
}
|
||||
}, [filter, showReviewed, reviewSummary]);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user