From 51615df2e67b5af7eb445057dc232aa91b6bb65d Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Fri, 9 Jun 2023 16:06:56 +0300 Subject: [PATCH 1/9] Accelerated & fixed decoder --- .../static/lambda_manager/decoder.onnx | Bin 8746235 -> 8745603 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/cvat/apps/lambda_manager/static/lambda_manager/decoder.onnx b/cvat/apps/lambda_manager/static/lambda_manager/decoder.onnx index 336a7ba506ca4ac8a067236cb36bb3eadc3cf126..72c5a1e8a1cb8894447a2e1cc2e571a67a26f994 100644 GIT binary patch delta 8025 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 D4bDp> delta 8344 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 From 0de3c7d795b9e19883c51b6def2dade1fc2e7d00 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Sat, 10 Jun 2023 12:44:47 +0300 Subject: [PATCH 2/9] Fixed models for exif rotated images --- cvat/apps/engine/media_extractors.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index 11590f4e463..01f75d04c01 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -31,7 +31,6 @@ ORIENTATION_EXIF_TAG = 274 - class ORIENTATION(IntEnum): NORMAL_HORIZONTAL=1 MIRROR_HORIZONTAL=2 @@ -42,7 +41,6 @@ class ORIENTATION(IntEnum): MIRROR_HORIZONTAL_90_ROTATED=7 NORMAL_270_ROTATED=8 - def get_mime(name): for type_name, type_def in MEDIA_TYPES.items(): if type_def['has_mime_type'](name): @@ -63,6 +61,7 @@ def files_to_ignore(directory): return True return False + def sort(images, sorting_method=SortingMethod.LEXICOGRAPHICAL, func=None): if sorting_method == SortingMethod.LEXICOGRAPHICAL: return sorted(images, key=func) @@ -76,6 +75,7 @@ def sort(images, sorting_method=SortingMethod.LEXICOGRAPHICAL, func=None): else: raise NotImplementedError() + def image_size_within_orientation(img: Image): orientation = img.getexif().get(ORIENTATION_EXIF_TAG, ORIENTATION.NORMAL_HORIZONTAL) if orientation > 4: @@ -651,11 +651,12 @@ class ZipChunkWriter(IChunkWriter): def save_as_chunk(self, images, chunk_path): with zipfile.ZipFile(chunk_path, 'x') as zip_chunk: for idx, (image, path, _) in enumerate(images): - arcname = '{:06d}{}'.format(idx, os.path.splitext(path)[1]) - if isinstance(image, io.BytesIO): - zip_chunk.writestr(arcname, image.getvalue()) - else: - zip_chunk.write(filename=image, arcname=arcname) + ext = os.path.splitext(path)[1] + arcname = '{:06d}{}'.format(idx, ext) + pil_image = rotate_within_exif(Image.open(image)) + with io.BytesIO() as output: + pil_image.save(output, format=pil_image.format if pil_image.format else ext or 'jpeg', quality=100, subsampling=0) + zip_chunk.writestr(arcname, output.getvalue()) # return empty list because ZipChunkWriter write files as is # and does not decode it to know img size. return [] From 39028e78418e5b4ebc6056844c30a4e04d021704 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Sat, 10 Jun 2023 12:45:25 +0300 Subject: [PATCH 3/9] Removed extra spaces --- cvat/apps/engine/media_extractors.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index 01f75d04c01..2a58da43d07 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -61,7 +61,6 @@ def files_to_ignore(directory): return True return False - def sort(images, sorting_method=SortingMethod.LEXICOGRAPHICAL, func=None): if sorting_method == SortingMethod.LEXICOGRAPHICAL: return sorted(images, key=func) @@ -75,7 +74,6 @@ def sort(images, sorting_method=SortingMethod.LEXICOGRAPHICAL, func=None): else: raise NotImplementedError() - def image_size_within_orientation(img: Image): orientation = img.getexif().get(ORIENTATION_EXIF_TAG, ORIENTATION.NORMAL_HORIZONTAL) if orientation > 4: From 8a617ec15427c1851641b72bc5045fa135a1c7c9 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Sat, 10 Jun 2023 12:46:14 +0300 Subject: [PATCH 4/9] Updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9942ba03d44..82fcad32544 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Simultaneous creation of tasks or projects with identical names from backups by multiple users.() - \[Server API\] The `predefined` sorting method for task data uploads () - Allowed slashes in export filenames. () +- Running serverless models for EXIF-rotated images () ### Security - TDB From 92bfadcad8d5fc2aec0f40c58f96980571b9db5f Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Mon, 12 Jun 2023 13:38:46 +0300 Subject: [PATCH 5/9] Fixed for 3D pcd files --- cvat/apps/engine/media_extractors.py | 27 +++++++++++++++++---------- cvat/apps/engine/task.py | 2 +- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index 2a58da43d07..dc75d1efd58 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -96,6 +96,15 @@ def rotate_within_exif(img: Image): return img +def write_pcd_file(image): + image_buf = open(image, "rb") if isinstance(image, str) else image + properties = ValidateDimension.get_pcd_properties(image_buf) + w, h = int(properties["WIDTH"]), int(properties["HEIGHT"]) + extension = "pcd" + image_buf.seek(0, 0) + image_buf = io.BytesIO(image_buf.read()) + return image_buf, extension, w, h + class IMediaReader(ABC): def __init__(self, source_path, step, start, stop, dimension): self._source_path = source_path @@ -650,11 +659,14 @@ def save_as_chunk(self, images, chunk_path): with zipfile.ZipFile(chunk_path, 'x') as zip_chunk: for idx, (image, path, _) in enumerate(images): ext = os.path.splitext(path)[1] - arcname = '{:06d}{}'.format(idx, ext) - pil_image = rotate_within_exif(Image.open(image)) - with io.BytesIO() as output: + output = io.BytesIO() + if self._dimension == DimensionType.DIM_2D: + pil_image = rotate_within_exif(Image.open(image)) pil_image.save(output, format=pil_image.format if pil_image.format else ext or 'jpeg', quality=100, subsampling=0) - zip_chunk.writestr(arcname, output.getvalue()) + else: + output, ext = write_pcd_file(image)[0:2] + arcname = '{:06d}{}'.format(idx, ext) + zip_chunk.writestr(arcname, output.getvalue()) # return empty list because ZipChunkWriter write files as is # and does not decode it to know img size. return [] @@ -668,12 +680,7 @@ def save_as_chunk(self, images, chunk_path): w, h, image_buf = self._compress_image(image, self._image_quality) extension = "jpeg" else: - image_buf = open(image, "rb") if isinstance(image, str) else image - properties = ValidateDimension.get_pcd_properties(image_buf) - w, h = int(properties["WIDTH"]), int(properties["HEIGHT"]) - extension = "pcd" - image_buf.seek(0, 0) - image_buf = io.BytesIO(image_buf.read()) + image_buf, extension, w, h = write_pcd_file(image) image_sizes.append((w, h)) arcname = '{:06d}.{}'.format(idx, extension) zip_chunk.writestr(arcname, image_buf.getvalue()) diff --git a/cvat/apps/engine/task.py b/cvat/apps/engine/task.py index 589f080df52..2a9e5098583 100644 --- a/cvat/apps/engine/task.py +++ b/cvat/apps/engine/task.py @@ -901,7 +901,7 @@ def update_progress(progress): if validate_dimension.dimension == models.DimensionType.DIM_3D: kwargs["dimension"] = validate_dimension.dimension compressed_chunk_writer = compressed_chunk_writer_class(db_data.image_quality, **kwargs) - original_chunk_writer = original_chunk_writer_class(original_quality) + original_chunk_writer = original_chunk_writer_class(original_quality, **kwargs) # calculate chunk size if it isn't specified if db_data.chunk_size is None: From 5283c48d0dc3436fe0ec91e72a0d359df6e5347c Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Mon, 12 Jun 2023 15:06:16 +0300 Subject: [PATCH 6/9] Fixed changelog --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55ca67de139..4cd6ab0ad81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## \[2.5.0] - Unreleased ### Added -- New option ``semi-auto`` is available as annotations source () - \[API\] Support for Ground Truth job creation and removal () - \[API\] Task quality estimation endpoints () @@ -24,7 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - TDB ### Fixed -- TDB +- Running serverless models for EXIF-rotated images () ### Security - TDB @@ -48,7 +47,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 after they have been uploaded to the server using the TUS protocol but before an RQ job has been initiated. () - Simultaneous creation of tasks or projects with identical names from backups by multiple users.() - \[API\] The `predefined` sorting method for task data uploads () -- Running serverless models for EXIF-rotated images () - Allowed slashes in export filenames. () - Dataset export error with `outside` property of tracks () From 2b915e6e13937ef1f4ca0a8c70ff484c3f131412 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Mon, 12 Jun 2023 16:25:54 +0300 Subject: [PATCH 7/9] Fixed missed dot --- cvat/apps/engine/media_extractors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index 81a1c51f636..60413492d0c 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -668,7 +668,7 @@ def save_as_chunk(self, images, chunk_path): pil_image.save(output, format=pil_image.format if pil_image.format else ext or self.IMAGE_EXT, quality=100, subsampling=0) else: output, ext = self._write_pcd_file(image)[0:2] - arcname = '{:06d}{}'.format(idx, ext) + arcname = '{:06d}.{}'.format(idx, ext) zip_chunk.writestr(arcname, output.getvalue()) # return empty list because ZipChunkWriter write files as is # and does not decode it to know img size. From c20e8fdf1990bb9e98a4a128bc5b73f7205bd09d Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Mon, 12 Jun 2023 19:48:21 +0300 Subject: [PATCH 8/9] updated inheritance model --- cvat/apps/engine/media_extractors.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index 60413492d0c..0e37154db77 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -600,22 +600,10 @@ def __iter__(self): return class IChunkWriter(ABC): - IMAGE_EXT = 'jpeg' - POINT_CLOUD_EXT = 'pcd' - def __init__(self, quality, dimension=DimensionType.DIM_2D): self._image_quality = quality self._dimension = dimension - def _write_pcd_file(self, image): - image_buf = open(image, "rb") if isinstance(image, str) else image - properties = ValidateDimension.get_pcd_properties(image_buf) - w, h = int(properties["WIDTH"]), int(properties["HEIGHT"]) - extension = self.POINT_CLOUD_EXT - image_buf.seek(0, 0) - image_buf = io.BytesIO(image_buf.read()) - return image_buf, extension, w, h - @staticmethod def _compress_image(image_path, quality): image = image_path.to_image() if isinstance(image_path, av.VideoFrame) else Image.open(image_path) @@ -658,6 +646,18 @@ def save_as_chunk(self, images, chunk_path): pass class ZipChunkWriter(IChunkWriter): + IMAGE_EXT = 'jpeg' + POINT_CLOUD_EXT = 'pcd' + + def _write_pcd_file(self, image): + image_buf = open(image, "rb") if isinstance(image, str) else image + properties = ValidateDimension.get_pcd_properties(image_buf) + w, h = int(properties["WIDTH"]), int(properties["HEIGHT"]) + extension = self.POINT_CLOUD_EXT + image_buf.seek(0, 0) + image_buf = io.BytesIO(image_buf.read()) + return image_buf, extension, w, h + def save_as_chunk(self, images, chunk_path): with zipfile.ZipFile(chunk_path, 'x') as zip_chunk: for idx, (image, path, _) in enumerate(images): @@ -674,7 +674,7 @@ def save_as_chunk(self, images, chunk_path): # and does not decode it to know img size. return [] -class ZipCompressedChunkWriter(IChunkWriter): +class ZipCompressedChunkWriter(ZipChunkWriter): def save_as_chunk( self, images, chunk_path, *, compress_frames: bool = True, zip_compress_level: int = 0 ): From a5e1f33209018815a7e4784758bb713a9ad9d5f7 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Tue, 13 Jun 2023 11:37:19 +0300 Subject: [PATCH 9/9] Close file --- cvat/apps/engine/media_extractors.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index 0e37154db77..447e1d73a1e 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -651,12 +651,14 @@ class ZipChunkWriter(IChunkWriter): def _write_pcd_file(self, image): image_buf = open(image, "rb") if isinstance(image, str) else image - properties = ValidateDimension.get_pcd_properties(image_buf) - w, h = int(properties["WIDTH"]), int(properties["HEIGHT"]) - extension = self.POINT_CLOUD_EXT - image_buf.seek(0, 0) - image_buf = io.BytesIO(image_buf.read()) - return image_buf, extension, w, h + try: + properties = ValidateDimension.get_pcd_properties(image_buf) + w, h = int(properties["WIDTH"]), int(properties["HEIGHT"]) + image_buf.seek(0, 0) + return io.BytesIO(image_buf.read()), self.POINT_CLOUD_EXT, w, h + finally: + if isinstance(image, str): + image_buf.close() def save_as_chunk(self, images, chunk_path): with zipfile.ZipFile(chunk_path, 'x') as zip_chunk: