mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-15 15:45:27 +03:00
placeholder for non frigate+ model lp detection
This commit is contained in:
parent
e1c541735a
commit
19b688a55d
@ -75,6 +75,9 @@ class EmbeddingMaintainer(threading.Thread):
|
|||||||
|
|
||||||
# set license plate recognition conditions
|
# set license plate recognition conditions
|
||||||
self.lpr_config = self.config.lpr
|
self.lpr_config = self.config.lpr
|
||||||
|
self.requires_license_plate_detection = (
|
||||||
|
"license_plate" not in self.config.model.all_attributes
|
||||||
|
)
|
||||||
self.detected_license_plates: dict[str, dict[str, any]] = {}
|
self.detected_license_plates: dict[str, dict[str, any]] = {}
|
||||||
|
|
||||||
if self.lpr_config.enabled:
|
if self.lpr_config.enabled:
|
||||||
@ -485,6 +488,11 @@ class EmbeddingMaintainer(threading.Thread):
|
|||||||
if resp.status_code == 200:
|
if resp.status_code == 200:
|
||||||
self.detected_faces[id] = avg_score
|
self.detected_faces[id] = avg_score
|
||||||
|
|
||||||
|
def _detect_license_plate(self, input: np.ndarray) -> tuple[int, int, int, int]:
|
||||||
|
"""Return the dimensions of the input image as [x, y, width, height]."""
|
||||||
|
height, width = input.shape[:2]
|
||||||
|
return (0, 0, width, height)
|
||||||
|
|
||||||
def _process_license_plate(
|
def _process_license_plate(
|
||||||
self, obj_data: dict[str, any], frame: np.ndarray
|
self, obj_data: dict[str, any], frame: np.ndarray
|
||||||
) -> None:
|
) -> None:
|
||||||
@ -511,37 +519,61 @@ class EmbeddingMaintainer(threading.Thread):
|
|||||||
|
|
||||||
license_plate: Optional[dict[str, any]] = None
|
license_plate: Optional[dict[str, any]] = None
|
||||||
|
|
||||||
# don't run for object without attributes
|
if self.requires_license_plate_detection:
|
||||||
if not obj_data.get("current_attributes"):
|
logger.debug("Running manual license_plate detection.")
|
||||||
logger.debug("No attributes to parse.")
|
car_box = obj_data.get("box")
|
||||||
return
|
|
||||||
|
|
||||||
attributes: list[dict[str, any]] = obj_data.get("current_attributes", [])
|
if not car_box:
|
||||||
for attr in attributes:
|
return None
|
||||||
if attr.get("label") != "license_plate":
|
|
||||||
continue
|
|
||||||
|
|
||||||
if license_plate is None or attr.get("score", 0.0) > license_plate.get(
|
rgb = cv2.cvtColor(frame, cv2.COLOR_YUV2RGB_I420)
|
||||||
"score", 0.0
|
left, top, right, bottom = car_box
|
||||||
|
car = rgb[top:bottom, left:right]
|
||||||
|
license_plate = self._detect_license_plate(car)
|
||||||
|
|
||||||
|
if not license_plate:
|
||||||
|
logger.debug("Detected no license plates for car object.")
|
||||||
|
return
|
||||||
|
|
||||||
|
license_plate_frame = car[
|
||||||
|
license_plate[1] : license_plate[3], license_plate[0] : license_plate[2]
|
||||||
|
]
|
||||||
|
license_plate_frame = cv2.cvtColor(license_plate_frame, cv2.COLOR_RGB2BGR)
|
||||||
|
else:
|
||||||
|
# don't run for object without attributes
|
||||||
|
if not obj_data.get("current_attributes"):
|
||||||
|
logger.debug("No attributes to parse.")
|
||||||
|
return
|
||||||
|
|
||||||
|
attributes: list[dict[str, any]] = obj_data.get("current_attributes", [])
|
||||||
|
for attr in attributes:
|
||||||
|
if attr.get("label") != "license_plate":
|
||||||
|
continue
|
||||||
|
|
||||||
|
if license_plate is None or attr.get("score", 0.0) > license_plate.get(
|
||||||
|
"score", 0.0
|
||||||
|
):
|
||||||
|
license_plate = attr
|
||||||
|
|
||||||
|
# no license plates detected in this frame
|
||||||
|
if not license_plate:
|
||||||
|
return
|
||||||
|
|
||||||
|
license_plate_box = license_plate.get("box")
|
||||||
|
|
||||||
|
# check that license plate is valid
|
||||||
|
if (
|
||||||
|
not license_plate_box
|
||||||
|
or area(license_plate_box) < self.config.lpr.min_area
|
||||||
):
|
):
|
||||||
license_plate = attr
|
logger.debug(f"Invalid license plate box {license_plate}")
|
||||||
|
return
|
||||||
|
|
||||||
# no license plates detected in this frame
|
license_plate_frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420)
|
||||||
if not license_plate:
|
license_plate_frame = license_plate_frame[
|
||||||
return
|
license_plate_box[1] : license_plate_box[3],
|
||||||
|
license_plate_box[0] : license_plate_box[2],
|
||||||
license_plate_box = license_plate.get("box")
|
]
|
||||||
|
|
||||||
# check that license plate is valid
|
|
||||||
if not license_plate_box or area(license_plate_box) < self.config.lpr.min_area:
|
|
||||||
logger.debug(f"Invalid license plate box {license_plate}")
|
|
||||||
return
|
|
||||||
|
|
||||||
license_plate_frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420)
|
|
||||||
license_plate_frame = license_plate_frame[
|
|
||||||
license_plate_box[1] : license_plate_box[3],
|
|
||||||
license_plate_box[0] : license_plate_box[2],
|
|
||||||
]
|
|
||||||
|
|
||||||
# run detection, returns results sorted by confidence, best first
|
# run detection, returns results sorted by confidence, best first
|
||||||
license_plates, confidences, areas = (
|
license_plates, confidences, areas = (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user