Add ability to restrict genai to labels and zones at the camera level

This commit is contained in:
Josh Hawkins 2024-09-25 08:53:49 -05:00
parent e935db5075
commit 8ed86a907a
5 changed files with 37 additions and 1 deletions

View File

@ -128,7 +128,7 @@ genai:
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. 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. You can also optionally specify `labels` and `required_zones` to only generate descriptions for certain labels or zones.
```yaml ```yaml
cameras: cameras:
@ -138,6 +138,11 @@ cameras:
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). 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." 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."
labels:
- person
- cat
required_zones:
- steps
``` ```
### Experiment with prompts ### Experiment with prompts

View File

@ -723,6 +723,12 @@ cameras:
# Format: {label}: {prompt} # Format: {label}: {prompt}
object_prompts: object_prompts:
person: "My special person prompt." person: "My special person prompt."
# Optional: labels that qualify as an alert (default: all labels that are tracked)
labels:
- person
- cat
# Optional: Restrict generation to objects that entered any of the listed zones (default: none, all zones qualify)
required_zones: []
# Optional # Optional
ui: ui:

View File

@ -810,6 +810,21 @@ class GenAICameraConfig(BaseModel):
title="Default caption prompt.", title="Default caption prompt.",
) )
object_prompts: Dict[str, str] = Field(default={}, title="Object specific prompts.") object_prompts: Dict[str, str] = Field(default={}, title="Object specific prompts.")
labels: Optional[List[str]] = Field(
default=None, title="Labels to run generative AI for."
)
required_zones: Union[str, List[str]] = Field(
default_factory=list,
title="List of required zones to be entered in order to run generative AI.",
)
@field_validator("required_zones", mode="before")
@classmethod
def validate_required_zones(cls, v):
if isinstance(v, str) and "," not in v:
return [v]
return v
class AudioConfig(FrigateBaseModel): class AudioConfig(FrigateBaseModel):

View File

@ -127,6 +127,14 @@ class EmbeddingMaintainer(threading.Thread):
camera_config.genai.enabled camera_config.genai.enabled
and self.genai_client is not None and self.genai_client is not None
and event.data.get("description") is None and event.data.get("description") is None
and (
camera_config.genai.labels is None
or event.label in camera_config.genai.labels
)
and (
camera_config.genai.required_zones is None
or set(event.zones) & set(camera_config.genai.zones)
)
): ):
# Generate the description. Call happens in a thread since it is network bound. # Generate the description. Call happens in a thread since it is network bound.
threading.Thread( threading.Thread(

View File

@ -306,6 +306,8 @@ export interface FrigateConfig {
model: string; model: string;
prompt: string; prompt: string;
object_prompts: { [key: string]: string }; object_prompts: { [key: string]: string };
required_zones: string[];
labels: string[];
}; };
go2rtc: { go2rtc: {