Don't zero out motion during calibration (#8163)

* don't zero out motion boxes

* define detect resolution to speed up tests
This commit is contained in:
Blake Blackshear 2023-10-14 08:05:44 -04:00 committed by GitHub
parent fa6c6c50d0
commit 9ea10f8541
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 125 additions and 23 deletions

View File

@ -20,3 +20,7 @@ class MotionDetector(ABC):
@abstractmethod @abstractmethod
def detect(self, frame): def detect(self, frame):
pass pass
@abstractmethod
def is_calibrating(self):
pass

View File

@ -38,6 +38,9 @@ class FrigateMotionDetector(MotionDetector):
self.threshold = threshold self.threshold = threshold
self.contour_area = contour_area self.contour_area = contour_area
def is_calibrating(self):
return False
def detect(self, frame): def detect(self, frame):
motion_boxes = [] motion_boxes = []

View File

@ -49,6 +49,9 @@ class ImprovedMotionDetector(MotionDetector):
self.contrast_values[:, 1:2] = 255 self.contrast_values[:, 1:2] = 255
self.contrast_values_index = 0 self.contrast_values_index = 0
def is_calibrating(self):
return self.calibrating
def detect(self, frame): def detect(self, frame):
motion_boxes = [] motion_boxes = []
@ -141,7 +144,6 @@ class ImprovedMotionDetector(MotionDetector):
# if calibrating or the motion contours are > 80% of the image area (lightning, ir, ptz) recalibrate # if calibrating or the motion contours are > 80% of the image area (lightning, ir, ptz) recalibrate
if self.calibrating or pct_motion > self.config.lightning_threshold: if self.calibrating or pct_motion > self.config.lightning_threshold:
motion_boxes = []
self.calibrating = True self.calibrating = True
if self.save_images: if self.save_images:

View File

@ -1027,7 +1027,12 @@ class TestConfig(unittest.TestCase):
"roles": ["detect"], "roles": ["detect"],
}, },
] ]
} },
"detect": {
"height": 720,
"width": 1280,
"fps": 5,
},
} }
}, },
} }
@ -1082,6 +1087,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
"snapshots": { "snapshots": {
"height": 100, "height": 100,
}, },
@ -1107,7 +1117,12 @@ class TestConfig(unittest.TestCase):
"roles": ["detect"], "roles": ["detect"],
}, },
] ]
} },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1132,6 +1147,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
"snapshots": { "snapshots": {
"height": 150, "height": 150,
"enabled": True, "enabled": True,
@ -1160,6 +1180,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1181,7 +1206,12 @@ class TestConfig(unittest.TestCase):
"roles": ["detect"], "roles": ["detect"],
}, },
] ]
} },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1205,6 +1235,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
"rtmp": { "rtmp": {
"enabled": True, "enabled": True,
}, },
@ -1234,6 +1269,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1257,6 +1297,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1278,7 +1323,12 @@ class TestConfig(unittest.TestCase):
"roles": ["detect"], "roles": ["detect"],
}, },
] ]
} },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1302,6 +1352,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
"live": { "live": {
"quality": 7, "quality": 7,
}, },
@ -1329,6 +1384,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1350,7 +1410,12 @@ class TestConfig(unittest.TestCase):
"roles": ["detect"], "roles": ["detect"],
}, },
] ]
} },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1375,6 +1440,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
"timestamp_style": {"position": "bl", "thickness": 4}, "timestamp_style": {"position": "bl", "thickness": 4},
} }
}, },
@ -1400,6 +1470,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1423,6 +1498,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1450,6 +1530,11 @@ class TestConfig(unittest.TestCase):
}, },
], ],
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
} }
}, },
} }
@ -1475,6 +1560,11 @@ class TestConfig(unittest.TestCase):
}, },
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
"zones": { "zones": {
"steps": { "steps": {
"coordinates": "0,0,0,0", "coordinates": "0,0,0,0",
@ -1546,6 +1636,11 @@ class TestConfig(unittest.TestCase):
{"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]} {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]}
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
"onvif": {"autotracking": {"movement_weights": "1.23, 2.34, 0.50"}}, "onvif": {"autotracking": {"movement_weights": "1.23, 2.34, 0.50"}},
} }
}, },
@ -1569,6 +1664,11 @@ class TestConfig(unittest.TestCase):
{"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]} {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]}
] ]
}, },
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
"onvif": {"autotracking": {"movement_weights": "1.234, 2.345a"}}, "onvif": {"autotracking": {"movement_weights": "1.234, 2.345a"}},
} }
}, },

View File

@ -21,7 +21,6 @@ from frigate.log import LogPipe
from frigate.motion import MotionDetector from frigate.motion import MotionDetector
from frigate.motion.improved_motion import ImprovedMotionDetector from frigate.motion.improved_motion import ImprovedMotionDetector
from frigate.object_detection import RemoteObjectDetector from frigate.object_detection import RemoteObjectDetector
from frigate.ptz.autotrack import ptz_moving_at_frame_time
from frigate.track import ObjectTracker from frigate.track import ObjectTracker
from frigate.track.norfair_tracker import NorfairTracker from frigate.track.norfair_tracker import NorfairTracker
from frigate.types import PTZMetricsTypes from frigate.types import PTZMetricsTypes
@ -777,19 +776,8 @@ def process_frames(
logger.info(f"{camera_name}: frame {frame_time} is not in memory store.") logger.info(f"{camera_name}: frame {frame_time} is not in memory store.")
continue continue
# look for motion if enabled and ptz is not moving # look for motion if enabled
# ptz_moving_at_frame_time() always returns False for motion_boxes = motion_detector.detect(frame) if motion_enabled.value else []
# non ptz/autotracking cameras
motion_boxes = (
motion_detector.detect(frame)
if motion_enabled.value
and not ptz_moving_at_frame_time(
frame_time,
ptz_metrics["ptz_start_time"].value,
ptz_metrics["ptz_stop_time"].value,
)
else []
)
regions = [] regions = []
consolidated_detections = [] consolidated_detections = []
@ -814,8 +802,10 @@ def process_frames(
) )
# and it hasn't disappeared # and it hasn't disappeared
and object_tracker.disappeared[obj["id"]] == 0 and object_tracker.disappeared[obj["id"]] == 0
# and it doesn't overlap with any current motion boxes # and it doesn't overlap with any current motion boxes when not calibrating
and not intersects_any(obj["box"], motion_boxes) and not intersects_any(
obj["box"], [] if motion_detector.is_calibrating() else motion_boxes
)
] ]
# get tracked object boxes that aren't stationary # get tracked object boxes that aren't stationary
@ -825,7 +815,10 @@ def process_frames(
if obj["id"] not in stationary_object_ids if obj["id"] not in stationary_object_ids
] ]
combined_boxes = motion_boxes + tracked_object_boxes combined_boxes = tracked_object_boxes
# only add in the motion boxes when not calibrating
if not motion_detector.is_calibrating():
combined_boxes += motion_boxes
cluster_candidates = get_cluster_candidates( cluster_candidates = get_cluster_candidates(
frame_shape, region_min_size, combined_boxes frame_shape, region_min_size, combined_boxes