forked from blakeblackshear/frigate
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Deepstack/CodeProject-AI.Server detector plugin (blakeblackshear#…
…6143) * Add Deepstack detector plugin with configurable API URL, timeout, and API key * Update DeepStack plugin to recognize 'truck' as 'car' for label indexing * Add debug logging to DeepStack plugin for better monitoring and troubleshooting * Refactor DeepStack label loading from file to use merged labelmap * Black format * add documentation draft * fix link to codeproject website * Apply suggestions from code review Co-authored-by: Nicolas Mowen <[email protected]> --------- Co-authored-by: Nicolas Mowen <[email protected]>
- Loading branch information
1 parent
0751358
commit ede1ded
Showing
2 changed files
with
100 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
import logging | ||
import numpy as np | ||
import requests | ||
import io | ||
|
||
from frigate.detectors.detection_api import DetectionApi | ||
from frigate.detectors.detector_config import BaseDetectorConfig | ||
from typing import Literal | ||
from pydantic import Extra, Field | ||
from PIL import Image | ||
|
||
|
||
logger = logging.getLogger(__name__) | ||
|
||
DETECTOR_KEY = "deepstack" | ||
|
||
|
||
class DeepstackDetectorConfig(BaseDetectorConfig): | ||
type: Literal[DETECTOR_KEY] | ||
api_url: str = Field( | ||
default="https://localhost:80/v1/vision/detection", title="DeepStack API URL" | ||
) | ||
api_timeout: float = Field(default=0.1, title="DeepStack API timeout (in seconds)") | ||
api_key: str = Field(default="", title="DeepStack API key (if required)") | ||
|
||
|
||
class DeepStack(DetectionApi): | ||
type_key = DETECTOR_KEY | ||
|
||
def __init__(self, detector_config: DeepstackDetectorConfig): | ||
self.api_url = detector_config.api_url | ||
self.api_timeout = detector_config.api_timeout | ||
self.api_key = detector_config.api_key | ||
self.labels = detector_config.model.merged_labelmap | ||
|
||
self.h = detector_config.model.height | ||
self.w = detector_config.model.width | ||
|
||
def get_label_index(self, label_value): | ||
if label_value.lower() == "truck": | ||
label_value = "car" | ||
for index, value in self.labels.items(): | ||
if value == label_value.lower(): | ||
return index | ||
return -1 | ||
|
||
def detect_raw(self, tensor_input): | ||
image_data = np.squeeze(tensor_input).astype(np.uint8) | ||
image = Image.fromarray(image_data) | ||
with io.BytesIO() as output: | ||
image.save(output, format="JPEG") | ||
image_bytes = output.getvalue() | ||
data = {"api_key": self.api_key} | ||
response = requests.post( | ||
self.api_url, files={"image": image_bytes}, timeout=self.api_timeout | ||
) | ||
response_json = response.json() | ||
detections = np.zeros((20, 6), np.float32) | ||
|
||
for i, detection in enumerate(response_json["predictions"]): | ||
logger.debug(f"Response: {detection}") | ||
if detection["confidence"] < 0.4: | ||
logger.debug(f"Break due to confidence < 0.4") | ||
break | ||
label = self.get_label_index(detection["label"]) | ||
if label < 0: | ||
logger.debug(f"Break due to unknown label") | ||
break | ||
detections[i] = [ | ||
label, | ||
float(detection["confidence"]), | ||
detection["y_min"] / self.h, | ||
detection["x_min"] / self.w, | ||
detection["y_max"] / self.h, | ||
detection["x_max"] / self.w, | ||
] | ||
|
||
return detections |