mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-12-06 13:34:13 +03:00
Cleanup
This commit is contained in:
parent
72c6fb4e22
commit
6548eb7260
@ -47,12 +47,12 @@ class StationaryMotionClassifier:
|
|||||||
SHIFT_KEEP_THRESHOLD = 0.02 # Small shift = keep stationary
|
SHIFT_KEEP_THRESHOLD = 0.02 # Small shift = keep stationary
|
||||||
SHIFT_ACTIVE_THRESHOLD = 0.04 # Large shift = consider active
|
SHIFT_ACTIVE_THRESHOLD = 0.04 # Large shift = consider active
|
||||||
DRIFT_ACTIVE_THRESHOLD = 0.12 # Cumulative drift over 5 frames
|
DRIFT_ACTIVE_THRESHOLD = 0.12 # Cumulative drift over 5 frames
|
||||||
DISAGREE_FRAMES_TO_FLIP = 2
|
CHANGED_FRAMES_TO_FLIP = 2
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self.anchor_crops: dict[str, np.ndarray] = {}
|
self.anchor_crops: dict[str, np.ndarray] = {}
|
||||||
self.anchor_boxes: dict[str, tuple[int, int, int, int]] = {}
|
self.anchor_boxes: dict[str, tuple[int, int, int, int]] = {}
|
||||||
self.disagree_counts: dict[str, int] = {}
|
self.changed_counts: dict[str, int] = {}
|
||||||
self.shift_histories: dict[str, list[float]] = {}
|
self.shift_histories: dict[str, list[float]] = {}
|
||||||
|
|
||||||
# Pre-compute Hanning window for phase correlation
|
# Pre-compute Hanning window for phase correlation
|
||||||
@ -64,7 +64,7 @@ class StationaryMotionClassifier:
|
|||||||
del self.anchor_crops[id]
|
del self.anchor_crops[id]
|
||||||
if id in self.anchor_boxes:
|
if id in self.anchor_boxes:
|
||||||
del self.anchor_boxes[id]
|
del self.anchor_boxes[id]
|
||||||
self.disagree_counts[id] = 0
|
self.changed_counts[id] = 0
|
||||||
self.shift_histories[id] = []
|
self.shift_histories[id] = []
|
||||||
|
|
||||||
def _extract_y_crop(
|
def _extract_y_crop(
|
||||||
@ -98,7 +98,7 @@ class StationaryMotionClassifier:
|
|||||||
if id not in self.anchor_crops:
|
if id not in self.anchor_crops:
|
||||||
self.anchor_boxes[id] = median_box
|
self.anchor_boxes[id] = median_box
|
||||||
self.anchor_crops[id] = self._extract_y_crop(yuv_frame, median_box)
|
self.anchor_crops[id] = self._extract_y_crop(yuv_frame, median_box)
|
||||||
self.disagree_counts[id] = 0
|
self.changed_counts[id] = 0
|
||||||
self.shift_histories[id] = []
|
self.shift_histories[id] = []
|
||||||
|
|
||||||
def on_active(self, id: str) -> None:
|
def on_active(self, id: str) -> None:
|
||||||
@ -139,7 +139,7 @@ class StationaryMotionClassifier:
|
|||||||
|
|
||||||
# Early exit for clear stationary case
|
# Early exit for clear stationary case
|
||||||
if ncc >= self.NCC_KEEP_THRESHOLD and shift_norm < self.SHIFT_KEEP_THRESHOLD:
|
if ncc >= self.NCC_KEEP_THRESHOLD and shift_norm < self.SHIFT_KEEP_THRESHOLD:
|
||||||
self.disagree_counts[id] = 0
|
self.changed_counts[id] = 0
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# Check for movement indicators
|
# Check for movement indicators
|
||||||
@ -150,15 +150,15 @@ class StationaryMotionClassifier:
|
|||||||
)
|
)
|
||||||
|
|
||||||
if movement_detected:
|
if movement_detected:
|
||||||
cnt = self.disagree_counts.get(id, 0) + 1
|
cnt = self.changed_counts.get(id, 0) + 1
|
||||||
self.disagree_counts[id] = cnt
|
self.changed_counts[id] = cnt
|
||||||
if (
|
if (
|
||||||
cnt >= self.DISAGREE_FRAMES_TO_FLIP
|
cnt >= self.CHANGED_FRAMES_TO_FLIP
|
||||||
or drift_sum >= self.DRIFT_ACTIVE_THRESHOLD
|
or drift_sum >= self.DRIFT_ACTIVE_THRESHOLD
|
||||||
):
|
):
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
self.disagree_counts[id] = 0
|
self.changed_counts[id] = 0
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user