From 4186a7dd313508e003af5a4ee66868ce6509e056 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2020 15:29:43 +0300 Subject: [PATCH 01/30] Bump mod-wsgi from 4.6.2 to 4.7.1 in /cvat/requirements (#1746) Bumps [mod-wsgi](https://github.com/GrahamDumpleton/mod_wsgi) from 4.6.2 to 4.7.1. - [Release notes](https://github.com/GrahamDumpleton/mod_wsgi/releases) - [Commits](https://github.com/GrahamDumpleton/mod_wsgi/compare/4.6.2...4.7.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/production.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/production.txt b/cvat/requirements/production.txt index fed7e9262311..36e64e297374 100644 --- a/cvat/requirements/production.txt +++ b/cvat/requirements/production.txt @@ -1,3 +1,3 @@ -r base.txt psycopg2-binary==2.8.5 -mod-wsgi==4.6.2 \ No newline at end of file +mod-wsgi==4.7.1 \ No newline at end of file From 5c63734ea5b9e220418069eacc9f695d656b36bb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2020 15:30:35 +0300 Subject: [PATCH 02/30] Bump imgaug from 0.2.9 to 0.4.0 in /cvat/requirements (#1745) Bumps [imgaug](https://github.com/aleju/imgaug) from 0.2.9 to 0.4.0. - [Release notes](https://github.com/aleju/imgaug/releases) - [Commits](https://github.com/aleju/imgaug/compare/0.2.9...0.4.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 15bff9eeee29..047c346f3dd6 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -42,7 +42,7 @@ tensorflow==1.15.2 keras==2.3.1 opencv-python==4.1.0.25 h5py==2.9.0 -imgaug==0.2.9 +imgaug==0.4.0 django-cors-headers==3.3.0 furl==2.0.0 av==6.2.0 From 2d34acd0e302306f714c61d3441a01c1c2cf7bf8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2020 15:31:09 +0300 Subject: [PATCH 03/30] Bump requests from 2.23.0 to 2.24.0 in /cvat/requirements (#1744) Bumps [requests](https://github.com/psf/requests) from 2.23.0 to 2.24.0. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/master/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.23.0...v2.24.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 047c346f3dd6..7200e9f3857d 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -13,7 +13,7 @@ pytz==2020.1 pyunpack==0.1.2 rcssmin==1.0.6 redis==3.2.0 -requests==2.23.0 +requests==2.24.0 rjsmin==1.0.12 rq==1.0.0 rq-scheduler==0.10.0 From e4c21d319a4a83eae9ae6d53fc89b569229e346d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2020 15:31:57 +0300 Subject: [PATCH 04/30] Bump pyunpack from 0.1.2 to 0.2.1 in /cvat/requirements (#1743) Bumps [pyunpack](https://github.com/ponty/pyunpack) from 0.1.2 to 0.2.1. - [Release notes](https://github.com/ponty/pyunpack/releases) - [Commits](https://github.com/ponty/pyunpack/compare/0.1.2...0.2.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 7200e9f3857d..c4f099453dca 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -10,7 +10,7 @@ Pillow==7.1.2 numpy==1.18.5 python-ldap==3.2.0 pytz==2020.1 -pyunpack==0.1.2 +pyunpack==0.2.1 rcssmin==1.0.6 redis==3.2.0 requests==2.24.0 From 2b34bf3dcc5899062fdefa5d24b1353f3455de29 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2020 15:32:27 +0300 Subject: [PATCH 05/30] Bump six from 1.12.0 to 1.15.0 in /cvat/requirements (#1742) Bumps [six](https://github.com/benjaminp/six) from 1.12.0 to 1.15.0. - [Release notes](https://github.com/benjaminp/six/releases) - [Changelog](https://github.com/benjaminp/six/blob/master/CHANGES) - [Commits](https://github.com/benjaminp/six/compare/1.12.0...1.15.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/testing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/testing.txt b/cvat/requirements/testing.txt index 356645815f20..25e85bb3a30e 100644 --- a/cvat/requirements/testing.txt +++ b/cvat/requirements/testing.txt @@ -2,5 +2,5 @@ fakeredis==1.4.1 # Fix dependencies for fakeredis 1.1.0 # Pip will not reinstall six package if it is installed already -six==1.12.0 +six==1.15.0 coveralls \ No newline at end of file From 408c475d622469f7c261e22c13aa3274c64a668e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2020 15:34:41 +0300 Subject: [PATCH 06/30] Bump django-auth-ldap from 1.4.0 to 2.2.0 in /cvat/requirements (#1739) Bumps [django-auth-ldap](https://github.com/django-auth-ldap/django-auth-ldap) from 1.4.0 to 2.2.0. - [Release notes](https://github.com/django-auth-ldap/django-auth-ldap/releases) - [Changelog](https://github.com/django-auth-ldap/django-auth-ldap/blob/master/CHANGES) - [Commits](https://github.com/django-auth-ldap/django-auth-ldap/compare/1.4.0...2.2.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index c4f099453dca..ccd0abc7862f 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -1,7 +1,7 @@ click==6.7 Django==2.2.13 django-appconf==1.0.4 -django-auth-ldap==1.4.0 +django-auth-ldap==2.2.0 django-cacheops==5.0 django-compressor==2.4 django-rq==2.0.0 From 4ec0d4dae2069e8214f988be4dc2c007a0f886d5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2020 15:38:17 +0300 Subject: [PATCH 07/30] Bump pylint-plugin-utils from 0.2.6 to 0.6 in /cvat/requirements (#1740) Bumps [pylint-plugin-utils](https://github.com/landscapeio/pylint-plugin-utils) from 0.2.6 to 0.6. - [Release notes](https://github.com/landscapeio/pylint-plugin-utils/releases) - [Commits](https://github.com/landscapeio/pylint-plugin-utils/commits/0.6) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/development.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/development.txt b/cvat/requirements/development.txt index 9ea3b60a8640..7c09ca5a0466 100644 --- a/cvat/requirements/development.txt +++ b/cvat/requirements/development.txt @@ -5,7 +5,7 @@ lazy-object-proxy==1.3.1 mccabe==0.6.1 pylint==2.5.3 pylint-django==2.0.15 -pylint-plugin-utils==0.2.6 +pylint-plugin-utils==0.6 rope==0.11 wrapt==1.12.1 django-extensions==2.0.6 From 4047df99443ef3679277969497f24049a730ae98 Mon Sep 17 00:00:00 2001 From: a-andre Date: Thu, 18 Jun 2020 15:17:36 +0200 Subject: [PATCH 08/30] Fix 'django-compressor 2.4 has requirement rjsmin==1.1.0' (#1737) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: André Apitzsch Co-authored-by: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index ccd0abc7862f..2460fe1e653d 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -13,8 +13,8 @@ pytz==2020.1 pyunpack==0.2.1 rcssmin==1.0.6 redis==3.2.0 +rjsmin==1.1.0 requests==2.24.0 -rjsmin==1.0.12 rq==1.0.0 rq-scheduler==0.10.0 scipy==1.4.1 From e1e90e182c2105cb65a0ca95953ec6657fd8e9be Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Fri, 19 Jun 2020 10:49:55 +0300 Subject: [PATCH 09/30] [CVAT-UI] Fixed AAM bug: #1750 (#1755) * Fixed AAM bug: #1750 * Updated changelog and version --- CHANGELOG.md | 1 + cvat-ui/package-lock.json | 2 +- cvat-ui/package.json | 2 +- .../attribute-annotation-sidebar.tsx | 22 +++++++++++++------ .../standard-workspace/canvas-wrapper.tsx | 2 -- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index edc74e025018..93a3b5934d79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Wrong description on register view for the username field () - Wrong resolution for resizing a shape () - React warning because of not unique keys in labels viewer () +- A couple of exceptions in AAM related with early object activation () ### Security diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index d7d6dc4ddb92..ae7685c57d4c 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.3.1", + "version": "1.3.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-ui/package.json b/cvat-ui/package.json index e15f89230fee..e94c9f289b7f 100644 --- a/cvat-ui/package.json +++ b/cvat-ui/package.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.3.1", + "version": "1.3.2", "description": "CVAT single-page application", "main": "src/index.tsx", "scripts": { diff --git a/cvat-ui/src/components/annotation-page/attribute-annotation-workspace/attribute-annotation-sidebar/attribute-annotation-sidebar.tsx b/cvat-ui/src/components/annotation-page/attribute-annotation-workspace/attribute-annotation-sidebar/attribute-annotation-sidebar.tsx index 1c24f961f16e..75ed16cb9411 100644 --- a/cvat-ui/src/components/annotation-page/attribute-annotation-workspace/attribute-annotation-sidebar/attribute-annotation-sidebar.tsx +++ b/cvat-ui/src/components/annotation-page/attribute-annotation-workspace/attribute-annotation-sidebar/attribute-annotation-sidebar.tsx @@ -35,6 +35,7 @@ interface StateToProps { jobInstance: any; keyMap: Record; normalizedKeyMap: Record; + canvasIsReady: boolean; } interface DispatchToProps { @@ -58,6 +59,9 @@ function mapStateToProps(state: CombinedState): StateToProps { instance: jobInstance, labels, }, + canvas: { + ready: canvasIsReady, + }, }, shortcuts: { keyMap, @@ -73,6 +77,7 @@ function mapStateToProps(state: CombinedState): StateToProps { states, keyMap, normalizedKeyMap, + canvasIsReady, }; } @@ -98,6 +103,7 @@ function AttributeAnnotationSidebar(props: StateToProps & DispatchToProps): JSX. activateObject, keyMap, normalizedKeyMap, + canvasIsReady, } = props; const [labelAttrMap, setLabelAttrMap] = useState( @@ -117,14 +123,16 @@ function AttributeAnnotationSidebar(props: StateToProps & DispatchToProps): JSX. ? labelAttrMap[activeObjectState.label.id] : null; - if (activeObjectState) { - const attribute = labelAttrMap[activeObjectState.label.id]; - if (attribute && attribute.id !== activatedAttributeID) { - activateObject(activatedStateID, attribute ? attribute.id : null); + if (canvasIsReady) { + if (activeObjectState) { + const attribute = labelAttrMap[activeObjectState.label.id]; + if (attribute && attribute.id !== activatedAttributeID) { + activateObject(activatedStateID, attribute ? attribute.id : null); + } + } else if (states.length) { + const attribute = labelAttrMap[states[0].label.id]; + activateObject(states[0].clientID, attribute ? attribute.id : null); } - } else if (states.length) { - const attribute = labelAttrMap[states[0].label.id]; - activateObject(states[0].clientID, attribute ? attribute.id : null); } const nextObject = (step: number): void => { diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx index ef962c543d6f..fb1f8fe17325 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx @@ -618,14 +618,12 @@ export default class CanvasWrapperComponent extends React.PureComponent { const { annotations, frameData, - frameAngle, canvasInstance, } = this.props; if (frameData !== null) { canvasInstance.setup(frameData, annotations .filter((e) => e.objectType !== ObjectType.TAG)); - canvasInstance.rotate(frameAngle); } } From 0eb005c9f2a022ad16270c452a5fe10c77c5d4d6 Mon Sep 17 00:00:00 2001 From: zhiltsov-max Date: Fri, 19 Jun 2020 14:10:30 +0300 Subject: [PATCH 10/30] Support relative paths in import and export (#1463) * Move annotations to dm * Refactor dm * Rename data manager * Move anno dump and upload functions * Join server host and port in cvat cli * Move export templates dir * add dm project exporter * update mask format support * Use decorators for formats definition * Update formats * Update format implementations * remove parameter * Add dm views * Move annotation components to dm * restore extension for export formats * update rest api * use serializers, update views * merge develop * Update format names * Update docs * Update tests * move test * fix import * Extend format tests * django compatibility for directory access * move tests * update module links * fixes * fix git application * fixes * add extension recommentation * fixes * api * join api methods * Add trim whitespace to workspace config * update tests * fixes * Update format docs * join format queries * fixes * update new ui * ui tests * old ui * update js bundles * linter fixes * add image with loader tests * fix linter * fix frame step and frame access * use server file name for annotations export * update cvat core * add import hack for rest api tests * move cli tests * fix cvat format converter args parsing * remove folder on extract error * print error message on incorrect xpath expression * use own categories when no others exist * update changelog * really add text to changelog * Fix annotation window menu * fix ui * fix replace * update extra apps * format readme * readme * linter * Fix old ui * Update CHANGELOG.md * update user guide * linter * more linter fixes * update changelog * Add image attributes * add directory check in save image * update image tests * update image dir format with relative paths * update datumaro format * update coco format * update cvat format * update labelme format * update mot format * update image dir format * update voc format * update mot format * update yolo format * update labelme test * update voc format * update tfrecord format * fixes * update save_image usage * remove item name conversion * fix merge * fix export * prohibit relative paths in labelme format * Add test for relative name matching * move code * implement frame matching * fix yolo * fix merge * fix merge * prettify code * fix methid call * fix frame matching in yolo * add tests * regularize function output * update changelog * fixes * fix z_order use * fix slash replacement * linter * t * t2 Co-authored-by: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> --- CHANGELOG.md | 1 + cvat/apps/dataset_manager/bindings.py | 72 ++++++++----- cvat/apps/dataset_manager/formats/yolo.py | 16 +-- .../dataset_manager/tests/_test_formats.py | 101 +++++++++++++++++- 4 files changed, 159 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93a3b5934d79..6c654efac8ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Removed information about e-mail from the basic user information () - Update https install manual. Makes it easier and more robust. Includes automatic renewing of lets encrypt certificates. +- Implemented import and export of annotations with relative image paths () ### Deprecated - diff --git a/cvat/apps/dataset_manager/bindings.py b/cvat/apps/dataset_manager/bindings.py index 5b3fad27a3ad..534a23e742ed 100644 --- a/cvat/apps/dataset_manager/bindings.py +++ b/cvat/apps/dataset_manager/bindings.py @@ -5,6 +5,7 @@ import os.path as osp from collections import OrderedDict, namedtuple +from pathlib import Path from django.utils import timezone @@ -125,8 +126,8 @@ def _init_frame_info(self): } for db_image in self._db_task.data.images.all()} self._frame_mapping = { - self._get_filename(info["path"]): frame - for frame, info in self._frame_info.items() + self._get_filename(info["path"]): frame_number + for frame_number, info in self._frame_info.items() } def _init_meta(self): @@ -398,16 +399,27 @@ def db_task(self): @staticmethod def _get_filename(path): - return osp.splitext(osp.basename(path))[0] - - def match_frame(self, filename): - # try to match by filename - _filename = self._get_filename(filename) - if _filename in self._frame_mapping: - return self._frame_mapping[_filename] - - raise Exception( - "Cannot match filename or determine frame number for {} filename".format(filename)) + return osp.splitext(path)[0] + + def match_frame(self, path, root_hint=None): + path = self._get_filename(path) + match = self._frame_mapping.get(path) + if not match and root_hint and not path.startswith(root_hint): + path = osp.join(root_hint, path) + match = self._frame_mapping.get(path) + return match + + def match_frame_fuzzy(self, path): + # Preconditions: + # - The input dataset is full, i.e. all items present. Partial dataset + # matching can't be correct for all input cases. + # - path is the longest path of input dataset in terms of path parts + + path = Path(self._get_filename(path)).parts + for p, v in self._frame_mapping.items(): + if Path(p).parts[-len(path):] == path: # endswith() for paths + return v + return None class CvatTaskDataExtractor(datumaro.SourceExtractor): def __init__(self, task_data, include_images=False): @@ -450,8 +462,7 @@ def categories(self): def _load_categories(cvat_anno): categories = {} - label_categories = datumaro.LabelCategories( - attributes=['occluded', 'z_order']) + label_categories = datumaro.LabelCategories(attributes=['occluded']) for _, label in cvat_anno.meta['task']['labels']: label_categories.add(label['name']) @@ -537,20 +548,14 @@ def convert_attrs(label, cvat_attrs): return item_anno -def match_frame(item, task_data): +def match_dm_item(item, task_data, root_hint=None): is_video = task_data.meta['task']['mode'] == 'interpolation' frame_number = None if frame_number is None and item.has_image: - try: - frame_number = task_data.match_frame(item.image.path) - except Exception: - pass + frame_number = task_data.match_frame(item.image.path, root_hint) if frame_number is None: - try: - frame_number = task_data.match_frame(item.id) - except Exception: - pass + frame_number = task_data.match_frame(item.id, root_hint) if frame_number is None: frame_number = cast(item.attributes.get('frame', item.id), int) if frame_number is None and is_video: @@ -561,6 +566,19 @@ def match_frame(item, task_data): item.id) return frame_number +def find_dataset_root(dm_dataset, task_data): + longest_path = max(dm_dataset, key=lambda x: len(Path(x.id).parts)).id + longest_match = task_data.match_frame_fuzzy(longest_path) + if longest_match is None: + return None + + longest_match = osp.dirname(task_data.frame_info[longest_match]['path']) + prefix = longest_match[:-len(osp.dirname(longest_path)) or None] + if prefix.endswith('/'): + prefix = prefix[:-1] + return prefix + + def import_dm_annotations(dm_dataset, task_data): shapes = { datumaro.AnnotationType.bbox: ShapeType.RECTANGLE, @@ -569,10 +587,16 @@ def import_dm_annotations(dm_dataset, task_data): datumaro.AnnotationType.points: ShapeType.POINTS, } + if len(dm_dataset) == 0: + return + label_cat = dm_dataset.categories()[datumaro.AnnotationType.label] + root_hint = find_dataset_root(dm_dataset, task_data) + for item in dm_dataset: - frame_number = task_data.abs_frame_id(match_frame(item, task_data)) + frame_number = task_data.abs_frame_id( + match_dm_item(item, task_data, root_hint=root_hint)) # do not store one-item groups group_map = {0: 0} diff --git a/cvat/apps/dataset_manager/formats/yolo.py b/cvat/apps/dataset_manager/formats/yolo.py index 688ff903482a..488fe1a42d7f 100644 --- a/cvat/apps/dataset_manager/formats/yolo.py +++ b/cvat/apps/dataset_manager/formats/yolo.py @@ -9,10 +9,11 @@ from pyunpack import Archive from cvat.apps.dataset_manager.bindings import (CvatTaskDataExtractor, - import_dm_annotations, match_frame) + import_dm_annotations, match_dm_item, find_dataset_root) from cvat.apps.dataset_manager.util import make_zip_archive from datumaro.components.extractor import DatasetItem from datumaro.components.project import Dataset +from datumaro.plugins.yolo_format.extractor import YoloExtractor from .registry import dm_env, exporter, importer @@ -33,17 +34,20 @@ def _import(src_file, task_data): Archive(src_file.name).extractall(tmp_dir) image_info = {} - anno_files = glob(osp.join(tmp_dir, '**', '*.txt'), recursive=True) - for filename in anno_files: - filename = osp.splitext(osp.basename(filename))[0] + frames = [YoloExtractor.name_from_path(osp.relpath(p, tmp_dir)) + for p in glob(osp.join(tmp_dir, '**', '*.txt'), recursive=True)] + root_hint = find_dataset_root( + [DatasetItem(id=frame) for frame in frames], task_data) + for frame in frames: frame_info = None try: - frame_id = match_frame(DatasetItem(id=filename), task_data) + frame_id = match_dm_item(DatasetItem(id=frame), task_data, + root_hint=root_hint) frame_info = task_data.frame_info[frame_id] except Exception: pass if frame_info is not None: - image_info[filename] = (frame_info['height'], frame_info['width']) + image_info[frame] = (frame_info['height'], frame_info['width']) dataset = dm_env.make_importer('yolo')(tmp_dir, image_info=image_info) \ .make_dataset() diff --git a/cvat/apps/dataset_manager/tests/_test_formats.py b/cvat/apps/dataset_manager/tests/_test_formats.py index 659b9c71c7bd..c6c8ab7feb73 100644 --- a/cvat/apps/dataset_manager/tests/_test_formats.py +++ b/cvat/apps/dataset_manager/tests/_test_formats.py @@ -70,6 +70,10 @@ def _setUpModule(): from rest_framework.test import APITestCase, APIClient from rest_framework import status +from cvat.apps.dataset_manager.annotation import AnnotationIR +from cvat.apps.dataset_manager.bindings import TaskData, find_dataset_root +from cvat.apps.engine.models import Task + _setUpModule() from cvat.apps.dataset_manager.annotation import AnnotationIR @@ -256,7 +260,7 @@ def _generate_annotations(self, task): self._put_api_v1_task_id_annotations(task["id"], annotations) return annotations - def _generate_task_images(self, count): + def _generate_task_images(self, count): # pylint: disable=no-self-use images = { "client_files[%d]" % i: generate_image_file("image_%d.jpg" % i) for i in range(count) @@ -385,6 +389,7 @@ def load_dataset(src): # NOTE: can't import cvat.utils.cli # for whatever reason, so remove the dependency + # project.config.remove('sources') return project.make_dataset() @@ -436,3 +441,97 @@ def test_can_make_abs_frame_id_from_known(self): task_data = TaskData(AnnotationIR(), Task.objects.get(pk=task['id'])) self.assertEqual(5, task_data.abs_frame_id(2)) + +class FrameMatchingTest(_DbTestBase): + def _generate_task_images(self, paths): # pylint: disable=no-self-use + f = BytesIO() + with zipfile.ZipFile(f, 'w') as archive: + for path in paths: + archive.writestr(path, generate_image_file(path).getvalue()) + f.name = 'images.zip' + f.seek(0) + + return { + 'client_files[0]': f, + 'image_quality': 75, + } + + def _generate_task(self, images): + task = { + "name": "my task #1", + "owner": '', + "assignee": '', + "overlap": 0, + "segment_size": 100, + "z_order": False, + "labels": [ + { + "name": "car", + "attributes": [ + { + "name": "model", + "mutable": False, + "input_type": "select", + "default_value": "mazda", + "values": ["bmw", "mazda", "renault"] + }, + { + "name": "parked", + "mutable": True, + "input_type": "checkbox", + "default_value": False + }, + ] + }, + {"name": "person"}, + ] + } + return self._create_task(task, images) + + def test_frame_matching(self): + task_paths = [ + 'a.jpg', + 'a/a.jpg', + 'a/b.jpg', + 'b/a.jpg', + 'b/c.jpg', + 'a/b/c.jpg', + 'a/b/d.jpg', + ] + + images = self._generate_task_images(task_paths) + task = self._generate_task(images) + task_data = TaskData(AnnotationIR(), Task.objects.get(pk=task["id"])) + + for input_path, expected, root in [ + ('z.jpg', None, ''), # unknown item + ('z/a.jpg', None, ''), # unknown item + + ('d.jpg', 'a/b/d.jpg', 'a/b'), # match with root hint + ('b/d.jpg', 'a/b/d.jpg', 'a'), # match with root hint + ] + list(zip(task_paths, task_paths, [None] * len(task_paths))): # exact matches + with self.subTest(input=input_path): + actual = task_data.match_frame(input_path, root) + if actual is not None: + actual = task_data.frame_info[actual]['path'] + self.assertEqual(expected, actual) + + def test_dataset_root(self): + for task_paths, dataset_paths, expected in [ + ([ 'a.jpg', 'b/c/a.jpg' ], [ 'a.jpg', 'b/c/a.jpg' ], ''), + ([ 'b/a.jpg', 'b/c/a.jpg' ], [ 'a.jpg', 'c/a.jpg' ], 'b'), # 'images from share' case + ([ 'b/c/a.jpg' ], [ 'a.jpg' ], 'b/c'), # 'images from share' case + ([ 'a.jpg' ], [ 'z.jpg' ], None), + ]: + with self.subTest(expected=expected): + images = self._generate_task_images(task_paths) + task = self._generate_task(images) + task_data = TaskData(AnnotationIR(), + Task.objects.get(pk=task["id"])) + dataset = [ + datumaro.components.extractor.DatasetItem( + id=osp.splitext(p)[0]) + for p in dataset_paths] + + root = find_dataset_root(dataset, task_data) + self.assertEqual(expected, root) From 5a738e14af4617b394f69c388b5030ebb796fd5a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2020 18:20:27 +0300 Subject: [PATCH 11/30] Bump easyprocess from 0.2.3 to 0.3 in /cvat/requirements (#1763) Bumps [easyprocess](https://github.com/ponty/easyprocess) from 0.2.3 to 0.3. - [Release notes](https://github.com/ponty/easyprocess/releases) - [Commits](https://github.com/ponty/easyprocess/compare/0.2.3...0.3) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 2460fe1e653d..1e1d2e679446 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -5,7 +5,7 @@ django-auth-ldap==2.2.0 django-cacheops==5.0 django-compressor==2.4 django-rq==2.0.0 -EasyProcess==0.2.3 +EasyProcess==0.3 Pillow==7.1.2 numpy==1.18.5 python-ldap==3.2.0 From 1886258a2e1a35ad36b37f1d2ee99c3cdcad361c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2020 18:22:20 +0300 Subject: [PATCH 12/30] Bump rope from 0.11 to 0.17.0 in /cvat/requirements (#1762) Bumps [rope](https://github.com/python-rope/rope) from 0.11 to 0.17.0. - [Release notes](https://github.com/python-rope/rope/releases) - [Commits](https://github.com/python-rope/rope/compare/0.11.0...0.17.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/development.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/development.txt b/cvat/requirements/development.txt index 7c09ca5a0466..fad8fb689983 100644 --- a/cvat/requirements/development.txt +++ b/cvat/requirements/development.txt @@ -6,7 +6,7 @@ mccabe==0.6.1 pylint==2.5.3 pylint-django==2.0.15 pylint-plugin-utils==0.6 -rope==0.11 +rope==0.17.0 wrapt==1.12.1 django-extensions==2.0.6 Werkzeug==0.15.3 From f3bc63973e6c2ab80cf5170b1ab179bdff4d3d17 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2020 18:23:12 +0300 Subject: [PATCH 13/30] Bump django-revproxy from 0.9.15 to 0.10.0 in /cvat/requirements (#1759) Bumps [django-revproxy](https://github.com/TracyWebTech/django-revproxy) from 0.9.15 to 0.10.0. - [Release notes](https://github.com/TracyWebTech/django-revproxy/releases) - [Changelog](https://github.com/TracyWebTech/django-revproxy/blob/master/CHANGELOG.rst) - [Commits](https://github.com/TracyWebTech/django-revproxy/compare/0.9.15...0.10.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 1e1d2e679446..a8d029702464 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -22,7 +22,7 @@ sqlparse==0.2.4 django-sendfile==0.3.11 dj-pagination==2.4.0 python-logstash==0.4.6 -django-revproxy==0.9.15 +django-revproxy==0.10.0 rules==2.0 GitPython==3.1.3 coreapi==2.3.3 From b96449a0587cca031471cc68606a6f89f0235c1a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2020 18:24:17 +0300 Subject: [PATCH 14/30] Bump keras from 2.3.1 to 2.4.2 in /cvat/requirements (#1760) Bumps [keras](https://github.com/keras-team/keras) from 2.3.1 to 2.4.2. - [Release notes](https://github.com/keras-team/keras/releases) - [Commits](https://github.com/keras-team/keras/commits) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index a8d029702464..884f7d4120a8 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -39,7 +39,7 @@ cython==0.29.20 matplotlib==3.0.3 scikit-image==0.15.0 tensorflow==1.15.2 -keras==2.3.1 +keras==2.4.2 opencv-python==4.1.0.25 h5py==2.9.0 imgaug==0.4.0 From 2b59195252136561922a74b88216e5773285ae07 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 19 Jun 2020 18:29:13 +0300 Subject: [PATCH 15/30] Bump click from 6.7 to 7.1.2 in /cvat/requirements (#1757) Bumps [click](https://github.com/pallets/click) from 6.7 to 7.1.2. - [Release notes](https://github.com/pallets/click/releases) - [Changelog](https://github.com/pallets/click/blob/master/CHANGES.rst) - [Commits](https://github.com/pallets/click/compare/6.7...7.1.2) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 884f7d4120a8..f6db1eed85e3 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -1,4 +1,4 @@ -click==6.7 +click==7.1.2 Django==2.2.13 django-appconf==1.0.4 django-auth-ldap==2.2.0 From e4cdd27e5cf50ed0567cfd8203a70d2959bc8cf9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2020 09:55:39 +0300 Subject: [PATCH 16/30] Bump redis from 3.2.0 to 3.5.3 in /cvat/requirements (#1741) Bumps [redis](https://github.com/andymccurdy/redis-py) from 3.2.0 to 3.5.3. - [Release notes](https://github.com/andymccurdy/redis-py/releases) - [Changelog](https://github.com/andymccurdy/redis-py/blob/master/CHANGES) - [Commits](https://github.com/andymccurdy/redis-py/compare/3.2.0...3.5.3) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index f6db1eed85e3..e93549766da8 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -12,7 +12,7 @@ python-ldap==3.2.0 pytz==2020.1 pyunpack==0.2.1 rcssmin==1.0.6 -redis==3.2.0 +redis==3.5.3 rjsmin==1.1.0 requests==2.24.0 rq==1.0.0 From 34eba81d86be041e8a93611f99069b4ca17d258b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2020 09:57:01 +0300 Subject: [PATCH 17/30] Bump h5py from 2.9.0 to 2.10.0 in /cvat/requirements (#1738) Bumps [h5py](https://github.com/h5py/h5py) from 2.9.0 to 2.10.0. - [Release notes](https://github.com/h5py/h5py/releases) - [Changelog](https://github.com/h5py/h5py/blob/master/docs/release_guide.rst) - [Commits](https://github.com/h5py/h5py/compare/2.9.0...2.10.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index e93549766da8..b64ff792bea5 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -41,7 +41,7 @@ scikit-image==0.15.0 tensorflow==1.15.2 keras==2.4.2 opencv-python==4.1.0.25 -h5py==2.9.0 +h5py==2.10.0 imgaug==0.4.0 django-cors-headers==3.3.0 furl==2.0.0 From 2a349d024318c685a85178ad4401100d486e7a65 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2020 12:19:43 +0300 Subject: [PATCH 18/30] Bump eslint-plugin-react-hooks from 2.5.1 to 4.0.4 (#1758) Bumps [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) from 2.5.1 to 4.0.4. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/master/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/HEAD/packages/eslint-plugin-react-hooks) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba122822c016..21d437d1abb7 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "eslint-plugin-no-unsafe-innerhtml": "^1.0.16", "eslint-plugin-no-unsanitized": "^3.0.2", "eslint-plugin-react": "^7.14.3", - "eslint-plugin-react-hooks": "^2.5.1", + "eslint-plugin-react-hooks": "^4.0.4", "eslint-plugin-security": "^1.4.0", "remark-lint-emphasis-marker": "^2.0.0", "remark-lint-list-item-spacing": "^2.0.0", From 97b1005456585cfc2c915d9b82ef6072fc272d62 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov <41117609+azhavoro@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:06:11 +0300 Subject: [PATCH 19/30] compatibility with python 3.6 and lower (#1780) --- cvat/apps/engine/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cvat/apps/engine/utils.py b/cvat/apps/engine/utils.py index dd4a083d7c75..e1ad9ef8381a 100644 --- a/cvat/apps/engine/utils.py +++ b/cvat/apps/engine/utils.py @@ -71,6 +71,6 @@ def av_scan_paths(*paths): if 'yes' == os.environ.get('CLAM_AV'): command = ['clamscan', '--no-summary', '-i', '-o'] command.extend(paths) - res = subprocess.run(command, capture_output=True) + res = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if res.returncode: - raise ValidationError(res.stdout) \ No newline at end of file + raise ValidationError(res.stdout) From a3d036d47dd42b227c1bcae1069be527899204fb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:07:05 +0300 Subject: [PATCH 20/30] Bump eslint from 6.8.0 to 7.3.0 (#1779) Bumps [eslint](https://github.com/eslint/eslint) from 6.8.0 to 7.3.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v6.8.0...v7.3.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 21d437d1abb7..2c5296d59839 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "dependencies": {}, "devDependencies": { - "eslint": "^6.8.0", + "eslint": "^7.3.0", "eslint-config-airbnb": "^18.0.1", "eslint-plugin-import": "^2.18.2", "eslint-plugin-jsx-a11y": "^6.2.3", From 4c0bf890299356cd646fd76a9ed49c758cf614fe Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:07:35 +0300 Subject: [PATCH 21/30] Bump sqlparse from 0.2.4 to 0.3.1 in /cvat/requirements (#1778) Bumps [sqlparse](https://github.com/andialbrecht/sqlparse) from 0.2.4 to 0.3.1. - [Release notes](https://github.com/andialbrecht/sqlparse/releases) - [Changelog](https://github.com/andialbrecht/sqlparse/blob/master/CHANGELOG) - [Commits](https://github.com/andialbrecht/sqlparse/compare/0.2.4...0.3.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index b64ff792bea5..a0b3a68dc829 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -18,7 +18,7 @@ requests==2.24.0 rq==1.0.0 rq-scheduler==0.10.0 scipy==1.4.1 -sqlparse==0.2.4 +sqlparse==0.3.1 django-sendfile==0.3.11 dj-pagination==2.4.0 python-logstash==0.4.6 From 54106294f99f05880f1a683736aaa0e7448b997a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:08:04 +0300 Subject: [PATCH 22/30] Bump rules from 2.0 to 2.2 in /cvat/requirements (#1777) Bumps [rules](https://github.com/dfunckt/django-rules) from 2.0 to 2.2. - [Release notes](https://github.com/dfunckt/django-rules/releases) - [Changelog](https://github.com/dfunckt/django-rules/blob/master/CHANGELOG.md) - [Commits](https://github.com/dfunckt/django-rules/compare/v2.0.0...v2.2.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index a0b3a68dc829..e5a852194ad8 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -23,7 +23,7 @@ django-sendfile==0.3.11 dj-pagination==2.4.0 python-logstash==0.4.6 django-revproxy==0.10.0 -rules==2.0 +rules==2.2 GitPython==3.1.3 coreapi==2.3.3 django-filter==2.3.0 From 7f7e3cef219e75b71a9488763ac6c5fdb66c444f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:10:03 +0300 Subject: [PATCH 23/30] Bump python-ldap from 3.2.0 to 3.3.0 in /cvat/requirements (#1775) Bumps [python-ldap](https://github.com/python-ldap/python-ldap) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/python-ldap/python-ldap/releases) - [Commits](https://github.com/python-ldap/python-ldap/compare/python-ldap-3.2.0...python-ldap-3.3.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index e5a852194ad8..f83695fe5bdd 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -8,7 +8,7 @@ django-rq==2.0.0 EasyProcess==0.3 Pillow==7.1.2 numpy==1.18.5 -python-ldap==3.2.0 +python-ldap==3.3.0 pytz==2020.1 pyunpack==0.2.1 rcssmin==1.0.6 From 126a22c04feeaa12312d26ccf4197cc704de3c55 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:10:28 +0300 Subject: [PATCH 24/30] Bump django-cors-headers from 3.3.0 to 3.4.0 in /cvat/requirements (#1774) Bumps [django-cors-headers](https://github.com/adamchainz/django-cors-headers) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/adamchainz/django-cors-headers/releases) - [Changelog](https://github.com/adamchainz/django-cors-headers/blob/master/HISTORY.rst) - [Commits](https://github.com/adamchainz/django-cors-headers/compare/3.3.0...3.4.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index f83695fe5bdd..fa3d609c64dc 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -43,7 +43,7 @@ keras==2.4.2 opencv-python==4.1.0.25 h5py==2.10.0 imgaug==0.4.0 -django-cors-headers==3.3.0 +django-cors-headers==3.4.0 furl==2.0.0 av==6.2.0 # The package is used by pyunpack as a command line tool to support multiple From 5b4e472bd90f1ef11212bcdf350be6c8bc53fc05 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:10:56 +0300 Subject: [PATCH 25/30] Bump django-extensions from 2.0.6 to 2.2.9 in /cvat/requirements (#1773) Bumps [django-extensions](https://github.com/django-extensions/django-extensions) from 2.0.6 to 2.2.9. - [Release notes](https://github.com/django-extensions/django-extensions/releases) - [Changelog](https://github.com/django-extensions/django-extensions/blob/master/CHANGELOG.md) - [Commits](https://github.com/django-extensions/django-extensions/compare/2.0.6...2.2.9) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/development.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/development.txt b/cvat/requirements/development.txt index fad8fb689983..0866368fa67c 100644 --- a/cvat/requirements/development.txt +++ b/cvat/requirements/development.txt @@ -8,6 +8,6 @@ pylint-django==2.0.15 pylint-plugin-utils==0.6 rope==0.17.0 wrapt==1.12.1 -django-extensions==2.0.6 +django-extensions==2.2.9 Werkzeug==0.15.3 snakeviz==2.1.0 From 07a3c4a9a2b63335ec0b95ba95d3f599325dc9a2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:11:26 +0300 Subject: [PATCH 26/30] Bump pdf2image from 1.6.0 to 1.13.1 in /cvat/requirements (#1772) Bumps [pdf2image](https://github.com/Belval/pdf2image) from 1.6.0 to 1.13.1. - [Release notes](https://github.com/Belval/pdf2image/releases) - [Commits](https://github.com/Belval/pdf2image/compare/v1.6.0...v1.13.1) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index fa3d609c64dc..6e016bd89c48 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -32,7 +32,7 @@ djangorestframework==3.11.0 Pygments==2.6.1 drf-yasg==1.17.0 Shapely==1.7.0 -pdf2image==1.6.0 +pdf2image==1.13.1 pascal_voc_writer==0.1.4 django-rest-auth[with_social]==0.9.5 cython==0.29.20 From a30068487661569c49a5f08df3f12227c3c1498a Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:27:45 +0300 Subject: [PATCH 27/30] Interpolation of polyshapes in CVAT (#1571) * cvat-core interpolation * Unlocked polyshapes * Updated versions * Second implementation * Splitted line * Inverse, set start point, fixed editing a bit, point menu refactoring * Removed extra code, fixed bug: Cannot open shape context menu when point context menu is opened * Do not close shape context menu on change shap[e * Improved editing * Updated mouseevents to edit/delete, added ability to redraw (shift + N) * Ignore tags when redraw * Ingoring tags on canvas, added method isAbleToChangeFrame, hide shapes during redraw, do not allow changing frame during redraw * Canceled advanced editing for polygons * A couple of fixes in interpolation, editing, reducing number of points * Moved change orientation functionality * Fixed interpolation algorithm * Zero division issue * Zero division issue * Segment minimization * Server implementation * Keyframe set to False * Simplified code, fixed server side code * Updated changelog.md * Added pdf describing interpolation * Resolved some issues * Updated UI version * Updated canvas version * Fixed host --- CHANGELOG.md | 6 + cvat-canvas/README.md | 7 +- cvat-canvas/package-lock.json | 2 +- cvat-canvas/package.json | 2 +- cvat-canvas/src/scss/canvas.scss | 19 + cvat-canvas/src/typescript/canvas.ts | 5 + cvat-canvas/src/typescript/canvasModel.ts | 38 +- cvat-canvas/src/typescript/canvasView.ts | 427 +++++++++---- cvat-canvas/src/typescript/consts.ts | 3 + cvat-canvas/src/typescript/drawHandler.ts | 21 +- cvat-canvas/src/typescript/editHandler.ts | 51 +- cvat-canvas/src/typescript/shared.ts | 73 ++- cvat-canvas/src/typescript/svg.patch.ts | 5 +- cvat-core/docs/Interpolation.pdf | Bin 0 -> 317628 bytes cvat-core/package.json | 2 +- cvat-core/src/annotations-objects.js | 568 ++++++++---------- cvat-ui/package-lock.json | 2 +- cvat-ui/package.json | 2 +- cvat-ui/src/actions/annotation-actions.ts | 48 ++ .../canvas-point-context-menu.tsx | 131 +++- .../standard-workspace/canvas-wrapper.tsx | 5 +- .../controls-side-bar/controls-side-bar.tsx | 14 +- .../controls-side-bar/draw-shape-popover.tsx | 6 +- .../objects-side-bar/object-item.tsx | 28 +- .../standard-workspace/standard-workspace.tsx | 4 +- .../components/annotation-page/styles.scss | 4 +- cvat-ui/src/components/cvat-app.tsx | 6 +- .../canvas-point-context-menu.tsx | 193 ------ .../standard-workspace/canvas-wrapper.tsx | 8 - .../controls-side-bar/controls-side-bar.tsx | 5 + .../objects-side-bar/object-item.tsx | 41 +- .../objects-side-bar/objects-list.tsx | 6 +- .../annotation-page/top-bar/top-bar.tsx | 14 +- cvat-ui/src/cvat-canvas-wrapper.ts | 6 - cvat-ui/src/reducers/interfaces.ts | 1 - cvat-ui/src/reducers/shortcuts-reducer.ts | 4 +- cvat/apps/dataset_manager/annotation.py | 290 ++++++++- 37 files changed, 1252 insertions(+), 795 deletions(-) create mode 100644 cvat-core/docs/Interpolation.pdf delete mode 100644 cvat-ui/src/containers/annotation-page/standard-workspace/canvas-point-context-menu.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c654efac8ae..488c67b1bb75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,11 +15,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Built-in search for labels when create an object or change a label () - Better validation of labels and attributes in raw viewer () - ClamAV antivirus integration () +- Polygon and polylines interpolation () +- Ability to redraw shape from scratch (Shift + N) for an activated shape () +- Highlights for the first point of a polygon/polyline and direction () +- Ability to change orientation for poylgons/polylines in context menu () +- Ability to set the first point for polygons in points context menu () ### Changed - Removed information about e-mail from the basic user information () - Update https install manual. Makes it easier and more robust. Includes automatic renewing of lets encrypt certificates. - Implemented import and export of annotations with relative image paths () +- Using only single click to start editing or remove a point () ### Deprecated - diff --git a/cvat-canvas/README.md b/cvat-canvas/README.md index a538a9e70402..808aa5ac52d0 100644 --- a/cvat-canvas/README.md +++ b/cvat-canvas/README.md @@ -117,6 +117,7 @@ Canvas itself handles: mode(): Mode; cancel(): void; configure(configuration: Configuration): void; + isAbleToChangeFrame(): boolean; } ``` @@ -188,8 +189,7 @@ Standard JS events are used. | | IDLE | GROUP | SPLIT | DRAW | MERGE | EDIT | DRAG | RESIZE | ZOOM_CANVAS | DRAG_CANVAS | |--------------|------|-------|-------|------|-------|------|------|--------|-------------|-------------| -| html() | + | + | + | + | + | + | + | + | + | + | -| setup() | + | + | + | + | + | +/- | +/- | +/- | + | + | +| setup() | + | + | + | +/- | + | +/- | +/- | +/- | + | + | | activate() | + | - | - | - | - | - | - | - | - | - | | rotate() | + | + | + | + | + | + | + | + | + | + | | focus() | + | + | + | + | + | + | + | + | + | + | @@ -208,3 +208,6 @@ Standard JS events are used. | setZLayer() | + | + | + | + | + | + | + | + | + | + | You can call setup() during editing, dragging, and resizing only to update objects, not to change a frame. +You can change frame during draw only when you do not redraw an existing object + +Other methods do not change state and can be used everytime. diff --git a/cvat-canvas/package-lock.json b/cvat-canvas/package-lock.json index e42242226b14..0805ead9b1a7 100644 --- a/cvat-canvas/package-lock.json +++ b/cvat-canvas/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-canvas", - "version": "1.1.1", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-canvas/package.json b/cvat-canvas/package.json index 73a7c98a3918..38a0c145eb75 100644 --- a/cvat-canvas/package.json +++ b/cvat-canvas/package.json @@ -1,6 +1,6 @@ { "name": "cvat-canvas", - "version": "1.1.1", + "version": "1.2.0", "description": "Part of Computer Vision Annotation Tool which presents its canvas library", "main": "src/canvas.ts", "scripts": { diff --git a/cvat-canvas/src/scss/canvas.scss b/cvat-canvas/src/scss/canvas.scss index b7d6c56d12c9..5e1e24ab2ca6 100644 --- a/cvat-canvas/src/scss/canvas.scss +++ b/cvat-canvas/src/scss/canvas.scss @@ -151,6 +151,25 @@ polyline.cvat_canvas_shape_splitting { cursor: move; } +.cvat_canvas_first_poly_point { + fill: lightgray; +} + +.cvat_canvas_poly_direction { + fill: lightgray; + stroke: black; + + &:hover { + fill: black; + stroke: lightgray; + } + + &:active { + fill: lightgray; + stroke: black; + } +} + #cvat_canvas_wrapper { width: calc(100% - 10px); height: calc(100% - 10px); diff --git a/cvat-canvas/src/typescript/canvas.ts b/cvat-canvas/src/typescript/canvas.ts index 61f3b0c8ca59..e0db5e5a1753 100644 --- a/cvat-canvas/src/typescript/canvas.ts +++ b/cvat-canvas/src/typescript/canvas.ts @@ -58,6 +58,7 @@ interface Canvas { mode(): Mode; cancel(): void; configure(configuration: Configuration): void; + isAbleToChangeFrame(): boolean; } class CanvasImpl implements Canvas { @@ -153,6 +154,10 @@ class CanvasImpl implements Canvas { public configure(configuration: Configuration): void { this.model.configure(configuration); } + + public isAbleToChangeFrame(): boolean { + return this.model.isAbleToChangeFrame(); + } } export { diff --git a/cvat-canvas/src/typescript/canvasModel.ts b/cvat-canvas/src/typescript/canvasModel.ts index 55873e4aa377..e2069efe27c4 100644 --- a/cvat-canvas/src/typescript/canvasModel.ts +++ b/cvat-canvas/src/typescript/canvasModel.ts @@ -66,6 +66,7 @@ export interface DrawData { numberOfPoints?: number; initialState?: any; crosshair?: boolean; + redraw?: number; } export interface EditData { @@ -169,6 +170,7 @@ export interface CanvasModel { dragCanvas(enable: boolean): void; zoomCanvas(enable: boolean): void; + isAbleToChangeFrame(): boolean; configure(configuration: Configuration): void; cancel(): void; } @@ -382,10 +384,17 @@ export class CanvasModelImpl extends MasterImpl implements CanvasModel { } if (this.data.mode !== Mode.IDLE && clientID !== null) { - // Exception or just return? throw Error(`Canvas is busy. Action: ${this.data.mode}`); } + if (typeof (clientID) === 'number') { + const [state] = this.data.objects + .filter((_state: any): boolean => _state.clientID === clientID); + if (!['rectangle', 'polygon', 'polyline', 'points', 'cuboid'].includes(state.shapeType)) { + return; + } + } + this.data.activeElement = { clientID, attributeID, @@ -465,10 +474,24 @@ export class CanvasModelImpl extends MasterImpl implements CanvasModel { } } - this.data.drawData = { ...drawData }; - if (this.data.drawData.initialState) { - this.data.drawData.shapeType = this.data.drawData.initialState.shapeType; + if (typeof (drawData.redraw) === 'number') { + const clientID = drawData.redraw; + const [state] = this.data.objects + .filter((_state: any): boolean => _state.clientID === clientID); + + if (state) { + this.data.drawData = { ...drawData }; + this.data.drawData.shapeType = state.shapeType; + } else { + return; + } + } else { + this.data.drawData = { ...drawData }; + if (this.data.drawData.initialState) { + this.data.drawData.shapeType = this.data.drawData.initialState.shapeType; + } } + this.notify(UpdateReasons.DRAW); } @@ -548,6 +571,13 @@ export class CanvasModelImpl extends MasterImpl implements CanvasModel { this.notify(UpdateReasons.CONFIG_UPDATED); } + public isAbleToChangeFrame(): boolean { + const isUnable = [Mode.DRAG, Mode.EDIT, Mode.RESIZE].includes(this.data.mode) + || (this.data.mode === Mode.DRAW && typeof (this.data.drawData.redraw) === 'number'); + + return !isUnable; + } + public cancel(): void { this.notify(UpdateReasons.CANCEL); } diff --git a/cvat-canvas/src/typescript/canvasView.ts b/cvat-canvas/src/typescript/canvasView.ts index 2220eff9c638..8c2fe940c7f8 100644 --- a/cvat-canvas/src/typescript/canvasView.ts +++ b/cvat-canvas/src/typescript/canvasView.ts @@ -21,8 +21,11 @@ import consts from './consts'; import { translateToSVG, translateFromSVG, - pointsToArray, + pointsToNumberArray, + parsePoints, displayShapeSize, + scalarProduct, + vectorLength, ShapeSizeElement, DrawnState, } from './shared'; @@ -71,6 +74,9 @@ export class CanvasViewImpl implements CanvasView, Listener { private autoborderHandler: AutoborderHandler; private activeElement: ActiveElement; private configuration: Configuration; + private serviceFlags: { + drawHidden: Record; + }; private set mode(value: Mode) { this.controller.mode = value; @@ -80,8 +86,75 @@ export class CanvasViewImpl implements CanvasView, Listener { return this.controller.mode; } + private isServiceHidden(clientID: number): boolean { + return this.serviceFlags.drawHidden[clientID] || false; + } + + private setupServiceHidden(clientID: number, value: boolean): void { + this.serviceFlags.drawHidden[clientID] = value; + const shape = this.svgShapes[clientID]; + const text = this.svgTexts[clientID]; + const state = this.drawnStates[clientID]; + + if (value) { + if (shape) { + (state.shapeType === 'points' ? shape.remember('_selectHandler').nested : shape) + .style('display', 'none'); + } + + if (text) { + text.addClass('cvat_canvas_hidden'); + } + } else { + delete this.serviceFlags.drawHidden[clientID]; + + if (state) { + if (!state.outside && !state.hidden) { + if (shape) { + (state.shapeType === 'points' ? shape.remember('_selectHandler').nested : shape) + .style('display', ''); + } + + if (text) { + text.removeClass('cvat_canvas_hidden'); + this.updateTextPosition( + text, + shape, + ); + } + } + } + } + } + private onDrawDone(data: object | null, duration: number, continueDraw?: boolean): void { + const hiddenBecauseOfDraw = Object.keys(this.serviceFlags.drawHidden) + .map((_clientID): number => +_clientID); + if (hiddenBecauseOfDraw.length) { + for (const hidden of hiddenBecauseOfDraw) { + this.setupServiceHidden(hidden, false); + } + } + if (data) { + const { clientID, points } = data as any; + if (typeof (clientID) === 'number') { + const event: CustomEvent = new CustomEvent('canvas.canceled', { + bubbles: false, + cancelable: true, + }); + + this.canvas.dispatchEvent(event); + + const [state] = this.controller.objects + .filter((_state: any): boolean => ( + _state.clientID === clientID + )); + + this.onEditDone(state, points); + return; + } + const { zLayer } = this.controller; const event: CustomEvent = new CustomEvent('canvas.drawn', { bubbles: false, @@ -323,6 +396,15 @@ export class CanvasViewImpl implements CanvasView, Listener { ); } + for (const element of + window.document.getElementsByClassName('cvat_canvas_poly_direction')) { + const angle = (element as any).instance.data('angle'); + + (element as any).instance.style({ + transform: `scale(${1 / this.geometry.scale}) rotate(${angle}deg)`, + }); + } + for (const element of window.document.getElementsByClassName('cvat_canvas_selected_point')) { const previousWidth = element.getAttribute('stroke-width') as string; @@ -425,13 +507,88 @@ export class CanvasViewImpl implements CanvasView, Listener { } } + private hideDirection(shape: SVG.Polygon | SVG.PolyLine): void { + /* eslint class-methods-use-this: 0 */ + const handler = shape.remember('_selectHandler'); + if (!handler || !handler.nested) return; + const nested = handler.nested as SVG.Parent; + if (nested.children().length) { + nested.children()[0].removeClass('cvat_canvas_first_poly_point'); + } + + const node = nested.node as SVG.LinkedHTMLElement; + const directions = node.getElementsByClassName('cvat_canvas_poly_direction'); + for (const direction of directions) { + const { instance } = (direction as any); + instance.off('click'); + instance.remove(); + } + } + + private showDirection(state: any, shape: SVG.Polygon | SVG.PolyLine): void { + const path = consts.ARROW_PATH; + + const points = parsePoints(state.points); + const handler = shape.remember('_selectHandler'); + + if (!handler || !handler.nested) return; + const firstCircle = handler.nested.children()[0]; + const secondCircle = handler.nested.children()[1]; + firstCircle.addClass('cvat_canvas_first_poly_point'); + + const [cx, cy] = [ + (secondCircle.cx() + firstCircle.cx()) / 2, + (secondCircle.cy() + firstCircle.cy()) / 2, + ]; + const [firstPoint, secondPoint] = points.slice(0, 2); + const xAxis = { i: 1, j: 0 }; + const baseVector = { i: secondPoint.x - firstPoint.x, j: secondPoint.y - firstPoint.y }; + const baseVectorLength = vectorLength(baseVector); + let cosinus = 0; + + if (baseVectorLength !== 0) { + // two points have the same coordinates + cosinus = scalarProduct(xAxis, baseVector) + / (vectorLength(xAxis) * baseVectorLength); + } + const angle = Math.acos(cosinus) * (Math.sign(baseVector.j) || 1) * 180 / Math.PI; + + const pathElement = handler.nested.path(path).fill('white') + .stroke({ + width: 1, + color: 'black', + }).addClass('cvat_canvas_poly_direction').style({ + 'transform-origin': `${cx}px ${cy}px`, + transform: `scale(${1 / this.geometry.scale}) rotate(${angle}deg)`, + }).move(cx, cy); + + pathElement.on('click', (e: MouseEvent): void => { + if (e.button === 0) { + e.stopPropagation(); + if (state.shapeType === 'polygon') { + const reversedPoints = [points[0], ...points.slice(1).reverse()]; + this.onEditDone(state, pointsToNumberArray(reversedPoints)); + } else { + const reversedPoints = points.reverse(); + this.onEditDone(state, pointsToNumberArray(reversedPoints)); + } + } + }); + + pathElement.data('angle', angle); + pathElement.dmove(-pathElement.width() / 2, -pathElement.height() / 2); + } + private selectize(value: boolean, shape: SVG.Element): void { const self = this; const { offset } = this.controller.geometry; const translate = (points: number[]): number[] => points .map((coord: number): number => coord - offset); - function dblClickHandler(e: MouseEvent): void { + function mousedownHandler(e: MouseEvent): void { + if (e.button !== 0) return; + e.preventDefault(); + const pointID = Array.prototype.indexOf .call(((e.target as HTMLElement).parentElement as HTMLElement).children, e.target); @@ -440,45 +597,52 @@ export class CanvasViewImpl implements CanvasView, Listener { .filter((_state: any): boolean => ( _state.clientID === self.activeElement.clientID )); - if (state.shapeType === 'rectangle') { - e.preventDefault(); - return; + + if (['polygon', 'polyline', 'points'].includes(state.shapeType)) { + if (e.ctrlKey) { + const { points } = state; + self.onEditDone( + state, + points.slice(0, pointID * 2).concat(points.slice(pointID * 2 + 2)), + ); + } else if (e.shiftKey) { + self.canvas.dispatchEvent(new CustomEvent('canvas.editstart', { + bubbles: false, + cancelable: true, + })); + + self.mode = Mode.EDIT; + self.deactivate(); + self.editHandler.edit({ + enabled: true, + state, + pointID, + }); + } } + } + } + + function dblClickHandler(e: MouseEvent): void { + e.preventDefault(); + + if (self.activeElement.clientID !== null) { + const [state] = self.controller.objects + .filter((_state: any): boolean => ( + _state.clientID === self.activeElement.clientID + )); + if (state.shapeType === 'cuboid') { if (e.shiftKey) { - const points = translate(pointsToArray((e.target as any) + const points = translate(pointsToNumberArray((e.target as any) .parentElement.parentElement.instance.attr('points'))); self.onEditDone( state, points, ); - e.preventDefault(); - return; } } - if (e.ctrlKey) { - const { points } = state; - self.onEditDone( - state, - points.slice(0, pointID * 2).concat(points.slice(pointID * 2 + 2)), - ); - } else if (e.shiftKey) { - self.canvas.dispatchEvent(new CustomEvent('canvas.editstart', { - bubbles: false, - cancelable: true, - })); - - self.mode = Mode.EDIT; - self.deactivate(); - self.editHandler.edit({ - enabled: true, - state, - pointID, - }); - } } - - e.preventDefault(); } function contextMenuHandler(e: MouseEvent): void { @@ -524,6 +688,7 @@ export class CanvasViewImpl implements CanvasView, Listener { }); circle.on('dblclick', dblClickHandler); + circle.on('mousedown', mousedownHandler); circle.on('contextmenu', contextMenuHandler); circle.addClass('cvat_canvas_selected_point'); }); @@ -534,6 +699,7 @@ export class CanvasViewImpl implements CanvasView, Listener { }); circle.off('dblclick', dblClickHandler); + circle.off('mousedown', mousedownHandler); circle.off('contextmenu', contextMenuHandler); circle.removeClass('cvat_canvas_selected_point'); }); @@ -565,6 +731,9 @@ export class CanvasViewImpl implements CanvasView, Listener { }; this.configuration = model.configuration; this.mode = Mode.IDLE; + this.serviceFlags = { + drawHidden: {}, + }; // Create HTML elements this.loadingAnimation = window.document @@ -864,6 +1033,9 @@ export class CanvasViewImpl implements CanvasView, Listener { if (data.enabled && this.mode === Mode.IDLE) { this.canvas.style.cursor = 'crosshair'; this.mode = Mode.DRAW; + if (typeof (data.redraw) === 'number') { + this.setupServiceHidden(data.redraw, true); + } this.drawHandler.draw(data, this.geometry); } else { this.canvas.style.cursor = ''; @@ -1045,7 +1217,8 @@ export class CanvasViewImpl implements CanvasView, Listener { const drawnState = this.drawnStates[clientID]; const shape = this.svgShapes[state.clientID]; const text = this.svgTexts[state.clientID]; - const isInvisible = state.hidden || state.outside; + const isInvisible = state.hidden || state.outside + || this.isServiceHidden(state.clientID); if (drawnState.hidden !== state.hidden || drawnState.outside !== state.outside) { if (isInvisible) { @@ -1147,59 +1320,57 @@ export class CanvasViewImpl implements CanvasView, Listener { const { displayAllText } = this.configuration; for (const state of states) { - if (state.objectType === 'tag') { - this.addTag(state); + const points: number[] = (state.points as number[]); + const translatedPoints: number[] = translate(points); + + // TODO: Use enums after typification cvat-core + if (state.shapeType === 'rectangle') { + this.svgShapes[state.clientID] = this + .addRect(translatedPoints, state); } else { - const points: number[] = (state.points as number[]); - const translatedPoints: number[] = translate(points); + const stringified = translatedPoints.reduce( + (acc: string, val: number, idx: number): string => { + if (idx % 2) { + return `${acc}${val} `; + } - // TODO: Use enums after typification cvat-core - if (state.shapeType === 'rectangle') { + return `${acc}${val},`; + }, '', + ); + + if (state.shapeType === 'polygon') { + this.svgShapes[state.clientID] = this + .addPolygon(stringified, state); + } else if (state.shapeType === 'polyline') { this.svgShapes[state.clientID] = this - .addRect(translatedPoints, state); + .addPolyline(stringified, state); + } else if (state.shapeType === 'points') { + this.svgShapes[state.clientID] = this + .addPoints(stringified, state); + } else if (state.shapeType === 'cuboid') { + this.svgShapes[state.clientID] = this + .addCuboid(stringified, state); } else { - const stringified = translatedPoints.reduce( - (acc: string, val: number, idx: number): string => { - if (idx % 2) { - return `${acc}${val} `; - } - - return `${acc}${val},`; - }, '', - ); - - if (state.shapeType === 'polygon') { - this.svgShapes[state.clientID] = this - .addPolygon(stringified, state); - } else if (state.shapeType === 'polyline') { - this.svgShapes[state.clientID] = this - .addPolyline(stringified, state); - } else if (state.shapeType === 'points') { - this.svgShapes[state.clientID] = this - .addPoints(stringified, state); - } else if (state.shapeType === 'cuboid') { - this.svgShapes[state.clientID] = this - .addCuboid(stringified, state); - } + continue; } + } - this.svgShapes[state.clientID].on('click.canvas', (): void => { - this.canvas.dispatchEvent(new CustomEvent('canvas.clicked', { - bubbles: false, - cancelable: true, - detail: { - state, - }, - })); - }); + this.svgShapes[state.clientID].on('click.canvas', (): void => { + this.canvas.dispatchEvent(new CustomEvent('canvas.clicked', { + bubbles: false, + cancelable: true, + detail: { + state, + }, + })); + }); - if (displayAllText) { - this.svgTexts[state.clientID] = this.addText(state); - this.updateTextPosition( - this.svgTexts[state.clientID], - this.svgShapes[state.clientID], - ); - } + if (displayAllText) { + this.svgTexts[state.clientID] = this.addText(state); + this.updateTextPosition( + this.svgTexts[state.clientID], + this.svgShapes[state.clientID], + ); } this.saveState(state); @@ -1327,16 +1498,6 @@ export class CanvasViewImpl implements CanvasView, Listener { const shape = this.svgShapes[clientID]; - let text = this.svgTexts[clientID]; - if (!text) { - text = this.addText(state); - this.svgTexts[state.clientID] = text; - this.updateTextPosition( - text, - shape, - ); - } - if (state.lock) { return; } @@ -1354,29 +1515,39 @@ export class CanvasViewImpl implements CanvasView, Listener { (shape as any).attr('projections', true); } + let text = this.svgTexts[clientID]; + if (!text) { + text = this.addText(state); + this.svgTexts[state.clientID] = text; + } + + const hideText = (): void => { + if (text) { + text.addClass('cvat_canvas_hidden'); + } + }; + + const showText = (): void => { + if (text) { + text.removeClass('cvat_canvas_hidden'); + this.updateTextPosition(text, shape); + } + }; + if (!state.pinned) { shape.addClass('cvat_canvas_shape_draggable'); (shape as any).draggable().on('dragstart', (): void => { this.mode = Mode.DRAG; - if (text) { - text.addClass('cvat_canvas_hidden'); - } + hideText(); }).on('dragend', (e: CustomEvent): void => { - if (text) { - text.removeClass('cvat_canvas_hidden'); - this.updateTextPosition( - text, - shape, - ); - } - + showText(); this.mode = Mode.IDLE; const p1 = e.detail.handler.startPoints.point; const p2 = e.detail.p; const delta = 1; const { offset } = this.controller.geometry; if (Math.sqrt(((p1.x - p2.x) ** 2) + ((p1.y - p2.y) ** 2)) >= delta) { - const points = pointsToArray( + const points = pointsToNumberArray( shape.attr('points') || `${shape.attr('x')},${shape.attr('y')} ` + `${shape.attr('x') + shape.attr('width')},` + `${shape.attr('y') + shape.attr('height')}`, @@ -1399,19 +1570,32 @@ export class CanvasViewImpl implements CanvasView, Listener { this.selectize(true, shape); } + const showDirection = (): void => { + if (['polygon', 'polyline'].includes(state.shapeType)) { + this.showDirection(state, shape as SVG.Polygon | SVG.PolyLine); + } + }; + + const hideDirection = (): void => { + if (['polygon', 'polyline'].includes(state.shapeType)) { + this.hideDirection(shape as SVG.Polygon | SVG.PolyLine); + } + }; + + showDirection(); + let shapeSizeElement: ShapeSizeElement | null = null; let resized = false; (shape as any).resize({ snapToGrid: 0.1, }).on('resizestart', (): void => { this.mode = Mode.RESIZE; + resized = false; + hideDirection(); + hideText(); if (state.shapeType === 'rectangle') { shapeSizeElement = displayShapeSize(this.adoptedContent, this.adoptedText); } - resized = false; - if (text) { - text.addClass('cvat_canvas_hidden'); - } }).on('resizing', (): void => { resized = true; if (shapeSizeElement) { @@ -1422,20 +1606,15 @@ export class CanvasViewImpl implements CanvasView, Listener { shapeSizeElement.rm(); } - if (text) { - text.removeClass('cvat_canvas_hidden'); - this.updateTextPosition( - text, - shape, - ); - } + showDirection(); + showText(); this.mode = Mode.IDLE; if (resized) { const { offset } = this.controller.geometry; - const points = pointsToArray( + const points = pointsToNumberArray( shape.attr('points') || `${shape.attr('x')},${shape.attr('y')} ` + `${shape.attr('x') + shape.attr('width')},` + `${shape.attr('y') + shape.attr('height')}`, @@ -1453,6 +1632,7 @@ export class CanvasViewImpl implements CanvasView, Listener { } }); + this.updateTextPosition(text, shape); this.canvas.dispatchEvent(new CustomEvent('canvas.activated', { bubbles: false, cancelable: true, @@ -1570,8 +1750,8 @@ export class CanvasViewImpl implements CanvasView, Listener { rect.addClass('cvat_canvas_shape_occluded'); } - if (state.hidden || state.outside) { - rect.style('display', 'none'); + if (state.hidden || state.outside || this.isServiceHidden(state.clientID)) { + rect.addClass('cvat_canvas_hidden'); } return rect; @@ -1593,8 +1773,8 @@ export class CanvasViewImpl implements CanvasView, Listener { polygon.addClass('cvat_canvas_shape_occluded'); } - if (state.hidden || state.outside) { - polygon.style('display', 'none'); + if (state.hidden || state.outside || this.isServiceHidden(state.clientID)) { + polygon.addClass('cvat_canvas_hidden'); } return polygon; @@ -1616,8 +1796,8 @@ export class CanvasViewImpl implements CanvasView, Listener { polyline.addClass('cvat_canvas_shape_occluded'); } - if (state.hidden || state.outside) { - polyline.style('display', 'none'); + if (state.hidden || state.outside || this.isServiceHidden(state.clientID)) { + polyline.addClass('cvat_canvas_hidden'); } return polyline; @@ -1640,8 +1820,8 @@ export class CanvasViewImpl implements CanvasView, Listener { cube.addClass('cvat_canvas_shape_occluded'); } - if (state.hidden || state.outside) { - cube.style('display', 'none'); + if (state.hidden || state.outside || this.isServiceHidden(state.clientID)) { + cube.addClass('cvat_canvas_hidden'); } return cube; @@ -1684,8 +1864,8 @@ export class CanvasViewImpl implements CanvasView, Listener { const group = this.setupPoints(shape, state); - if (state.hidden || state.outside) { - group.style('display', 'none'); + if (state.hidden || state.outside || this.isServiceHidden(state.clientID)) { + group.addClass('cvat_canvas_hidden'); } shape.remove = (): SVG.PolyLine => { @@ -1696,9 +1876,4 @@ export class CanvasViewImpl implements CanvasView, Listener { return shape; } - - /* eslint-disable-next-line */ - private addTag(state: any): void { - console.log(state); - } } diff --git a/cvat-canvas/src/typescript/consts.ts b/cvat-canvas/src/typescript/consts.ts index aa92a9f2a444..b9110b399c26 100644 --- a/cvat-canvas/src/typescript/consts.ts +++ b/cvat-canvas/src/typescript/consts.ts @@ -14,6 +14,8 @@ const MIN_EDGE_LENGTH = 3; const CUBOID_ACTIVE_EDGE_STROKE_WIDTH = 2.5; const CUBOID_UNACTIVE_EDGE_STROKE_WIDTH = 1.75; const UNDEFINED_ATTRIBUTE_VALUE = '__undefined__'; +const ARROW_PATH = 'M13.162 6.284L.682.524a.483.483 0 0 0-.574.134.477.477 0 ' + + '0 0-.012.59L4.2 6.72.096 12.192a.479.479 0 0 0 .585.724l12.48-5.76a.48.48 0 0 0 0-.872z'; export default { BASE_STROKE_WIDTH, @@ -28,4 +30,5 @@ export default { CUBOID_ACTIVE_EDGE_STROKE_WIDTH, CUBOID_UNACTIVE_EDGE_STROKE_WIDTH, UNDEFINED_ATTRIBUTE_VALUE, + ARROW_PATH, }; diff --git a/cvat-canvas/src/typescript/drawHandler.ts b/cvat-canvas/src/typescript/drawHandler.ts index 5a52baddb003..21caaabc752d 100644 --- a/cvat-canvas/src/typescript/drawHandler.ts +++ b/cvat-canvas/src/typescript/drawHandler.ts @@ -11,8 +11,8 @@ import { translateToSVG, displayShapeSize, ShapeSizeElement, - pointsToString, - pointsToArray, + stringifyPoints, + pointsToNumberArray, BBox, Box, } from './shared'; @@ -264,12 +264,13 @@ export class DrawHandlerImpl implements DrawHandler { this.drawInstance.on('drawstop', (e: Event): void => { const bbox = (e.target as SVGRectElement).getBBox(); const [xtl, ytl, xbr, ybr] = this.getFinalRectCoordinates(bbox); - const { shapeType } = this.drawData; + const { shapeType, redraw: clientID } = this.drawData; this.release(); if (this.canceled) return; if ((xbr - xtl) * (ybr - ytl) >= consts.AREA_THRESHOLD) { this.onDrawDone({ + clientID, shapeType, points: [xtl, ytl, xbr, ybr], }, Date.now() - this.startTimestamp); @@ -298,12 +299,13 @@ export class DrawHandlerImpl implements DrawHandler { if (numberOfPoints === 4) { const bbox = (e.target as SVGPolylineElement).getBBox(); const [xtl, ytl, xbr, ybr] = this.getFinalRectCoordinates(bbox); - const { shapeType } = this.drawData; + const { shapeType, redraw: clientID } = this.drawData; this.cancel(); if ((xbr - xtl) * (ybr - ytl) >= consts.AREA_THRESHOLD) { this.onDrawDone({ shapeType, + clientID, points: [xtl, ytl, xbr, ybr], }, Date.now() - this.startTimestamp); } @@ -356,6 +358,7 @@ export class DrawHandlerImpl implements DrawHandler { if (lastDrawnPoint.x === null || lastDrawnPoint.y === null) { this.drawInstance.draw('point', e); } else { + this.drawInstance.draw('update', e); const deltaTreshold = 15; const delta = Math.sqrt( ((e.clientX - lastDrawnPoint.x) ** 2) @@ -379,8 +382,8 @@ export class DrawHandlerImpl implements DrawHandler { }); this.drawInstance.on('drawdone', (e: CustomEvent): void => { - const targetPoints = pointsToArray((e.target as SVGElement).getAttribute('points')); - const { shapeType } = this.drawData; + const targetPoints = pointsToNumberArray((e.target as SVGElement).getAttribute('points')); + const { shapeType, redraw: clientID } = this.drawData; const { points, box } = shapeType === 'cuboid' ? this.getFinalCuboidCoordinates(targetPoints) : this.getFinalPolyshapeCoordinates(targetPoints); this.release(); @@ -390,6 +393,7 @@ export class DrawHandlerImpl implements DrawHandler { && ((box.xbr - box.xtl) * (box.ybr - box.ytl) >= consts.AREA_THRESHOLD) && points.length >= 3 * 2) { this.onDrawDone({ + clientID, shapeType, points, }, Date.now() - this.startTimestamp); @@ -398,12 +402,14 @@ export class DrawHandlerImpl implements DrawHandler { || (box.ybr - box.ytl) >= consts.SIZE_THRESHOLD) && points.length >= 2 * 2) { this.onDrawDone({ + clientID, shapeType, points, }, Date.now() - this.startTimestamp); } else if (shapeType === 'points' && (e.target as any).getAttribute('points') !== '0,0') { this.onDrawDone({ + clientID, shapeType, points, }, Date.now() - this.startTimestamp); @@ -411,6 +417,7 @@ export class DrawHandlerImpl implements DrawHandler { } else if (shapeType === 'cuboid' && points.length === 4 * 2) { this.onDrawDone({ + clientID, shapeType, points: cuboidFrom4Points(points), }, Date.now() - this.startTimestamp); @@ -673,7 +680,7 @@ export class DrawHandlerImpl implements DrawHandler { } else { const points = this.drawData.initialState.points .map((coord: number): number => coord + offset); - const stringifiedPoints = pointsToString(points); + const stringifiedPoints = stringifyPoints(points); if (this.drawData.shapeType === 'polygon') { this.pastePolygon(stringifiedPoints); diff --git a/cvat-canvas/src/typescript/editHandler.ts b/cvat-canvas/src/typescript/editHandler.ts index 74446096b542..2ced96d5e571 100644 --- a/cvat-canvas/src/typescript/editHandler.ts +++ b/cvat-canvas/src/typescript/editHandler.ts @@ -6,7 +6,7 @@ import * as SVG from 'svg.js'; import 'svg.select.js'; import consts from './consts'; -import { translateFromSVG, pointsToArray } from './shared'; +import { translateFromSVG, pointsToNumberArray } from './shared'; import { EditData, Geometry, Configuration } from './canvasModel'; import { AutoborderHandler } from './autoborderHandler'; @@ -28,6 +28,38 @@ export class EditHandlerImpl implements EditHandler { private clones: SVG.Polygon[]; private autobordersEnabled: boolean; + private setupTrailingPoint(circle: SVG.Circle): void { + const head = this.editedShape.attr('points').split(' ').slice(0, this.editData.pointID).join(' '); + circle.on('mouseenter', (): void => { + circle.attr({ + 'stroke-width': consts.POINTS_SELECTED_STROKE_WIDTH / this.geometry.scale, + }); + }); + + circle.on('mouseleave', (): void => { + circle.attr({ + 'stroke-width': consts.POINTS_STROKE_WIDTH / this.geometry.scale, + }); + }); + + const minimumPoints = 2; + circle.on('mousedown', (e: MouseEvent): void => { + if (e.button !== 0) return; + const { offset } = this.geometry; + const stringifiedPoints = `${head} ${this.editLine.node.getAttribute('points').slice(0, -2)}`; + const points = pointsToNumberArray(stringifiedPoints).slice(0, -2) + .map((coord: number): number => coord - offset); + + if (points.length >= minimumPoints * 2) { + const { state } = this.editData; + this.edit({ + enabled: false, + }); + this.onEditDone(state, points); + } + }); + } + private startEdit(): void { // get started coordinates const [clientX, clientY] = translateFromSVG( @@ -72,6 +104,14 @@ export class EditHandlerImpl implements EditHandler { }); this.editLine = (this.canvas as any).polyline(); + + if (this.editData.state.shapeType === 'polyline') { + (this.editLine as any).on('drawpoint', (e: CustomEvent): void => { + const circle = (e.target as any).instance.remember('_paintHandler').set.last(); + if (circle) this.setupTrailingPoint(circle); + }); + } + (this.editLine as any).addClass('cvat_canvas_shape_drawing').style({ 'pointer-events': 'none', 'fill-opacity': 0, @@ -110,7 +150,7 @@ export class EditHandlerImpl implements EditHandler { private selectPolygon(shape: SVG.Polygon): void { const { offset } = this.geometry; - const points = pointsToArray(shape.attr('points')) + const points = pointsToNumberArray(shape.attr('points')) .map((coord: number): number => coord - offset); const { state } = this.editData; @@ -149,9 +189,8 @@ export class EditHandlerImpl implements EditHandler { .concat(linePoints) .concat(oldPoints.slice(stop + 1)); - linePoints.reverse(); - const secondPart = oldPoints.slice(start + 1, stop) - .concat(linePoints); + const secondPart = oldPoints.slice(start, stop) + .concat(linePoints.slice(1).reverse()); if (firstPart.length < 3 || secondPart.length < 3) { this.cancel(); @@ -198,7 +237,7 @@ export class EditHandlerImpl implements EditHandler { points = oldPoints.concat(linePoints.slice(0, -1)); } - points = pointsToArray(points.join(' ')) + points = pointsToNumberArray(points.join(' ')) .map((coord: number): number => coord - offset); const { state } = this.editData; diff --git a/cvat-canvas/src/typescript/shared.ts b/cvat-canvas/src/typescript/shared.ts index 0a06c72d80af..2d985e63977c 100644 --- a/cvat-canvas/src/typescript/shared.ts +++ b/cvat-canvas/src/typescript/shared.ts @@ -29,6 +29,12 @@ interface Point { x: number; y: number; } + +interface Vector2D { + i: number; + j: number; +} + export interface DrawnState { clientID: number; outside?: boolean; @@ -76,21 +82,6 @@ export function translateToSVG(svg: SVGSVGElement, points: number[]): number[] { return output; } -export function pointsToString(points: number[]): string { - return points.reduce((acc, val, idx): string => { - if (idx % 2) { - return `${acc},${val}`; - } - - return `${acc} ${val}`.trim(); - }, ''); -} - -export function pointsToArray(points: string): number[] { - return points.trim().split(/[,\s]+/g) - .map((coord: string): number => +coord); -} - export function displayShapeSize( shapesContainer: SVG.Container, textContainer: SVG.Container, @@ -120,25 +111,59 @@ export function displayShapeSize( return shapeSize; } -export function convertToArray(points: Point[]): number[][] { - const arr: number[][] = []; - points.forEach((point: Point): void => { - arr.push([point.x, point.y]); - }); - return arr; +export function pointsToNumberArray(points: string | Point[]): number[] { + if (Array.isArray(points)) { + return points.reduce((acc: number[], point: Point): number[] => { + acc.push(point.x, point.y); + return acc; + }, []); + } + + return points.trim().split(/[,\s]+/g) + .map((coord: string): number => +coord); } -export function parsePoints(stringified: string): Point[] { - return stringified.trim().split(/\s/).map((point: string): Point => { +export function parsePoints(source: string | number[]): Point[] { + if (Array.isArray(source)) { + return source.reduce((acc: Point[], _: number, index: number): Point[] => { + if (index % 2) { + acc.push({ + x: source[index - 1], + y: source[index], + }); + } + + return acc; + }, []); + } + + return source.trim().split(/\s/).map((point: string): Point => { const [x, y] = point.split(',').map((coord: string): number => +coord); return { x, y }; }); } -export function stringifyPoints(points: Point[]): string { +export function stringifyPoints(points: (Point | number)[]): string { + if (typeof (points[0]) === 'number') { + return points.reduce((acc: string, val: number, idx: number): string => { + if (idx % 2) { + return `${acc},${val}`; + } + + return `${acc} ${val}`.trim(); + }, ''); + } return points.map((point: Point): string => `${point.x},${point.y}`).join(' '); } export function clamp(x: number, min: number, max: number): number { return Math.min(Math.max(x, min), max); } + +export function scalarProduct(a: Vector2D, b: Vector2D): number { + return a.i * b.i + a.j * b.j; +} + +export function vectorLength(vector: Vector2D): number { + return Math.sqrt((vector.i ** 2) + (vector.j ** 2)); +} diff --git a/cvat-canvas/src/typescript/svg.patch.ts b/cvat-canvas/src/typescript/svg.patch.ts index f571accb4f3e..3d88c7daed3c 100644 --- a/cvat-canvas/src/typescript/svg.patch.ts +++ b/cvat-canvas/src/typescript/svg.patch.ts @@ -17,7 +17,7 @@ import { Orientation, Edge, } from './cuboid'; -import { parsePoints, stringifyPoints, clamp } from './shared'; +import { parsePoints, clamp } from './shared'; // Update constructor const originalDraw = SVG.Element.prototype.draw; @@ -174,7 +174,8 @@ SVG.Element.prototype.resize = function constructor(...args: any): any { originalResize.call(this, ...args); handler = this.remember('_resizeHandler'); handler.resize = function(e: any) { - if (e.detail.event.button === 0) { + const { event } = e.detail; + if (event.button === 0 && !event.shiftKey && !event.ctrlKey) { return handler.constructor.prototype.resize.call(this, e); } } diff --git a/cvat-core/docs/Interpolation.pdf b/cvat-core/docs/Interpolation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..51e7d5ea38397e7758be113f89162c45099ea236 GIT binary patch literal 317628 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 IqT4Gl_?HiUY4@t+%tN;l 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�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 literal 0 HcmV?d00001 diff --git a/cvat-core/package.json b/cvat-core/package.json index b347fcb15b19..5c62139ad00c 100644 --- a/cvat-core/package.json +++ b/cvat-core/package.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "2.1.1", + "version": "3.0.0", "description": "Part of Computer Vision Tool which presents an interface for client-side integration", "main": "babel.config.js", "scripts": { diff --git a/cvat-core/src/annotations-objects.js b/cvat-core/src/annotations-objects.js index 20d2e222ba95..c5d0e035d5ad 100644 --- a/cvat-core/src/annotations-objects.js +++ b/cvat-core/src/annotations-objects.js @@ -333,7 +333,9 @@ const { width, height } = this.frameMeta[frame]; fittedPoints = fitPoints(this.shapeType, data.points, width, height); - if ((!checkShapeArea(this.shapeType, fittedPoints)) || checkOutside(fittedPoints, width, height)) { + if ((!checkShapeArea(this.shapeType, fittedPoints)) + || checkOutside(fittedPoints, width, height) + ) { fittedPoints = []; } } @@ -1534,13 +1536,12 @@ } interpolatePosition(leftPosition, rightPosition, offset) { - const positionOffset = leftPosition.points.map((point, index) => ( rightPosition.points[index] - point - )) + )); return { - points: leftPosition.points.map((point ,index) => ( + points: leftPosition.points.map((point, index) => ( point + positionOffset[index] * offset )), occluded: leftPosition.occluded, @@ -1556,385 +1557,274 @@ } interpolatePosition(leftPosition, rightPosition, offset) { - function findBox(points) { - let xmin = Number.MAX_SAFE_INTEGER; - let ymin = Number.MAX_SAFE_INTEGER; - let xmax = Number.MIN_SAFE_INTEGER; - let ymax = Number.MIN_SAFE_INTEGER; - - for (let i = 0; i < points.length; i += 2) { - if (points[i] < xmin) xmin = points[i]; - if (points[i + 1] < ymin) ymin = points[i + 1]; - if (points[i] > xmax) xmax = points[i]; - if (points[i + 1] > ymax) ymax = points[i + 1]; - } - + if (offset === 0) { return { - xmin, - ymin, - xmax, - ymax, + points: [...leftPosition.points], + occluded: leftPosition.occluded, + outside: leftPosition.outside, + zOrder: leftPosition.zOrder, }; } - function normalize(points, box) { - const normalized = []; - const width = box.xmax - box.xmin; - const height = box.ymax - box.ymin; + function toArray(points) { + return points.reduce((acc, val) => { + acc.push(val.x, val.y); + return acc; + }, []); + } - for (let i = 0; i < points.length; i += 2) { - normalized.push( - (points[i] - box.xmin) / width, - (points[i + 1] - box.ymin) / height, - ); - } + function toPoints(array) { + return array.reduce((acc, _, index) => { + if (index % 2) { + acc.push({ + x: array[index - 1], + y: array[index], + }); + } + + return acc; + }, []); + } - return normalized; + function curveLength(points) { + return points.slice(1).reduce((acc, _, index) => { + const dx = points[index + 1].x - points[index].x; + const dy = points[index + 1].y - points[index].y; + return acc + Math.sqrt(dx ** 2 + dy ** 2); + }, 0); } - function denormalize(points, box) { - const denormalized = []; - const width = box.xmax - box.xmin; - const height = box.ymax - box.ymin; + function curveToOffsetVec(points, length) { + const offsetVector = [0]; // with initial value + let accumulatedLength = 0; - for (let i = 0; i < points.length; i += 2) { - denormalized.push( - points[i] * width + box.xmin, - points[i + 1] * height + box.ymin, - ); - } + points.slice(1).forEach((_, index) => { + const dx = points[index + 1].x - points[index].x; + const dy = points[index + 1].y - points[index].y; + accumulatedLength += Math.sqrt(dx ** 2 + dy ** 2); + offsetVector.push(accumulatedLength / length); + }); - return denormalized; + return offsetVector; } - function toPoints(array) { - const points = []; - for (let i = 0; i < array.length; i += 2) { - points.push({ - x: array[i], - y: array[i + 1], - }); + function findNearestPair(value, curve) { + let minimum = [0, Math.abs(value - curve[0])]; + for (let i = 1; i < curve.length; i++) { + const distance = Math.abs(value - curve[i]); + if (distance < minimum[1]) { + minimum = [i, distance]; + } } - return points; + return minimum[0]; } - function toArray(points) { - const array = []; - for (const point of points) { - array.push(point.x, point.y); + function matchLeftRight(leftCurve, rightCurve) { + const matching = {}; + for (let i = 0; i < leftCurve.length; i++) { + matching[i] = [findNearestPair(leftCurve[i], rightCurve)]; } - return array; + return matching; } - function computeDistances(source, target) { - const distances = {}; - for (let i = 0; i < source.length; i++) { - distances[i] = distances[i] || {}; - for (let j = 0; j < target.length; j++) { - const dx = source[i].x - target[j].x; - const dy = source[i].y - target[j].y; + function matchRightLeft(leftCurve, rightCurve, leftRightMatching) { + const matchedRightPoints = Object.values(leftRightMatching); + const unmatchedRightPoints = rightCurve.map((_, index) => index) + .filter((index) => !matchedRightPoints.includes(index)); + const updatedMatching = { ...leftRightMatching }; - distances[i][j] = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); - } + for (const rightPoint of unmatchedRightPoints) { + const leftPoint = findNearestPair(rightCurve[rightPoint], leftCurve); + updatedMatching[leftPoint].push(rightPoint); } - return distances; + for (const key of Object.keys(updatedMatching)) { + const sortedRightIndexes = updatedMatching[key] + .sort((a, b) => a - b); + updatedMatching[key] = sortedRightIndexes; + } + + return updatedMatching; } - function truncateByThreshold(mapping, threshold) { - for (const key of Object.keys(mapping)) { - if (mapping[key].distance > threshold) { - delete mapping[key]; + function reduceInterpolation(interpolatedPoints, matching, leftPoints, rightPoints) { + function averagePoint(points) { + let sumX = 0; + let sumY = 0; + for (const point of points) { + sumX += point.x; + sumY += point.y; } - } - } - // https://en.wikipedia.org/wiki/Stable_marriage_problem - // TODO: One of important part of the algorithm is to correctly match - // "corner" points. Thus it is possible for each of such point calculate - // a descriptor (d) and use (x, y, d) to calculate the distance. One more - // idea is to be sure that order or matched points is preserved. For example, - // if p1 matches q1 and p2 matches q2 and between p1 and p2 we don't have any - // points thus we should not have points between q1 and q2 as well. - function stableMarriageProblem(men, women, distances) { - const menPreferences = {}; - for (const man of men) { - menPreferences[man] = women.concat() - .sort((w1, w2) => distances[man][w1] - distances[man][w2]); + return { + x: sumX / points.length, + y: sumY / points.length, + }; } - // Start alghoritm with max N^2 complexity - const womenMaybe = {}; // id woman:id man,distance - const menBusy = {}; // id man:boolean - let prefIndex = 0; - - // While there is at least one free man - while (Object.values(menBusy).length !== men.length) { - // Every man makes offer to the best woman - for (const man of men) { - // The man have already found a woman - if (menBusy[man]) { - continue; - } + function computeDistance(point1, point2) { + return Math.sqrt( + ((point1.x - point2.x) ** 2) + ((point1.y - point2.y) ** 2), + ); + } - const woman = menPreferences[man][prefIndex]; - const distance = distances[man][woman]; + function minimizeSegment(baseLength, N, startInterpolated, stopInterpolated) { + const threshold = baseLength / (2 * N); + const minimized = [interpolatedPoints[startInterpolated]]; + let latestPushed = startInterpolated; + for (let i = startInterpolated + 1; i < stopInterpolated; i++) { + const distance = computeDistance( + interpolatedPoints[latestPushed], interpolatedPoints[i], + ); - // A women chooses the best offer and says "maybe" - if (woman in womenMaybe && womenMaybe[woman].distance > distance) { - // A woman got better offer - const prevChoice = womenMaybe[woman].value; - delete womenMaybe[woman]; - delete menBusy[prevChoice]; + if (distance >= threshold) { + minimized.push(interpolatedPoints[i]); + latestPushed = i; } + } - if (!(woman in womenMaybe)) { - womenMaybe[woman] = { - value: man, - distance, - }; + minimized.push(interpolatedPoints[stopInterpolated]); + + if (minimized.length === 2) { + const distance = computeDistance( + interpolatedPoints[startInterpolated], + interpolatedPoints[stopInterpolated], + ); - menBusy[man] = true; + if (distance < threshold) { + return [averagePoint(minimized)]; } } - prefIndex++; + return minimized; } - const result = {}; - for (const woman of Object.keys(womenMaybe)) { - result[womenMaybe[woman].value] = { - value: woman, - distance: womenMaybe[woman].distance, - }; + const reduced = []; + const interpolatedIndexes = {}; + let accumulated = 0; + for (let i = 0; i < leftPoints.length; i++) { + // eslint-disable-next-line + interpolatedIndexes[i] = matching[i].map(() => accumulated++); } - return result; - } + function leftSegment(start, stop) { + const startInterpolated = interpolatedIndexes[start][0]; + const stopInterpolated = interpolatedIndexes[stop][0]; - function getMapping(source, target) { - function sumEdges(points) { - let result = 0; - for (let i = 1; i < points.length; i += 2) { - const distance = Math.sqrt(Math.pow(points[i].x - points[i - 1].x, 2) - + Math.pow(points[i].y - points[i - 1].y, 2)); - result += distance; + if (startInterpolated === stopInterpolated) { + reduced.push(interpolatedPoints[startInterpolated]); + return; } - // Corner case when work with one point - // Mapping in this case can't be wrong - if (!result) { - return Number.MAX_SAFE_INTEGER; - } + const baseLength = curveLength(leftPoints.slice(start, stop + 1)); + const N = stop - start + 1; - return result; + reduced.push( + ...minimizeSegment(baseLength, N, startInterpolated, stopInterpolated), + ); } - function computeDeviation(points, average) { - let result = 0; - for (let i = 1; i < points.length; i += 2) { - const distance = Math.sqrt(Math.pow(points[i].x - points[i - 1].x, 2) - + Math.pow(points[i].y - points[i - 1].y, 2)); - result += Math.pow(distance - average, 2); - } - - return result; - } + function rightSegment(leftPoint) { + const start = matching[leftPoint][0]; + const [stop] = matching[leftPoint].slice(-1); + const startInterpolated = interpolatedIndexes[leftPoint][0]; + const [stopInterpolated] = interpolatedIndexes[leftPoint].slice(-1); + const baseLength = curveLength(rightPoints.slice(start, stop + 1)); + const N = stop - start + 1; - const processedSource = []; - const processedTarget = []; - - const distances = computeDistances(source, target); - const mapping = stableMarriageProblem(Array.from(source.keys()), - Array.from(target.keys()), distances); - - const average = (sumEdges(target) - + sumEdges(source)) / (target.length + source.length); - const meanSquareDeviation = Math.sqrt((computeDeviation(source, average) - + computeDeviation(target, average)) / (source.length + target.length)); - const threshold = average + 3 * meanSquareDeviation; // 3 sigma rule - truncateByThreshold(mapping, threshold); - for (const key of Object.keys(mapping)) { - mapping[key] = mapping[key].value; + reduced.push( + ...minimizeSegment(baseLength, N, startInterpolated, stopInterpolated), + ); } - // const receivingOrder = Object.keys(mapping).map(x => +x).sort((a,b) => a - b); - const receivingOrder = this.appendMapping(mapping, source, target); + let previousOpened = null; + for (let i = 0; i < leftPoints.length; i++) { + if (matching[i].length === 1) { + // check if left segment is opened + if (previousOpened !== null) { + // check if we should continue the left segment + if (matching[i][0] === matching[previousOpened][0]) { + continue; + } else { + // left segment found + const start = previousOpened; + const stop = i - 1; + leftSegment(start, stop); + + // start next left segment + previousOpened = i; + } + } else { + // start next left segment + previousOpened = i; + } + } else { + // check if left segment is opened + if (previousOpened !== null) { + // left segment found + const start = previousOpened; + const stop = i - 1; + leftSegment(start, stop); + + previousOpened = null; + } - for (const pointIdx of receivingOrder) { - processedSource.push(source[pointIdx]); - processedTarget.push(target[mapping[pointIdx]]); + // right segment found + rightSegment(i); + } } - return [processedSource, processedTarget]; - } + // check if there is an opened segment + if (previousOpened !== null) { + leftSegment(previousOpened, leftPoints.length - 1); + } - if (offset === 0) { - return { - points: [...leftPosition.points], - occluded: leftPosition.occluded, - outside: leftPosition.outside, - zOrder: leftPosition.zOrder, - }; + return reduced; } - let leftBox = findBox(leftPosition.points); - let rightBox = findBox(rightPosition.points); - - // Sometimes (if shape has one point or shape is line), - // We can get box with zero area - // Next computation will be with NaN in this case - // We have to prevent it - const delta = 1; - if (leftBox.xmax - leftBox.xmin < delta || rightBox.ymax - rightBox.ymin < delta) { - leftBox = { - xmin: 0, - xmax: 1024, // TODO: Get actual image size - ymin: 0, - ymax: 768, - }; - - rightBox = leftBox; - } + // the algorithm below is based on fact that both left and right + // polyshapes have the same start point and the same draw direction + const leftPoints = toPoints(leftPosition.points); + const rightPoints = toPoints(rightPosition.points); + const leftOffsetVec = curveToOffsetVec(leftPoints, curveLength(leftPoints)); + const rightOffsetVec = curveToOffsetVec(rightPoints, curveLength(rightPoints)); - const leftPoints = toPoints(normalize(leftPosition.points, leftBox)); - const rightPoints = toPoints(normalize(rightPosition.points, rightBox)); + const matching = matchLeftRight(leftOffsetVec, rightOffsetVec); + const completedMatching = matchRightLeft( + leftOffsetVec, rightOffsetVec, matching, + ); - let newLeftPoints = []; - let newRightPoints = []; - if (leftPoints.length > rightPoints.length) { - const [ - processedRight, - processedLeft, - ] = getMapping.call(this, rightPoints, leftPoints); - newLeftPoints = processedLeft; - newRightPoints = processedRight; - } else { - const [ - processedLeft, - processedRight, - ] = getMapping.call(this, leftPoints, rightPoints); - newLeftPoints = processedLeft; - newRightPoints = processedRight; - } + const interpolatedPoints = Object.keys(completedMatching) + .map((leftPointIdx) => +leftPointIdx).sort((a, b) => a - b) + .reduce((acc, leftPointIdx) => { + const leftPoint = leftPoints[leftPointIdx]; + for (const rightPointIdx of completedMatching[leftPointIdx]) { + const rightPoint = rightPoints[rightPointIdx]; + acc.push({ + x: leftPoint.x + (rightPoint.x - leftPoint.x) * offset, + y: leftPoint.y + (rightPoint.y - leftPoint.y) * offset, + }); + } - const absoluteLeftPoints = denormalize(toArray(newLeftPoints), leftBox); - const absoluteRightPoints = denormalize(toArray(newRightPoints), rightBox); + return acc; + }, []); - const interpolation = []; - for (let i = 0; i < absoluteLeftPoints.length; i++) { - interpolation.push(absoluteLeftPoints[i] + ( - absoluteRightPoints[i] - absoluteLeftPoints[i]) * offset); - } + const reducedPoints = reduceInterpolation( + interpolatedPoints, + completedMatching, + leftPoints, + rightPoints, + ); return { - points: interpolation, + points: toArray(reducedPoints), occluded: leftPosition.occluded, outside: leftPosition.outside, zOrder: leftPosition.zOrder, }; } - - // mapping is predicted order of points sourse_idx:target_idx - // some points from source and target can absent in mapping - // source, target - arrays of points. Target array size >= sourse array size - appendMapping(mapping, source, target) { - const targetMatched = Object.values(mapping).map((x) => +x); - const sourceMatched = Object.keys(mapping).map((x) => +x); - const orderForReceive = []; - - function findNeighbors(point) { - let prev = point; - let next = point; - - if (!targetMatched.length) { - // Prevent infinity loop - throw new ScriptingError('Interpolation mapping is empty'); - } - - while (!targetMatched.includes(prev)) { - prev--; - if (prev < 0) { - prev = target.length - 1; - } - } - - while (!targetMatched.includes(next)) { - next++; - if (next >= target.length) { - next = 0; - } - } - - return [prev, next]; - } - - function computeOffset(point, prev, next) { - const pathPoints = []; - - while (prev !== next) { - pathPoints.push(target[prev]); - prev++; - if (prev >= target.length) { - prev = 0; - } - } - pathPoints.push(target[next]); - - let curveLength = 0; - let offset = 0; - let iCrossed = false; - for (let k = 1; k < pathPoints.length; k++) { - const p1 = pathPoints[k]; - const p2 = pathPoints[k - 1]; - const distance = Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); - - if (!iCrossed) { - offset += distance; - } - curveLength += distance; - if (target[point] === pathPoints[k]) { - iCrossed = true; - } - } - - if (!curveLength) { - return 0; - } - - return offset / curveLength; - } - - for (let i = 0; i < target.length; i++) { - const index = targetMatched.indexOf(i); - if (index === -1) { - // We have to find a neighbours which have been mapped - const [prev, next] = findNeighbors(i); - - // Now compute edge offset - const offset = computeOffset(i, prev, next); - - // Get point between two neighbors points - const prevPoint = target[prev]; - const nextPoint = target[next]; - const autoPoint = { - x: prevPoint.x + (nextPoint.x - prevPoint.x) * offset, - y: prevPoint.y + (nextPoint.y - prevPoint.y) * offset, - }; - - // Put it into matched - source.push(autoPoint); - mapping[source.length - 1] = i; - orderForReceive.push(source.length - 1); - } else { - orderForReceive.push(sourceMatched[index]); - } - } - - return orderForReceive; - } } class PolygonTrack extends PolyTrack { @@ -1945,6 +1835,26 @@ checkNumberOfPoints(this.shapeType, shape.points); } } + + interpolatePosition(leftPosition, rightPosition, offset) { + const copyLeft = { + ...leftPosition, + points: [...leftPosition.points, leftPosition.points[0], leftPosition.points[1]], + }; + + const copyRight = { + ...rightPosition, + points: [...rightPosition.points, rightPosition.points[0], rightPosition.points[1]], + }; + + const result = PolyTrack.prototype.interpolatePosition + .call(this, copyLeft, copyRight, offset); + + return { + ...result, + points: result.points.slice(0, -2), + }; + } } class PolylineTrack extends PolyTrack { @@ -1965,6 +1875,27 @@ checkNumberOfPoints(this.shapeType, shape.points); } } + + interpolatePosition(leftPosition, rightPosition, offset) { + // interpolate only when one point in both left and right positions + if (leftPosition.points.length === 2 && rightPosition.points.length === 2) { + return { + points: leftPosition.points.map( + (value, index) => value + (rightPosition.points[index] - value) * offset, + ), + occluded: leftPosition.occluded, + outside: leftPosition.outside, + zOrder: leftPosition.zOrder, + }; + } + + return { + points: [...leftPosition.points], + occluded: leftPosition.occluded, + outside: leftPosition.outside, + zOrder: leftPosition.zOrder, + }; + } } class CuboidTrack extends Track { @@ -1978,13 +1909,12 @@ } interpolatePosition(leftPosition, rightPosition, offset) { - const positionOffset = leftPosition.points.map((point, index) => ( rightPosition.points[index] - point - )) + )); return { - points: leftPosition.points.map((point ,index) => ( + points: leftPosition.points.map((point, index) => ( point + positionOffset[index] * offset )), occluded: leftPosition.occluded, diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index ae7685c57d4c..f521fbcedc4b 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.3.2", + "version": "1.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-ui/package.json b/cvat-ui/package.json index e94c9f289b7f..0db6a04d12e3 100644 --- a/cvat-ui/package.json +++ b/cvat-ui/package.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.3.2", + "version": "1.4.0", "description": "CVAT single-page application", "main": "src/index.tsx", "scripts": { diff --git a/cvat-ui/src/actions/annotation-actions.ts b/cvat-ui/src/actions/annotation-actions.ts index f6a46224f3c3..b669cabf507d 100644 --- a/cvat-ui/src/actions/annotation-actions.ts +++ b/cvat-ui/src/actions/annotation-actions.ts @@ -1487,3 +1487,51 @@ export function repeatDrawShapeAsync(): ThunkAction, {}, {}, AnyAc } }; } + +export function redrawShapeAsync(): ThunkAction, {}, {}, AnyAction> { + return async (dispatch: ActionCreator): Promise => { + const { + annotations: { + activatedStateID, + states, + }, + canvas: { + instance: canvasInstance, + }, + } = getStore().getState().annotation; + + if (activatedStateID !== null) { + const [state] = states + .filter((_state: any): boolean => _state.clientID === activatedStateID); + if (state && state.objectType !== ObjectType.TAG) { + let activeControl = ActiveControl.CURSOR; + if (state.shapeType === ShapeType.RECTANGLE) { + activeControl = ActiveControl.DRAW_RECTANGLE; + } else if (state.shapeType === ShapeType.POINTS) { + activeControl = ActiveControl.DRAW_POINTS; + } else if (state.shapeType === ShapeType.POLYGON) { + activeControl = ActiveControl.DRAW_POLYGON; + } else if (state.shapeType === ShapeType.POLYLINE) { + activeControl = ActiveControl.DRAW_POLYLINE; + } else if (state.shapeType === ShapeType.CUBOID) { + activeControl = ActiveControl.DRAW_CUBOID; + } + + dispatch({ + type: AnnotationActionTypes.REPEAT_DRAW_SHAPE, + payload: { + activeControl, + }, + }); + + canvasInstance.cancel(); + canvasInstance.draw({ + enabled: true, + redraw: activatedStateID, + shapeType: state.shapeType, + crosshair: state.shapeType === ShapeType.RECTANGLE, + }); + } + } + }; +} diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/canvas-point-context-menu.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/canvas-point-context-menu.tsx index bd534747e77f..2e782a4f40e7 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/canvas-point-context-menu.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/canvas-point-context-menu.tsx @@ -2,40 +2,131 @@ // // SPDX-License-Identifier: MIT -import React from 'react'; +import React, { useState } from 'react'; import ReactDOM from 'react-dom'; import Button from 'antd/lib/button'; import Tooltip from 'antd/lib/tooltip'; +import { connect } from 'react-redux'; -interface Props { - activatedStateID: number | null; +import { CombinedState, ContextMenuType } from 'reducers/interfaces'; +import { updateAnnotationsAsync, updateCanvasContextMenu } from 'actions/annotation-actions'; + +interface StateToProps { + activatedState: any | null; + selectedPoint: number | null; visible: boolean; - left: number; top: number; - onPointDelete(): void; + left: number; + type: ContextMenuType; } -export default function CanvasPointContextMenu(props: Props): JSX.Element | null { +function mapStateToProps(state: CombinedState): StateToProps { const { - onPointDelete, - activatedStateID, + annotation: { + annotations: { + states, + activatedStateID, + }, + canvas: { + contextMenu: { + visible, + top, + left, + type, + pointID: selectedPoint, + }, + }, + }, + } = state; + + return { + activatedState: activatedStateID === null + ? null : states.filter((_state) => _state.clientID === activatedStateID)[0] || null, + selectedPoint, visible, left, top, + type, + }; +} + +interface DispatchToProps { + onUpdateAnnotations(states: any[]): void; + onCloseContextMenu(): void; +} + +function mapDispatchToProps(dispatch: any): DispatchToProps { + return { + onUpdateAnnotations(states: any[]): void { + dispatch(updateAnnotationsAsync(states)); + }, + onCloseContextMenu(): void { + dispatch(updateCanvasContextMenu(false, 0, 0)); + }, + }; +} + +type Props = StateToProps & DispatchToProps; + +function CanvasPointContextMenu(props: Props): React.ReactPortal | null { + const { + onCloseContextMenu, + onUpdateAnnotations, + activatedState, + visible, + type, + top, + left, } = props; - if (!visible || activatedStateID === null) { - return null; + const [contextMenuFor, setContextMenuFor] = useState(activatedState); + + if (activatedState !== contextMenuFor) { + setContextMenuFor(activatedState); + if (visible && type === ContextMenuType.CANVAS_SHAPE_POINT) { + onCloseContextMenu(); + } } - return ReactDOM.createPortal( -
- - - -
, - window.document.body, - ); + const onPointDelete = (): void => { + const { selectedPoint } = props; + if (contextMenuFor && selectedPoint !== null) { + contextMenuFor.points = contextMenuFor.points.slice(0, selectedPoint * 2) + .concat(contextMenuFor.points.slice(selectedPoint * 2 + 2)); + onUpdateAnnotations([contextMenuFor]); + onCloseContextMenu(); + } + }; + + const onSetStartPoint = (): void => { + const { selectedPoint } = props; + if (contextMenuFor && selectedPoint !== null && contextMenuFor.shapeType === 'polygon') { + contextMenuFor.points = contextMenuFor.points.slice(selectedPoint * 2) + .concat(contextMenuFor.points.slice(0, selectedPoint * 2)); + onUpdateAnnotations([contextMenuFor]); + onCloseContextMenu(); + } + }; + + return visible && contextMenuFor && type === ContextMenuType.CANVAS_SHAPE_POINT + ? (ReactDOM.createPortal( +
+ + + + {contextMenuFor && contextMenuFor.shapeType === 'polygon' && ( + + )} +
, + window.document.body, + )) : null; } + +export default connect( + mapStateToProps, + mapDispatchToProps, +)(CanvasPointContextMenu); diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx index fb1f8fe17325..0eb7a5d0fc0b 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx @@ -58,8 +58,6 @@ interface Props { contrastLevel: number; saturationLevel: number; resetZoom: boolean; - contextVisible: boolean; - contextType: ContextMenuType; aamZoomMargin: number; showObjectsTextAlways: boolean; workspace: Workspace; @@ -382,10 +380,9 @@ export default class CanvasWrapperComponent extends React.PureComponent { const { activatedStateID, onUpdateContextMenu, - contextType, } = this.props; - if (contextType !== ContextMenuType.CANVAS_SHAPE_POINT) { + if (e.target && !(e.target as HTMLElement).classList.contains('svg_select_points')) { onUpdateContextMenu(activatedStateID !== null, e.clientX, e.clientY, ContextMenuType.CANVAS_SHAPE); } diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/controls-side-bar.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/controls-side-bar.tsx index e4b672c92d71..f6ffeb2ae5bc 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/controls-side-bar.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/controls-side-bar.tsx @@ -37,13 +37,15 @@ interface Props { repeatDrawShape(): void; pasteShape(): void; resetGroup(): void; + redrawShape(): void; } export default function ControlsSideBarComponent(props: Props): JSX.Element { const { canvasInstance, activeControl, - + normalizedKeyMap, + keyMap, mergeObjects, groupObjects, splitTrack, @@ -51,8 +53,7 @@ export default function ControlsSideBarComponent(props: Props): JSX.Element { repeatDrawShape, pasteShape, resetGroup, - normalizedKeyMap, - keyMap, + redrawShape, } = props; const preventDefault = (event: KeyboardEvent | undefined): void => { @@ -89,7 +90,12 @@ export default function ControlsSideBarComponent(props: Props): JSX.Element { canvasInstance.cancel(); // repeateDrawShapes gets all the latest parameters // and calls canvasInstance.draw() with them - repeatDrawShape(); + + if (event && event.shiftKey) { + redrawShape(); + } else { + repeatDrawShape(); + } } else { canvasInstance.draw({ enabled: false }); } diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover.tsx index 39b3230beb86..070a0c84139c 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover.tsx @@ -51,10 +51,6 @@ function DrawShapePopoverComponent(props: Props): JSX.Element { onChangeCuboidDrawingMethod, } = props; - const trackDisabled = shapeType === ShapeType.POLYGON - || shapeType === ShapeType.POLYLINE - || (shapeType === ShapeType.POINTS && numberOfPoints !== 1); - return (
@@ -198,7 +194,7 @@ function DrawShapePopoverComponent(props: Props): JSX.Element { - diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/object-item.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/object-item.tsx index da2bf9572669..0dfb658b9457 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/object-item.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/object-item.tsx @@ -38,8 +38,8 @@ import { clamp } from 'utils/math'; function ItemMenu( serverID: number | undefined, locked: boolean, - objectType: ObjectType, shapeType: ShapeType, + objectType: ObjectType, copyShortcut: string, pasteShortcut: string, propagateShortcut: string, @@ -50,9 +50,9 @@ function ItemMenu( remove: (() => void), propagate: (() => void), createURL: (() => void), + switchOrientation: (() => void), toBackground: (() => void), toForeground: (() => void), - switchCuboidOrientation: (() => void), resetCuboidPerspective: (() => void), ): JSX.Element { return ( @@ -76,9 +76,9 @@ function ItemMenu( - {shapeType === ShapeType.CUBOID && ( + { [ShapeType.POLYGON, ShapeType.POLYLINE, ShapeType.CUBOID].includes(shapeType) && ( - @@ -143,8 +143,8 @@ interface ItemTopComponentProps { serverID: number | undefined; labelID: number; labels: any[]; - objectType: ObjectType; shapeType: ShapeType; + objectType: ObjectType; type: string; locked: boolean; copyShortcut: string; @@ -158,9 +158,9 @@ interface ItemTopComponentProps { remove(): void; propagate(): void; createURL(): void; + switchOrientation(): void; toBackground(): void; toForeground(): void; - switchCuboidOrientation(): void; resetCuboidPerspective(): void; } @@ -170,8 +170,8 @@ function ItemTopComponent(props: ItemTopComponentProps): JSX.Element { serverID, labelID, labels, - objectType, shapeType, + objectType, type, locked, copyShortcut, @@ -185,9 +185,9 @@ function ItemTopComponent(props: ItemTopComponentProps): JSX.Element { remove, propagate, createURL, + switchOrientation, toBackground, toForeground, - switchCuboidOrientation, resetCuboidPerspective, } = props; @@ -228,8 +228,8 @@ function ItemTopComponent(props: ItemTopComponentProps): JSX.Element { overlay={ItemMenu( serverID, locked, - objectType, shapeType, + objectType, copyShortcut, pasteShortcut, propagateShortcut, @@ -240,9 +240,9 @@ function ItemTopComponent(props: ItemTopComponentProps): JSX.Element { remove, propagate, createURL, + switchOrientation, toBackground, toForeground, - switchCuboidOrientation, resetCuboidPerspective, )} > @@ -749,6 +749,7 @@ interface Props { copy(): void; propagate(): void; createURL(): void; + switchOrientation(): void; toBackground(): void; toForeground(): void; remove(): void; @@ -768,7 +769,6 @@ interface Props { changeAttribute(attrID: number, value: string): void; changeColor(color: string): void; collapse(): void; - switchCuboidOrientation(): void; resetCuboidPerspective(): void; } @@ -828,6 +828,7 @@ function ObjectItemComponent(props: Props): JSX.Element { copy, propagate, createURL, + switchOrientation, toBackground, toForeground, remove, @@ -847,7 +848,6 @@ function ObjectItemComponent(props: Props): JSX.Element { changeAttribute, changeColor, collapse, - switchCuboidOrientation, resetCuboidPerspective, } = props; @@ -886,9 +886,9 @@ function ObjectItemComponent(props: Props): JSX.Element { clientID={clientID} labelID={labelID} labels={labels} + shapeType={shapeType} objectType={objectType} type={type} - shapeType={shapeType} locked={locked} copyShortcut={normalizedKeyMap.COPY_SHAPE} pasteShortcut={normalizedKeyMap.PASTE_SHAPE} @@ -901,9 +901,9 @@ function ObjectItemComponent(props: Props): JSX.Element { remove={remove} propagate={propagate} createURL={createURL} + switchOrientation={switchOrientation} toBackground={toBackground} toForeground={toForeground} - switchCuboidOrientation={switchCuboidOrientation} resetCuboidPerspective={resetCuboidPerspective} /> - + ); } diff --git a/cvat-ui/src/components/annotation-page/styles.scss b/cvat-ui/src/components/annotation-page/styles.scss index 5c6f2eba710e..809b5e29f4f6 100644 --- a/cvat-ui/src/components/annotation-page/styles.scss +++ b/cvat-ui/src/components/annotation-page/styles.scss @@ -231,12 +231,10 @@ } .cvat-canvas-point-context-menu { + display: grid; opacity: 0.6; position: fixed; - width: 135px; z-index: 10; - max-height: 50%; - overflow-y: auto; background-color: #ffffff; border-radius: 4px; diff --git a/cvat-ui/src/components/cvat-app.tsx b/cvat-ui/src/components/cvat-app.tsx index ad83d05bbbc2..b5c3e4408ee1 100644 --- a/cvat-ui/src/components/cvat-app.tsx +++ b/cvat-ui/src/components/cvat-app.tsx @@ -53,8 +53,8 @@ interface CVATAppProps { installedAutoAnnotation: boolean; installedTFAnnotation: boolean; installedTFSegmentation: boolean; - userAgreementsFetching: boolean, - userAgreementsInitialized: boolean, + userAgreementsFetching: boolean; + userAgreementsInitialized: boolean; notifications: NotificationsState; user: any; } @@ -72,7 +72,7 @@ class CVATApplication extends React.PureComponent window.document.hasFocus, userActivityCallback); - customWaViewHit(location.pathname, location.search, location.hash); + customWaViewHit(history.location.pathname, history.location.search, history.location.hash); history.listen((location) => { customWaViewHit(location.pathname, location.search, location.hash); }); diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-point-context-menu.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-point-context-menu.tsx deleted file mode 100644 index 9dd2975b4977..000000000000 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-point-context-menu.tsx +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright (C) 2020 Intel Corporation -// -// SPDX-License-Identifier: MIT - -import React from 'react'; - -import { connect } from 'react-redux'; -import { CombinedState, ContextMenuType } from 'reducers/interfaces'; - -import { updateAnnotationsAsync, updateCanvasContextMenu } from 'actions/annotation-actions'; - -import CanvasPointContextMenuComponent from 'components/annotation-page/standard-workspace/canvas-point-context-menu'; - -interface StateToProps { - activatedStateID: number | null; - activatedPointID: number | null; - states: any[]; - visible: boolean; - top: number; - left: number; - type: ContextMenuType; -} - -function mapStateToProps(state: CombinedState): StateToProps { - const { - annotation: { - annotations: { - states, - activatedStateID, - }, - canvas: { - contextMenu: { - visible, - top, - left, - type, - pointID: activatedPointID, - }, - }, - }, - } = state; - - return { - activatedStateID, - activatedPointID, - states, - visible, - left, - top, - type, - }; -} - -interface DispatchToProps { - onUpdateAnnotations(states: any[]): void; - onCloseContextMenu(): void; -} - -function mapDispatchToProps(dispatch: any): DispatchToProps { - return { - onUpdateAnnotations(states: any[]): void { - dispatch(updateAnnotationsAsync(states)); - }, - onCloseContextMenu(): void { - dispatch(updateCanvasContextMenu(false, 0, 0)); - }, - }; -} - -type Props = StateToProps & DispatchToProps; - -interface State { - activatedStateID: number | null; - activatedPointID: number | null; - latestLeft: number; - latestTop: number; - left: number; - top: number; -} - -class CanvasPointContextMenuContainer extends React.PureComponent { - public constructor(props: Props) { - super(props); - - this.state = { - activatedStateID: null, - activatedPointID: null, - latestLeft: 0, - latestTop: 0, - left: 0, - top: 0, - }; - } - - static getDerivedStateFromProps(props: Props, state: State): State { - const newState: State = { ...state }; - - if (props.left !== state.latestLeft - || props.top !== state.latestTop) { - newState.latestLeft = props.left; - newState.latestTop = props.top; - newState.top = props.top; - newState.left = props.left; - } - - if (typeof state.activatedStateID !== typeof props.activatedStateID - || state.activatedPointID !== props.activatedPointID) { - newState.activatedStateID = props.activatedStateID; - newState.activatedPointID = props.activatedPointID; - } - - - return newState; - } - - public componentDidUpdate(): void { - const { - top, - left, - } = this.state; - - const { - innerWidth, - innerHeight, - } = window; - - const [element] = window.document.getElementsByClassName('cvat-canvas-point-context-menu'); - if (element) { - const height = element.clientHeight; - const width = element.clientWidth; - - if (top + height > innerHeight || left + width > innerWidth) { - this.setState({ - top: top - Math.max(top + height - innerHeight, 0), - left: left - Math.max(left + width - innerWidth, 0), - }); - } - } - } - - private deletePoint(): void { - const { - states, - onUpdateAnnotations, - onCloseContextMenu, - } = this.props; - - const { - activatedStateID, - activatedPointID, - } = this.state; - - const [objectState] = states.filter((e) => (e.clientID === activatedStateID)); - if (typeof activatedPointID === 'number') { - objectState.points = objectState.points.slice(0, activatedPointID * 2) - .concat(objectState.points.slice(activatedPointID * 2 + 2)); - onUpdateAnnotations([objectState]); - onCloseContextMenu(); - } - } - - public render(): JSX.Element { - const { - visible, - activatedStateID, - type, - } = this.props; - - const { - top, - left, - } = this.state; - - return ( - <> - {type === ContextMenuType.CANVAS_SHAPE_POINT && ( - this.deletePoint()} - /> - )} - - ); - } -} - -export default connect( - mapStateToProps, - mapDispatchToProps, -)(CanvasPointContextMenuContainer); diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-wrapper.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-wrapper.tsx index f5c48061421b..8ebe9844b1e5 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-wrapper.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-wrapper.tsx @@ -83,8 +83,6 @@ interface StateToProps { maxZLayer: number; curZLayer: number; automaticBordering: boolean; - contextVisible: boolean; - contextType: ContextMenuType; switchableAutomaticBordering: boolean; keyMap: Record; } @@ -124,10 +122,6 @@ function mapStateToProps(state: CombinedState): StateToProps { annotation: { canvas: { activeControl, - contextMenu: { - visible: contextVisible, - type: contextType, - }, instance: canvasInstance, }, drawing: { @@ -223,8 +217,6 @@ function mapStateToProps(state: CombinedState): StateToProps { minZLayer, maxZLayer, automaticBordering, - contextVisible, - contextType, workspace, keyMap, switchableAutomaticBordering: activeControl === ActiveControl.DRAW_POLYGON diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/controls-side-bar.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/controls-side-bar.tsx index 10be78cd7b96..ae2405caa9ca 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/controls-side-bar.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/controls-side-bar.tsx @@ -10,6 +10,7 @@ import { mergeObjects, groupObjects, splitTrack, + redrawShapeAsync, rotateCurrentFrame, repeatDrawShapeAsync, pasteShapeAsync, @@ -34,6 +35,7 @@ interface DispatchToProps { resetGroup(): void; repeatDrawShape(): void; pasteShape(): void; + redrawShape(): void; } function mapStateToProps(state: CombinedState): StateToProps { @@ -87,6 +89,9 @@ function dispatchToProps(dispatch: any): DispatchToProps { resetGroup(): void { dispatch(resetAnnotationsGroup()); }, + redrawShape(): void { + dispatch(redrawShapeAsync()); + }, }; } diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/object-item.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/object-item.tsx index 0f3bf9efa263..b2282a1c984d 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/object-item.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/object-item.tsx @@ -7,8 +7,13 @@ import copy from 'copy-to-clipboard'; import { connect } from 'react-redux'; import { LogType } from 'cvat-logger'; -import { Canvas, isAbleToChangeFrame } from 'cvat-canvas-wrapper'; -import { ActiveControl, CombinedState, ColorBy } from 'reducers/interfaces'; +import { Canvas } from 'cvat-canvas-wrapper'; +import { + ActiveControl, + CombinedState, + ColorBy, + ShapeType, +} from 'reducers/interfaces'; import { collapseObjectItems, changeLabelColorAsync, @@ -235,6 +240,33 @@ class ObjectItemContainer extends React.PureComponent { copy(url); }; + private switchOrientation = (): void => { + const { objectState, updateState } = this.props; + if (objectState.shapeType === ShapeType.CUBOID) { + this.switchCuboidOrientation(); + return; + } + + const reducedPoints = objectState.points.reduce( + (acc: number[][], _: number, index: number, array: number[]): number[][] => { + if (index % 2) { + acc.push([array[index - 1], array[index]]); + } + + return acc; + }, [], + ); + + if (objectState.shapeType === ShapeType.POLYGON) { + objectState.points = reducedPoints.slice(0, 1) + .concat(reducedPoints.reverse().slice(0, -1)).flat(); + updateState(objectState); + } else if (objectState.shapeType === ShapeType.POLYLINE) { + objectState.points = reducedPoints.reverse().flat(); + updateState(objectState); + } + }; + private toBackground = (): void => { const { objectState, @@ -394,7 +426,6 @@ class ObjectItemContainer extends React.PureComponent { this.commit(); }; - private switchCuboidOrientation = (): void => { function cuboidOrientationIsLeft(points: number[]): boolean { return points[12] > points[0]; @@ -444,7 +475,7 @@ class ObjectItemContainer extends React.PureComponent { private changeFrame(frame: number): void { const { changeFrame, canvasInstance } = this.props; - if (isAbleToChangeFrame(canvasInstance)) { + if (canvasInstance.isAbleToChangeFrame()) { changeFrame(frame); } } @@ -534,6 +565,7 @@ class ObjectItemContainer extends React.PureComponent { copy={this.copy} propagate={this.propagate} createURL={this.createURL} + switchOrientation={this.switchOrientation} toBackground={this.toBackground} toForeground={this.toForeground} setOccluded={this.setOccluded} @@ -552,7 +584,6 @@ class ObjectItemContainer extends React.PureComponent { changeLabel={this.changeLabel} changeAttribute={this.changeAttribute} collapse={this.collapse} - switchCuboidOrientation={this.switchCuboidOrientation} resetCuboidPerspective={() => this.resetCuboidPerspective()} /> ); diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/objects-list.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/objects-list.tsx index f0603a2e417b..43e6e2659ef4 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/objects-list.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/objects-list.tsx @@ -17,7 +17,7 @@ import { changeGroupColorAsync, changeLabelColorAsync, } from 'actions/annotation-actions'; -import { Canvas, isAbleToChangeFrame } from 'cvat-canvas-wrapper'; +import { Canvas } from 'cvat-canvas-wrapper'; import { CombinedState, StatesOrdering, @@ -446,7 +446,7 @@ class ObjectsListContainer extends React.PureComponent { if (state && state.objectType === ObjectType.TRACK) { const frame = typeof (state.keyframes.next) === 'number' ? state.keyframes.next : null; - if (frame !== null && isAbleToChangeFrame(canvasInstance)) { + if (frame !== null && canvasInstance.isAbleToChangeFrame()) { changeFrame(frame); } } @@ -457,7 +457,7 @@ class ObjectsListContainer extends React.PureComponent { if (state && state.objectType === ObjectType.TRACK) { const frame = typeof (state.keyframes.prev) === 'number' ? state.keyframes.prev : null; - if (frame !== null && isAbleToChangeFrame(canvasInstance)) { + if (frame !== null && canvasInstance.isAbleToChangeFrame()) { changeFrame(frame); } } diff --git a/cvat-ui/src/containers/annotation-page/top-bar/top-bar.tsx b/cvat-ui/src/containers/annotation-page/top-bar/top-bar.tsx index ad773de3e777..5f759c4e97b5 100644 --- a/cvat-ui/src/containers/annotation-page/top-bar/top-bar.tsx +++ b/cvat-ui/src/containers/annotation-page/top-bar/top-bar.tsx @@ -23,7 +23,7 @@ import { changeWorkspace as changeWorkspaceAction, activateObject, } from 'actions/annotation-actions'; -import { Canvas, isAbleToChangeFrame } from 'cvat-canvas-wrapper'; +import { Canvas } from 'cvat-canvas-wrapper'; import AnnotationTopBarComponent from 'components/annotation-page/top-bar/top-bar'; import { CombinedState, FrameSpeed, Workspace } from 'reducers/interfaces'; @@ -222,7 +222,7 @@ class AnnotationTopBarContainer extends React.PureComponent { setTimeout(() => { const { playing: stillPlaying } = this.props; if (stillPlaying) { - if (isAbleToChangeFrame(canvasInstance)) { + if (canvasInstance.isAbleToChangeFrame()) { onChangeFrame( frameNumber + 1 + framesSkiped, stillPlaying, framesSkiped + 1, @@ -252,7 +252,7 @@ class AnnotationTopBarContainer extends React.PureComponent { canvasInstance, } = this.props; - if (isAbleToChangeFrame(canvasInstance)) { + if (canvasInstance.isAbleToChangeFrame()) { undo(jobInstance, frameNumber); } }; @@ -265,7 +265,7 @@ class AnnotationTopBarContainer extends React.PureComponent { canvasInstance, } = this.props; - if (isAbleToChangeFrame(canvasInstance)) { + if (canvasInstance.isAbleToChangeFrame()) { redo(jobInstance, frameNumber); } }; @@ -446,7 +446,7 @@ class AnnotationTopBarContainer extends React.PureComponent { private changeFrame(frame: number): void { const { onChangeFrame, canvasInstance } = this.props; - if (isAbleToChangeFrame(canvasInstance)) { + if (canvasInstance.isAbleToChangeFrame()) { onChangeFrame(frame); } } @@ -551,7 +551,7 @@ class AnnotationTopBarContainer extends React.PureComponent { SEARCH_FORWARD: (event: KeyboardEvent | undefined) => { preventDefault(event); if (frameNumber + 1 <= stopFrame && canvasIsReady - && isAbleToChangeFrame(canvasInstance) + && canvasInstance.isAbleToChangeFrame() ) { searchAnnotations(jobInstance, frameNumber + 1, stopFrame); } @@ -559,7 +559,7 @@ class AnnotationTopBarContainer extends React.PureComponent { SEARCH_BACKWARD: (event: KeyboardEvent | undefined) => { preventDefault(event); if (frameNumber - 1 >= startFrame && canvasIsReady - && isAbleToChangeFrame(canvasInstance) + && canvasInstance.isAbleToChangeFrame() ) { searchAnnotations(jobInstance, frameNumber - 1, startFrame); } diff --git a/cvat-ui/src/cvat-canvas-wrapper.ts b/cvat-ui/src/cvat-canvas-wrapper.ts index 1c8dfa7ed53e..631a52a915f3 100644 --- a/cvat-ui/src/cvat-canvas-wrapper.ts +++ b/cvat-ui/src/cvat-canvas-wrapper.ts @@ -10,16 +10,10 @@ import { CuboidDrawingMethod, } from 'cvat-canvas/src/typescript/canvas'; -function isAbleToChangeFrame(canvas: Canvas): boolean { - return ![CanvasMode.DRAG, CanvasMode.EDIT, CanvasMode.RESIZE] - .includes(canvas.mode()); -} - export { Canvas, CanvasMode, CanvasVersion, RectDrawingMethod, CuboidDrawingMethod, - isAbleToChangeFrame, }; diff --git a/cvat-ui/src/reducers/interfaces.ts b/cvat-ui/src/reducers/interfaces.ts index 6031435975ce..0cf7ffcd8dbe 100644 --- a/cvat-ui/src/reducers/interfaces.ts +++ b/cvat-ui/src/reducers/interfaces.ts @@ -305,7 +305,6 @@ export enum StatesOrdering { } export enum ContextMenuType { - CANVAS = 'canvas', CANVAS_SHAPE = 'canvas_shape', CANVAS_SHAPE_POINT = 'canvas_shape_point', } diff --git a/cvat-ui/src/reducers/shortcuts-reducer.ts b/cvat-ui/src/reducers/shortcuts-reducer.ts index f42ed5d4eb9f..c72aae78f9a8 100644 --- a/cvat-ui/src/reducers/shortcuts-reducer.ts +++ b/cvat-ui/src/reducers/shortcuts-reducer.ts @@ -207,8 +207,8 @@ const defaultKeyMap = { }, SWITCH_DRAW_MODE: { name: 'Draw mode', - description: 'Repeat the latest procedure of drawing with the same parameters', - sequences: ['n'], + description: 'Repeat the latest procedure of drawing with the same parameters (shift to redraw an existing shape)', + sequences: ['shift+n', 'n'], action: 'keydown', }, SWITCH_MERGE_MODE: { diff --git a/cvat/apps/dataset_manager/annotation.py b/cvat/apps/dataset_manager/annotation.py index df66c99bbf9f..54b0f21a6477 100644 --- a/cvat/apps/dataset_manager/annotation.py +++ b/cvat/apps/dataset_manager/annotation.py @@ -442,34 +442,284 @@ def normalize_shape(shape): @staticmethod def get_interpolated_shapes(track, start_frame, end_frame): - def interpolate(shape0, shape1): + def copy_shape(source, frame, points = None): + copied = deepcopy(source) + copied["keyframe"] = True + copied["frame"] = frame + if points: + copied["points"] = points + return copied + + def simple_interpolation(shape0, shape1): + shapes = [] + distance = shape1["frame"] - shape0["frame"] + diff = np.subtract(shape1["points"], shape0["points"]) + + for frame in range(shape0["frame"] + 1, shape1["frame"]): + offset = (frame - shape0["frame"]) / distance + points = None + if shape1["outside"]: + points = np.asarray(shape0["points"]) + else: + points = shape0["points"] + diff * offset + + shapes.append(copy_shape(shape0, frame, points.tolist())) + + return shapes + + def points_interpolation(shape0, shape1): + if len(shape0["points"]) == 2 and len(shape1["points"]) == 2: + return simple_interpolation(shape0, shape1) + else: + shapes = [] + for frame in range(shape0["frame"] + 1, shape1["frame"]): + shapes.append(copy_shape(shape0, frame)) + + return shapes + + def interpolate_position(left_position, right_position, offset): + def to_array(points): + return np.asarray( + list(map(lambda point: [point["x"], point["y"]], points)) + ).flatten() + + def to_points(array): + return list(map( + lambda point: {"x": point[0], "y": point[1]}, np.asarray(array).reshape(-1, 2) + )) + + def curve_length(points): + length = 0 + for i in range(1, len(points)): + dx = points[i]["x"] - points[i - 1]["x"] + dy = points[i]["y"] - points[i - 1]["y"] + length += np.sqrt(dx ** 2 + dy ** 2) + return length + + def curve_to_offset_vec(points, length): + offset_vector = [0] + accumulated_length = 0 + for i in range(1, len(points)): + dx = points[i]["x"] - points[i - 1]["x"] + dy = points[i]["y"] - points[i - 1]["y"] + accumulated_length += np.sqrt(dx ** 2 + dy ** 2) + offset_vector.append(accumulated_length / length) + + return offset_vector + + def find_nearest_pair(value, curve): + minimum = [0, abs(value - curve[0])] + for i in range(1, len(curve)): + distance = abs(value - curve[i]) + if distance < minimum[1]: + minimum = [i, distance] + + return minimum[0] + + def match_left_right(left_curve, right_curve): + matching = {} + for i, left_curve_item in enumerate(left_curve): + matching[i] = [find_nearest_pair(left_curve_item, right_curve)] + return matching + + def match_right_left(left_curve, right_curve, left_right_matching): + matched_right_points = left_right_matching.values() + unmatched_right_points = filter(lambda x: x not in matched_right_points, range(len(right_curve))) + updated_matching = deepcopy(left_right_matching) + + for right_point in unmatched_right_points: + left_point = find_nearest_pair(right_curve[right_point], left_curve) + updated_matching[left_point].append(right_point) + + for key, value in updated_matching.items(): + updated_matching[key] = sorted(value) + + return updated_matching + + def reduce_interpolation(interpolated_points, matching, left_points, right_points): + def average_point(points): + sumX = 0 + sumY = 0 + for point in points: + sumX += point["x"] + sumY += point["y"] + + return { + "x": sumX / len(points), + "y": sumY / len(points) + } + + def compute_distance(point1, point2): + return np.sqrt( + ((point1["x"] - point2["x"])) ** 2 + + ((point1["y"] - point2["y"]) ** 2) + ) + + def minimize_segment(base_length, N, start_interpolated, stop_interpolated): + threshold = base_length / (2 * N) + minimized = [interpolated_points[start_interpolated]] + latest_pushed = start_interpolated + for i in range(start_interpolated + 1, stop_interpolated): + distance = compute_distance( + interpolated_points[latest_pushed], interpolated_points[i] + ) + + if distance >= threshold: + minimized.append(interpolated_points[i]) + latest_pushed = i + + minimized.append(interpolated_points[stop_interpolated]) + + if len(minimized) == 2: + distance = compute_distance( + interpolated_points[start_interpolated], + interpolated_points[stop_interpolated] + ) + + if distance < threshold: + return [average_point(minimized)] + + return minimized + + reduced = [] + interpolated_indexes = {} + accumulated = 0 + for i in range(len(left_points)): + interpolated_indexes[i] = [] + for _ in range(len(matching[i])): + interpolated_indexes[i].append(accumulated) + accumulated += 1 + + def left_segment(start, stop): + start_interpolated = interpolated_indexes[start][0] + stop_interpolated = interpolated_indexes[stop][0] + + if start_interpolated == stop_interpolated: + reduced.append(interpolated_points[start_interpolated]) + return + + base_length = curve_length(left_points[start: stop + 1]) + N = stop - start + 1 + + reduced.extend( + minimize_segment(base_length, N, start_interpolated, stop_interpolated) + ) + + + def right_segment(left_point): + start = matching[left_point][0] + stop = matching[left_point][-1] + start_interpolated = interpolated_indexes[left_point][0] + stop_interpolated = interpolated_indexes[left_point][-1] + base_length = curve_length(right_points[start: stop + 1]) + N = stop - start + 1 + + reduced.extend( + minimize_segment(base_length, N, start_interpolated, stop_interpolated) + ) + + previous_opened = None + for i in range(len(left_points)): + if len(matching[i]) == 1: + if previous_opened is not None: + if matching[i][0] == matching[previous_opened][0]: + continue + else: + start = previous_opened + stop = i - 1 + left_segment(start, stop) + previous_opened = i + else: + previous_opened = i + else: + if previous_opened is not None: + start = previous_opened + stop = i - 1 + left_segment(start, stop) + previous_opened = None + + right_segment(i) + + if previous_opened is not None: + left_segment(previous_opened, len(left_points) - 1) + + return reduced + + left_points = to_points(left_position["points"]) + right_points = to_points(right_position["points"]) + left_offset_vec = curve_to_offset_vec(left_points, curve_length(left_points)) + right_offset_vec = curve_to_offset_vec(right_points, curve_length(right_points)) + + matching = match_left_right(left_offset_vec, right_offset_vec) + completed_matching = match_right_left( + left_offset_vec, right_offset_vec, matching + ) + + interpolated_points = [] + for left_point_index, left_point in enumerate(left_points): + for right_point_index in completed_matching[left_point_index]: + right_point = right_points[right_point_index] + interpolated_points.append({ + "x": left_point["x"] + (right_point["x"] - left_point["x"]) * offset, + "y": left_point["y"] + (right_point["y"] - left_point["y"]) * offset + }) + + reducedPoints = reduce_interpolation( + interpolated_points, + completed_matching, + left_points, + right_points + ) + + return to_array(reducedPoints).tolist() + + def polyshape_interpolation(shape0, shape1): shapes = [] - is_same_type = shape0["type"] == shape1["type"] is_polygon = shape0["type"] == ShapeType.POLYGON - is_polyline = shape0["type"] == ShapeType.POLYLINE - is_same_size = len(shape0["points"]) == len(shape1["points"]) - if not is_same_type or is_polygon or is_polyline or not is_same_size: - shape0 = TrackManager.normalize_shape(shape0) - shape1 = TrackManager.normalize_shape(shape1) + if is_polygon: + shape0["points"].extend(shape0["points"][:2]) + shape1["points"].extend(shape1["points"][:2]) distance = shape1["frame"] - shape0["frame"] - step = np.subtract(shape1["points"], shape0["points"]) / distance for frame in range(shape0["frame"] + 1, shape1["frame"]): - off = frame - shape0["frame"] + offset = (frame - shape0["frame"]) / distance + points = None if shape1["outside"]: - points = np.asarray(shape0["points"]).reshape(-1, 2) - else: - points = (shape0["points"] + step * off).reshape(-1, 2) - shape = deepcopy(shape0) - if len(points) == 1: - shape["points"] = points.flatten() + points = np.asarray(shape0["points"]) else: - broken_line = geometry.LineString(points).simplify(0.05, False) - shape["points"] = [x for p in broken_line.coords for x in p] + points = interpolate_position(shape0, shape1, offset) + + shapes.append(copy_shape(shape0, frame, points)) + + if is_polygon: + shape0["points"] = shape0["points"][:-2] + shape1["points"] = shape1["points"][:-2] + for shape in shapes: + shape["points"] = shape["points"][:-2] + + return shapes + + def interpolate(shape0, shape1): + is_same_type = shape0["type"] == shape1["type"] + is_rectangle = shape0["type"] == ShapeType.RECTANGLE + is_cuboid = shape0["type"] == ShapeType.CUBOID + is_polygon = shape0["type"] == ShapeType.POLYGON + is_polyline = shape0["type"] == ShapeType.POLYLINE + is_points = shape0["type"] == ShapeType.POINTS + + if not is_same_type: + raise NotImplementedError() + + shapes = [] + if is_rectangle or is_cuboid: + shapes = simple_interpolation(shape0, shape1) + elif is_points: + shapes = points_interpolation(shape0, shape1) + elif is_polygon or is_polyline: + shapes = polyshape_interpolation(shape0, shape1) + else: + raise NotImplementedError() - shape["keyframe"] = False - shape["frame"] = frame - shapes.append(shape) return shapes if track.get("interpolated_shapes"): From 90c8f789ee413b7a23deb48b166cfd535cb22970 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2020 16:42:02 +0300 Subject: [PATCH 28/30] Bump tensorflow from 1.15.2 to 2.2.0 in /cvat/requirements (#1761) Bumps [tensorflow](https://github.com/tensorflow/tensorflow) from 1.15.2 to 2.2.0. - [Release notes](https://github.com/tensorflow/tensorflow/releases) - [Changelog](https://github.com/tensorflow/tensorflow/blob/master/RELEASE.md) - [Commits](https://github.com/tensorflow/tensorflow/compare/v1.15.2...v2.2.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 6e016bd89c48..2cb727660b59 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -38,7 +38,7 @@ django-rest-auth[with_social]==0.9.5 cython==0.29.20 matplotlib==3.0.3 scikit-image==0.15.0 -tensorflow==1.15.2 +tensorflow==2.2.0 keras==2.4.2 opencv-python==4.1.0.25 h5py==2.10.0 From 3fee4cfcab389268b6ad6c2b54bb60f06fb38ba8 Mon Sep 17 00:00:00 2001 From: Eric Grinstein Date: Mon, 22 Jun 2020 10:49:59 -0300 Subject: [PATCH 29/30] Functionality to upload annotations on task creation (#1735) * Upload annotations on task creation * Bulk upload v1 * Not working * Annotation upon task creation finished * Functionality to upload annotations on task creation * Functionality to upload annotations on task creation * Functionality to upload annotations on task creation * Functionality to upload annotations on task creation * Fix trailing whitespace * Use status request for checking task completion * fixed default format name Co-authored-by: Eric Grinstein Co-authored-by: Andrey Zhavoronkov Co-authored-by: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> --- CHANGELOG.md | 1 + utils/cli/core/core.py | 33 +++++++++++++++++++++++++++++---- utils/cli/core/definition.py | 21 ++++++++++++++++++++- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 488c67b1bb75..eb38df346160 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Built-in search for labels when create an object or change a label () - Better validation of labels and attributes in raw viewer () - ClamAV antivirus integration () +- Add option to upload annotations upon task creation on CLI - Polygon and polylines interpolation () - Ability to redraw shape from scratch (Shift + N) for an activated shape () - Highlights for the first point of a polygon/polyline and direction () diff --git a/utils/cli/core/core.py b/utils/cli/core/core.py index f684608ea914..a51364285e89 100644 --- a/utils/cli/core/core.py +++ b/utils/cli/core/core.py @@ -8,6 +8,7 @@ import requests from io import BytesIO import mimetypes +from time import sleep from PIL import Image @@ -57,7 +58,9 @@ def tasks_list(self, use_json_output, **kwargs): response = self.session.get(url) response.raise_for_status() - def tasks_create(self, name, labels, bug, resource_type, resources, **kwargs): + def tasks_create(self, name, labels, bug, resource_type, resources, + annotation_path='', annotation_format='CVAT XML 1.1', + completion_verification_period=20, **kwargs): """ Create a new task with the given name and labels JSON and add the files to it. """ url = self.api.tasks @@ -69,7 +72,26 @@ def tasks_create(self, name, labels, bug, resource_type, resources, **kwargs): response.raise_for_status() response_json = response.json() log.info('Created task ID: {id} NAME: {name}'.format(**response_json)) - self.tasks_data(response_json['id'], resource_type, resources) + task_id = response_json['id'] + self.tasks_data(task_id, resource_type, resources) + + if annotation_path != '': + url = self.api.tasks_id_status(task_id) + response = self.session.get(url) + response_json = response.json() + + log.info('Awaiting data compression before uploading annotations...') + while response_json['state'] != 'Finished': + sleep(completion_verification_period) + response = self.session.get(url) + response_json = response.json() + logger_string= '''Awaiting compression for task {}. + Status={}, Message={}'''.format(task_id, + response_json['state'], + response_json['message']) + log.info(logger_string) + + self.tasks_upload(task_id, annotation_format, annotation_path, **kwargs) def tasks_delete(self, task_ids, **kwargs): """ Delete a list of tasks, ignoring those which don't exist. """ @@ -135,8 +157,8 @@ def tasks_upload(self, task_id, fileformat, filename, **kwargs): while True: response = self.session.put( url, - files={'annotation_file':open(filename, 'rb')} - ) + files={'annotation_file': open(filename, 'rb')} + ) response.raise_for_status() if response.status_code == 201: break @@ -176,6 +198,9 @@ def tasks_id_data(self, task_id): def tasks_id_frame_id(self, task_id, frame_id, quality): return self.tasks_id(task_id) + '/data?type=frame&number={}&quality={}'.format(frame_id, quality) + def tasks_id_status(self, task_id): + return self.tasks_id(task_id) + '/status' + def tasks_id_annotations_format(self, task_id, fileformat): return self.tasks_id(task_id) + '/annotations?format={}' \ .format(fileformat) diff --git a/utils/cli/core/definition.py b/utils/cli/core/definition.py index 7f9eb2db9717..d8892d19c59f 100644 --- a/utils/cli/core/definition.py +++ b/utils/cli/core/definition.py @@ -125,6 +125,25 @@ def argparse(s): help='list of paths or URLs', nargs='+' ) +task_create_parser.add_argument( + '--annotation_path', + default='', + type=str, + help='path to annotation file' +) +task_create_parser.add_argument( + '--annotation_format', + default='CVAT 1.1', + type=str, + help='format of the annotation file being uploaded, e.g. CVAT 1.1' +) +task_create_parser.add_argument( + '--completion_verification_period', + default=20, + type=int, + help='''number of seconds to wait until checking + if data compression finished (necessary before uploading annotations)''' +) ####################################################################### # Delete @@ -240,4 +259,4 @@ def argparse(s): type=str, default='CVAT 1.1', help='annotation format (default: %(default)s)' -) +) \ No newline at end of file From 12f78559d22d054d2b5c3a2be28c732436adebed Mon Sep 17 00:00:00 2001 From: zhiltsov-max Date: Mon, 22 Jun 2020 16:52:25 +0300 Subject: [PATCH 30/30] [Datumaro] Mean and std for dataset (#1734) * Add meanstd * Add stats cli * Update changelog Co-authored-by: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> --- CHANGELOG.md | 1 + .../datumaro/cli/contexts/project/__init__.py | 34 ++++++++ datumaro/datumaro/components/operations.py | 82 +++++++++++++++++++ datumaro/tests/test_ops.py | 31 +++++++ 4 files changed, 148 insertions(+) create mode 100644 datumaro/datumaro/components/operations.py create mode 100644 datumaro/tests/test_ops.py diff --git a/CHANGELOG.md b/CHANGELOG.md index eb38df346160..91ed8dd5c3c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Built-in search for labels when create an object or change a label () - Better validation of labels and attributes in raw viewer () - ClamAV antivirus integration () +- [Datumaro] Added `stats` command, which shows some dataset statistics like image mean and std (https://github.com/opencv/cvat/pull/1734) - Add option to upload annotations upon task creation on CLI - Polygon and polylines interpolation () - Ability to redraw shape from scratch (Shift + N) for an activated shape () diff --git a/datumaro/datumaro/cli/contexts/project/__init__.py b/datumaro/datumaro/cli/contexts/project/__init__.py index 4c443a2bfca2..6ee6dbaaf748 100644 --- a/datumaro/datumaro/cli/contexts/project/__init__.py +++ b/datumaro/datumaro/cli/contexts/project/__init__.py @@ -16,6 +16,7 @@ from datumaro.components.dataset_filter import DatasetItemEncoder from datumaro.components.extractor import AnnotationType from datumaro.components.cli_plugin import CliPlugin +from datumaro.components.operations import mean_std from .diff import DiffVisualizer from ...util import add_subparser, CliException, MultilineFormatter, \ make_file_name @@ -623,6 +624,38 @@ def transform_command(args): return 0 +def build_stats_parser(parser_ctor=argparse.ArgumentParser): + parser = parser_ctor(help="Get project statistics", + description=""" + Outputs project statistics. + """, + formatter_class=MultilineFormatter) + + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + parser.set_defaults(command=stats_command) + + return parser + +def stats_command(args): + project = load_project(args.project_dir) + dataset = project.make_dataset() + + def print_extractor_info(extractor, indent=''): + mean, std = mean_std(dataset) + print("%sImage mean:" % indent, ', '.join('%.3f' % n for n in mean)) + print("%sImage std:" % indent, ', '.join('%.3f' % n for n in std)) + + print("Dataset: ") + print_extractor_info(dataset) + + if 1 < len(dataset.subsets()): + print("Subsets: ") + for subset_name in dataset.subsets(): + subset = dataset.get_subset(subset_name) + print(" %s:" % subset_name) + print_extractor_info(subset, " " * 4) + def build_info_parser(parser_ctor=argparse.ArgumentParser): parser = parser_ctor(help="Get project info", description=""" @@ -718,5 +751,6 @@ def build_parser(parser_ctor=argparse.ArgumentParser): add_subparser(subparsers, 'diff', build_diff_parser) add_subparser(subparsers, 'transform', build_transform_parser) add_subparser(subparsers, 'info', build_info_parser) + add_subparser(subparsers, 'stats', build_stats_parser) return parser diff --git a/datumaro/datumaro/components/operations.py b/datumaro/datumaro/components/operations.py new file mode 100644 index 000000000000..a049e2675c5d --- /dev/null +++ b/datumaro/datumaro/components/operations.py @@ -0,0 +1,82 @@ + +# Copyright (C) 2020 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import cv2 +import numpy as np + + +def mean_std(dataset): + """ + Computes unbiased mean and std. dev. for dataset images, channel-wise. + """ + # Use an online algorithm to: + # - handle different image sizes + # - avoid cancellation problem + + stats = np.empty((len(dataset), 2, 3), dtype=np.double) + counts = np.empty(len(dataset), dtype=np.uint32) + + mean = lambda i, s: s[i][0] + var = lambda i, s: s[i][1] + + for i, item in enumerate(dataset): + counts[i] = np.prod(item.image.size) + + image = item.image.data + if len(image.shape) == 2: + image = image[:, :, np.newaxis] + else: + image = image[:, :, :3] + # opencv is much faster than numpy here + cv2.meanStdDev(image.astype(np.double) / 255, + mean=mean(i, stats), stddev=var(i, stats)) + + # make variance unbiased + np.multiply(np.square(stats[:, 1]), + (counts / (counts - 1))[:, np.newaxis], + out=stats[:, 1]) + + _, mean, var = StatsCounter().compute_stats(stats, counts, mean, var) + return mean * 255, np.sqrt(var) * 255 + +class StatsCounter: + # Implements online parallel computation of sample variance + # https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Parallel_algorithm + + # Needed do avoid catastrophic cancellation in floating point computations + @staticmethod + def pairwise_stats(count_a, mean_a, var_a, count_b, mean_b, var_b): + delta = mean_b - mean_a + m_a = var_a * (count_a - 1) + m_b = var_b * (count_b - 1) + M2 = m_a + m_b + delta ** 2 * count_a * count_b / (count_a + count_b) + return ( + count_a + count_b, + mean_a * 0.5 + mean_b * 0.5, + M2 / (count_a + count_b - 1) + ) + + # stats = float array of shape N, 2 * d, d = dimensions of values + # count = integer array of shape N + # mean_accessor = function(idx, stats) to retrieve element mean + # variance_accessor = function(idx, stats) to retrieve element variance + # Recursively computes total count, mean and variance, does O(log(N)) calls + @staticmethod + def compute_stats(stats, counts, mean_accessor, variance_accessor): + m = mean_accessor + v = variance_accessor + n = len(stats) + if n == 1: + return counts[0], m(0, stats), v(0, stats) + if n == 2: + return __class__.pairwise_stats( + counts[0], m(0, stats), v(0, stats), + counts[1], m(1, stats), v(1, stats) + ) + h = n // 2 + return __class__.pairwise_stats( + *__class__.compute_stats(stats[:h], counts[:h], m, v), + *__class__.compute_stats(stats[h:], counts[h:], m, v) + ) diff --git a/datumaro/tests/test_ops.py b/datumaro/tests/test_ops.py new file mode 100644 index 000000000000..24f32f352a71 --- /dev/null +++ b/datumaro/tests/test_ops.py @@ -0,0 +1,31 @@ +import numpy as np + +from datumaro.components.extractor import Extractor, DatasetItem +from datumaro.components.operations import mean_std + +from unittest import TestCase + + +class TestOperations(TestCase): + def test_mean_std(self): + expected_mean = [100, 50, 150] + expected_std = [20, 50, 10] + + class TestExtractor(Extractor): + def __iter__(self): + return iter([ + DatasetItem(id=1, image=np.random.normal( + expected_mean, expected_std, + size=(w, h, 3)) + ) + for i, (w, h) in enumerate([ + (3000, 100), (800, 600), (400, 200), (700, 300) + ]) + ]) + + actual_mean, actual_std = mean_std(TestExtractor()) + + for em, am in zip(expected_mean, actual_mean): + self.assertAlmostEqual(em, am, places=0) + for estd, astd in zip(expected_std, actual_std): + self.assertAlmostEqual(estd, astd, places=0) \ No newline at end of file