From e92014ead0d589c55ce9eac75e436a5113c7055c Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Wed, 15 Jul 2020 18:22:45 +0300 Subject: [PATCH] CVAT-UI: Couple of fixes (#1892) * Polygon interpolation fix * Fix interpolation issue * Updated changelog --- CHANGELOG.md | 2 ++ cvat-canvas/package-lock.json | 2 +- cvat-canvas/package.json | 2 +- cvat-canvas/src/typescript/autoborderHandler.ts | 13 +++++++------ cvat-canvas/src/typescript/drawHandler.ts | 12 ++++++++---- cvat-canvas/src/typescript/editHandler.ts | 8 ++++++-- cvat-core/package.json | 2 +- cvat-core/src/annotations-objects.js | 2 +- cvat/apps/dataset_manager/annotation.py | 3 ++- 9 files changed, 29 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c1eb3ad038f..f82be7a2c3ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `outside` annotations should not be in exported images () - `CVAT for video format` import error with interpolation () - `Image compression` definition mismatch () +- Points are dublicated during polygon interpolation sometimes () +- When redraw a shape with activated autobordering, previous points are visible () ### Security - diff --git a/cvat-canvas/package-lock.json b/cvat-canvas/package-lock.json index f892c11a647c..8f0920cfb634 100644 --- a/cvat-canvas/package-lock.json +++ b/cvat-canvas/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-canvas", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-canvas/package.json b/cvat-canvas/package.json index 2044f33dea1d..5d61f0663106 100644 --- a/cvat-canvas/package.json +++ b/cvat-canvas/package.json @@ -1,6 +1,6 @@ { "name": "cvat-canvas", - "version": "2.0.0", + "version": "2.0.1", "description": "Part of Computer Vision Annotation Tool which presents its canvas library", "main": "src/canvas.ts", "scripts": { diff --git a/cvat-canvas/src/typescript/autoborderHandler.ts b/cvat-canvas/src/typescript/autoborderHandler.ts index 8f042948c080..198a485e9107 100644 --- a/cvat-canvas/src/typescript/autoborderHandler.ts +++ b/cvat-canvas/src/typescript/autoborderHandler.ts @@ -13,14 +13,14 @@ interface TransformedShape { } export interface AutoborderHandler { - autoborder(enabled: boolean, currentShape?: SVG.Shape, ignoreCurrent?: boolean): void; + autoborder(enabled: boolean, currentShape?: SVG.Shape, currentID?: number): void; transform(geometry: Geometry): void; updateObjects(): void; } export class AutoborderHandlerImpl implements AutoborderHandler { private currentShape: SVG.Shape | null; - private ignoreCurrent: boolean; + private currentID?: number; private frameContent: SVGSVGElement; private enabled: boolean; private scale: number; @@ -34,7 +34,7 @@ export class AutoborderHandlerImpl implements AutoborderHandler { public constructor(frameContent: SVGSVGElement) { this.frameContent = frameContent; - this.ignoreCurrent = false; + this.currentID = undefined; this.currentShape = null; this.enabled = false; this.scale = 1; @@ -231,7 +231,8 @@ export class AutoborderHandlerImpl implements AutoborderHandler { this.removeMarkers(); const currentClientID = this.currentShape.node.dataset.originClientId; - const shapes = Array.from(this.frameContent.getElementsByClassName('cvat_canvas_shape')); + const shapes = Array.from(this.frameContent.getElementsByClassName('cvat_canvas_shape')) + .filter((shape: HTMLElement): boolean => +shape.getAttribute('clientID') !== this.currentID); const transformedShapes = shapes.map((shape: HTMLElement): TransformedShape | null => { const color = shape.getAttribute('fill'); const clientID = shape.getAttribute('clientID'); @@ -277,12 +278,12 @@ export class AutoborderHandlerImpl implements AutoborderHandler { public autoborder( enabled: boolean, currentShape?: SVG.Shape, - ignoreCurrent: boolean = false, + currentID?: number, ): void { if (enabled && !this.enabled && currentShape) { this.enabled = true; this.currentShape = currentShape; - this.ignoreCurrent = ignoreCurrent; + this.currentID = currentID; this.updateObjects(); } else { this.release(); diff --git a/cvat-canvas/src/typescript/drawHandler.ts b/cvat-canvas/src/typescript/drawHandler.ts index 21caaabc752d..404157bd6110 100644 --- a/cvat-canvas/src/typescript/drawHandler.ts +++ b/cvat-canvas/src/typescript/drawHandler.ts @@ -433,7 +433,7 @@ export class DrawHandlerImpl implements DrawHandler { this.drawPolyshape(); if (this.autobordersEnabled) { - this.autoborderHandler.autoborder(true, this.drawInstance, false); + this.autoborderHandler.autoborder(true, this.drawInstance, this.drawData.redraw); } } @@ -446,7 +446,7 @@ export class DrawHandlerImpl implements DrawHandler { this.drawPolyshape(); if (this.autobordersEnabled) { - this.autoborderHandler.autoborder(true, this.drawInstance, false); + this.autoborderHandler.autoborder(true, this.drawInstance, this.drawData.redraw); } } @@ -478,7 +478,7 @@ export class DrawHandlerImpl implements DrawHandler { if (this.canceled) return; if ((xbr - xtl) * (ybr - ytl) >= consts.AREA_THRESHOLD) { - const d = { x: (xbr - xtl) * 0.1, y: (ybr - ytl)*0.1} + const d = { x: (xbr - xtl) * 0.1, y: (ybr - ytl) * 0.1 }; this.onDrawDone({ shapeType, points: cuboidFrom4Points([xtl, ybr, xbr, ybr, xbr, ytl, xbr + d.x, ytl - d.y]), @@ -767,7 +767,11 @@ export class DrawHandlerImpl implements DrawHandler { this.autobordersEnabled = configuration.autoborders; if (this.drawInstance) { if (this.autobordersEnabled) { - this.autoborderHandler.autoborder(true, this.drawInstance, false); + this.autoborderHandler.autoborder( + true, + this.drawInstance, + this.drawData.redraw, + ); } else { this.autoborderHandler.autoborder(false); } diff --git a/cvat-canvas/src/typescript/editHandler.ts b/cvat-canvas/src/typescript/editHandler.ts index 2ced96d5e571..3d64590269cd 100644 --- a/cvat-canvas/src/typescript/editHandler.ts +++ b/cvat-canvas/src/typescript/editHandler.ts @@ -130,7 +130,7 @@ export class EditHandlerImpl implements EditHandler { this.setupEditEvents(); if (this.autobordersEnabled) { - this.autoborderHandler.autoborder(true, this.editLine, true); + this.autoborderHandler.autoborder(true, this.editLine, this.editData.state.clientID); } } @@ -376,7 +376,11 @@ export class EditHandlerImpl implements EditHandler { this.autobordersEnabled = configuration.autoborders; if (this.editLine) { if (this.autobordersEnabled) { - this.autoborderHandler.autoborder(true, this.editLine, true); + this.autoborderHandler.autoborder( + true, + this.editLine, + this.editData.state.clientID, + ); } else { this.autoborderHandler.autoborder(false); } diff --git a/cvat-core/package.json b/cvat-core/package.json index dbff47de467d..5467bfc2899a 100644 --- a/cvat-core/package.json +++ b/cvat-core/package.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "3.1.0", + "version": "3.1.1", "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 ef8286534444..cb86542e75e6 100644 --- a/cvat-core/src/annotations-objects.js +++ b/cvat-core/src/annotations-objects.js @@ -1629,7 +1629,7 @@ } function matchRightLeft(leftCurve, rightCurve, leftRightMatching) { - const matchedRightPoints = Object.values(leftRightMatching); + const matchedRightPoints = Object.values(leftRightMatching).flat(); const unmatchedRightPoints = rightCurve.map((_, index) => index) .filter((index) => !matchedRightPoints.includes(index)); const updatedMatching = { ...leftRightMatching }; diff --git a/cvat/apps/dataset_manager/annotation.py b/cvat/apps/dataset_manager/annotation.py index 6c7df4b1d1e3..0678adc2544f 100644 --- a/cvat/apps/dataset_manager/annotation.py +++ b/cvat/apps/dataset_manager/annotation.py @@ -5,6 +5,7 @@ from copy import copy, deepcopy import numpy as np +from itertools import chain from scipy.optimize import linear_sum_assignment from shapely import geometry @@ -523,7 +524,7 @@ def match_left_right(left_curve, right_curve): return matching def match_right_left(left_curve, right_curve, left_right_matching): - matched_right_points = left_right_matching.values() + matched_right_points = list(chain.from_iterable(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)