update events model

This commit is contained in:
Blake Blackshear 2020-10-24 09:49:13 -05:00
parent 070c9721b6
commit d67a56d37e
3 changed files with 39 additions and 7 deletions

View File

@ -135,7 +135,16 @@ class EventProcessor(threading.Thread):
return return
with open(f"{os.path.join(self.clip_dir, clip_name)}.json", 'w') as outfile: 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): def run(self):
while True: while True:

View File

@ -135,12 +135,14 @@ class CameraState():
for id in new_ids: for id in new_ids:
self.tracked_objects[id] = tracked_objects[id] self.tracked_objects[id] = tracked_objects[id]
self.tracked_objects[id]['zones'] = [] self.tracked_objects[id]['zones'] = []
self.tracked_objects[id]['entered_zones'] = set()
# start the score history # start the score history
self.tracked_objects[id]['score_history'] = [self.tracked_objects[id]['score']] self.tracked_objects[id]['score_history'] = [self.tracked_objects[id]['score']]
# calculate if this is a false positive # calculate if this is a false positive
self.tracked_objects[id]['computed_score'] = self.compute_score(self.tracked_objects[id]) 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]) self.tracked_objects[id]['false_positive'] = self.false_positive(self.tracked_objects[id])
# call event handlers # call event handlers
@ -160,7 +162,10 @@ class CameraState():
self.tracked_objects[id]['score_history'] = self.tracked_objects[id]['score_history'][-10:] self.tracked_objects[id]['score_history'] = self.tracked_objects[id]['score_history'][-10:]
# calculate if this is a false positive # 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]) self.tracked_objects[id]['false_positive'] = self.false_positive(self.tracked_objects[id])
# call event handlers # call event handlers
@ -186,6 +191,8 @@ class CameraState():
# if the object passed the filters once, dont apply again # if the object passed the filters once, dont apply again
if name in obj.get('zones', []) or not zone_filtered(obj, zone.get('filters', {})): if name in obj.get('zones', []) or not zone_filtered(obj, zone.get('filters', {})):
current_zones.append(name) current_zones.append(name)
obj['entered_zones'].add(name)
obj['zones'] = current_zones obj['zones'] = current_zones
@ -255,14 +262,33 @@ class TrackedObjectProcessor(threading.Thread):
def start(camera, obj): def start(camera, obj):
# publish events to mqtt # 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)) self.event_queue.put(('start', camera, obj))
def update(camera, obj): def update(camera, obj):
pass pass
def end(camera, obj): 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)) self.event_queue.put(('end', camera, obj))
def snapshot(camera, obj): def snapshot(camera, obj):

View File

@ -23,7 +23,6 @@ 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['top_score'] = obj['score']
self.tracked_objects[id] = obj self.tracked_objects[id] = obj
self.disappeared[id] = 0 self.disappeared[id] = 0
@ -34,8 +33,6 @@ class ObjectTracker():
def update(self, id, new_obj): def update(self, id, new_obj):
self.disappeared[id] = 0 self.disappeared[id] = 0
self.tracked_objects[id].update(new_obj) 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): def match_and_update(self, frame_time, new_objects):
# group by name # group by name