Added camera config
ci/woodpecker/push/02-build-push Pipeline was successful
ci/woodpecker/manual/02-build-push Pipeline was successful
ci/woodpecker/manual/01-test Pipeline failed

This commit is contained in:
Roman Meshko
2026-05-14 22:31:29 +03:00
parent 2eb5b5d8ad
commit c9aeed3dd9
19 changed files with 282 additions and 48 deletions
+37
View File
@@ -1,24 +1,61 @@
def test_ai_config_from_dict_defaults():
# Arrange
from inference import ai_config_from_dict
# Act
cfg = ai_config_from_dict({})
# Assert
assert cfg.model_batch_size == 8
assert cfg.frame_period_recognition == 4
assert cfg.frame_recognition_seconds == 2
assert cfg.has_camera_config is False
assert cfg.has_altitude is False
def test_ai_config_from_dict_altitude_override_sets_flag():
# Arrange
from inference import ai_config_from_dict
# Act
cfg = ai_config_from_dict({"altitude": 400})
# Assert
assert cfg.has_camera_config is True
assert cfg.has_altitude is True
assert cfg.altitude == 400
assert cfg.current_height == 400
def test_ai_config_from_dict_overrides():
# Arrange
from inference import ai_config_from_dict
# Act
cfg = ai_config_from_dict({"model_batch_size": 4, "probability_threshold": 0.5})
# Assert
assert cfg.model_batch_size == 4
assert cfg.probability_threshold == 0.5
def test_ai_config_from_dict_camera_config_sets_physical_filter_fields():
# Arrange
from inference import ai_config_from_dict
# Act
cfg = ai_config_from_dict(
{
"camera_config": {
"focal_length": 35,
"sensor_width": 36,
"current_zoom": 2,
"current_angle": 80,
"current_height": 300,
}
}
)
# Assert
assert cfg.has_camera_config is True
assert cfg.current_height == 300
assert cfg.focal_length == 35
assert cfg.sensor_width == 36
assert cfg.current_zoom == 2
assert cfg.current_angle == 80
+38 -5
View File
@@ -61,7 +61,9 @@ def test_merged_annotation_settings_pascal_case():
# Assert
assert out["frame_period_recognition"] == 5
assert out["probability_threshold"] == 0.4
assert out["altitude"] == 300
assert out["camera_config"]["current_height"] == 300
assert out["camera_config"]["focal_length"] == 35
assert out["camera_config"]["sensor_width"] == 36
def test_merged_annotation_nested_sections():
@@ -76,7 +78,7 @@ def test_merged_annotation_nested_sections():
out = _merged_annotation_settings_payload(raw)
# Assert
assert out["model_batch_size"] == 4
assert out["altitude"] == 100
assert out["camera_config"]["current_height"] == 100
def test_resolve_media_for_detect_uses_api_path_and_defaults_when_api_empty():
@@ -105,7 +107,7 @@ def test_resolve_media_for_detect_override_wins():
mock_ann = MagicMock()
mock_ann.fetch_user_ai_settings.return_value = {
"probabilityThreshold": 0.2,
"altitude": 500,
"camera_config": {"current_height": 500},
}
mock_ann.fetch_media_path.return_value = "/m/v.mp4"
with patch("main.annotations_client", mock_ann):
@@ -113,11 +115,42 @@ def test_resolve_media_for_detect_override_wins():
cfg, path = main._resolve_media_for_detect("vid-1", tm, override)
# Assert
assert cfg["probability_threshold"] == 0.99
assert cfg["altitude"] == 500
assert cfg["camera_config"]["current_height"] == 500
assert path == "/m/v.mp4"
assert "paths" not in cfg
def test_resolve_media_for_detect_merges_camera_config_override():
# Arrange
import main
tm = main.TokenManager(_access_jwt(), "")
override = main.AIConfigDto(
camera_config=main.CameraConfigDto(current_height=500)
)
mock_ann = MagicMock()
mock_ann.fetch_user_ai_settings.return_value = {
"camera_config": {
"focal_length": 35,
"sensor_width": 36,
"current_zoom": 2,
"current_angle": 80,
"current_height": 300,
}
}
mock_ann.fetch_media_path.return_value = "/m/v.mp4"
with patch("main.annotations_client", mock_ann):
# Act
cfg, path = main._resolve_media_for_detect("vid-1", tm, override)
# Assert
assert cfg["camera_config"]["current_height"] == 500
assert cfg["camera_config"]["focal_length"] == 35
assert cfg["camera_config"]["sensor_width"] == 36
assert cfg["camera_config"]["current_zoom"] == 2
assert cfg["camera_config"]["current_angle"] == 80
assert path == "/m/v.mp4"
def test_resolve_media_for_detect_omits_altitude_when_not_provided():
# Arrange
import main
@@ -130,7 +163,7 @@ def test_resolve_media_for_detect_omits_altitude_when_not_provided():
# Act
cfg, path = main._resolve_media_for_detect("vid-2", tm, None)
# Assert
assert "altitude" not in cfg
assert "camera_config" not in cfg
assert cfg["probability_threshold"] == 0.2
assert path == "/m/v.mp4"