feat: add min bbox for frontal tracking
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build Worker Base and Application Images / check-base-changes (push) Successful in 9s
				
			
		
			
				
	
				Build Worker Base and Application Images / build-base (push) Has been skipped
				
			
		
			
				
	
				Build Worker Base and Application Images / build-docker (push) Successful in 3m22s
				
			
		
			
				
	
				Build Worker Base and Application Images / deploy-stack (push) Successful in 15s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Build Worker Base and Application Images / check-base-changes (push) Successful in 9s
				
			Build Worker Base and Application Images / build-base (push) Has been skipped
				
			Build Worker Base and Application Images / build-docker (push) Successful in 3m22s
				
			Build Worker Base and Application Images / deploy-stack (push) Successful in 15s
				
			This commit is contained in:
		
							parent
							
								
									52ba1ff316
								
							
						
					
					
						commit
						ee484b4655
					
				
					 1 changed files with 59 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -71,12 +71,17 @@ class TrackingPipelineIntegration:
 | 
			
		|||
        # Thread pool for pipeline execution
 | 
			
		||||
        self.executor = ThreadPoolExecutor(max_workers=2)
 | 
			
		||||
 | 
			
		||||
        # Min bbox filtering configuration
 | 
			
		||||
        # TODO: Make this configurable via pipeline.json in the future
 | 
			
		||||
        self.min_bbox_area_percentage = 4.5  # 4.5% of frame area minimum
 | 
			
		||||
 | 
			
		||||
        # Statistics
 | 
			
		||||
        self.stats = {
 | 
			
		||||
            'frames_processed': 0,
 | 
			
		||||
            'vehicles_detected': 0,
 | 
			
		||||
            'vehicles_validated': 0,
 | 
			
		||||
            'pipelines_executed': 0
 | 
			
		||||
            'pipelines_executed': 0,
 | 
			
		||||
            'frontals_filtered_small': 0  # Track filtered detections
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -202,6 +207,10 @@ class TrackingPipelineIntegration:
 | 
			
		|||
                else:
 | 
			
		||||
                    logger.debug(f"No tracking results or detections attribute")
 | 
			
		||||
 | 
			
		||||
                # Filter out small frontal detections (neighboring pumps/distant cars)
 | 
			
		||||
                if tracking_results and hasattr(tracking_results, 'detections'):
 | 
			
		||||
                    tracking_results = self._filter_small_frontals(tracking_results, frame)
 | 
			
		||||
 | 
			
		||||
                # Process tracking results
 | 
			
		||||
                tracked_vehicles = self.tracker.process_detections(
 | 
			
		||||
                    tracking_results,
 | 
			
		||||
| 
						 | 
				
			
			@ -667,6 +676,55 @@ class TrackingPipelineIntegration:
 | 
			
		|||
        if stage == "car_wait_staff":
 | 
			
		||||
            logger.info(f"Started monitoring session {session_id} for car abandonment")
 | 
			
		||||
 | 
			
		||||
    def _filter_small_frontals(self, tracking_results, frame):
 | 
			
		||||
        """
 | 
			
		||||
        Filter out frontal detections that are smaller than minimum bbox area percentage.
 | 
			
		||||
        This prevents processing of cars from neighboring pumps that appear in camera view.
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            tracking_results: YOLO tracking results with detections
 | 
			
		||||
            frame: Input frame for calculating frame area
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            Modified tracking_results with small frontals removed
 | 
			
		||||
        """
 | 
			
		||||
        if not hasattr(tracking_results, 'detections') or not tracking_results.detections:
 | 
			
		||||
            return tracking_results
 | 
			
		||||
 | 
			
		||||
        # Calculate frame area and minimum bbox area threshold
 | 
			
		||||
        frame_area = frame.shape[0] * frame.shape[1]  # height * width
 | 
			
		||||
        min_bbox_area = frame_area * (self.min_bbox_area_percentage / 100.0)
 | 
			
		||||
 | 
			
		||||
        # Filter detections
 | 
			
		||||
        filtered_detections = []
 | 
			
		||||
        filtered_count = 0
 | 
			
		||||
 | 
			
		||||
        for detection in tracking_results.detections:
 | 
			
		||||
            # Calculate detection bbox area
 | 
			
		||||
            bbox = detection.bbox  # Assuming bbox is [x1, y1, x2, y2]
 | 
			
		||||
            bbox_area = (bbox[2] - bbox[0]) * (bbox[3] - bbox[1])
 | 
			
		||||
 | 
			
		||||
            if bbox_area >= min_bbox_area:
 | 
			
		||||
                # Keep detection - bbox is large enough
 | 
			
		||||
                filtered_detections.append(detection)
 | 
			
		||||
            else:
 | 
			
		||||
                # Filter out small detection
 | 
			
		||||
                filtered_count += 1
 | 
			
		||||
                area_percentage = (bbox_area / frame_area) * 100
 | 
			
		||||
                logger.debug(f"Filtered small frontal: area={bbox_area:.0f}px² ({area_percentage:.1f}% of frame, "
 | 
			
		||||
                           f"min required: {self.min_bbox_area_percentage}%)")
 | 
			
		||||
 | 
			
		||||
        # Update tracking results with filtered detections
 | 
			
		||||
        tracking_results.detections = filtered_detections
 | 
			
		||||
 | 
			
		||||
        # Update statistics
 | 
			
		||||
        if filtered_count > 0:
 | 
			
		||||
            self.stats['frontals_filtered_small'] += filtered_count
 | 
			
		||||
            logger.info(f"Filtered {filtered_count} small frontal detections, "
 | 
			
		||||
                       f"{len(filtered_detections)} remaining (total filtered: {self.stats['frontals_filtered_small']})")
 | 
			
		||||
 | 
			
		||||
        return tracking_results
 | 
			
		||||
 | 
			
		||||
    def cleanup(self):
 | 
			
		||||
        """Cleanup resources."""
 | 
			
		||||
        self.executor.shutdown(wait=False)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue