From d67a56d37ef203aacb095903e3ad32a27c84d150 Mon Sep 17 00:00:00 2001 From: Blake Blackshear Date: Sat, 24 Oct 2020 09:49:13 -0500 Subject: [PATCH] update events model --- frigate/events.py | 11 ++++++++++- frigate/object_processing.py | 32 +++++++++++++++++++++++++++++--- frigate/objects.py | 3 --- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/frigate/events.py b/frigate/events.py index 6b4785c3f..ed2dfb473 100644 --- a/frigate/events.py +++ b/frigate/events.py @@ -135,7 +135,16 @@ class EventProcessor(threading.Thread): return with open(f"{os.path.join(self.clip_dir, clip_name)}.json", 'w') as outfile: - json.dump(event_data, outfile) + json.dump({ + 'id': event_data['id'], + 'label': event_data['label'], + 'camera': camera, + 'start_time': event_data['start_time'], + 'end_time': event_data['end_time'], + 'top_score': event_data['top_score'], + 'false_positive': event_data['false_positive'], + 'zones': list(event_data['entered_zones']) + }, outfile) def run(self): while True: diff --git a/frigate/object_processing.py b/frigate/object_processing.py index 669ef1418..892ecc338 100644 --- a/frigate/object_processing.py +++ b/frigate/object_processing.py @@ -135,12 +135,14 @@ class CameraState(): for id in new_ids: self.tracked_objects[id] = tracked_objects[id] self.tracked_objects[id]['zones'] = [] + self.tracked_objects[id]['entered_zones'] = set() # start the score history self.tracked_objects[id]['score_history'] = [self.tracked_objects[id]['score']] # calculate if this is a false positive self.tracked_objects[id]['computed_score'] = self.compute_score(self.tracked_objects[id]) + self.tracked_objects[id]['top_score'] = self.tracked_objects[id]['computed_score'] self.tracked_objects[id]['false_positive'] = self.false_positive(self.tracked_objects[id]) # call event handlers @@ -160,7 +162,10 @@ class CameraState(): self.tracked_objects[id]['score_history'] = self.tracked_objects[id]['score_history'][-10:] # calculate if this is a false positive - self.tracked_objects[id]['computed_score'] = self.compute_score(self.tracked_objects[id]) + computed_score = self.compute_score(self.tracked_objects[id]) + self.tracked_objects[id]['computed_score'] = computed_score + if computed_score > self.tracked_objects[id]['top_score']: + self.tracked_objects[id]['top_score'] = computed_score self.tracked_objects[id]['false_positive'] = self.false_positive(self.tracked_objects[id]) # call event handlers @@ -186,6 +191,8 @@ class CameraState(): # if the object passed the filters once, dont apply again if name in obj.get('zones', []) or not zone_filtered(obj, zone.get('filters', {})): current_zones.append(name) + obj['entered_zones'].add(name) + obj['zones'] = current_zones @@ -255,14 +262,33 @@ class TrackedObjectProcessor(threading.Thread): def start(camera, obj): # publish events to mqtt - self.client.publish(f"{self.topic_prefix}/{camera}/events/start", json.dumps(obj), retain=False) + event_data = { + 'id': obj['id'], + 'label': obj['label'], + 'camera': camera, + 'start_time': obj['start_time'], + 'top_score': obj['top_score'], + 'false_positive': obj['false_positive'], + 'zones': list(obj['entered_zones']) + } + self.client.publish(f"{self.topic_prefix}/{camera}/events/start", json.dumps(event_data), retain=False) self.event_queue.put(('start', camera, obj)) def update(camera, obj): pass def end(camera, obj): - self.client.publish(f"{self.topic_prefix}/{camera}/events/end", json.dumps(obj), retain=False) + event_data = { + 'id': obj['id'], + 'label': obj['label'], + 'camera': camera, + 'start_time': obj['start_time'], + 'end_time': obj['end_time'], + 'top_score': obj['top_score'], + 'false_positive': obj['false_positive'], + 'zones': list(obj['entered_zones']) + } + self.client.publish(f"{self.topic_prefix}/{camera}/events/end", json.dumps(event_data), retain=False) self.event_queue.put(('end', camera, obj)) def snapshot(camera, obj): diff --git a/frigate/objects.py b/frigate/objects.py index f083d5a5b..83cd46e0a 100644 --- a/frigate/objects.py +++ b/frigate/objects.py @@ -23,7 +23,6 @@ class ObjectTracker(): id = f"{obj['frame_time']}-{rand_id}" obj['id'] = id obj['start_time'] = obj['frame_time'] - obj['top_score'] = obj['score'] self.tracked_objects[id] = obj self.disappeared[id] = 0 @@ -34,8 +33,6 @@ class ObjectTracker(): def update(self, id, new_obj): self.disappeared[id] = 0 self.tracked_objects[id].update(new_obj) - if self.tracked_objects[id]['score'] > self.tracked_objects[id]['top_score']: - self.tracked_objects[id]['top_score'] = self.tracked_objects[id]['score'] def match_and_update(self, frame_time, new_objects): # group by name