mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-07-16 13:47:07 +02:00
write prompts for genai at the camera level (#13767)
This commit is contained in:
parent
06ccf7e9e9
commit
e3edcf057c
@ -124,13 +124,25 @@ genai:
|
|||||||
model: llava
|
model: llava
|
||||||
prompt: "Describe the {label} in these images from the {camera} security camera."
|
prompt: "Describe the {label} in these images from the {camera} security camera."
|
||||||
object_prompts:
|
object_prompts:
|
||||||
person: "Describe the main person in these images (gender, age, clothing, activity, etc). Do not include where the activity is occurring (sidewalk, concrete, driveway, etc). If delivering a package, include the company the package is from."
|
person: "Describe the main person in these images (gender, age, clothing, activity, etc). Do not include where the activity is occurring (sidewalk, concrete, driveway, etc)."
|
||||||
car: "Label the primary vehicle in these images with just the name of the company if it is a delivery vehicle, or the color make and model."
|
car: "Label the primary vehicle in these images with just the name of the company if it is a delivery vehicle, or the color make and model."
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Prompts can also be overriden at the camera level to provide a more detailed prompt to the model about your specific camera, if you desire.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
cameras:
|
||||||
|
front_door:
|
||||||
|
genai:
|
||||||
|
prompt: "Describe the {label} in these images from the {camera} security camera at the front door of a house, aimed outward toward the street."
|
||||||
|
object_prompts:
|
||||||
|
person: "Describe the main person in these images (gender, age, clothing, activity, etc). Do not include where the activity is occurring (sidewalk, concrete, driveway, etc). If delivering a package, include the company the package is from."
|
||||||
|
cat: "Describe the cat in these images (color, size, tail). Indicate whether or not the cat is by the flower pots. If the cat is chasing a mouse, make up a name for the mouse."
|
||||||
|
```
|
||||||
|
|
||||||
### Experiment with prompts
|
### Experiment with prompts
|
||||||
|
|
||||||
Providers also has a public facing chat interface for their models. Download a couple different thumbnails or snapshots from Frigate and try new things in the playground to get descriptions to your liking before updating the prompt in Frigate.
|
Many providers also have a public facing chat interface for their models. Download a couple of different thumbnails or snapshots from Frigate and try new things in the playground to get descriptions to your liking before updating the prompt in Frigate.
|
||||||
|
|
||||||
- OpenAI - [ChatGPT](https://chatgpt.com)
|
- OpenAI - [ChatGPT](https://chatgpt.com)
|
||||||
- Gemini - [Google AI Studio](https://aistudio.google.com)
|
- Gemini - [Google AI Studio](https://aistudio.google.com)
|
||||||
|
@ -504,7 +504,7 @@ semantic_search:
|
|||||||
# to Google or OpenAI's LLMs to generate descriptions. It can be overridden at
|
# to Google or OpenAI's LLMs to generate descriptions. It can be overridden at
|
||||||
# the camera level (enabled: False) to enhance privacy for indoor cameras.
|
# the camera level (enabled: False) to enhance privacy for indoor cameras.
|
||||||
genai:
|
genai:
|
||||||
# Optional: Enable Google Gemini description generation (default: shown below)
|
# Optional: Enable AI description generation (default: shown below)
|
||||||
enabled: False
|
enabled: False
|
||||||
# Required if enabled: Provider must be one of ollama, gemini, or openai
|
# Required if enabled: Provider must be one of ollama, gemini, or openai
|
||||||
provider: ollama
|
provider: ollama
|
||||||
@ -712,6 +712,18 @@ cameras:
|
|||||||
# By default the cameras are sorted alphabetically.
|
# By default the cameras are sorted alphabetically.
|
||||||
order: 0
|
order: 0
|
||||||
|
|
||||||
|
# Optional: Configuration for AI generated tracked object descriptions
|
||||||
|
genai:
|
||||||
|
# Optional: Enable AI description generation (default: shown below)
|
||||||
|
enabled: False
|
||||||
|
# Optional: The default prompt for generating descriptions. Can use replacement
|
||||||
|
# variables like "label", "sub_label", "camera" to make more dynamic. (default: shown below)
|
||||||
|
prompt: "Describe the {label} in the sequence of images with as much detail as possible. Do not describe the background."
|
||||||
|
# Optional: Object specific prompts to customize description results
|
||||||
|
# Format: {label}: {prompt}
|
||||||
|
object_prompts:
|
||||||
|
person: "My special person prompt."
|
||||||
|
|
||||||
# Optional
|
# Optional
|
||||||
ui:
|
ui:
|
||||||
# Optional: Set a timezone to use in the UI (default: use browser local time)
|
# Optional: Set a timezone to use in the UI (default: use browser local time)
|
||||||
|
@ -763,8 +763,14 @@ class GenAIConfig(FrigateBaseModel):
|
|||||||
object_prompts: Dict[str, str] = Field(default={}, title="Object specific prompts.")
|
object_prompts: Dict[str, str] = Field(default={}, title="Object specific prompts.")
|
||||||
|
|
||||||
|
|
||||||
class GenAICameraConfig(FrigateBaseModel):
|
# uses BaseModel because some global attributes are not available at the camera level
|
||||||
|
class GenAICameraConfig(BaseModel):
|
||||||
enabled: bool = Field(default=False, title="Enable GenAI for camera.")
|
enabled: bool = Field(default=False, title="Enable GenAI for camera.")
|
||||||
|
prompt: str = Field(
|
||||||
|
default="Describe the {label} in the sequence of images with as much detail as possible. Do not describe the background.",
|
||||||
|
title="Default caption prompt.",
|
||||||
|
)
|
||||||
|
object_prompts: Dict[str, str] = Field(default={}, title="Object specific prompts.")
|
||||||
|
|
||||||
|
|
||||||
class AudioConfig(FrigateBaseModel):
|
class AudioConfig(FrigateBaseModel):
|
||||||
@ -1520,7 +1526,7 @@ class FrigateConfig(FrigateBaseModel):
|
|||||||
"live": ...,
|
"live": ...,
|
||||||
"objects": ...,
|
"objects": ...,
|
||||||
"review": ...,
|
"review": ...,
|
||||||
"genai": {"enabled"},
|
"genai": ...,
|
||||||
"motion": ...,
|
"motion": ...,
|
||||||
"detect": ...,
|
"detect": ...,
|
||||||
"ffmpeg": ...,
|
"ffmpeg": ...,
|
||||||
|
@ -171,8 +171,11 @@ class EmbeddingMaintainer(threading.Thread):
|
|||||||
self, event: Event, thumbnails: list[bytes], metadata: dict
|
self, event: Event, thumbnails: list[bytes], metadata: dict
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Embed the description for an event."""
|
"""Embed the description for an event."""
|
||||||
|
camera_config = self.config.cameras[event.camera]
|
||||||
|
|
||||||
description = self.genai_client.generate_description(thumbnails, metadata)
|
description = self.genai_client.generate_description(
|
||||||
|
camera_config, thumbnails, metadata
|
||||||
|
)
|
||||||
|
|
||||||
if description is None:
|
if description is None:
|
||||||
logger.debug("Failed to generate description for %s", event.id)
|
logger.debug("Failed to generate description for %s", event.id)
|
||||||
|
@ -4,7 +4,7 @@ import importlib
|
|||||||
import os
|
import os
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from frigate.config import GenAIConfig, GenAIProviderEnum
|
from frigate.config import CameraConfig, GenAIConfig, GenAIProviderEnum
|
||||||
|
|
||||||
PROVIDERS = {}
|
PROVIDERS = {}
|
||||||
|
|
||||||
@ -28,11 +28,14 @@ class GenAIClient:
|
|||||||
self.provider = self._init_provider()
|
self.provider = self._init_provider()
|
||||||
|
|
||||||
def generate_description(
|
def generate_description(
|
||||||
self, thumbnails: list[bytes], metadata: dict[str, any]
|
self,
|
||||||
|
camera_config: CameraConfig,
|
||||||
|
thumbnails: list[bytes],
|
||||||
|
metadata: dict[str, any],
|
||||||
) -> Optional[str]:
|
) -> Optional[str]:
|
||||||
"""Generate a description for the frame."""
|
"""Generate a description for the frame."""
|
||||||
prompt = self.genai_config.object_prompts.get(
|
prompt = camera_config.genai.object_prompts.get(
|
||||||
metadata["label"], self.genai_config.prompt
|
metadata["label"], camera_config.genai.prompt
|
||||||
).format(**metadata)
|
).format(**metadata)
|
||||||
return self._send(prompt, thumbnails)
|
return self._send(prompt, thumbnails)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user