mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	Adjust stationary reqs depending on state (#11226)
This commit is contained in:
		
							parent
							
								
									216e44bc34
								
							
						
					
					
						commit
						f0054ceba4
					
				@ -22,8 +22,9 @@ from frigate.util.object import average_boxes, median_of_boxes
 | 
				
			|||||||
logger = logging.getLogger(__name__)
 | 
					logger = logging.getLogger(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
THRESHOLD_ACTIVE_IOU = 0.35
 | 
					THRESHOLD_KNOWN_ACTIVE_IOU = 0.2
 | 
				
			||||||
THRESHOLD_STATIONARY_IOU = 0.7
 | 
					THRESHOLD_STATIONARY_CHECK_IOU = 0.6
 | 
				
			||||||
 | 
					THRESHOLD_ACTIVE_CHECK_IOU = 0.9
 | 
				
			||||||
MAX_STATIONARY_HISTORY = 10
 | 
					MAX_STATIONARY_HISTORY = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -146,7 +147,7 @@ class NorfairTracker(ObjectTracker):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # tracks the current position of the object based on the last N bounding boxes
 | 
					    # tracks the current position of the object based on the last N bounding boxes
 | 
				
			||||||
    # returns False if the object has moved outside its previous position
 | 
					    # returns False if the object has moved outside its previous position
 | 
				
			||||||
    def update_position(self, id: str, box: list[int, int, int, int]):
 | 
					    def update_position(self, id: str, box: list[int, int, int, int], stationary: bool):
 | 
				
			||||||
        xmin, ymin, xmax, ymax = box
 | 
					        xmin, ymin, xmax, ymax = box
 | 
				
			||||||
        position = self.positions[id]
 | 
					        position = self.positions[id]
 | 
				
			||||||
        self.stationary_box_history[id].append(box)
 | 
					        self.stationary_box_history[id].append(box)
 | 
				
			||||||
@ -162,7 +163,7 @@ class NorfairTracker(ObjectTracker):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # object has minimal or zero iou
 | 
					        # object has minimal or zero iou
 | 
				
			||||||
        # assume object is active
 | 
					        # assume object is active
 | 
				
			||||||
        if avg_iou < THRESHOLD_ACTIVE_IOU:
 | 
					        if avg_iou < THRESHOLD_KNOWN_ACTIVE_IOU:
 | 
				
			||||||
            self.positions[id] = {
 | 
					            self.positions[id] = {
 | 
				
			||||||
                "xmins": [xmin],
 | 
					                "xmins": [xmin],
 | 
				
			||||||
                "ymins": [ymin],
 | 
					                "ymins": [ymin],
 | 
				
			||||||
@ -175,8 +176,12 @@ class NorfairTracker(ObjectTracker):
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            return False
 | 
					            return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        threshold = (
 | 
				
			||||||
 | 
					            THRESHOLD_STATIONARY_CHECK_IOU if stationary else THRESHOLD_ACTIVE_CHECK_IOU
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # object has iou below threshold, check median to reduce outliers
 | 
					        # object has iou below threshold, check median to reduce outliers
 | 
				
			||||||
        if avg_iou < THRESHOLD_STATIONARY_IOU:
 | 
					        if avg_iou < threshold:
 | 
				
			||||||
            median_iou = intersection_over_union(
 | 
					            median_iou = intersection_over_union(
 | 
				
			||||||
                (
 | 
					                (
 | 
				
			||||||
                    position["xmin"],
 | 
					                    position["xmin"],
 | 
				
			||||||
@ -189,7 +194,7 @@ class NorfairTracker(ObjectTracker):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            # if the median iou drops below the threshold
 | 
					            # if the median iou drops below the threshold
 | 
				
			||||||
            # assume object is no longer stationary
 | 
					            # assume object is no longer stationary
 | 
				
			||||||
            if median_iou < THRESHOLD_STATIONARY_IOU:
 | 
					            if median_iou < threshold:
 | 
				
			||||||
                self.positions[id] = {
 | 
					                self.positions[id] = {
 | 
				
			||||||
                    "xmins": [xmin],
 | 
					                    "xmins": [xmin],
 | 
				
			||||||
                    "ymins": [ymin],
 | 
					                    "ymins": [ymin],
 | 
				
			||||||
@ -240,8 +245,12 @@ class NorfairTracker(ObjectTracker):
 | 
				
			|||||||
    def update(self, track_id, obj):
 | 
					    def update(self, track_id, obj):
 | 
				
			||||||
        id = self.track_id_map[track_id]
 | 
					        id = self.track_id_map[track_id]
 | 
				
			||||||
        self.disappeared[id] = 0
 | 
					        self.disappeared[id] = 0
 | 
				
			||||||
 | 
					        stationary = (
 | 
				
			||||||
 | 
					            self.tracked_objects[id]["motionless_count"]
 | 
				
			||||||
 | 
					            >= self.detect_config.stationary.threshold
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        # update the motionless count if the object has not moved to a new position
 | 
					        # update the motionless count if the object has not moved to a new position
 | 
				
			||||||
        if self.update_position(id, obj["box"]):
 | 
					        if self.update_position(id, obj["box"], stationary):
 | 
				
			||||||
            self.tracked_objects[id]["motionless_count"] += 1
 | 
					            self.tracked_objects[id]["motionless_count"] += 1
 | 
				
			||||||
            if self.is_expired(id):
 | 
					            if self.is_expired(id):
 | 
				
			||||||
                self.deregister(id, track_id)
 | 
					                self.deregister(id, track_id)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user