Add more vehicle types to default attribute map (#24097)
CI / AMD64 Build (push) Canceled after 0s
CI / ARM Build (push) Canceled after 0s
CI / Jetson Jetpack 6 (push) Canceled after 0s
CI / AMD64 Extra Build (push) Canceled after 0s
CI / ARM Extra Build (push) Canceled after 0s
CI / Synaptics Build (push) Canceled after 0s
CI / Assemble and push default build (push) Canceled after 0s

* run lpr on more vehicle types by default

before, a config change to attribute_map was required

* logging tweaks

* remove arg

* use attributes for frontend check

* docs

* only check thumbnail attributes the object can have
This commit is contained in:
Josh Hawkins
2026-08-26 08:23:15 -06:00
committed by GitHub
parent 18c77faea5
commit 5197881ef7
9 changed files with 47 additions and 46 deletions
+7 -2
View File
@@ -60,6 +60,11 @@ class CameraState:
# face/LPR pipelines when using a model without built-in detection.
self.face_recognition_min_obj_area: int = 0
self.lpr_min_obj_area: int = 0
self.lp_objects = {
label
for label, attributes in config.model.attributes_map.items()
if "license_plate" in attributes
}
if (
self.camera_config.face_recognition.enabled
@@ -452,7 +457,7 @@ class CameraState:
and obj_area >= self.face_recognition_min_obj_area
and updated_obj.obj_data.get("sub_label") is None
) or (
obj_label in ("car", "motorcycle")
obj_label in self.lp_objects
and self.lpr_min_obj_area > 0
and obj_area >= self.lpr_min_obj_area
and updated_obj.obj_data.get("sub_label") is None
@@ -548,7 +553,7 @@ class CameraState:
current_best.thumbnail_data is not None
and obj.thumbnail_data is not None
and is_better_thumbnail(
object_type,
obj.thumbnail_attributes,
current_best.thumbnail_data,
obj.thumbnail_data,
self.camera_config.frame_shape,
+4
View File
@@ -44,7 +44,11 @@ DEFAULT_ATTRIBUTE_LABEL_MAP = {
"ups",
"usps",
],
"truck": ["license_plate"],
"garbage_truck": ["license_plate"],
"motorcycle": ["license_plate"],
"bus": ["license_plate"],
"school_bus": ["license_plate"],
}
ATTRIBUTE_LABEL_DISPLAY_MAP = {
"amazon": "Amazon",
@@ -1290,7 +1290,7 @@ class LicensePlateProcessingMixin:
and obj_data.get("label") != "license_plate"
):
logger.debug(
f"{camera}: Not a processing license plate for non car/motorcycle object."
f"{camera}: Not a processing license plate for {obj_data.get('label', 'unknown')}."
)
return
@@ -1367,7 +1367,7 @@ class LicensePlateProcessingMixin:
if not license_plate:
logger.debug(
f"{camera}: Detected no license plates for car/motorcycle object."
f"{camera}: Detected no license plates for {obj_data.get('label', 'unknown')} object."
)
return
+6 -1
View File
@@ -54,6 +54,11 @@ class TrackedObject:
self.obj_data = obj_data
self.colormap = model_config.colormap
self.logos = model_config.all_attribute_logos
self.thumbnail_attributes = [
attr
for attr in model_config.attributes_map.get(obj_data["label"], [])
if attr in model_config.non_logo_attributes
]
self.camera_config = camera_config
self.ui_config = ui_config
self.frame_cache = frame_cache
@@ -149,7 +154,7 @@ class TrackedObject:
if not self.false_positive and has_valid_frame:
# determine if this frame is a better thumbnail
if self.thumbnail_data is None or is_better_thumbnail(
self.obj_data["label"],
self.thumbnail_attributes,
self.thumbnail_data,
obj_data,
self.camera_config.frame_shape,
+5 -13
View File
@@ -67,7 +67,7 @@ def has_better_attr(current_thumb, new_obj, attr_label) -> bool:
def is_better_thumbnail(
label: str,
label_attributes: list[str],
current_thumb: dict[str, Any],
new_obj: dict[str, Any],
frame_shape: tuple[int, int],
@@ -76,20 +76,12 @@ def is_better_thumbnail(
# cutoff images are less ideal, but they should also be smaller?
# better scores are obviously better too
# check face on person
if label == "person":
if has_better_attr(current_thumb, new_obj, "face"):
for attr_label in label_attributes:
if has_better_attr(current_thumb, new_obj, attr_label):
return True
# if the current thumb has a face attr, dont update unless it gets better
if any([a["label"] == "face" for a in current_thumb["attributes"]]):
return False
# check license_plate on car
if label in ["car", "motorcycle"]:
if has_better_attr(current_thumb, new_obj, "license_plate"):
return True
# if the current thumb has a license_plate attr, dont update unless it gets better
if any([a["label"] == "license_plate" for a in current_thumb["attributes"]]):
# if the current thumb has the attr, dont update unless it gets better
if any([a["label"] == attr_label for a in current_thumb["attributes"]]):
return False
# if the new_thumb is on an edge, and the current thumb is not
+4 -14
View File
@@ -216,20 +216,10 @@ def process_frames(
# remove license_plate from attributes if this camera is a dedicated LPR cam
if camera_config.type == CameraTypeEnum.lpr:
modified_attributes_map = model_config.attributes_map.copy()
if (
"car" in modified_attributes_map
and "license_plate" in modified_attributes_map["car"]
):
modified_attributes_map["car"] = [
attr
for attr in modified_attributes_map["car"]
if attr != "license_plate"
]
attributes_map = modified_attributes_map
attributes_map = {
label: [attr for attr in attributes if attr != "license_plate"]
for label, attributes in model_config.attributes_map.items()
}
all_attributes = [
attr for attr in model_config.all_attributes if attr != "license_plate"
]