From 1492d6c526de09f990e0123021856323d04aa315 Mon Sep 17 00:00:00 2001 From: "Yermolenko, Dmytro" Date: Mon, 1 Dec 2025 13:21:11 +0100 Subject: [PATCH 1/5] Add timeout before feeding tracker --- manager/src/django/serializers.py | 2 +- tests/Makefile | 2 +- tests/system/metric/tc_distance_thresh.py | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/manager/src/django/serializers.py b/manager/src/django/serializers.py index 4f51d6d93..2643355a1 100644 --- a/manager/src/django/serializers.py +++ b/manager/src/django/serializers.py @@ -697,7 +697,7 @@ def create_update(self, validated_data, instance=None): if use_tracker: instance.scenescapeScene.use_tracker = use_tracker if trs_matrix: - Scene.objects.filter(pk=self.pk).update(trs_matrix=trs_matrix) + Scene.objects.filter(pk=instance.pk).update(trs_matrix=trs_matrix) if map_path: map_path = '/media/' + map_path.name diff --git a/tests/Makefile b/tests/Makefile index 1e11fa3e2..1d0d26361 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -104,7 +104,6 @@ broken-tests: \ april-tag-setup \ calibrate-camera-3d-ui-2d-ui \ out-of-box-no-ntp \ - distance-msoce \ geospatial-ingest-publish \ delete-sensor-mqtt-api \ @@ -186,6 +185,7 @@ _metric-tests: \ idc-error-metric \ velocity-metric \ msoce-metric \ + distance-msoce \ ui-tests: $(MAKE) -Otarget _$@ SECRETSDIR=$(PWD)/manager/secrets SUPASS=$(SUPASS) -k diff --git a/tests/system/metric/tc_distance_thresh.py b/tests/system/metric/tc_distance_thresh.py index 4f642eca8..538e1306c 100644 --- a/tests/system/metric/tc_distance_thresh.py +++ b/tests/system/metric/tc_distance_thresh.py @@ -3,6 +3,7 @@ # SPDX-FileCopyrightText: (C) 2024 - 2025 Intel Corporation # SPDX-License-Identifier: Apache-2.0 +import time import controller.tools.analytics.library.json_helper as json_helper import controller.tools.analytics.library.metrics as metrics import tests.common_test_utils as common @@ -49,6 +50,7 @@ def track(params): if 'assets' in params: scene.tracker.updateObjectClasses(params['assets']) + time.sleep(3) while True: _, cam_detect, _ = mgr.nextFrame(scene, loop=False) if not cam_detect: From 131f16e096699aad78864e211ab089fa5b929b0f Mon Sep 17 00:00:00 2001 From: "Yermolenko, Dmytro" Date: Mon, 1 Dec 2025 13:24:53 +0100 Subject: [PATCH 2/5] Revert temp changes --- manager/src/django/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/src/django/serializers.py b/manager/src/django/serializers.py index 2643355a1..4f51d6d93 100644 --- a/manager/src/django/serializers.py +++ b/manager/src/django/serializers.py @@ -697,7 +697,7 @@ def create_update(self, validated_data, instance=None): if use_tracker: instance.scenescapeScene.use_tracker = use_tracker if trs_matrix: - Scene.objects.filter(pk=instance.pk).update(trs_matrix=trs_matrix) + Scene.objects.filter(pk=self.pk).update(trs_matrix=trs_matrix) if map_path: map_path = '/media/' + map_path.name From 0510476ac713e3c306ad9ab9c5dd9da1e2a75132 Mon Sep 17 00:00:00 2001 From: "Yermolenko, Dmytro" Date: Mon, 1 Dec 2025 14:44:48 +0100 Subject: [PATCH 3/5] Use tracker.waitForComplete() --- tests/system/metric/tc_distance_thresh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/metric/tc_distance_thresh.py b/tests/system/metric/tc_distance_thresh.py index 538e1306c..526e03956 100644 --- a/tests/system/metric/tc_distance_thresh.py +++ b/tests/system/metric/tc_distance_thresh.py @@ -50,7 +50,6 @@ def track(params): if 'assets' in params: scene.tracker.updateObjectClasses(params['assets']) - time.sleep(3) while True: _, cam_detect, _ = mgr.nextFrame(scene, loop=False) if not cam_detect: @@ -65,6 +64,7 @@ def track(params): } get_detections(tracked_data, scene, objects, jdata) + scene.tracker.waitForComplete() scene.tracker.join() return tracked_data From a4ad63f55cdb4e0085bef37434fd471ebf52920f Mon Sep 17 00:00:00 2001 From: Dmytro Yermolenko Date: Mon, 1 Dec 2025 14:46:26 +0100 Subject: [PATCH 4/5] Update tests/system/metric/tc_distance_thresh.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/system/metric/tc_distance_thresh.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/system/metric/tc_distance_thresh.py b/tests/system/metric/tc_distance_thresh.py index 526e03956..45e7a3fe8 100644 --- a/tests/system/metric/tc_distance_thresh.py +++ b/tests/system/metric/tc_distance_thresh.py @@ -3,7 +3,6 @@ # SPDX-FileCopyrightText: (C) 2024 - 2025 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -import time import controller.tools.analytics.library.json_helper as json_helper import controller.tools.analytics.library.metrics as metrics import tests.common_test_utils as common From c0a012fcb4e76bcf3ca226f8064b9a7f32235336 Mon Sep 17 00:00:00 2001 From: "Yermolenko, Dmytro" Date: Tue, 2 Dec 2025 11:45:15 +0100 Subject: [PATCH 5/5] Add time chunking tracker configuration --- tests/system/metric/tc_distance_thresh.py | 89 ++++++++++++++++++++++- 1 file changed, 86 insertions(+), 3 deletions(-) diff --git a/tests/system/metric/tc_distance_thresh.py b/tests/system/metric/tc_distance_thresh.py index 45e7a3fe8..dcc0fd3e8 100644 --- a/tests/system/metric/tc_distance_thresh.py +++ b/tests/system/metric/tc_distance_thresh.py @@ -3,6 +3,12 @@ # SPDX-FileCopyrightText: (C) 2024 - 2025 Intel Corporation # SPDX-License-Identifier: Apache-2.0 +import json +import os +import time + +import cv2 + import controller.tools.analytics.library.json_helper as json_helper import controller.tools.analytics.library.metrics as metrics import tests.common_test_utils as common @@ -10,6 +16,8 @@ from controller.scene import Scene from scene_common.json_track_data import CamManager from scene_common.scenescape import SceneLoader +from scene_common.camera import Camera +from scene_common.geometry import Region, Tripwire def get_detections(tracked_data, scene, objects, jdata): @@ -40,20 +48,95 @@ def track(params): @param params Dict of parameters needed for tracking @return tracked_data The filled list of tracked data """ - tracked_data = [] - scene = SceneLoader(params["config"], scene_model=Scene).scene + + with open(params["trackerconfig"]) as f: + trackerConfigData = json.load(f) + max_unreliable_time = trackerConfigData["max_unreliable_frames"]/trackerConfigData["baseline_frame_rate"] + non_measurement_time_dynamic = trackerConfigData["non_measurement_frames_dynamic"]/trackerConfigData["baseline_frame_rate"] + non_measurement_time_static = trackerConfigData["non_measurement_frames_static"]/trackerConfigData["baseline_frame_rate"] + time_chunking_enabled = trackerConfigData["time_chunking_enabled"] + time_chunking_interval_ms = trackerConfigData["time_chunking_interval_milliseconds"] + + camera_fps = [] + for input_file in params["input"]: + cam = cv2.VideoCapture(input_file.removesuffix('.json')+'.mp4') + fps = cam.get(cv2.CAP_PROP_FPS) + if fps == 0.0: + fps = int(params["default_camera_frame_rate"]) # default value + camera_fps.append(fps) + cam.release() + ref_camera_fps = int(min(camera_fps)) + + if time_chunking_enabled: + time_chunking_interval_ms = int((1 / ref_camera_fps) * 1000) + print(f"Time chunking ENABLED with interval: {time_chunking_interval_ms}ms for {ref_camera_fps} FPS") + else: + print("Time chunking DISABLED") + + loader = SceneLoader(params["config"]) + scene_config = loader.config + + scene = Scene( + scene_config['name'], + scene_config.get('map'), + scene_config.get('scale'), + max_unreliable_time=max_unreliable_time, + non_measurement_time_dynamic=non_measurement_time_dynamic, + non_measurement_time_static=non_measurement_time_static, + time_chunking_enabled=time_chunking_enabled, + time_chunking_interval_milliseconds=time_chunking_interval_ms + ) + + if 'sensors' in scene_config: + for name in scene_config['sensors']: + info = scene_config['sensors'][name] + if 'map points' in info: + if scene.areCoordinatesInPixels(info['map points']): + info['map points'] = scene.mapPixelsToMetric(info['map points']) + camera = Camera(name, info) + scene.cameras[name] = camera + + if 'regions' in scene_config: + for region in scene_config['regions']: + points = region['points'] + if scene.areCoordinatesInPixels(points): + region['points'] = scene.mapPixelsToMetric(points) + region_obj = Region(region['uuid'], region['name'], {'points': region['points']}) + scene.regions[region_obj.name] = region_obj + + if 'tripwires' in scene_config: + for tripwire in scene_config['tripwires']: + points = tripwire['points'] + if scene.areCoordinatesInPixels(points): + points = scene.mapPixelsToMetric(points) + tripwire_obj = Tripwire(tripwire['uuid'], tripwire['name'], {'points': points}) + scene.tripwires[tripwire_obj.name] = tripwire_obj + + scene.ref_camera_frame_rate = ref_camera_fps mgr = CamManager(params["input"], scene) - detected_category = None if 'assets' in params: scene.tracker.updateObjectClasses(params['assets']) + frame_interval = 1.0 / ref_camera_fps if time_chunking_enabled else 0 + start_time = time.time() + frame_count = 0 + while True: _, cam_detect, _ = mgr.nextFrame(scene, loop=False) if not cam_detect: break objects = cam_detect["objects"] + + if time_chunking_enabled: + frame_count += 1 + expected_time = start_time + (frame_count * frame_interval) + current_time = time.time() + sleep_time = expected_time - current_time + if sleep_time > 0: + time.sleep(sleep_time) + scene.processCameraData(cam_detect) jdata = {