mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-06 05:27:44 +03:00
backend rename
This commit is contained in:
parent
b7333557a1
commit
3dcef62271
@ -619,37 +619,39 @@ def get_sub_labels(split_joined: Optional[int] = None):
|
|||||||
return JSONResponse(content=sub_labels)
|
return JSONResponse(content=sub_labels)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/identifiers")
|
@router.get("/recognized_license_plates")
|
||||||
def get_identifiers(split_joined: Optional[int] = None):
|
def get_recognized_license_plates(split_joined: Optional[int] = None):
|
||||||
try:
|
try:
|
||||||
events = Event.select(Event.data).distinct()
|
events = Event.select(Event.data).distinct()
|
||||||
except Exception:
|
except Exception:
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
content=({"success": False, "message": "Failed to get identifiers"}),
|
content=(
|
||||||
|
{"success": False, "message": "Failed to get recognized license plates"}
|
||||||
|
),
|
||||||
status_code=404,
|
status_code=404,
|
||||||
)
|
)
|
||||||
|
|
||||||
identifiers = []
|
recognized_license_plates = []
|
||||||
for e in events:
|
for e in events:
|
||||||
if e.data is not None and "identifier" in e.data:
|
if e.data is not None and "recognized_license_plate" in e.data:
|
||||||
identifiers.append(e.data["identifier"])
|
recognized_license_plates.append(e.data["recognized_license_plate"])
|
||||||
|
|
||||||
while None in identifiers:
|
while None in recognized_license_plates:
|
||||||
identifiers.remove(None)
|
recognized_license_plates.remove(None)
|
||||||
|
|
||||||
if split_joined:
|
if split_joined:
|
||||||
original_identifiers = identifiers.copy()
|
original_recognized_license_plates = recognized_license_plates.copy()
|
||||||
for identifier in original_identifiers:
|
for recognized_license_plate in original_recognized_license_plates:
|
||||||
if identifier and "," in identifier:
|
if recognized_license_plate and "," in recognized_license_plate:
|
||||||
identifiers.remove(identifier)
|
recognized_license_plates.remove(recognized_license_plate)
|
||||||
parts = identifier.split(",")
|
parts = recognized_license_plate.split(",")
|
||||||
for part in parts:
|
for part in parts:
|
||||||
if part.strip() not in identifiers:
|
if part.strip() not in recognized_license_plates:
|
||||||
identifiers.append(part.strip())
|
recognized_license_plates.append(part.strip())
|
||||||
|
|
||||||
identifiers = list(set(identifiers))
|
recognized_license_plates = list(set(recognized_license_plates))
|
||||||
identifiers.sort()
|
recognized_license_plates.sort()
|
||||||
return JSONResponse(content=identifiers)
|
return JSONResponse(content=recognized_license_plates)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/timeline")
|
@router.get("/timeline")
|
||||||
|
|||||||
@ -27,7 +27,7 @@ class EventsQueryParams(BaseModel):
|
|||||||
max_score: Optional[float] = None
|
max_score: Optional[float] = None
|
||||||
min_speed: Optional[float] = None
|
min_speed: Optional[float] = None
|
||||||
max_speed: Optional[float] = None
|
max_speed: Optional[float] = None
|
||||||
identifier: Optional[str] = "all"
|
recognized_license_plate: Optional[str] = "all"
|
||||||
is_submitted: Optional[int] = None
|
is_submitted: Optional[int] = None
|
||||||
min_length: Optional[float] = None
|
min_length: Optional[float] = None
|
||||||
max_length: Optional[float] = None
|
max_length: Optional[float] = None
|
||||||
@ -56,7 +56,7 @@ class EventsSearchQueryParams(BaseModel):
|
|||||||
max_score: Optional[float] = None
|
max_score: Optional[float] = None
|
||||||
min_speed: Optional[float] = None
|
min_speed: Optional[float] = None
|
||||||
max_speed: Optional[float] = None
|
max_speed: Optional[float] = None
|
||||||
identifier: Optional[str] = "all"
|
recognized_license_plate: Optional[str] = "all"
|
||||||
sort: Optional[str] = None
|
sort: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -101,7 +101,7 @@ def events(params: EventsQueryParams = Depends()):
|
|||||||
min_length = params.min_length
|
min_length = params.min_length
|
||||||
max_length = params.max_length
|
max_length = params.max_length
|
||||||
event_id = params.event_id
|
event_id = params.event_id
|
||||||
identifier = params.identifier
|
recognized_license_plate = params.recognized_license_plate
|
||||||
|
|
||||||
sort = params.sort
|
sort = params.sort
|
||||||
|
|
||||||
@ -159,31 +159,44 @@ def events(params: EventsQueryParams = Depends()):
|
|||||||
sub_label_clause = reduce(operator.or_, sub_label_clauses)
|
sub_label_clause = reduce(operator.or_, sub_label_clauses)
|
||||||
clauses.append((sub_label_clause))
|
clauses.append((sub_label_clause))
|
||||||
|
|
||||||
if identifier != "all":
|
if recognized_license_plate != "all":
|
||||||
# use matching so joined identifiers are included
|
# use matching so joined recognized_license_plates are included
|
||||||
# for example an identifier 'ABC123' would get events
|
# for example a recognized license plate 'ABC123' would get events
|
||||||
# with identifiers 'ABC123' and 'ABC123, XYZ789'
|
# with recognized license plates 'ABC123' and 'ABC123, XYZ789'
|
||||||
identifier_clauses = []
|
recognized_license_plate_clauses = []
|
||||||
filtered_identifiers = identifier.split(",")
|
filtered_recognized_license_plates = recognized_license_plate.split(",")
|
||||||
|
|
||||||
if "None" in filtered_identifiers:
|
if "None" in filtered_recognized_license_plates:
|
||||||
filtered_identifiers.remove("None")
|
filtered_recognized_license_plates.remove("None")
|
||||||
identifier_clauses.append((Event.data["identifier"].is_null()))
|
recognized_license_plate_clauses.append(
|
||||||
|
(Event.data["recognized_license_plate"].is_null())
|
||||||
|
)
|
||||||
|
|
||||||
for identifier in filtered_identifiers:
|
for recognized_license_plate in filtered_recognized_license_plates:
|
||||||
# Exact matching plus list inclusion
|
# Exact matching plus list inclusion
|
||||||
identifier_clauses.append(
|
recognized_license_plate_clauses.append(
|
||||||
(Event.data["identifier"].cast("text") == identifier)
|
(
|
||||||
|
Event.data["recognized_license_plate"].cast("text")
|
||||||
|
== recognized_license_plate
|
||||||
|
)
|
||||||
)
|
)
|
||||||
identifier_clauses.append(
|
recognized_license_plate_clauses.append(
|
||||||
(Event.data["identifier"].cast("text") % f"*{identifier},*")
|
(
|
||||||
|
Event.data["recognized_license_plate"].cast("text")
|
||||||
|
% f"*{recognized_license_plate},*"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
identifier_clauses.append(
|
recognized_license_plate_clauses.append(
|
||||||
(Event.data["identifier"].cast("text") % f"*, {identifier}*")
|
(
|
||||||
|
Event.data["recognized_license_plate"].cast("text")
|
||||||
|
% f"*, {recognized_license_plate}*"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
identifier_clause = reduce(operator.or_, identifier_clauses)
|
recognized_license_plate_clause = reduce(
|
||||||
clauses.append((identifier_clause))
|
operator.or_, recognized_license_plate_clauses
|
||||||
|
)
|
||||||
|
clauses.append((recognized_license_plate_clause))
|
||||||
|
|
||||||
if zones != "all":
|
if zones != "all":
|
||||||
# use matching so events with multiple zones
|
# use matching so events with multiple zones
|
||||||
@ -367,8 +380,8 @@ def events_explore(limit: int = 10):
|
|||||||
"average_estimated_speed",
|
"average_estimated_speed",
|
||||||
"velocity_angle",
|
"velocity_angle",
|
||||||
"path_data",
|
"path_data",
|
||||||
"identifier",
|
"recognized_license_plate",
|
||||||
"identifier_score",
|
"recognized_license_plate_score",
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"event_count": label_counts[event.label],
|
"event_count": label_counts[event.label],
|
||||||
@ -426,7 +439,7 @@ def events_search(request: Request, params: EventsSearchQueryParams = Depends())
|
|||||||
has_clip = params.has_clip
|
has_clip = params.has_clip
|
||||||
has_snapshot = params.has_snapshot
|
has_snapshot = params.has_snapshot
|
||||||
is_submitted = params.is_submitted
|
is_submitted = params.is_submitted
|
||||||
identifier = params.identifier
|
recognized_license_plate = params.recognized_license_plate
|
||||||
|
|
||||||
# for similarity search
|
# for similarity search
|
||||||
event_id = params.event_id
|
event_id = params.event_id
|
||||||
@ -496,31 +509,44 @@ def events_search(request: Request, params: EventsSearchQueryParams = Depends())
|
|||||||
|
|
||||||
event_filters.append((reduce(operator.or_, zone_clauses)))
|
event_filters.append((reduce(operator.or_, zone_clauses)))
|
||||||
|
|
||||||
if identifier != "all":
|
if recognized_license_plate != "all":
|
||||||
# use matching so joined identifiers are included
|
# use matching so joined recognized_license_plates are included
|
||||||
# for example an identifier 'ABC123' would get events
|
# for example an recognized_license_plate 'ABC123' would get events
|
||||||
# with identifiers 'ABC123' and 'ABC123, XYZ789'
|
# with recognized_license_plates 'ABC123' and 'ABC123, XYZ789'
|
||||||
identifier_clauses = []
|
recognized_license_plate_clauses = []
|
||||||
filtered_identifiers = identifier.split(",")
|
filtered_recognized_license_plates = recognized_license_plate.split(",")
|
||||||
|
|
||||||
if "None" in filtered_identifiers:
|
if "None" in filtered_recognized_license_plates:
|
||||||
filtered_identifiers.remove("None")
|
filtered_recognized_license_plates.remove("None")
|
||||||
identifier_clauses.append((Event.data["identifier"].is_null()))
|
recognized_license_plate_clauses.append(
|
||||||
|
(Event.data["recognized_license_plate"].is_null())
|
||||||
|
)
|
||||||
|
|
||||||
for identifier in filtered_identifiers:
|
for recognized_license_plate in filtered_recognized_license_plates:
|
||||||
# Exact matching plus list inclusion
|
# Exact matching plus list inclusion
|
||||||
identifier_clauses.append(
|
recognized_license_plate_clauses.append(
|
||||||
(Event.data["identifier"].cast("text") == identifier)
|
(
|
||||||
|
Event.data["recognized_license_plate"].cast("text")
|
||||||
|
== recognized_license_plate
|
||||||
|
)
|
||||||
)
|
)
|
||||||
identifier_clauses.append(
|
recognized_license_plate_clauses.append(
|
||||||
(Event.data["identifier"].cast("text") % f"*{identifier},*")
|
(
|
||||||
|
Event.data["recognized_license_plate"].cast("text")
|
||||||
|
% f"*{recognized_license_plate},*"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
identifier_clauses.append(
|
recognized_license_plate_clauses.append(
|
||||||
(Event.data["identifier"].cast("text") % f"*, {identifier}*")
|
(
|
||||||
|
Event.data["recognized_license_plate"].cast("text")
|
||||||
|
% f"*, {recognized_license_plate}*"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
identifier_clause = reduce(operator.or_, identifier_clauses)
|
recognized_license_plate_clause = reduce(
|
||||||
event_filters.append((identifier_clause))
|
operator.or_, recognized_license_plate_clauses
|
||||||
|
)
|
||||||
|
event_filters.append((recognized_license_plate_clause))
|
||||||
|
|
||||||
if after:
|
if after:
|
||||||
event_filters.append((Event.start_time > after))
|
event_filters.append((Event.start_time > after))
|
||||||
@ -683,8 +709,8 @@ def events_search(request: Request, params: EventsSearchQueryParams = Depends())
|
|||||||
"average_estimated_speed",
|
"average_estimated_speed",
|
||||||
"velocity_angle",
|
"velocity_angle",
|
||||||
"path_data",
|
"path_data",
|
||||||
"identifier",
|
"recognized_license_plate",
|
||||||
"identifier_score",
|
"recognized_license_plate_score",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -141,8 +141,11 @@ class CameraState:
|
|||||||
if (
|
if (
|
||||||
obj.get("sub_label") and is_label_printable(obj["sub_label"][0])
|
obj.get("sub_label") and is_label_printable(obj["sub_label"][0])
|
||||||
)
|
)
|
||||||
else obj.get("identifier", [None])[0]
|
else obj.get("recognized_license_plate", [None])[0]
|
||||||
if (obj.get("identifier") and obj["identifier"][0])
|
if (
|
||||||
|
obj.get("recognized_license_plate")
|
||||||
|
and obj["recognized_license_plate"][0]
|
||||||
|
)
|
||||||
else obj["label"]
|
else obj["label"]
|
||||||
)
|
)
|
||||||
draw_box_with_label(
|
draw_box_with_label(
|
||||||
|
|||||||
@ -14,7 +14,7 @@ class EventMetadataTypeEnum(str, Enum):
|
|||||||
manual_event_end = "manual_event_end"
|
manual_event_end = "manual_event_end"
|
||||||
regenerate_description = "regenerate_description"
|
regenerate_description = "regenerate_description"
|
||||||
sub_label = "sub_label"
|
sub_label = "sub_label"
|
||||||
identifier = "identifier"
|
recognized_license_plate = "recognized_license_plate"
|
||||||
|
|
||||||
|
|
||||||
class EventMetadataPublisher(Publisher):
|
class EventMetadataPublisher(Publisher):
|
||||||
|
|||||||
@ -1064,7 +1064,8 @@ class LicensePlateProcessingMixin:
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.sub_label_publisher.publish(
|
self.sub_label_publisher.publish(
|
||||||
EventMetadataTypeEnum.identifier, (id, top_plate, avg_confidence)
|
EventMetadataTypeEnum.recognized_license_plate,
|
||||||
|
(id, top_plate, avg_confidence),
|
||||||
)
|
)
|
||||||
|
|
||||||
self.detected_license_plates[id] = {
|
self.detected_license_plates[id] = {
|
||||||
|
|||||||
@ -27,7 +27,8 @@ def should_update_db(prev_event: Event, current_event: Event) -> bool:
|
|||||||
or prev_event["average_estimated_speed"]
|
or prev_event["average_estimated_speed"]
|
||||||
!= current_event["average_estimated_speed"]
|
!= current_event["average_estimated_speed"]
|
||||||
or prev_event["velocity_angle"] != current_event["velocity_angle"]
|
or prev_event["velocity_angle"] != current_event["velocity_angle"]
|
||||||
or prev_event["identifier"] != current_event["identifier"]
|
or prev_event["recognized_license_plate"]
|
||||||
|
!= current_event["recognized_license_plate"]
|
||||||
or prev_event["path_data"] != current_event["path_data"]
|
or prev_event["path_data"] != current_event["path_data"]
|
||||||
):
|
):
|
||||||
return True
|
return True
|
||||||
@ -227,10 +228,14 @@ class EventProcessor(threading.Thread):
|
|||||||
event[Event.sub_label] = event_data["sub_label"][0]
|
event[Event.sub_label] = event_data["sub_label"][0]
|
||||||
event[Event.data]["sub_label_score"] = event_data["sub_label"][1]
|
event[Event.data]["sub_label_score"] = event_data["sub_label"][1]
|
||||||
|
|
||||||
# only overwrite the identifier in the database if it's set
|
# only overwrite the recognized_license_plate in the database if it's set
|
||||||
if event_data.get("identifier") is not None:
|
if event_data.get("recognized_license_plate") is not None:
|
||||||
event[Event.data]["identifier"] = event_data["identifier"][0]
|
event[Event.data]["recognized_license_plate"] = event_data[
|
||||||
event[Event.data]["identifier_score"] = event_data["identifier"][1]
|
"recognized_license_plate"
|
||||||
|
][0]
|
||||||
|
event[Event.data]["recognized_license_plate_score"] = event_data[
|
||||||
|
"recognized_license_plate"
|
||||||
|
][1]
|
||||||
|
|
||||||
(
|
(
|
||||||
Event.insert(event)
|
Event.insert(event)
|
||||||
|
|||||||
@ -346,10 +346,10 @@ class TrackedObjectProcessor(threading.Thread):
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def set_identifier(
|
def set_recognized_license_plate(
|
||||||
self, event_id: str, identifier: str | None, score: float | None
|
self, event_id: str, recognized_license_plate: str | None, score: float | None
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Update identifier for given event id."""
|
"""Update recognized license plate for given event id."""
|
||||||
tracked_obj: TrackedObject = None
|
tracked_obj: TrackedObject = None
|
||||||
|
|
||||||
for state in self.camera_states.values():
|
for state in self.camera_states.values():
|
||||||
@ -367,15 +367,18 @@ class TrackedObjectProcessor(threading.Thread):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if tracked_obj:
|
if tracked_obj:
|
||||||
tracked_obj.obj_data["identifier"] = (identifier, score)
|
tracked_obj.obj_data["recognized_license_plate"] = (
|
||||||
|
recognized_license_plate,
|
||||||
|
score,
|
||||||
|
)
|
||||||
|
|
||||||
if event:
|
if event:
|
||||||
data = event.data
|
data = event.data
|
||||||
data["identifier"] = identifier
|
data["recognized_license_plate"] = recognized_license_plate
|
||||||
if identifier is None:
|
if recognized_license_plate is None:
|
||||||
data["identifier_score"] = None
|
data["recognized_license_plate_score"] = None
|
||||||
elif score is not None:
|
elif score is not None:
|
||||||
data["identifier_score"] = score
|
data["recognized_license_plate_score"] = score
|
||||||
event.data = data
|
event.data = data
|
||||||
event.save()
|
event.save()
|
||||||
|
|
||||||
@ -542,9 +545,11 @@ class TrackedObjectProcessor(threading.Thread):
|
|||||||
if topic.endswith(EventMetadataTypeEnum.sub_label.value):
|
if topic.endswith(EventMetadataTypeEnum.sub_label.value):
|
||||||
(event_id, sub_label, score) = payload
|
(event_id, sub_label, score) = payload
|
||||||
self.set_sub_label(event_id, sub_label, score)
|
self.set_sub_label(event_id, sub_label, score)
|
||||||
if topic.endswith(EventMetadataTypeEnum.identifier.value):
|
if topic.endswith(EventMetadataTypeEnum.recognized_license_plate.value):
|
||||||
(event_id, identifier, score) = payload
|
(event_id, recognized_license_plate, score) = payload
|
||||||
self.set_identifier(event_id, identifier, score)
|
self.set_recognized_license_plate(
|
||||||
|
event_id, recognized_license_plate, score
|
||||||
|
)
|
||||||
elif topic.endswith(EventMetadataTypeEnum.manual_event_create.value):
|
elif topic.endswith(EventMetadataTypeEnum.manual_event_create.value):
|
||||||
self.create_manual_event(payload)
|
self.create_manual_event(payload)
|
||||||
elif topic.endswith(EventMetadataTypeEnum.manual_event_end.value):
|
elif topic.endswith(EventMetadataTypeEnum.manual_event_end.value):
|
||||||
|
|||||||
@ -153,8 +153,12 @@ class TrackedObject:
|
|||||||
"current_estimated_speed": self.current_estimated_speed,
|
"current_estimated_speed": self.current_estimated_speed,
|
||||||
"velocity_angle": self.velocity_angle,
|
"velocity_angle": self.velocity_angle,
|
||||||
"path_data": self.path_data,
|
"path_data": self.path_data,
|
||||||
"identifier": obj_data.get("identifier"),
|
"recognized_license_plate": obj_data.get(
|
||||||
"identifier_score": obj_data.get("identifier_score"),
|
"recognized_license_plate"
|
||||||
|
),
|
||||||
|
"recognized_license_plate_score": obj_data.get(
|
||||||
|
"recognized_license_plate_score"
|
||||||
|
),
|
||||||
}
|
}
|
||||||
thumb_update = True
|
thumb_update = True
|
||||||
|
|
||||||
@ -367,7 +371,7 @@ class TrackedObject:
|
|||||||
"average_estimated_speed": self.average_estimated_speed,
|
"average_estimated_speed": self.average_estimated_speed,
|
||||||
"velocity_angle": self.velocity_angle,
|
"velocity_angle": self.velocity_angle,
|
||||||
"path_data": self.path_data,
|
"path_data": self.path_data,
|
||||||
"identifier": self.obj_data.get("identifier"),
|
"recognized_license_plate": self.obj_data.get("recognized_license_plate"),
|
||||||
}
|
}
|
||||||
|
|
||||||
return event
|
return event
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user