mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	* add ability to specify min and max area as percentages * debug draw area and ratio * docs * update for best percentage
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import Any, Optional, Union
 | 
						|
 | 
						|
from pydantic import Field, PrivateAttr, field_serializer
 | 
						|
 | 
						|
from ..base import FrigateBaseModel
 | 
						|
 | 
						|
__all__ = ["ObjectConfig", "FilterConfig"]
 | 
						|
 | 
						|
 | 
						|
DEFAULT_TRACKED_OBJECTS = ["person"]
 | 
						|
 | 
						|
 | 
						|
class FilterConfig(FrigateBaseModel):
 | 
						|
    min_area: Union[int, float] = Field(
 | 
						|
        default=0,
 | 
						|
        title="Minimum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99).",
 | 
						|
    )
 | 
						|
    max_area: Union[int, float] = Field(
 | 
						|
        default=24000000,
 | 
						|
        title="Maximum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99).",
 | 
						|
    )
 | 
						|
    min_ratio: float = Field(
 | 
						|
        default=0,
 | 
						|
        title="Minimum ratio of bounding box's width/height for object to be counted.",
 | 
						|
    )
 | 
						|
    max_ratio: float = Field(
 | 
						|
        default=24000000,
 | 
						|
        title="Maximum ratio of bounding box's width/height for object to be counted.",
 | 
						|
    )
 | 
						|
    threshold: float = Field(
 | 
						|
        default=0.7,
 | 
						|
        title="Average detection confidence threshold for object to be counted.",
 | 
						|
    )
 | 
						|
    min_score: float = Field(
 | 
						|
        default=0.5, title="Minimum detection confidence for object to be counted."
 | 
						|
    )
 | 
						|
    mask: Optional[Union[str, list[str]]] = Field(
 | 
						|
        default=None,
 | 
						|
        title="Detection area polygon mask for this filter configuration.",
 | 
						|
    )
 | 
						|
    raw_mask: Union[str, list[str]] = ""
 | 
						|
 | 
						|
    @field_serializer("mask", when_used="json")
 | 
						|
    def serialize_mask(self, value: Any, info):
 | 
						|
        return self.raw_mask
 | 
						|
 | 
						|
    @field_serializer("raw_mask", when_used="json")
 | 
						|
    def serialize_raw_mask(self, value: Any, info):
 | 
						|
        return None
 | 
						|
 | 
						|
 | 
						|
class ObjectConfig(FrigateBaseModel):
 | 
						|
    track: list[str] = Field(default=DEFAULT_TRACKED_OBJECTS, title="Objects to track.")
 | 
						|
    filters: dict[str, FilterConfig] = Field(
 | 
						|
        default_factory=dict, title="Object filters."
 | 
						|
    )
 | 
						|
    mask: Union[str, list[str]] = Field(default="", title="Object mask.")
 | 
						|
    _all_objects: list[str] = PrivateAttr()
 | 
						|
 | 
						|
    @property
 | 
						|
    def all_objects(self) -> list[str]:
 | 
						|
        return self._all_objects
 | 
						|
 | 
						|
    def parse_all_objects(self, cameras):
 | 
						|
        if "_all_objects" in self:
 | 
						|
            return
 | 
						|
 | 
						|
        # get list of unique enabled labels for tracking
 | 
						|
        enabled_labels = set(self.track)
 | 
						|
 | 
						|
        for camera in cameras.values():
 | 
						|
            enabled_labels.update(camera.objects.track)
 | 
						|
 | 
						|
        self._all_objects = list(enabled_labels)
 |