浏览代码

update events model

Blake Blackshear 4 年之前
父节点
当前提交
d67a56d37e
共有 3 个文件被更改,包括 39 次插入7 次删除
  1. 10 1
      frigate/events.py
  2. 29 3
      frigate/object_processing.py
  3. 0 3
      frigate/objects.py

+ 10 - 1
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:

+ 29 - 3
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):

+ 0 - 3
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