separate trackers for static and autotracking cameras

This commit is contained in:
Josh Hawkins 2025-01-07 19:57:23 -06:00
parent 9247a112a8
commit 6aad20224c

View File

@ -89,7 +89,7 @@ class NorfairTracker(ObjectTracker):
self.camera_name = config.name self.camera_name = config.name
self.track_id_map = {} self.track_id_map = {}
# Define tracker configurations for each object type # Define tracker configurations for static camera
self.object_type_configs = { self.object_type_configs = {
"car": { "car": {
"filter_factory": OptimizedKalmanFilterFactory(R=3.4, Q=0.03), "filter_factory": OptimizedKalmanFilterFactory(R=3.4, Q=0.03),
@ -98,6 +98,18 @@ class NorfairTracker(ObjectTracker):
}, },
} }
# Define autotracking PTZ-specific configurations
self.ptz_object_type_configs = {
"person": {
"filter_factory": OptimizedKalmanFilterFactory(
R=4,
Q=0.15,
),
"distance_function": frigate_distance,
"distance_threshold": 3,
},
}
# Default tracker configuration # Default tracker configuration
# use default filter factory with custom values # use default filter factory with custom values
# R is the multiplier for the sensor measurement noise matrix, default of 4.0 # R is the multiplier for the sensor measurement noise matrix, default of 4.0
@ -109,33 +121,78 @@ class NorfairTracker(ObjectTracker):
"distance_threshold": 2.5, "distance_threshold": 2.5,
} }
# Initialize trackers for each object type self.default_ptz_tracker_config = {
"filter_factory": OptimizedKalmanFilterFactory(R=4, Q=0.2),
"distance_function": frigate_distance,
"distance_threshold": 3,
}
self.trackers = {} self.trackers = {}
for obj_type, config in self.object_type_configs.items(): # Handle static trackers
self.trackers[obj_type] = Tracker( for obj_type, tracker_config in self.object_type_configs.items():
distance_function=config["distance_function"], if obj_type in self.camera_config.objects.track:
distance_threshold=config["distance_threshold"], if obj_type not in self.trackers:
self.trackers[obj_type] = {}
self.trackers[obj_type]["static"] = Tracker(
distance_function=tracker_config["distance_function"],
distance_threshold=tracker_config["distance_threshold"],
initialization_delay=self.detect_config.min_initialized, initialization_delay=self.detect_config.min_initialized,
hit_counter_max=self.detect_config.max_disappeared, hit_counter_max=self.detect_config.max_disappeared,
filter_factory=config["filter_factory"], filter_factory=tracker_config["filter_factory"],
) )
# Initialize default tracker # Handle PTZ trackers
self.default_tracker = Tracker( for obj_type, tracker_config in self.ptz_object_type_configs.items():
if (
obj_type in self.camera_config.onvif.autotracking.track
and self.camera_config.onvif.autotracking.enabled_in_config
):
if obj_type not in self.trackers:
self.trackers[obj_type] = {}
self.trackers[obj_type]["ptz"] = Tracker(
distance_function=tracker_config["distance_function"],
distance_threshold=tracker_config["distance_threshold"],
initialization_delay=self.detect_config.min_initialized,
hit_counter_max=self.detect_config.max_disappeared,
filter_factory=tracker_config["filter_factory"],
)
# Initialize default trackers
self.default_tracker = {
"static": Tracker(
distance_function=frigate_distance, distance_function=frigate_distance,
distance_threshold=self.default_tracker_config["distance_threshold"], distance_threshold=self.default_tracker_config["distance_threshold"],
initialization_delay=self.detect_config.min_initialized, initialization_delay=self.detect_config.min_initialized,
hit_counter_max=self.detect_config.max_disappeared, hit_counter_max=self.detect_config.max_disappeared,
filter_factory=self.default_tracker_config["filter_factory"], filter_factory=self.default_tracker_config["filter_factory"],
) ),
"ptz": Tracker(
distance_function=frigate_distance,
distance_threshold=self.default_ptz_tracker_config[
"distance_threshold"
],
initialization_delay=self.detect_config.min_initialized,
hit_counter_max=self.detect_config.max_disappeared,
filter_factory=self.default_ptz_tracker_config["filter_factory"],
),
}
if self.ptz_metrics.autotracker_enabled.value: if self.ptz_metrics.autotracker_enabled.value:
self.ptz_motion_estimator = PtzMotionEstimator( self.ptz_motion_estimator = PtzMotionEstimator(
self.camera_config, self.ptz_metrics self.camera_config, self.ptz_metrics
) )
def get_tracker_for_label(self, label: str) -> Tracker: def get_tracker(self, object_type: str) -> Tracker:
"""Get the appropriate tracker for the given object label.""" """Get the appropriate tracker based on object type and camera mode."""
return self.trackers.get(label, self.default_tracker) mode = (
"ptz"
if self.ptz_metrics.autotracker_enabled
and object_type in self.camera_config.onvif.autotracking.track
else "static"
)
if object_type in self.trackers:
return self.trackers[object_type][mode]
return self.default_tracker[mode]
def register(self, track_id, obj): def register(self, track_id, obj):
rand_id = "".join(random.choices(string.ascii_lowercase + string.digits, k=6)) rand_id = "".join(random.choices(string.ascii_lowercase + string.digits, k=6))
@ -147,7 +204,7 @@ class NorfairTracker(ObjectTracker):
obj["position_changes"] = 0 obj["position_changes"] = 0
# Get the correct tracker for this object's label # Get the correct tracker for this object's label
tracker = self.get_tracker_for_label(obj["label"]) tracker = self.get_tracker(obj["label"])
obj["score_history"] = [ obj["score_history"] = [
p.data["score"] p.data["score"]
for p in next( for p in next(
@ -170,7 +227,7 @@ class NorfairTracker(ObjectTracker):
def deregister(self, id, track_id): def deregister(self, id, track_id):
obj = self.tracked_objects[id] obj = self.tracked_objects[id]
tracker = self.get_tracker_for_label(obj["label"]) tracker = self.get_tracker(obj["label"])
del self.tracked_objects[id] del self.tracked_objects[id]
del self.disappeared[id] del self.disappeared[id]
@ -368,7 +425,7 @@ class NorfairTracker(ObjectTracker):
# Update each tracker with its corresponding detections # Update each tracker with its corresponding detections
all_tracked_objects = [] all_tracked_objects = []
for label, label_detections in detections_by_type.items(): for label, label_detections in detections_by_type.items():
tracker = self.get_tracker_for_label(label) tracker = self.get_tracker(label)
tracked_objects = tracker.update( tracked_objects = tracker.update(
detections=label_detections, coord_transformations=coord_transformations detections=label_detections, coord_transformations=coord_transformations
) )