From 3d2f1437e4a5ab70078d36180554b9a7cb5b078a Mon Sep 17 00:00:00 2001 From: Blake Blackshear Date: Sat, 11 Jul 2020 09:54:04 -0500 Subject: [PATCH] filter objects before triggering events --- config/config.example.yml | 3 +++ frigate/object_processing.py | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/config/config.example.yml b/config/config.example.yml index 0975ce2df..e39916884 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -116,6 +116,9 @@ cameras: # from the video stream without re-encoding. Clips are them created by using ffmpeg to merge segments # without re-encoding. The segements saved are unaltered from what frigate receives to avoid re-encoding. # They do not contain bounding boxes. 30 seconds of video is added to the start of the clip. + # + # NOTE: This will only work for camera feeds that can be copied into the mp4 container format without + # encoding such as h264. I do not expect this to work for mjpeg streams. ################ save_clips: False diff --git a/frigate/object_processing.py b/frigate/object_processing.py index ec5a02154..f5bc7911f 100644 --- a/frigate/object_processing.py +++ b/frigate/object_processing.py @@ -22,6 +22,11 @@ COLOR_MAP = {} for key, val in LABELS.items(): COLOR_MAP[val] = tuple(int(round(255 * c)) for c in cmap(key)[:3]) +def filter_false_positives(event): + if len(event['history']) < 2: + return True + return False + class TrackedObjectProcessor(threading.Thread): def __init__(self, config, client, topic_prefix, tracked_objects_queue, event_queue): threading.Thread.__init__(self) @@ -65,10 +70,12 @@ class TrackedObjectProcessor(threading.Thread): updated_ids = list(set(current_ids).intersection(previous_ids)) for id in new_ids: - tracked_objects[id] = current_tracked_objects[id] - # publish events to mqtt - self.client.publish(f"{self.topic_prefix}/{camera}/events/start", json.dumps(tracked_objects[id]), retain=False) - self.event_queue.put(('start', camera, tracked_objects[id])) + # only register the object here if we are sure it isnt a false positive + if not filter_false_positives(current_tracked_objects[id]): + tracked_objects[id] = current_tracked_objects[id] + # publish events to mqtt + self.client.publish(f"{self.topic_prefix}/{camera}/events/start", json.dumps(tracked_objects[id]), retain=False) + self.event_queue.put(('start', camera, tracked_objects[id])) for id in updated_ids: tracked_objects[id] = current_tracked_objects[id] @@ -139,11 +146,10 @@ class TrackedObjectProcessor(threading.Thread): ### # Report over MQTT ### - # count objects with more than 2 entries in history by type + # count objects by type obj_counter = Counter() for obj in tracked_objects.values(): - if len(obj['history']) > 1: - obj_counter[obj['label']] += 1 + obj_counter[obj['label']] += 1 # report on detected objects for obj_name, count in obj_counter.items():