reduce detection rate for stationary objects

This commit is contained in:
Blake Blackshear 2021-10-30 14:01:31 -05:00
parent e36099a342
commit 75c8570913
2 changed files with 35 additions and 4 deletions

View File

@ -13,7 +13,7 @@ import numpy as np
from scipy.spatial import distance as dist from scipy.spatial import distance as dist
from frigate.config import DetectConfig from frigate.config import DetectConfig
from frigate.util import draw_box_with_label from frigate.util import intersection_over_union
class ObjectTracker: class ObjectTracker:
@ -27,6 +27,7 @@ class ObjectTracker:
id = f"{obj['frame_time']}-{rand_id}" id = f"{obj['frame_time']}-{rand_id}"
obj["id"] = id obj["id"] = id
obj["start_time"] = obj["frame_time"] obj["start_time"] = obj["frame_time"]
obj["motionless_count"] = 0
self.tracked_objects[id] = obj self.tracked_objects[id] = obj
self.disappeared[id] = 0 self.disappeared[id] = 0
@ -36,6 +37,13 @@ class ObjectTracker:
def update(self, id, new_obj): def update(self, id, new_obj):
self.disappeared[id] = 0 self.disappeared[id] = 0
if (
intersection_over_union(self.tracked_objects[id]["box"], new_obj["box"])
> 0.9
):
self.tracked_objects[id]["motionless_count"] += 1
else:
self.tracked_objects[id]["motionless_count"] = 0
self.tracked_objects[id].update(new_obj) self.tracked_objects[id].update(new_obj)
def match_and_update(self, frame_time, new_objects): def match_and_update(self, frame_time, new_objects):

View File

@ -498,9 +498,21 @@ def process_frames(
# look for motion # look for motion
motion_boxes = motion_detector.detect(frame) motion_boxes = motion_detector.detect(frame)
# only get the tracked object boxes that intersect with motion # get stationary object ids
# check every 10th frame for stationary objects
stationary_object_ids = [
obj["id"]
for obj in object_tracker.tracked_objects.values()
if obj["motionless_count"] >= 10
and obj["motionless_count"] % 10 != 0
and object_tracker.disappeared[obj["id"]] == 0
]
# get tracked object boxes that aren't stationary
tracked_object_boxes = [ tracked_object_boxes = [
obj["box"] for obj in object_tracker.tracked_objects.values() obj["box"]
for obj in object_tracker.tracked_objects.values()
if not obj["id"] in stationary_object_ids
] ]
# combine motion boxes with known locations of existing objects # combine motion boxes with known locations of existing objects
@ -513,7 +525,18 @@ def process_frames(
] ]
# resize regions and detect # resize regions and detect
detections = [] # seed with stationary objects
detections = [
(
obj["label"],
obj["score"],
obj["box"],
obj["area"],
obj["region"],
)
for obj in object_tracker.tracked_objects.values()
if obj["id"] in stationary_object_ids
]
for region in regions: for region in regions:
detections.extend( detections.extend(
detect( detect(