rework attributes to get scores

This commit is contained in:
Blake Blackshear 2023-07-09 07:52:23 -05:00
parent 5e772c3625
commit 737c763354
4 changed files with 21 additions and 14 deletions

View File

@ -63,7 +63,9 @@ Message published for each changed event. The first message is published when th
"stationary": false, // whether or not the object is considered stationary "stationary": false, // whether or not the object is considered stationary
"motionless_count": 0, // number of frames the object has been motionless "motionless_count": 0, // number of frames the object has been motionless
"position_changes": 2, // number of times the object has moved from a stationary position "position_changes": 2, // number of times the object has moved from a stationary position
"attributes": [], // set of unique attributes that have been identified on the object "attributes": {
"face": 0.64
}, // attributes with top score that have been identified on the object at any point
"current_attributes": [] // detailed data about the current attributes in this frame "current_attributes": [] // detailed data about the current attributes in this frame
}, },
"after": { "after": {
@ -90,13 +92,15 @@ Message published for each changed event. The first message is published when th
"stationary": false, // whether or not the object is considered stationary "stationary": false, // whether or not the object is considered stationary
"motionless_count": 0, // number of frames the object has been motionless "motionless_count": 0, // number of frames the object has been motionless
"position_changes": 2, // number of times the object has changed position "position_changes": 2, // number of times the object has changed position
"attributes": ["face"], // set of unique attributes that have been identified on the object "attributes": {
"face": 0.86
}, // attributes with top score that have been identified on the object at any point
"current_attributes": [ "current_attributes": [
// detailed data about the current attributes in this frame // detailed data about the current attributes in this frame
{ {
"label": "face", "label": "face",
"box": [442, 506, 534, 524], "box": [442, 506, 534, 524],
"score": 0.64 "score": 0.86
} }
] ]
} }

View File

@ -199,7 +199,8 @@ class EventProcessor(threading.Thread):
# only overwrite the sub_label in the database if it's set # only overwrite the sub_label in the database if it's set
if event_data.get("sub_label") is not None: if event_data.get("sub_label") is not None:
event[Event.sub_label] = event_data["sub_label"] event[Event.sub_label] = event_data["sub_label"][0]
event[Event.data]["sub_label_score"] = event_data["sub_label"][1]
( (
Event.insert(event) Event.insert(event)

View File

@ -38,7 +38,9 @@ class Event(Model): # type: ignore[misc]
IntegerField() IntegerField()
) # TODO remove when columns can be dropped without rebuilding table ) # TODO remove when columns can be dropped without rebuilding table
retain_indefinitely = BooleanField(default=False) retain_indefinitely = BooleanField(default=False)
ratio = FloatField(default=1.0) ratio = FloatField(
default=1.0
) # TODO remove when columns can be dropped without rebuilding table
plus_id = CharField(max_length=30) plus_id = CharField(max_length=30)
model_hash = CharField(max_length=32) model_hash = CharField(max_length=32)
detector_type = CharField(max_length=32) detector_type = CharField(max_length=32)

View File

@ -112,7 +112,7 @@ class TrackedObject:
self.zone_presence = {} self.zone_presence = {}
self.current_zones = [] self.current_zones = []
self.entered_zones = [] self.entered_zones = []
self.attributes = set() self.attributes = defaultdict(float)
self.false_positive = True self.false_positive = True
self.has_clip = False self.has_clip = False
self.has_snapshot = False self.has_snapshot = False
@ -207,15 +207,15 @@ class TrackedObject:
# maintain attributes # maintain attributes
for attr in obj_data["attributes"]: for attr in obj_data["attributes"]:
self.attributes.add(attr["label"]) if self.attributes[attr["label"]] < attr["score"]:
self.attributes[attr["label"]] = attr["score"]
# populate the sub_label for car with first logo if it exists # populate the sub_label for car with highest scoring logo
if self.obj_data["label"] == "car" and "sub_label" not in self.obj_data: if self.obj_data["label"] == "car":
recognized_logos = self.attributes.intersection( recognized_logos = {k: self.attributes[k] for k in ["ups", "fedex", "amazon"] if k in self.attributes}
set(["ups", "fedex", "amazon"])
)
if len(recognized_logos) > 0: if len(recognized_logos) > 0:
self.obj_data["sub_label"] = recognized_logos.pop() max_logo = max(recognized_logos, key=recognized_logos.get)
self.obj_data["sub_label"] = (max_logo, recognized_logos[max_logo])
# check for significant change # check for significant change
if not self.false_positive: if not self.false_positive:
@ -274,7 +274,7 @@ class TrackedObject:
"entered_zones": self.entered_zones.copy(), "entered_zones": self.entered_zones.copy(),
"has_clip": self.has_clip, "has_clip": self.has_clip,
"has_snapshot": self.has_snapshot, "has_snapshot": self.has_snapshot,
"attributes": list(self.attributes), "attributes": self.attributes,
"current_attributes": self.obj_data["attributes"], "current_attributes": self.obj_data["attributes"],
} }