From 700685bc535736f4d98bac79af7148e1dbf4df75 Mon Sep 17 00:00:00 2001 From: yasakova-anastasia Date: Mon, 7 Nov 2022 18:47:44 +0200 Subject: [PATCH 1/6] Fix interpolation --- cvat/apps/dataset_manager/annotation.py | 12 ++--- .../tests/test_rest_api_formats.py | 54 ++++++++++--------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/cvat/apps/dataset_manager/annotation.py b/cvat/apps/dataset_manager/annotation.py index 38ff78b2fad..6d1b175ca8e 100644 --- a/cvat/apps/dataset_manager/annotation.py +++ b/cvat/apps/dataset_manager/annotation.py @@ -737,11 +737,14 @@ def interpolate(shape0, shape1): return shapes shapes = [] - curr_frame = track["shapes"][0]["frame"] prev_shape = {} for shape in track["shapes"]: + curr_frame = shape["frame"] + if end_frame <= curr_frame: + break + if prev_shape: - assert shape["frame"] > curr_frame + assert shape["frame"] > prev_shape["frame"] for attr in prev_shape["attributes"]: if attr["spec_id"] not in map(lambda el: el["spec_id"], shape["attributes"]): shape["attributes"].append(deepcopy(attr)) @@ -750,13 +753,8 @@ def interpolate(shape0, shape1): shape["keyframe"] = True shapes.append(shape) - curr_frame = shape["frame"] prev_shape = shape - # keep at least 1 shape - if end_frame <= curr_frame: - break - if not prev_shape["outside"]: shape = deepcopy(prev_shape) shape["frame"] = end_frame diff --git a/cvat/apps/dataset_manager/tests/test_rest_api_formats.py b/cvat/apps/dataset_manager/tests/test_rest_api_formats.py index 93327305a75..b15e2bac503 100644 --- a/cvat/apps/dataset_manager/tests/test_rest_api_formats.py +++ b/cvat/apps/dataset_manager/tests/test_rest_api_formats.py @@ -785,39 +785,41 @@ def test_api_v2_dump_upload_annotations_from_several_jobs(self): with open(file_zip_name, 'rb') as binary_file: self._upload_file(url, binary_file, self.admin) - def test_api_v2_dump_annotations_with_objects_type_is_shape_from_several_jobs(self): + def test_api_v2_dump_annotations_with_objects_type_from_several_jobs(self): test_name = self._testMethodName - dump_format_name = "CVAT for images 1.1" + dump_formats = ["CVAT for images 1.1", "CVAT for video 1.1"] test_cases = ['all', 'first'] - images = self._generate_task_images(10) - task = self._create_task(tasks["change overlap and segment size"], images) - task_id = task["id"] + for dump_format_name in dump_formats: - for test_case in test_cases: - with TestDir() as test_dir: - jobs = self._get_jobs(task_id) - if test_case == "all": - for job in jobs: - self._create_annotations_in_job(task, job["id"], dump_format_name, "default") - else: - self._create_annotations_in_job(task, jobs[0]["id"], dump_format_name, "default") + images = self._generate_task_images(10) + task = self._create_task(tasks["change overlap and segment size"], images) + task_id = task["id"] - url = self._generate_url_dump_tasks_annotations(task_id) + for test_case in test_cases: + with TestDir() as test_dir: + jobs = self._get_jobs(task_id) + if test_case == "all": + for job in jobs: + self._create_annotations_in_job(task, job["id"], dump_format_name, "default") + else: + self._create_annotations_in_job(task, jobs[0]["id"], dump_format_name, "default") - file_zip_name = osp.join(test_dir, f'{test_name}.zip') - data = { - "format": dump_format_name, - "action": "download", - } - self._download_file(url, data, self.admin, file_zip_name) - self.assertEqual(osp.exists(file_zip_name), True) + url = self._generate_url_dump_tasks_annotations(task_id) - # remove annotations - self._remove_annotations(url, self.admin) - url = self._generate_url_upload_tasks_annotations(task_id, "CVAT 1.1") - with open(file_zip_name, 'rb') as binary_file: - self._upload_file(url, binary_file, self.admin) + file_zip_name = osp.join(test_dir, f'{test_name}.zip') + data = { + "format": dump_format_name, + "action": "download", + } + self._download_file(url, data, self.admin, file_zip_name) + self.assertEqual(osp.exists(file_zip_name), True) + + # remove annotations + self._remove_annotations(url, self.admin) + url = self._generate_url_upload_tasks_annotations(task_id, "CVAT 1.1") + with open(file_zip_name, 'rb') as binary_file: + self._upload_file(url, binary_file, self.admin) def test_api_v2_export_dataset(self): test_name = self._testMethodName From aed0f0b280fab880aa9a846bf1dfd28a961e00ca Mon Sep 17 00:00:00 2001 From: yasakova-anastasia Date: Mon, 7 Nov 2022 18:54:52 +0200 Subject: [PATCH 2/6] Update Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 622318f7c15..5ccbd487d45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,7 @@ non-ascii paths while adding files from "Connected file share" (issue #4428) - Create manifest with cvat/server docker container command () - Cannot assign a resource to a user who has an organization () - Oriented bounding boxes broken with COCO format ss() +- Can't dump annotations with objects type is track from several jobs () ### Security - TDB From 8cea25e24b0af2996e4c9ae8220d05aa1f463b75 Mon Sep 17 00:00:00 2001 From: yasakova-anastasia Date: Mon, 7 Nov 2022 20:43:07 +0200 Subject: [PATCH 3/6] Fix import --- cvat/apps/dataset_manager/annotation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cvat/apps/dataset_manager/annotation.py b/cvat/apps/dataset_manager/annotation.py index 6d1b175ca8e..08a7ded0f2c 100644 --- a/cvat/apps/dataset_manager/annotation.py +++ b/cvat/apps/dataset_manager/annotation.py @@ -741,6 +741,10 @@ def interpolate(shape0, shape1): for shape in track["shapes"]: curr_frame = shape["frame"] if end_frame <= curr_frame: + if not prev_shape: + shape["keyframe"] = True + shapes.append(shape) + prev_shape = shape break if prev_shape: From c32251354b9ae633f25423e9922a2140f8531351 Mon Sep 17 00:00:00 2001 From: yasakova-anastasia Date: Tue, 8 Nov 2022 17:53:09 +0200 Subject: [PATCH 4/6] Fix incorrect import --- cvat/apps/dataset_manager/annotation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/apps/dataset_manager/annotation.py b/cvat/apps/dataset_manager/annotation.py index 08a7ded0f2c..8a338d622d2 100644 --- a/cvat/apps/dataset_manager/annotation.py +++ b/cvat/apps/dataset_manager/annotation.py @@ -105,7 +105,7 @@ def filter_track_shapes(shapes): if scoped_shapes: if not scoped_shapes[0]['keyframe']: segment_shapes.insert(0, scoped_shapes[0]) - if not scoped_shapes[-1]['keyframe'] and \ + if scoped_shapes[-1]['keyframe'] and \ scoped_shapes[-1]['outside']: segment_shapes.append(scoped_shapes[-1]) elif stop + 1 < len(interpolated_shapes) and \ From 11401352553caf41be290bf70e5b13dd73214770 Mon Sep 17 00:00:00 2001 From: yasakova-anastasia Date: Thu, 10 Nov 2022 15:18:17 +0200 Subject: [PATCH 5/6] Small fix --- cvat/apps/dataset_manager/tests/test_rest_api_formats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/apps/dataset_manager/tests/test_rest_api_formats.py b/cvat/apps/dataset_manager/tests/test_rest_api_formats.py index b15e2bac503..8705a288417 100644 --- a/cvat/apps/dataset_manager/tests/test_rest_api_formats.py +++ b/cvat/apps/dataset_manager/tests/test_rest_api_formats.py @@ -785,7 +785,7 @@ def test_api_v2_dump_upload_annotations_from_several_jobs(self): with open(file_zip_name, 'rb') as binary_file: self._upload_file(url, binary_file, self.admin) - def test_api_v2_dump_annotations_with_objects_type_from_several_jobs(self): + def test_api_v2_dump_annotations_from_several_jobs(self): test_name = self._testMethodName dump_formats = ["CVAT for images 1.1", "CVAT for video 1.1"] test_cases = ['all', 'first'] From b1b6218c99fc9beaedd80b329b658a84bd886580 Mon Sep 17 00:00:00 2001 From: yasakova-anastasia Date: Tue, 15 Nov 2022 16:38:43 +0200 Subject: [PATCH 6/6] Fixes --- cvat/apps/dataset_manager/annotation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/apps/dataset_manager/annotation.py b/cvat/apps/dataset_manager/annotation.py index 8a338d622d2..16e67691a5f 100644 --- a/cvat/apps/dataset_manager/annotation.py +++ b/cvat/apps/dataset_manager/annotation.py @@ -738,7 +738,7 @@ def interpolate(shape0, shape1): shapes = [] prev_shape = {} - for shape in track["shapes"]: + for shape in sorted(track["shapes"], key=lambda shape: shape["frame"]): curr_frame = shape["frame"] if end_frame <= curr_frame: if not prev_shape: