mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	cleanup global and camera detect config (fixes #1615)
This commit is contained in:
		
							parent
							
								
									11c425a7eb
								
							
						
					
					
						commit
						fa5ec8d019
					
				| @ -284,11 +284,11 @@ cameras: | |||||||
| 
 | 
 | ||||||
|     # Required: Camera level detect settings |     # Required: Camera level detect settings | ||||||
|     detect: |     detect: | ||||||
|       # Required: width of the frame for the input with the detect role |       # Optional: width of the frame for the input with the detect role (default: shown below) | ||||||
|       width: 1280 |       width: 1280 | ||||||
|       # Required: height of the frame for the input with the detect role |       # Optional: height of the frame for the input with the detect role (default: shown below) | ||||||
|       height: 720 |       height: 720 | ||||||
|       # Required: desired fps for your camera for the input with the detect role |       # Optional: desired fps for your camera for the input with the detect role (default: shown below) | ||||||
|       # NOTE: Recommended value of 5. Ideally, try and reduce your FPS on the camera. |       # NOTE: Recommended value of 5. Ideally, try and reduce your FPS on the camera. | ||||||
|       fps: 5 |       fps: 5 | ||||||
|       # Optional: enables detection for the camera (default: True) |       # Optional: enables detection for the camera (default: True) | ||||||
|  | |||||||
| @ -149,9 +149,11 @@ class RuntimeMotionConfig(MotionConfig): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class DetectConfig(BaseModel): | class DetectConfig(BaseModel): | ||||||
|     height: int = Field(title="Height of the stream for the detect role.") |     height: int = Field(default=720, title="Height of the stream for the detect role.") | ||||||
|     width: int = Field(title="Width of the stream for the detect role.") |     width: int = Field(default=1280, title="Width of the stream for the detect role.") | ||||||
|     fps: int = Field(title="Number of frames per second to process through detection.") |     fps: int = Field( | ||||||
|  |         default=5, title="Number of frames per second to process through detection." | ||||||
|  |     ) | ||||||
|     enabled: bool = Field(default=True, title="Detection Enabled.") |     enabled: bool = Field(default=True, title="Detection Enabled.") | ||||||
|     max_disappeared: Optional[int] = Field( |     max_disappeared: Optional[int] = Field( | ||||||
|         title="Maximum number of frames the object can dissapear before detection ends." |         title="Maximum number of frames the object can dissapear before detection ends." | ||||||
| @ -466,7 +468,7 @@ class CameraConfig(BaseModel): | |||||||
|         default_factory=ObjectConfig, title="Object configuration." |         default_factory=ObjectConfig, title="Object configuration." | ||||||
|     ) |     ) | ||||||
|     motion: Optional[MotionConfig] = Field(title="Motion detection configuration.") |     motion: Optional[MotionConfig] = Field(title="Motion detection configuration.") | ||||||
|     detect: DetectConfig = Field(title="Object detection configuration.") |     detect: Optional[DetectConfig] = Field(title="Object detection configuration.") | ||||||
|     timestamp_style: TimestampStyleConfig = Field( |     timestamp_style: TimestampStyleConfig = Field( | ||||||
|         default_factory=TimestampStyleConfig, title="Timestamp style configuration." |         default_factory=TimestampStyleConfig, title="Timestamp style configuration." | ||||||
|     ) |     ) | ||||||
| @ -701,6 +703,14 @@ class FrigateConfig(BaseModel): | |||||||
|                 {"name": name, **merged_config} |                 {"name": name, **merged_config} | ||||||
|             ) |             ) | ||||||
| 
 | 
 | ||||||
|  |             # Default detect configuration | ||||||
|  |             if camera_config.detect is None: | ||||||
|  |                 camera_config.detect = DetectConfig() | ||||||
|  | 
 | ||||||
|  |             max_disappeared = camera_config.detect.fps * 5 | ||||||
|  |             if camera_config.detect.max_disappeared is None: | ||||||
|  |                 camera_config.detect.max_disappeared = max_disappeared | ||||||
|  | 
 | ||||||
|             # FFMPEG input substitution |             # FFMPEG input substitution | ||||||
|             for input in camera_config.ffmpeg.inputs: |             for input in camera_config.ffmpeg.inputs: | ||||||
|                 input.path = input.path.format(**FRIGATE_ENV_VARS) |                 input.path = input.path.format(**FRIGATE_ENV_VARS) | ||||||
| @ -748,11 +758,6 @@ class FrigateConfig(BaseModel): | |||||||
|                     **camera_config.motion.dict(exclude_unset=True), |                     **camera_config.motion.dict(exclude_unset=True), | ||||||
|                 ) |                 ) | ||||||
| 
 | 
 | ||||||
|             # Default detect configuration |  | ||||||
|             max_disappeared = camera_config.detect.fps * 5 |  | ||||||
|             if camera_config.detect.max_disappeared is None: |  | ||||||
|                 camera_config.detect.max_disappeared = max_disappeared |  | ||||||
| 
 |  | ||||||
|             # Default live configuration |             # Default live configuration | ||||||
|             if camera_config.live is None: |             if camera_config.live is None: | ||||||
|                 camera_config.live = CameraLiveConfig() |                 camera_config.live = CameraLiveConfig() | ||||||
|  | |||||||
| @ -717,6 +717,91 @@ class TestConfig(unittest.TestCase): | |||||||
| 
 | 
 | ||||||
|         self.assertRaises(ValidationError, lambda: FrigateConfig(**config)) |         self.assertRaises(ValidationError, lambda: FrigateConfig(**config)) | ||||||
| 
 | 
 | ||||||
|  |     def test_global_detect(self): | ||||||
|  | 
 | ||||||
|  |         config = { | ||||||
|  |             "mqtt": {"host": "mqtt"}, | ||||||
|  |             "detect": {"max_disappeared": 1}, | ||||||
|  |             "cameras": { | ||||||
|  |                 "back": { | ||||||
|  |                     "ffmpeg": { | ||||||
|  |                         "inputs": [ | ||||||
|  |                             { | ||||||
|  |                                 "path": "rtsp://10.0.0.1:554/video", | ||||||
|  |                                 "roles": ["detect"], | ||||||
|  |                             }, | ||||||
|  |                         ] | ||||||
|  |                     }, | ||||||
|  |                     "detect": { | ||||||
|  |                         "height": 1080, | ||||||
|  |                         "width": 1920, | ||||||
|  |                         "fps": 5, | ||||||
|  |                     }, | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |         } | ||||||
|  |         frigate_config = FrigateConfig(**config) | ||||||
|  |         assert config == frigate_config.dict(exclude_unset=True) | ||||||
|  | 
 | ||||||
|  |         runtime_config = frigate_config.runtime_config | ||||||
|  |         assert runtime_config.cameras["back"].detect.max_disappeared == 1 | ||||||
|  |         assert runtime_config.cameras["back"].detect.height == 1080 | ||||||
|  | 
 | ||||||
|  |     def test_default_detect(self): | ||||||
|  | 
 | ||||||
|  |         config = { | ||||||
|  |             "mqtt": {"host": "mqtt"}, | ||||||
|  |             "cameras": { | ||||||
|  |                 "back": { | ||||||
|  |                     "ffmpeg": { | ||||||
|  |                         "inputs": [ | ||||||
|  |                             { | ||||||
|  |                                 "path": "rtsp://10.0.0.1:554/video", | ||||||
|  |                                 "roles": ["detect"], | ||||||
|  |                             }, | ||||||
|  |                         ] | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |         } | ||||||
|  |         frigate_config = FrigateConfig(**config) | ||||||
|  |         assert config == frigate_config.dict(exclude_unset=True) | ||||||
|  | 
 | ||||||
|  |         runtime_config = frigate_config.runtime_config | ||||||
|  |         assert runtime_config.cameras["back"].detect.max_disappeared == 25 | ||||||
|  |         assert runtime_config.cameras["back"].detect.height == 720 | ||||||
|  | 
 | ||||||
|  |     def test_global_detect_merge(self): | ||||||
|  | 
 | ||||||
|  |         config = { | ||||||
|  |             "mqtt": {"host": "mqtt"}, | ||||||
|  |             "detect": {"max_disappeared": 1, "height": 720}, | ||||||
|  |             "cameras": { | ||||||
|  |                 "back": { | ||||||
|  |                     "ffmpeg": { | ||||||
|  |                         "inputs": [ | ||||||
|  |                             { | ||||||
|  |                                 "path": "rtsp://10.0.0.1:554/video", | ||||||
|  |                                 "roles": ["detect"], | ||||||
|  |                             }, | ||||||
|  |                         ] | ||||||
|  |                     }, | ||||||
|  |                     "detect": { | ||||||
|  |                         "height": 1080, | ||||||
|  |                         "width": 1920, | ||||||
|  |                         "fps": 5, | ||||||
|  |                     }, | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |         } | ||||||
|  |         frigate_config = FrigateConfig(**config) | ||||||
|  |         assert config == frigate_config.dict(exclude_unset=True) | ||||||
|  | 
 | ||||||
|  |         runtime_config = frigate_config.runtime_config | ||||||
|  |         assert runtime_config.cameras["back"].detect.max_disappeared == 1 | ||||||
|  |         assert runtime_config.cameras["back"].detect.height == 1080 | ||||||
|  |         assert runtime_config.cameras["back"].detect.width == 1920 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|     unittest.main(verbosity=2) |     unittest.main(verbosity=2) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user