From 96f38026a732cb124db24f9e47573b692b7513a4 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Tue, 4 Sep 2018 15:45:42 +0300 Subject: [PATCH 01/19] Move function from closure to class method --- .../engine/static/engine/js/shapeCreator.js | 151 +++++++++--------- 1 file changed, 75 insertions(+), 76 deletions(-) diff --git a/cvat/apps/engine/static/engine/js/shapeCreator.js b/cvat/apps/engine/static/engine/js/shapeCreator.js index a1a58149..dc797fc2 100644 --- a/cvat/apps/engine/static/engine/js/shapeCreator.js +++ b/cvat/apps/engine/static/engine/js/shapeCreator.js @@ -261,6 +261,75 @@ class ShapeCreatorView { }.bind(this)); } + + _createPolyEvents() { + // If number of points for poly shape specified, use it. + // Dicrement number on draw new point events. Drawstart trigger when create first point + + if (this._polyShapeSize) { + let size = this._polyShapeSize; + let sizeDecrement = function() { + if (!--size) { + this._drawInstance.draw('done'); + } + }.bind(this); + + let sizeIncrement = function() { + size ++; + }; + + this._drawInstance.on('drawstart', sizeDecrement); + this._drawInstance.on('drawpoint', sizeDecrement); + this._drawInstance.on('undopoint', sizeIncrement); + } + // Otherwise draw will stop by Ctrl + N press + + // Callbacks for point scale + this._drawInstance.on('drawstart', this._rescaleDrawPoints.bind(this)); + this._drawInstance.on('drawpoint', this._rescaleDrawPoints.bind(this)); + this._frameContent.on('mousedown.shapeCreator', (e) => { + if (e.which === 3) { + this._drawInstance.draw('undo'); + } + }); + + this._drawInstance.on('drawstop', () => { + this._frameContent.off('mousedown.shapeCreator'); + }); + // Also we need callback on drawdone event for get points + this._drawInstance.on('drawdone', function(e) { + let points = PolyShapeModel.convertStringToNumberArray(e.target.getAttribute('points')); + for (let point of points) { + point.x = Math.clamp(point.x, 0, window.cvat.player.geometry.frameWidth); + point.y = Math.clamp(point.y, 0, window.cvat.player.geometry.frameHeight); + } + + // Min 2 points for polyline and 3 points for polygon + if (points.length) { + if (this._type === 'polyline' && points.length < 2) { + showMessage("Min 2 points must be for polyline drawing."); + } + else if (this._type === 'polygon' && points.length < 3) { + showMessage("Min 3 points must be for polygon drawing."); + } + else { + points = PolyShapeModel.convertNumberArrayToString(points); + + // Update points in view in order to get updated box + e.target.setAttribute('points', points); + let box = e.target.getBBox(); + if (box.width * box.height >= AREA_TRESHOLD || this._type === 'points' || + this._type === 'polyline' && (box.width >= AREA_TRESHOLD || box.height >= AREA_TRESHOLD)) { + this._controller.finish({points: e.target.getAttribute('points')}, this._type); + } + } + } + + this._controller.switchCreateMode(true); + }.bind(this)); + } + + _create() { let sizeUI = null; switch(this._type) { @@ -302,7 +371,7 @@ class ShapeCreatorView { this._drawInstance = this._frameContent.polyline().draw({snapToGrid: 0.1}).addClass('shapeCreation').attr({ 'stroke-width': 0, }); - createPolyEvents.call(this); + this._createPolyEvents(); break; case 'polygon': if (this._polyShapeSize && this._polyShapeSize < 3) { @@ -315,7 +384,7 @@ class ShapeCreatorView { this._drawInstance = this._frameContent.polygon().draw({snapToGrid: 0.1}).addClass('shapeCreation').attr({ 'stroke-width': STROKE_WIDTH / this._scale, }); - createPolyEvents.call(this); + this._createPolyEvents(); break; case 'polyline': if (this._polyShapeSize && this._polyShapeSize < 2) { @@ -328,7 +397,7 @@ class ShapeCreatorView { this._drawInstance = this._frameContent.polyline().draw({snapToGrid: 0.1}).addClass('shapeCreation').attr({ 'stroke-width': STROKE_WIDTH / this._scale, }); - createPolyEvents.call(this); + this._createPolyEvents(); break; default: throw Error(`Bad type found ${this._type}`); @@ -368,73 +437,6 @@ class ShapeCreatorView { this._drawInstance.attr({ 'z_order': Number.MAX_SAFE_INTEGER, }); - - function createPolyEvents() { - // If number of points for poly shape specified, use it. - // Dicrement number on draw new point events. Drawstart trigger when create first point - - if (this._polyShapeSize) { - let size = this._polyShapeSize; - let sizeDecrement = function() { - if (!--size) { - this._drawInstance.draw('done'); - } - }.bind(this); - - let sizeIncrement = function() { - size ++; - }; - - this._drawInstance.on('drawstart', sizeDecrement); - this._drawInstance.on('drawpoint', sizeDecrement); - this._drawInstance.on('undopoint', sizeIncrement); - } - // Otherwise draw will stop by Ctrl + N press - - // Callbacks for point scale - this._drawInstance.on('drawstart', this._rescaleDrawPoints.bind(this)); - this._drawInstance.on('drawpoint', this._rescaleDrawPoints.bind(this)); - this._frameContent.on('mousedown.shapeCreator', (e) => { - if (e.which === 3) { - this._drawInstance.draw('undo'); - } - }); - - this._drawInstance.on('drawstop', () => { - this._frameContent.off('mousedown.shapeCreator'); - }); - // Also we need callback on drawdone event for get points - this._drawInstance.on('drawdone', function(e) { - let points = PolyShapeModel.convertStringToNumberArray(e.target.getAttribute('points')); - for (let point of points) { - point.x = Math.clamp(point.x, 0, window.cvat.player.geometry.frameWidth); - point.y = Math.clamp(point.y, 0, window.cvat.player.geometry.frameHeight); - } - - // Min 2 points for polyline and 3 points for polygon - if (points.length) { - if (this._type === 'polyline' && points.length < 2) { - showMessage("Min 2 points must be for polyline drawing."); - } - else if (this._type === 'polygon' && points.length < 3) { - showMessage("Min 3 points must be for polygon drawing."); - } - else { - points = PolyShapeModel.convertNumberArrayToString(points); - - // Update points in view in order to get updated box - e.target.setAttribute('points', points); - let box = e.target.getBBox(); - if (box.width * box.height >= AREA_TRESHOLD || this._type === 'points' || - this._type === 'polyline' && (box.width >= AREA_TRESHOLD || box.height >= AREA_TRESHOLD)) { - this._controller.finish({points: e.target.getAttribute('points')}, this._type); - } - } - } - - this._controller.switchCreateMode(true); - }.bind(this)); - } } _rescaleDrawPoints() { @@ -477,7 +479,7 @@ class ShapeCreatorView { this._type = model.defaultType; this._mode = model.defaultMode; - if (this._type === 'box') { + if (!['polygon', 'polyline', 'points'].includes(this._type)) { this._drawAim(); } @@ -486,10 +488,7 @@ class ShapeCreatorView { this._create(); } else { - if (this._type === 'box') { - this._removeAim(); - } - + this._removeAim(); this._cancel = true; this._createButton.text("Create Shape"); document.oncontextmenu = null; @@ -526,7 +525,7 @@ class ShapeCreatorView { this._aim.x.attr('stroke-width', STROKE_WIDTH / this._scale); this._aim.y.attr('stroke-width', STROKE_WIDTH / this._scale); } - if (this._type != 'points') { + if (['box', 'polygon', 'polyline'].includes(this._type)) { this._drawInstance.attr('stroke-width', STROKE_WIDTH / this._scale); } } From 2dd868052a0b20fe556adb7d4612bffa92e459bd Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Fri, 7 Sep 2018 15:46:34 +0300 Subject: [PATCH 02/19] Bug has been fixed: Failed to execute 'inverse' on 'SVGMatrix': The matrix is not invertible --- cvat/apps/engine/static/engine/js/annotationUI.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cvat/apps/engine/static/engine/js/annotationUI.js b/cvat/apps/engine/static/engine/js/annotationUI.js index e24c2a44..3bd09d35 100644 --- a/cvat/apps/engine/static/engine/js/annotationUI.js +++ b/cvat/apps/engine/static/engine/js/annotationUI.js @@ -12,8 +12,10 @@ function callAnnotationUI(jid) { let loadJobEvent = Logger.addContinuedEvent(Logger.EventType.loadJob); serverRequest("/get/job/" + jid, function(job) { serverRequest("get/annotation/job/" + jid, function(data) { - buildAnnotationUI(job, data, loadJobEvent); $('#loadingOverlay').remove(); + setTimeout(() => { + buildAnnotationUI(job, data, loadJobEvent); + }, 0); }); }); } From a6db3a4abdba9c17c935e4af3b8a31cb62fa6bf3 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Fri, 7 Sep 2018 17:05:13 +0300 Subject: [PATCH 03/19] Performance of frame changing has been increased due to UI containers had detached from DOM before their items were created --- cvat/apps/engine/static/engine/base.css | 3 ++- .../engine/static/engine/js/shapeCollection.js | 15 ++++++++++++++- cvat/apps/engine/static/engine/stylesheet.css | 7 ++++++- cvat/apps/engine/templates/engine/annotation.html | 9 +++++---- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/cvat/apps/engine/static/engine/base.css b/cvat/apps/engine/static/engine/base.css index ce19a39b..30b2b128 100644 --- a/cvat/apps/engine/static/engine/base.css +++ b/cvat/apps/engine/static/engine/base.css @@ -98,8 +98,9 @@ html { border: none; outline: none; cursor: pointer; - padding: 14px 16px; + padding: 3px 0px; transition: 0.3s; + } .tab button:hover { diff --git a/cvat/apps/engine/static/engine/js/shapeCollection.js b/cvat/apps/engine/static/engine/js/shapeCollection.js index 1ee31a46..121dd94c 100644 --- a/cvat/apps/engine/static/engine/js/shapeCollection.js +++ b/cvat/apps/engine/static/engine/js/shapeCollection.js @@ -1247,8 +1247,17 @@ class ShapeCollectionView { view.erase(); } - this._currentViews = []; + // Save parents and detach elements from DOM + // in order to increase performance in the buildShapeView function + let parents = { + uis: this._UIContent.parent(), + shapes: this._frameContent.node.parentNode + } + + this._frameContent.node.parent = null; + this._UIContent.detach(); + this._currentViews = []; for (let shape of collection.currentShapes) { let model = shape.model; let view = buildShapeView(model, buildShapeController(model), this._frameContent, this._UIContent); @@ -1259,6 +1268,10 @@ class ShapeCollectionView { view.subscribe(this); this._labelsContent.find(`.labelContentElement[label_id="${model.label}"]`).removeClass('hidden'); } + + parents.shapes.append(this._frameContent.node); + parents.uis.prepend(this._UIContent); + ShapeCollectionView.sortByZOrder(); } diff --git a/cvat/apps/engine/static/engine/stylesheet.css b/cvat/apps/engine/static/engine/stylesheet.css index 2a9306ac..4e53b72d 100644 --- a/cvat/apps/engine/static/engine/stylesheet.css +++ b/cvat/apps/engine/static/engine/stylesheet.css @@ -356,6 +356,9 @@ .customizedTab { border-radius: 5px 5px 0px 0px; width: 100%; + width: 15%; + float: left; + margin: 0px 10px; } /* ----------------------- IDs ----------------------- */ @@ -392,7 +395,9 @@ } #uiContent, #trackManagement, #aamMenu, #labelsContent { - border: 1px black solid; + border-bottom: 1px solid black; + border-right: 1px solid black; + border-left: 1px solid black; border-radius: 5px; box-shadow: 0 0 5px rgba(0,0,0,0.5); background-color: #B0C4DE; diff --git a/cvat/apps/engine/templates/engine/annotation.html b/cvat/apps/engine/templates/engine/annotation.html index 124fd0d8..2b12d634 100644 --- a/cvat/apps/engine/templates/engine/annotation.html +++ b/cvat/apps/engine/templates/engine/annotation.html @@ -375,11 +375,12 @@ + +
+ + +
-
- - -
From 5a369a9e528a0c722258c8d64b12ce66f82e8dde Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Wed, 12 Sep 2018 09:24:00 +0300 Subject: [PATCH 04/19] Bug has been fixed: Defiant doesn't support dash (-) in xpath nodes (#53) --- cvat/apps/engine/static/engine/js/shapeFilter.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cvat/apps/engine/static/engine/js/shapeFilter.js b/cvat/apps/engine/static/engine/js/shapeFilter.js index 564d421f..9781812b 100644 --- a/cvat/apps/engine/static/engine/js/shapeFilter.js +++ b/cvat/apps/engine/static/engine/js/shapeFilter.js @@ -26,10 +26,11 @@ class FilterModel { lock: shape.model.lock }; + // We replace all dashes due to defiant.js can't work with it function convertAttributes(attributes) { let converted = {}; for (let attrId in attributes) { - converted[attributes[attrId].name.toLowerCase()] = ('' + attributes[attrId].value).toLowerCase(); + converted[attributes[attrId].name.toLowerCase().replace(/-/g, "_")] = ('' + attributes[attrId].value).toLowerCase(); } return converted; } @@ -38,11 +39,11 @@ class FilterModel { _convertCollection(collection) { let converted = {}; for (let labelId in this._labels) { - converted[this._labels[labelId]] = []; + converted[this._labels[labelId].replace(/-/g, "_")] = []; } for (let shape of collection) { - converted[this._labels[shape.model.label].toLowerCase()].push(this._convertShape(shape)); + converted[this._labels[shape.model.label].toLowerCase().replace(/-/g, "_")].push(this._convertShape(shape)); } return converted; } @@ -109,7 +110,7 @@ class FilterView { this._filterString.on('change', (e) => { let value = $.trim(e.target.value); if (value.length) { - value = value.split('|').map(x => '/d:data/' + x).join('|').toLowerCase(); + value = value.split('|').map(x => '/d:data/' + x).join('|').toLowerCase().replace(/-/g, "_"); } if (this._controller.updateFilter(value)) { this._filterString.css('color', 'green'); From 72e5bf6661aeb093a743fa2ddd25316b8194bc18 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Wed, 12 Sep 2018 10:24:18 +0300 Subject: [PATCH 05/19] =?UTF-8?q?Bug=20has=20been=20fixed:=20filename=20ex?= =?UTF-8?q?tension=20in=20annotation=20file=20differ=20by=20s=E2=80=A6=20(?= =?UTF-8?q?#55)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bug has been fixed: filename extensions in annotation file differ by source filename extension --- cvat/apps/engine/task.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cvat/apps/engine/task.py b/cvat/apps/engine/task.py index 5f768dac..f6d755be 100644 --- a/cvat/apps/engine/task.py +++ b/cvat/apps/engine/task.py @@ -362,7 +362,7 @@ def _parse_labels(labels): for token in shlex.split(labels): if token[0] != "~" and token[0] != "@": if token in parsed_labels: - raise ValueError("labels string is not corect. " + + raise ValueError("labels string is not corect. " + "`{}` label is specified at least twice.".format(token)) parsed_labels[token] = {} @@ -388,7 +388,7 @@ def _parse_labels(labels): "`{}` attribute has incorrect format.".format(attr['name'])) if attr['name'] in parsed_labels[last_label]: - raise ValueError("labels string is not corect. " + + raise ValueError("labels string is not corect. " + "`{}` attribute is specified at least twice.".format(attr['name'])) parsed_labels[last_label][attr['name']] = attr @@ -544,7 +544,6 @@ def _find_and_compress_images(upload_dir, output_dir, db_task, compress_quality, filenames.sort() if len(filenames): - compressed_names = [] for idx, name in enumerate(filenames): job.meta['status'] = 'Images are being compressed.. {}%'.format(idx * 100 // len(filenames)) job.save_meta() @@ -554,10 +553,12 @@ def _find_and_compress_images(upload_dir, output_dir, db_task, compress_quality, image = image.transpose(Image.ROTATE_180) image.save(compressed_name, quality=compress_quality, optimize=True) image.close() - compressed_names.append(compressed_name) if compressed_name != name: os.remove(name) - filenames = compressed_names + # PIL::save uses filename in order to define image extension. + # We need save it as jpeg for compression and after rename the file + # Else annotation file will contain invalid file names (with other extensions) + os.rename(compressed_name, name) for frame, image_orig_path in enumerate(filenames): image_dest_path = _get_frame_path(frame, output_dir) From 6e64bb31f22241be86b56d856674b35b084ddab9 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Wed, 12 Sep 2018 10:32:08 +0300 Subject: [PATCH 06/19] Data validation on client and server (#51) * Data validation on client and server * Consistent uploading methods for task and for job --- cvat/apps/engine/annotation.py | 44 +++++- .../static/engine/js/annotationParser.js | 6 +- .../engine/static/engine/js/shapeBuffer.js | 2 +- .../static/engine/js/shapeCollection.js | 2 +- cvat/apps/engine/static/engine/js/shapes.js | 127 +++++++++++++----- 5 files changed, 134 insertions(+), 47 deletions(-) diff --git a/cvat/apps/engine/annotation.py b/cvat/apps/engine/annotation.py index 234c2267..f6c28376 100644 --- a/cvat/apps/engine/annotation.py +++ b/cvat/apps/engine/annotation.py @@ -761,14 +761,29 @@ class _AnnotationForJob(_Annotation): label = _Label(self.db_labels[int(path['label_id'])]) boxes = [] frame = -1 + + has_boxes_on_prev_segm = False + last_box_on_prev_segm = None + has_box_on_start_frame = False + for box in path['shapes']: + if int(box['frame']) < self.start_frame: + has_boxes_on_prev_segm = True + if last_box_on_prev_segm is None or int(last_box_on_prev_segm["frame"]) < int(box["frame"]): + last_box_on_prev_segm = box + elif int(box['frame']) == self.start_frame: + has_box_on_start_frame = True + break + if has_boxes_on_prev_segm and not has_box_on_start_frame: + last_box_on_prev_segm["frame"] = self.start_frame + for box in path['shapes']: - if int(box['frame']) <= self.stop_frame: + if int(box['frame']) <= self.stop_frame and int(box['frame']) >= self.start_frame: frame_idx = int(box['frame']) if db_task.mode == 'annotation' else 0 xtl, ytl, xbr, ybr = self._clamp_box(float(box['xtl']), float(box['ytl']), float(box['xbr']), float(box['ybr']), image_meta['original_size'][frame_idx]) tracked_box = _TrackedBox(xtl, ytl, xbr, ybr, int(box['frame']), strtobool(str(box['occluded'])), int(box['z_order']), strtobool(str(box['outside']))) - assert tracked_box.frame > frame + assert tracked_box.frame > frame frame = tracked_box.frame for attr in box['attributes']: @@ -780,7 +795,7 @@ class _AnnotationForJob(_Annotation): boxes.append(tracked_box) else: self.logger.error("init_from_client: ignore frame #%d " + - "because stop_frame is %d", int(box['frame']), self.stop_frame) + "because it out of segment range [%d-%d]", int(box['frame']), self.start_frame, self.stop_frame) attributes = [] for attr in path['attributes']: @@ -790,7 +805,7 @@ class _AnnotationForJob(_Annotation): attributes.append(attr) assert frame <= self.stop_frame - box_path = _BoxPath(label, int(path['frame']), self.stop_frame, + box_path = _BoxPath(label, min(list(map(lambda box: box.frame, boxes))), self.stop_frame, int(path['group_id']), boxes, attributes) self.box_paths.append(box_path) @@ -799,8 +814,23 @@ class _AnnotationForJob(_Annotation): label = _Label(self.db_labels[int(path['label_id'])]) poly_shapes = [] frame = -1 + + has_shapes_on_prev_segm = False + last_shape_on_prev_segm = None + has_shape_on_start_frame = False + for poly_shape in path['shapes']: + if int(poly_shape['frame']) < self.start_frame: + has_shapes_on_prev_segm = True + if last_shape_on_prev_segm is None or int(last_shape_on_prev_segm["frame"]) < (poly_shape["frame"]): + last_shape_on_prev_segm = box + elif int(poly_shape['frame']) == self.start_frame: + has_shape_on_start_frame = True + break + if has_shapes_on_prev_segm and not has_shape_on_start_frame: + last_shape_on_prev_segm["frame"] = self.start_frame + for poly_shape in path['shapes']: - if int(poly_shape['frame']) <= self.stop_frame: + if int(poly_shape['frame']) <= self.stop_frame and int(poly_shape['frame']) >= self.start_frame: frame_idx = int(poly_shape['frame']) if db_task.mode == 'annotation' else 0 points = self._clamp_poly(poly_shape['points'], image_meta['original_size'][frame_idx]) tracked_poly_shape = _TrackedPolyShape(points, int(poly_shape['frame']), strtobool(str(poly_shape['occluded'])), @@ -817,7 +847,7 @@ class _AnnotationForJob(_Annotation): poly_shapes.append(tracked_poly_shape) else: self.logger.error("init_from_client: ignore frame #%d " + - "because stop_frame is %d", int(poly_shape['frame']), self.stop_frame) + "because it out of segment range [%d-%d]", int(poly_shape['frame']), self.start_frame, self.stop_frame) attributes = [] for attr in path['attributes']: @@ -826,7 +856,7 @@ class _AnnotationForJob(_Annotation): attr = _Attribute(spec, str(attr['value'])) attributes.append(attr) - poly_path = _PolyPath(label, int(path['frame']), self.stop_frame + 1, + poly_path = _PolyPath(label, min(list(map(lambda shape: shape.frame, poly_shapes))), self.stop_frame + 1, int(path['group_id']), poly_shapes, attributes) getattr(self, poly_path_type).append(poly_path) diff --git a/cvat/apps/engine/static/engine/js/annotationParser.js b/cvat/apps/engine/static/engine/js/annotationParser.js index 0f9ee9a7..92536516 100644 --- a/cvat/apps/engine/static/engine/js/annotationParser.js +++ b/cvat/apps/engine/static/engine/js/annotationParser.js @@ -322,8 +322,6 @@ class AnnotationParser { Ignore all frames more then stop. */ let significant = keyFrame || frame === this._startFrame; - significant = significant && frame >= this._startFrame; - significant = significant && frame <= this._stopFrame; if (significant) { let attributeList = this._getAttributeList(shape, labelId); @@ -348,7 +346,7 @@ class AnnotationParser { path.attributes = pathAttributes; if (type === 'boxes') { - let [xtl, ytl, xbr, ybr, occluded, z_order] = this._getBoxPosition(shape, frame); + let [xtl, ytl, xbr, ybr, occluded, z_order] = this._getBoxPosition(shape, Math.clamp(frame, this._startFrame, this._stopFrame)); path.shapes.push({ frame: frame, occluded: occluded, @@ -362,7 +360,7 @@ class AnnotationParser { }); } else { - let [points, occluded, z_order] = this._getPolyPosition(shape, frame); + let [points, occluded, z_order] = this._getPolyPosition(shape, Math.clamp(frame, this._startFrame, this._stopFrame)); path.shapes.push({ frame: frame, occluded: occluded, diff --git a/cvat/apps/engine/static/engine/js/shapeBuffer.js b/cvat/apps/engine/static/engine/js/shapeBuffer.js index 8c0efe4f..42ef6bf5 100644 --- a/cvat/apps/engine/static/engine/js/shapeBuffer.js +++ b/cvat/apps/engine/static/engine/js/shapeBuffer.js @@ -149,7 +149,7 @@ class ShapeBufferModel extends Listener { this._collection.add(object, `annotation_${this._shape.type}`); } - // Undo/redo code + // Undo/redo code let model = this._collection.shapes.slice(-1)[0]; window.cvat.addAction('Paste Object', () => { model.removed = true; diff --git a/cvat/apps/engine/static/engine/js/shapeCollection.js b/cvat/apps/engine/static/engine/js/shapeCollection.js index 121dd94c..bdb08126 100644 --- a/cvat/apps/engine/static/engine/js/shapeCollection.js +++ b/cvat/apps/engine/static/engine/js/shapeCollection.js @@ -1252,7 +1252,7 @@ class ShapeCollectionView { let parents = { uis: this._UIContent.parent(), shapes: this._frameContent.node.parentNode - } + }; this._frameContent.node.parent = null; this._UIContent.detach(); diff --git a/cvat/apps/engine/static/engine/js/shapes.js b/cvat/apps/engine/static/engine/js/shapes.js index 40371245..e58d52f1 100644 --- a/cvat/apps/engine/static/engine/js/shapes.js +++ b/cvat/apps/engine/static/engine/js/shapes.js @@ -22,7 +22,9 @@ class ShapeModel extends Listener { this._type = type; this._color = color; this._label = data.label_id; - this._frame = data.frame; + this._frame = type.split('_')[0] === 'annotation' ? data.frame : + positions.filter((pos) => pos.frame < window.cvat.player.frames.start).length ? + window.cvat.player.frames.start : Math.min(...positions.map((pos) => pos.frame)); this._removed = false; this._locked = false; this._merging = false; @@ -333,7 +335,17 @@ class ShapeModel extends Listener { let oldPos = Object.assign({}, this._positions[frame]); window.cvat.addAction('Change Outside', () => { if (!Object.keys(oldPos).length) { + // Frame hasn't been a keyframe, remove it from position and redestribute attributes delete this._positions[frame]; + this._frame = Math.min(...Object.keys(this._positions).map((el) => +el)); + if (frame < this._frame && frame in this._attributes.mutable) { + this._attributes.mutable[this._frame] = this._attributes.mutable[frame]; + } + + if (frame in this._attributes.mutable) { + delete this._attributes.mutable[frame]; + } + this._updateReason = 'outside'; this.notify(); } @@ -349,6 +361,15 @@ class ShapeModel extends Listener { position.outside = !position.outside; this.updatePosition(frame, position, true); + // Update the start frame if need and redestribute attributes + if (frame < this._frame) { + if (this._frame in this._attributes.mutable) { + this._attributes.mutable[frame] = this._attributes.mutable[this._frame]; + delete(this._attributes.mutable[this._frame]); + } + this._frame = frame; + } + this._updateReason = 'outside'; this.notify(); } @@ -360,38 +381,28 @@ class ShapeModel extends Listener { } // Undo/redo code - let oldPos = Object.assign({}, this._positions[frame]); window.cvat.addAction('Change Keyframe', () => { - if (!Object.keys(oldPos).length) { - delete this._positions[frame]; - this._updateReason = 'outside'; - this.notify(); - } - else { - this.updatePosition(frame, oldPos, true); - this._updateReason = 'keyframe'; - this.notify(); - } + this.switchKeyFrame(frame); }, () => { this.switchKeyFrame(frame); }, frame); // End of undo/redo code if (frame in this._positions && Object.keys(this._positions).length > 1) { - // If frame is first frame, need to redestribute attributes to new first frame + // If frame is first object frame, need redestribute attributes if (frame === this._frame) { - this._frame = +Object.keys(this._positions).sort((a,b) => +a - +b)[1]; + this._frame = Object.keys(this._positions).map((el) => +el).sort((a,b) => a - b)[1]; if (frame in this._attributes.mutable) { this._attributes.mutable[this._frame] = this._attributes.mutable[frame]; + delete(this._attributes.mutable[frame]); } } - delete(this._positions[frame]); - if (frame in this._attributes.mutable) { - delete(this._attributes.mutable[frame]); - } } else { + let position = this._interpolatePosition(frame); + this.updatePosition(frame, position, true); + if (frame < this._frame) { if (this._frame in this._attributes.mutable) { this._attributes.mutable[frame] = this._attributes.mutable[this._frame]; @@ -399,9 +410,6 @@ class ShapeModel extends Listener { } this._frame = frame; } - - let position = this._interpolatePosition(frame); - this.updatePosition(frame, position, true); } this._updateReason = 'keyframe'; this.notify(); @@ -803,17 +811,44 @@ class BoxModel extends ShapeModel { static importPositions(positions) { let imported = {}; if (this._type === 'interpolation_box') { + let last_key_in_prev_segm = null; + let segm_start = window.cvat.player.frames.start; + let segm_stop = window.cvat.player.frames.stop; + for (let pos of positions) { - imported[pos.frame] = { - xtl: pos.xtl, - ytl: pos.ytl, - xbr: pos.xbr, - ybr: pos.ybr, - occluded: pos.occluded, - outside: pos.outside, - z_order: pos.z_order, + let frame = pos.frame; + + if (frame >= segm_start && frame <= segm_stop) { + imported[frame] = { + xtl: pos.xtl, + ytl: pos.ytl, + xbr: pos.xbr, + ybr: pos.ybr, + occluded: pos.occluded, + outside: pos.outside, + z_order: pos.z_order, + }; + } + else { + console.log(`Frame ${frame} has been found in segment [${segm_start}-${segm_stop}]. It have been ignored.`); + if (!last_key_in_prev_segm || frame > last_key_in_prev_segm.frame) { + last_key_in_prev_segm = pos; + } + } + } + + if (last_key_in_prev_segm && !(segm_start in imported)) { + imported[segm_start] = { + xtl: last_key_in_prev_segm.xtl, + ytl: last_key_in_prev_segm.ytl, + xbr: last_key_in_prev_segm.xbr, + ybr: last_key_in_prev_segm.ybr, + occluded: last_key_in_prev_segm.occluded, + outside: last_key_in_prev_segm.outside, + z_order: last_key_in_prev_segm.z_order, }; } + return imported; } @@ -837,6 +872,7 @@ class PolyShapeModel extends ShapeModel { this._setupKeyFrames(); } + _interpolatePosition(frame) { if (frame in this._positions) { return Object.assign({}, this._positions[frame], { @@ -1036,14 +1072,37 @@ class PolyShapeModel extends ShapeModel { static importPositions(positions) { let imported = {}; if (this._type.startsWith('interpolation')) { + let last_key_in_prev_segm = null; + let segm_start = window.cvat.player.frames.start; + let segm_stop = window.cvat.player.frames.stop; + for (let pos of positions) { - imported[pos.frame] = { - points: pos.points, - occluded: pos.occluded, - outside: pos.outside, - z_order: pos.z_order, + let frame = pos.frame; + if (frame >= segm_start && frame <= segm_stop) { + imported[pos.frame] = { + points: pos.points, + occluded: pos.occluded, + outside: pos.outside, + z_order: pos.z_order, + }; + } + else { + console.log(`Frame ${frame} has been found in segment [${segm_start}-${segm_stop}]. It have been ignored.`); + if (!last_key_in_prev_segm || frame > last_key_in_prev_segm.frame) { + last_key_in_prev_segm = pos; + } + } + } + + if (last_key_in_prev_segm && !(segm_start in imported)) { + imported[segm_start] = { + points: last_key_in_prev_segm.points, + occluded: last_key_in_prev_segm.occluded, + outside: last_key_in_prev_segm.outside, + z_order: last_key_in_prev_segm.z_order, }; } + return imported; } From 7c3f20a44364ed570ac1b07c66febb0b55db2051 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Mon, 17 Sep 2018 16:24:41 +0300 Subject: [PATCH 07/19] Migration files have been added (#59) Fixed problems with "integer out of range" for trackedbox (int -> bigint) --- .../migrations/0008_auto_20180917_1424.py | 20 ++++++++ .../migrations/0009_auto_20180917_1424.py | 49 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 cvat/apps/engine/migrations/0008_auto_20180917_1424.py create mode 100644 cvat/apps/engine/migrations/0009_auto_20180917_1424.py diff --git a/cvat/apps/engine/migrations/0008_auto_20180917_1424.py b/cvat/apps/engine/migrations/0008_auto_20180917_1424.py new file mode 100644 index 00000000..cf6b4550 --- /dev/null +++ b/cvat/apps/engine/migrations/0008_auto_20180917_1424.py @@ -0,0 +1,20 @@ +# Generated by Django 2.0.3 on 2018-09-17 11:24 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('engine', '0007_task_flipped'), + ] + + operations = [ + migrations.AlterField( + model_name='task', + name='owner', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/cvat/apps/engine/migrations/0009_auto_20180917_1424.py b/cvat/apps/engine/migrations/0009_auto_20180917_1424.py new file mode 100644 index 00000000..675b0b04 --- /dev/null +++ b/cvat/apps/engine/migrations/0009_auto_20180917_1424.py @@ -0,0 +1,49 @@ +# Generated by Django 2.0.3 on 2018-09-17 11:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('engine', '0008_auto_20180917_1424'), + ] + + operations = [ + migrations.RunSQL('ALTER TABLE "engine_objectpath" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_objectpathattributeval" ALTER COLUMN "track_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedbox" ALTER COLUMN "track_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpoints" ALTER COLUMN "track_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpolygon" ALTER COLUMN "track_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpolyline" ALTER COLUMN "track_id" TYPE bigint;'), + + migrations.RunSQL('ALTER TABLE "engine_trackedbox" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpoints" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpolygon" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpolyline" ALTER COLUMN "id" TYPE bigint;'), + + migrations.RunSQL('ALTER TABLE "engine_trackedboxattributeval" ALTER COLUMN "box_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpointsattributeval" ALTER COLUMN "points_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpolygonattributeval" ALTER COLUMN "polygon_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpolylineattributeval" ALTER COLUMN "polyline_id" TYPE bigint;'), + + migrations.RunSQL('ALTER TABLE "engine_trackedboxattributeval" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpointsattributeval" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpolygonattributeval" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_trackedpolylineattributeval" ALTER COLUMN "id" TYPE bigint;'), + + migrations.RunSQL('ALTER TABLE "engine_labeledbox" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_labeledpoints" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_labeledpolygon" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_labeledpolyline" ALTER COLUMN "id" TYPE bigint;'), + + migrations.RunSQL('ALTER TABLE "engine_labeledboxattributeval" ALTER COLUMN "box_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_labeledpointsattributeval" ALTER COLUMN "points_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_labeledpolygonattributeval" ALTER COLUMN "polygon_id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_labeledpolylineattributeval" ALTER COLUMN "polyline_id" TYPE bigint;'), + + migrations.RunSQL('ALTER TABLE "engine_labeledboxattributeval" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_labeledpointsattributeval" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_labeledpolygonattributeval" ALTER COLUMN "id" TYPE bigint;'), + migrations.RunSQL('ALTER TABLE "engine_labeledpolylineattributeval" ALTER COLUMN "id" TYPE bigint;'), + ] From d1b20d6dcfb835020bd7dc61da227f93ca2f9256 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Tue, 18 Sep 2018 10:10:31 +0300 Subject: [PATCH 08/19] Polygon edit method (#57) * Editor for polylines * Polyshape editing for points * Ability to exit from edit mode by right click (if no points) * Slice approach have been added for polyshape creating --- .../engine/static/engine/js/annotationUI.js | 24 +- .../static/engine/js/polyshapeEditor.js | 395 ++++++++++++++++++ .../static/engine/js/shapeCollection.js | 49 --- .../engine/static/engine/js/shapeCreator.js | 40 ++ cvat/apps/engine/static/engine/js/shapes.js | 73 ++-- .../engine/templates/engine/annotation.html | 3 +- tests/eslintrc.conf.js | 5 + 7 files changed, 493 insertions(+), 96 deletions(-) create mode 100644 cvat/apps/engine/static/engine/js/polyshapeEditor.js diff --git a/cvat/apps/engine/static/engine/js/annotationUI.js b/cvat/apps/engine/static/engine/js/annotationUI.js index 3bd09d35..f0c5fab4 100644 --- a/cvat/apps/engine/static/engine/js/annotationUI.js +++ b/cvat/apps/engine/static/engine/js/annotationUI.js @@ -85,6 +85,13 @@ function buildAnnotationUI(job, shapeData, loadJobEvent) { let shapeCreatorController = new ShapeCreatorController(shapeCreatorModel); let shapeCreatorView = new ShapeCreatorView(shapeCreatorModel, shapeCreatorController); + let polyshapeEditorModel = new PolyshapeEditorModel(); + let polyshapeEditorController = new PolyshapeEditorController(polyshapeEditorModel); + let polyshapeEditorView = new PolyshapeEditorView(polyshapeEditorModel, polyshapeEditorController); + + // Add static member for class. It will be used by all polyshapes. + PolyShapeView.editor = polyshapeEditorModel; + let shapeMergerModel = new ShapeMergerModel(shapeCollectionModel); let shapeMergerController = new ShapeMergerController(shapeMergerModel); new ShapeMergerView(shapeMergerModel, shapeMergerController); @@ -129,6 +136,7 @@ function buildAnnotationUI(job, shapeData, loadJobEvent) { playerModel.subscribe(shapeCreatorView); playerModel.subscribe(shapeBufferView); playerModel.subscribe(shapeGrouperView); + playerModel.subscribe(polyshapeEditorView); playerModel.shift(0); let shortkeys = window.cvat.config.shortkeys; @@ -459,13 +467,15 @@ function setupMenu(job, shapeCollectionModel, annotationParser, aamModel, player }); $('#removeAnnotationButton').on('click', () => { - hide(); - confirm('Do you want to remove all annotations? The action cannot be undone!', - () => { - historyModel.empty(); - shapeCollectionModel.empty(); - } - ); + if (!window.cvat.mode) { + hide(); + confirm('Do you want to remove all annotations? The action cannot be undone!', + () => { + historyModel.empty(); + shapeCollectionModel.empty(); + } + ); + } }); $('#saveButton').on('click', () => { diff --git a/cvat/apps/engine/static/engine/js/polyshapeEditor.js b/cvat/apps/engine/static/engine/js/polyshapeEditor.js new file mode 100644 index 00000000..2f5c61fb --- /dev/null +++ b/cvat/apps/engine/static/engine/js/polyshapeEditor.js @@ -0,0 +1,395 @@ +/* + * Copyright (C) 2018 Intel Corporation + * + * SPDX-License-Identifier: MIT + */ + +/* exported PolyshapeEditorModel PolyshapeEditorController PolyshapeEditorView */ + +"use strict"; + +class PolyshapeEditorModel extends Listener { + constructor() { + super("onPolyshapeEditorUpdate", () => this); + + this._modeName = 'poly_editing'; + this._active = false; + this._data = { + points: null, + color: null, + start: null, + oncomplete: null, + type: null, + event: null, + }; + } + + edit(type, points, color, start, event, oncomplete) { + if (!this._active && !window.cvat.mode) { + window.cvat.mode = this._modeName; + this._active = true; + this._data.points = points; + this._data.color = color; + this._data.start = start; + this._data.oncomplete = oncomplete; + this._data.type = type; + this._data.event = event; + this.notify(); + } + else if (this._active) { + throw Error('Polyshape has been being edited already'); + } + } + + finish(points) { + if (this._active && this._data.oncomplete) { + this._data.oncomplete(points); + } + + this.cancel(); + } + + cancel() { + if (this._active) { + this._active = false; + if (window.cvat.mode === this._modeName) { + window.cvat.mode = null; + } + + this._data.points = null; + this._data.color = null; + this._data.start = null; + this._data.oncomplete = null; + this._data.type = null; + this._data.event = null; + this.notify(); + } + } + + get active() { + return this._active; + } + + get data() { + return this._data; + } +} + + +class PolyshapeEditorController { + constructor(model) { + this._model = model; + } + + finish(points) { + this._model.finish(points); + } + + cancel() { + this._model.cancel(); + } +} + + +class PolyshapeEditorView { + constructor(model, controller) { + this._controller = controller; + this._data = null; + + this._frameContent = SVG.adopt($('#frameContent')[0]); + this._originalShapePointsGroup = null; + this._originalShapePoints = []; + this._originalShape = null; + this._correctLine = null; + + this._scale = window.cvat.player.geometry.scale; + this._frame = window.cvat.player.frames.current; + + model.subscribe(this); + } + + _rescaleDrawPoints() { + let scale = this._scale; + $('.svg_draw_point').each(function() { + this.instance.radius(POINT_RADIUS / (2 * scale)).attr('stroke-width', STROKE_WIDTH / (2 * scale)); + }); + } + + // After this method start element will be in begin of the array. + // Array will consist only range elements from start to stop + _resortPoints(points, start, stop) { + let sorted = []; + + if (points.indexOf(start) === -1 || points.indexOf(stop) === -1) { + throw Error('Point array must consist both start and stop elements'); + } + + let idx = points.indexOf(start) + 1; + let condition = true; // constant condition is eslint error + while (condition) { + if (idx >= points.length) idx = 0; + if (points[idx] === stop) condition = false; + else sorted.push(points[idx++]); + } + + return sorted; + } + + // Method represents array like circle list and find shortest way from source to target + // It returns integer number - distance from source to target. + // It can be negative if shortest way is anti clockwise + _findMinCircleDistance(array, source, target) { + let clockwise_distance = 0; + let anti_clockwise_distance = 0; + + let source_idx = array.indexOf(source); + let target_idx = array.indexOf(target); + + if (source_idx === -1 || target_idx == -1) { + throw Error('Array should consist both elements'); + } + + let idx = source_idx; + while (array[idx++] != target) { + clockwise_distance ++; + if (idx >= array.length) idx = 0; + } + + idx = source_idx; + while (array[idx--] != target) { + anti_clockwise_distance ++; + if (idx < 0) idx = array.length - 1; + } + + let offset = Math.min(clockwise_distance, anti_clockwise_distance); + if (anti_clockwise_distance < clockwise_distance) { + offset = -offset; + } + + return offset; + } + + _startEdit() { + this._frame = window.cvat.player.frames.current; + let strokeWidth = this._data.type === 'points' ? 0 : STROKE_WIDTH / this._scale; + + // Draw copy of original shape + if (this._data.type === 'polygon') { + this._originalShape = this._frameContent.polygon(this._data.points); + } + else { + this._originalShape = this._frameContent.polyline(this._data.points); + } + + this._originalShape.attr({ + 'stroke-width': strokeWidth, + 'stroke': 'white', + 'fill': 'none', + }); + + // Create the correct line + this._correctLine = this._frameContent.polyline().draw({snapToGrid: 0.1}).attr({ + 'stroke-width': strokeWidth / 2, + 'fill': 'none', + 'stroke': 'red', + }).on('mouseover', () => false); + + + // Add points to original shape + let pointRadius = POINT_RADIUS / this._scale; + this._originalShapePointsGroup = this._frameContent.group(); + for (let point of PolyShapeModel.convertStringToNumberArray(this._data.points)) { + let uiPoint = this._originalShapePointsGroup.circle(pointRadius * 2) + .move(point.x - pointRadius, point.y - pointRadius) + .attr({ + 'stroke-width': strokeWidth, + 'stroke': 'black', + 'fill': 'white', + 'z_order': Number.MAX_SAFE_INTEGER, + }); + this._originalShapePoints.push(uiPoint); + } + + + let prevPoint = { + x: this._data.event.clientX, + y: this._data.event.clientY + }; + + this._correctLine.draw('point', this._data.event); + this._rescaleDrawPoints(); + this._frameContent.on('mousemove.polyshapeEditor', (e) => { + if (e.shiftKey && this._data.type != 'points') { + let delta = Math.sqrt(Math.pow(e.clientX - prevPoint.x, 2) + Math.pow(e.clientY - prevPoint.y, 2)); + let deltaTreshold = 15; + if (delta > deltaTreshold) { + this._correctLine.draw('point', e); + prevPoint = { + x: e.clientX, + y: e.clientY + }; + } + } + }); + + this._frameContent.on('contextmenu.polyshapeEditor', (e) => { + if (PolyShapeModel.convertStringToNumberArray(this._correctLine.attr('points')).length > 2) { + this._correctLine.draw('undo'); + } + else { + // Finish without points argument is just cancel + this._controller.finish(); + } + e.preventDefault(); + e.stopPropagation(); + }); + + this._correctLine.on('drawpoint', (e) => { + prevPoint = { + x: e.detail.event.clientX, + y: e.detail.event.clientY + }; + this._rescaleDrawPoints(); + }); + + this._correctLine.on('drawstart', () => this._rescaleDrawPoints()); + + + for (let instance of this._originalShapePoints) { + instance.on('mouseover', () => { + instance.attr('stroke-width', STROKE_WIDTH * 2 / this._scale); + }).on('mouseout', () => { + instance.attr('stroke-width', STROKE_WIDTH / this._scale); + }).on('mousedown', (e) => { + if (e.which != 1) return; + let currentPoints = PolyShapeModel.convertStringToNumberArray(this._data.points); + let correctPoints = PolyShapeModel.convertStringToNumberArray(this._correctLine.attr('points')); + let resultPoints = []; + + if (this._data.type === 'polygon') { + let startPtIdx = this._data.start; + let stopPtIdx = $(instance.node).index(); + let offset = this._findMinCircleDistance(currentPoints, currentPoints[startPtIdx], currentPoints[stopPtIdx]); + + if (!offset) { + currentPoints = this._resortPoints(currentPoints, currentPoints[startPtIdx], currentPoints[stopPtIdx]); + resultPoints.push(...correctPoints.slice(0, -2)); + resultPoints.push(...currentPoints); + } + else { + resultPoints.push(...correctPoints); + if (offset < 0) { + resultPoints = resultPoints.reverse(); + currentPoints = this._resortPoints(currentPoints, currentPoints[startPtIdx], currentPoints[stopPtIdx]); + } + else { + currentPoints = this._resortPoints(currentPoints, currentPoints[stopPtIdx], currentPoints[startPtIdx]); + } + + resultPoints.push(...currentPoints); + } + } + else if (this._data.type === 'polyline') { + let startPtIdx = this._data.start; + let stopPtIdx = $(instance.node).index(); + + if (startPtIdx === stopPtIdx) { + resultPoints.push(...correctPoints.slice(1, -1).reverse()); + resultPoints.push(...currentPoints); + } + else { + if (startPtIdx > stopPtIdx) { + if (startPtIdx < currentPoints.length - 1) { + resultPoints.push(...currentPoints.slice(startPtIdx + 1).reverse()); + } + resultPoints.push(...correctPoints.slice(0, -1)); + if (stopPtIdx > 0) { + resultPoints.push(...currentPoints.slice(0, stopPtIdx).reverse()); + } + } + else { + if (startPtIdx > 0) { + resultPoints.push(...currentPoints.slice(0, startPtIdx)); + } + resultPoints.push(...correctPoints.slice(0, -1)); + if (stopPtIdx < currentPoints.length) { + resultPoints.push(...currentPoints.slice(stopPtIdx + 1)); + } + } + } + } + else { + resultPoints.push(...currentPoints); + resultPoints.push(...correctPoints.slice(1, -1).reverse()); + } + + this._correctLine.draw('cancel'); + this._controller.finish(PolyShapeModel.convertNumberArrayToString(resultPoints)); + }); + } + } + + _endEdit() { + for (let uiPoint of this._originalShapePoints) { + uiPoint.off(); + uiPoint.remove(); + } + + this._originalShapePoints = []; + this._originalShapePointsGroup.remove(); + this._originalShapePointsGroup = null; + this._originalShape.remove(); + this._originalShape = null; + this._correctLine.off('drawstart'); + this._correctLine.off('drawpoint'); + this._correctLine.draw('cancel'); + this._correctLine.remove(); + this._correctLine = null; + this._data = null; + + this._frameContent.off('mousemove.polyshapeEditor'); + this._frameContent.off('mousedown.polyshapeEditor'); + this._frameContent.off('contextmenu.polyshapeEditor'); + } + + + onPolyshapeEditorUpdate(model) { + if (model.active && !this._data) { + this._data = model.data; + this._startEdit(); + } + else if (!model.active) { + this._endEdit(); + } + } + + onPlayerUpdate(player) { + let scale = player.geometry.scale; + if (this._scale != scale) { + this._scale = scale; + + let strokeWidth = this._data && this._data.type === 'points' ? 0 : STROKE_WIDTH / this._scale; + let pointRadius = POINT_RADIUS / this._scale; + + if (this._originalShape) { + this._originalShape.attr('stroke-width', strokeWidth); + } + + if (this._correctLine) { + this._correctLine.attr('stroke-width', strokeWidth / 2); + } + + for (let uiPoint of this._originalShapePoints) { + uiPoint.attr('stroke-width', strokeWidth); + uiPoint.radius(pointRadius); + } + + this._rescaleDrawPoints(); + } + + // Abort if frame have been changed + if (player.frames.current != this._frame && this._data) { + this._controller.cancel(); + } + } +} diff --git a/cvat/apps/engine/static/engine/js/shapeCollection.js b/cvat/apps/engine/static/engine/js/shapeCollection.js index bdb08126..67cbc9ee 100644 --- a/cvat/apps/engine/static/engine/js/shapeCollection.js +++ b/cvat/apps/engine/static/engine/js/shapeCollection.js @@ -725,13 +725,6 @@ class ShapeCollectionModel extends Listener { } } - clonePointForActiveShape(idx, direction, insertPoint) { - if (this._activeShape && !this._activeShape.lock) { - return this._activeShape.clonePoint(idx, direction, insertPoint); - } - else return null; - } - split() { if (this._activeShape) { if (!this._activeShape.lock && this._activeShape.type.split('_')[0] === 'interpolation') { @@ -968,10 +961,6 @@ class ShapeCollectionController { this._model.removePointFromActiveShape(idx); } - clonePointForActiveShape(idx, direction, insertPoint) { - return this._model.clonePointForActiveShape(idx, direction, insertPoint); - } - splitForActive() { this._model.split(); } @@ -1164,44 +1153,6 @@ class ShapeCollectionView { case "remove_point": this._controller.removePointFromActiveShape(idx); break; - case "clone_point_before": - this._controller.clonePointForActiveShape(idx, 'before', true); - break; - case "clone_point_after": - this._controller.clonePointForActiveShape(idx, 'after', true); - break; - } - }); - - $('#pointContextMenu').mouseout(() => { - $(this._frameContent.node).find('.tmp_inserted_point').remove(); - }); - - $('#pointContextMenu li').mouseover((e) => { - $(this._frameContent.node).find('.tmp_inserted_point').remove(); - let menu = $('#pointContextMenu'); - let idx = +menu.attr('point_idx'); - let point = null; - - switch($(e.target).attr("action")) { - case "clone_point_before": - point = this._controller.clonePointForActiveShape(idx, 'before', false); - if (point) { - this._frameContent.circle(POINT_RADIUS * 2 / this._scale).center(point.x, point.y) - .addClass('tmp_inserted_point tempMarker').fill('white').stroke('black').attr({ - 'stroke-width': STROKE_WIDTH / this._scale - }); - } - break; - case "clone_point_after": - point = this._controller.clonePointForActiveShape(idx, 'after', false); - if (point) { - this._frameContent.circle(POINT_RADIUS * 2 / this._scale).center(point.x, point.y) - .addClass('tmp_inserted_point tempMarker').fill('white').stroke('black').attr({ - 'stroke-width': STROKE_WIDTH / this._scale - }); - } - break; } }); diff --git a/cvat/apps/engine/static/engine/js/shapeCreator.js b/cvat/apps/engine/static/engine/js/shapeCreator.js index dc797fc2..eebcb878 100644 --- a/cvat/apps/engine/static/engine/js/shapeCreator.js +++ b/cvat/apps/engine/static/engine/js/shapeCreator.js @@ -265,6 +265,10 @@ class ShapeCreatorView { _createPolyEvents() { // If number of points for poly shape specified, use it. // Dicrement number on draw new point events. Drawstart trigger when create first point + let lastPoint = { + x: null, + y: null, + } if (this._polyShapeSize) { let size = this._polyShapeSize; @@ -287,14 +291,50 @@ class ShapeCreatorView { // Callbacks for point scale this._drawInstance.on('drawstart', this._rescaleDrawPoints.bind(this)); this._drawInstance.on('drawpoint', this._rescaleDrawPoints.bind(this)); + + this._drawInstance.on('drawstart', (e) => { + lastPoint = { + x: e.detail.event.clientX, + y: e.detail.event.clientY, + } + }); + + this._drawInstance.on('drawpoint', (e) => { + lastPoint = { + x: e.detail.event.clientX, + y: e.detail.event.clientY, + } + }); + this._frameContent.on('mousedown.shapeCreator', (e) => { if (e.which === 3) { this._drawInstance.draw('undo'); } }); + + this._frameContent.on('mousemove.shapeCreator', (e) => { + if (e.shiftKey && this._type != 'points') { + if (lastPoint.x === null || lastPoint.y === null) { + this._drawInstance.draw('point', e); + } + else { + let delta = Math.sqrt(Math.pow(e.clientX - lastPoint.x, 2) + Math.pow(e.clientY - lastPoint.y, 2)); + let deltaTreshold = 15; + if (delta > deltaTreshold) { + this._drawInstance.draw('point', e); + lastPoint = { + x: e.clientX, + y: e.clientY + }; + } + } + } + }); + this._drawInstance.on('drawstop', () => { this._frameContent.off('mousedown.shapeCreator'); + this._frameContent.off('mousemove.shapeCreator'); }); // Also we need callback on drawdone event for get points this._drawInstance.on('drawdone', function(e) { diff --git a/cvat/apps/engine/static/engine/js/shapes.js b/cvat/apps/engine/static/engine/js/shapes.js index e58d52f1..20392394 100644 --- a/cvat/apps/engine/static/engine/js/shapes.js +++ b/cvat/apps/engine/static/engine/js/shapes.js @@ -804,10 +804,6 @@ class BoxModel extends ShapeModel { // nothing do } - clonePoint() { - // nothing do - } - static importPositions(positions) { let imported = {}; if (this._type === 'interpolation_box') { @@ -1011,40 +1007,6 @@ class PolyShapeModel extends ShapeModel { } } - clonePoint(idx, direction, inserPoint) { - let frame = window.cvat.player.frames.current; - let position = this._interpolatePosition(frame); - let points = PolyShapeModel.convertStringToNumberArray(position.points); - - let otherIdx = null; - if (direction === 'before') { - otherIdx = idx - 1 >= 0 ? idx - 1: points.length - 1; - } - else { - otherIdx = idx + 1 in points ? idx + 1: 0; - } - let curP = points[idx]; - let otherP = points[otherIdx]; - let newP = { - x: curP.x + (otherP.x - curP.x) / 2, - y: curP.y + (otherP.y - curP.y) / 2, - }; - - if (direction === 'before') { - points.splice(idx, 0, newP); - } - else { - points.splice(idx + 1, 0, newP); - } - - if (inserPoint) { - position.points = PolyShapeModel.convertNumberArrayToString(points); - this.updatePosition(frame, position); - } - - return newP; - } - static convertStringToNumberArray(serializedPoints) { let pointArray = []; for (let pair of serializedPoints.split(' ')) { @@ -2868,9 +2830,11 @@ class PolyShapeView extends ShapeView { if (this._flags.editable) { for (let point of $('.svg_select_points')) { point = $(point); + point.on('contextmenu.contextMenu', (e) => { this._shapeContextMenu.hide(100); this._pointContextMenu.attr('point_idx', point.index()); + this._pointContextMenu.attr('dom_point_id', point.attr('id')); this._pointContextMenu.finish().show(100).offset({ top: e.pageY - 20, @@ -2878,6 +2842,38 @@ class PolyShapeView extends ShapeView { }); e.preventDefault(); + }); + + point.on('dblclick.polyshapeEditor', (e) => { + if (e.shiftKey) { + if (!window.cvat.mode) { + // Get index before detach shape from DOM + let index = point.index(); + + // Make non active view and detach shape from DOM + this._makeNotEditable(); + this._deselect(); + if (this._controller.hiddenText) { + this._hideShapeText(); + } + this._uis.shape.addClass('hidden'); + + // Run edit mode + PolyShapeView.editor.edit(this._controller.type.split('_')[1], + this._uis.shape.attr('points'), this._color, index, e, + (points) => { + this._uis.shape.removeClass('hidden'); + if (points) { + this._uis.shape.attr('points', points); + this._controller.updatePosition(window.cvat.player.frames.current, this._buildPosition()); + } + } + ); + } + } + else { + this._controller.model().removePoint(point.index()); + } e.stopPropagation(); }); } @@ -2888,6 +2884,7 @@ class PolyShapeView extends ShapeView { _makeNotEditable() { for (let point of $('.svg_select_points')) { $(point).off('contextmenu.contextMenu'); + $(point).off('dblclick.polyshapeEditor'); } ShapeView.prototype._makeNotEditable.call(this); } diff --git a/cvat/apps/engine/templates/engine/annotation.html b/cvat/apps/engine/templates/engine/annotation.html index 2b12d634..33dea2ad 100644 --- a/cvat/apps/engine/templates/engine/annotation.html +++ b/cvat/apps/engine/templates/engine/annotation.html @@ -41,6 +41,7 @@ + @@ -87,8 +88,6 @@
  • Remove
  • -
  • Clone Before
  • -
  • Clone After
diff --git a/tests/eslintrc.conf.js b/tests/eslintrc.conf.js index e54e0548..7771a024 100644 --- a/tests/eslintrc.conf.js +++ b/tests/eslintrc.conf.js @@ -73,6 +73,7 @@ module.exports = { 'ShapeMergerView': true, // from shapes.js 'PolyShapeModel': true, + 'PolyShapeView': true, 'buildShapeModel': true, 'buildShapeController': true, 'buildShapeView': true, @@ -116,5 +117,9 @@ module.exports = { 'HistoryModel': true, 'HistoryController': true, 'HistoryView': true, + // from polyshapeEditor.js + 'PolyshapeEditorModel': true, + 'PolyshapeEditorController': true, + 'PolyshapeEditorView': true, }, }; From 05e6e331d2011c2e9e4e0e3caa79ac5c8c7c4314 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Tue, 18 Sep 2018 17:14:15 +0300 Subject: [PATCH 09/19] Big int migration file has been rewritten with Django syntax (#60) --- .../migrations/0009_auto_20180917_1424.py | 191 ++++++++++++++---- cvat/apps/engine/models.py | 4 + 2 files changed, 160 insertions(+), 35 deletions(-) diff --git a/cvat/apps/engine/migrations/0009_auto_20180917_1424.py b/cvat/apps/engine/migrations/0009_auto_20180917_1424.py index 675b0b04..a20ec2cf 100644 --- a/cvat/apps/engine/migrations/0009_auto_20180917_1424.py +++ b/cvat/apps/engine/migrations/0009_auto_20180917_1424.py @@ -9,41 +9,162 @@ class Migration(migrations.Migration): ('engine', '0008_auto_20180917_1424'), ] - operations = [ - migrations.RunSQL('ALTER TABLE "engine_objectpath" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_objectpathattributeval" ALTER COLUMN "track_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedbox" ALTER COLUMN "track_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpoints" ALTER COLUMN "track_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpolygon" ALTER COLUMN "track_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpolyline" ALTER COLUMN "track_id" TYPE bigint;'), - - migrations.RunSQL('ALTER TABLE "engine_trackedbox" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpoints" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpolygon" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpolyline" ALTER COLUMN "id" TYPE bigint;'), - - migrations.RunSQL('ALTER TABLE "engine_trackedboxattributeval" ALTER COLUMN "box_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpointsattributeval" ALTER COLUMN "points_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpolygonattributeval" ALTER COLUMN "polygon_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpolylineattributeval" ALTER COLUMN "polyline_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedboxattributeval" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpointsattributeval" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpolygonattributeval" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_trackedpolylineattributeval" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledbox" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledpoints" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledpolygon" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledpolyline" ALTER COLUMN "id" TYPE bigint;'), - - migrations.RunSQL('ALTER TABLE "engine_labeledboxattributeval" ALTER COLUMN "box_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledpointsattributeval" ALTER COLUMN "points_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledpolygonattributeval" ALTER COLUMN "polygon_id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledpolylineattributeval" ALTER COLUMN "polyline_id" TYPE bigint;'), - - migrations.RunSQL('ALTER TABLE "engine_labeledboxattributeval" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledpointsattributeval" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledpolygonattributeval" ALTER COLUMN "id" TYPE bigint;'), - migrations.RunSQL('ALTER TABLE "engine_labeledpolylineattributeval" ALTER COLUMN "id" TYPE bigint;'), + operations = [ + migrations.AlterField( + model_name='labeledbox', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='labeledboxattributeval', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='labeledpoints', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='labeledpointsattributeval', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='labeledpolygon', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='labeledpolygonattributeval', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='labeledpolyline', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='labeledpolylineattributeval', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='objectpath', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='objectpathattributeval', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trackedbox', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trackedboxattributeval', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trackedpoints', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trackedpointsattributeval', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trackedpolygon', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trackedpolygonattributeval', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trackedpolyline', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='trackedpolylineattributeval', + name='id', + field=models.BigAutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='objectpathattributeval', + name='track_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='objectpathattributeval', + name='track_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='trackedpoints', + name='track_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='trackedpolygon', + name='track_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='trackedpolyline', + name='track_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='trackedboxattributeval', + name='box_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='trackedpointsattributeval', + name='points_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='trackedpolygonattributeval', + name='polygon_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='trackedpolylineattributeval', + name='polyline_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='labeledboxattributeval', + name='box_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='labeledpointsattributeval', + name='points_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='labeledpolygonattributeval', + name='polygon_id', + field=models.BigIntegerField(), + ), + migrations.AlterField( + model_name='labeledpolylineattributeval', + name='polyline_id', + field=models.BigIntegerField(), + ), ] diff --git a/cvat/apps/engine/models.py b/cvat/apps/engine/models.py index a77efd3e..6883018b 100644 --- a/cvat/apps/engine/models.py +++ b/cvat/apps/engine/models.py @@ -128,6 +128,7 @@ class AttributeSpec(models.Model): class AttributeVal(models.Model): # TODO: add a validator here to be sure that it corresponds to self.label + id = models.BigAutoField(primary_key=True) spec = models.ForeignKey(AttributeSpec, on_delete=models.CASCADE) value = models.CharField(max_length=64) class Meta: @@ -148,6 +149,7 @@ class Shape(models.Model): abstract = True class BoundingBox(Shape): + id = models.BigAutoField(primary_key=True) xtl = models.FloatField() ytl = models.FloatField() xbr = models.FloatField() @@ -156,6 +158,7 @@ class BoundingBox(Shape): abstract = True class PolyShape(Shape): + id = models.BigAutoField(primary_key=True) points = models.TextField() class Meta: abstract = True @@ -185,6 +188,7 @@ class LabeledPointsAttributeVal(AttributeVal): points = models.ForeignKey(LabeledPoints, on_delete=models.CASCADE) class ObjectPath(Annotation): + id = models.BigAutoField(primary_key=True) shapes = models.CharField(max_length=10, default='boxes') class ObjectPathAttributeVal(AttributeVal): From badddeb07f04011d2d2abc54b443ca9197903186 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Wed, 19 Sep 2018 11:19:37 +0300 Subject: [PATCH 10/19] Some memory leaks have been fixed (#61) * svg.selectize.js memory leaks have been fixed --- .../engine/static/engine/js/3rdparty.patch | 72 +++++++++++++------ cvat/apps/engine/static/engine/js/player.js | 4 ++ cvat/apps/engine/static/engine/js/shapes.js | 3 +- 3 files changed, 55 insertions(+), 24 deletions(-) diff --git a/cvat/apps/engine/static/engine/js/3rdparty.patch b/cvat/apps/engine/static/engine/js/3rdparty.patch index f3a21636..38f26000 100644 --- a/cvat/apps/engine/static/engine/js/3rdparty.patch +++ b/cvat/apps/engine/static/engine/js/3rdparty.patch @@ -1,29 +1,29 @@ -From b89380c65ea8bc9231cc98a6ae0e812227c85b3d Mon Sep 17 00:00:00 2001 +From 5eeb1092c64865c555671ed585da18f974c9c10c Mon Sep 17 00:00:00 2001 From: Boris Sekachev -Date: Tue, 10 Jul 2018 14:31:13 +0300 +Date: Tue, 18 Sep 2018 15:58:20 +0300 Subject: [PATCH] tmp --- .../engine/static/engine/js/3rdparty/svg.draggable.js | 1 + cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js | 17 +++++++++++++++-- .../apps/engine/static/engine/js/3rdparty/svg.resize.js | 5 +++-- - .../apps/engine/static/engine/js/3rdparty/svg.select.js | 1 + - 4 files changed, 20 insertions(+), 4 deletions(-) + .../apps/engine/static/engine/js/3rdparty/svg.select.js | 5 ++++- + 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/cvat/apps/engine/static/engine/js/3rdparty/svg.draggable.js b/cvat/apps/engine/static/engine/js/3rdparty/svg.draggable.js -index d88abf5..06158f1 100644 +index d88abf5..aba474c 100644 --- a/cvat/apps/engine/static/engine/js/3rdparty/svg.draggable.js +++ b/cvat/apps/engine/static/engine/js/3rdparty/svg.draggable.js @@ -109,6 +109,7 @@ - + // while dragging DragHandler.prototype.drag = function(e){ + this.m = this.el.node.getScreenCTM().inverse(); - + var box = this.getBBox() , p = this.transformPoint(e) diff --git a/cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js b/cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js -index 68dbf2a..9884b75 100644 +index 68dbf2a..20a6917 100644 --- a/cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js +++ b/cvat/apps/engine/static/engine/js/3rdparty/svg.draw.js @@ -18,6 +18,7 @@ @@ -31,13 +31,13 @@ index 68dbf2a..9884b75 100644 this.lastUpdateCall = null; this.options = {}; + this.set = new SVG.Set(); - + // Merge options and defaults for (var i in this.el.draw.defaults) { @@ -139,6 +140,8 @@ // Call the calc-function which calculates the new position and size this.calc(event); - + + this.m = this.el.node.getScreenCTM().inverse(); + this.offset = { x: window.pageXOffset, y: window.pageYOffset }; // Fire the `drawupdate`-event @@ -46,7 +46,7 @@ index 68dbf2a..9884b75 100644 @@ -160,6 +163,16 @@ this.el.fire('drawcancel'); }; - + + // Undo last drawed point + PaintHandler.prototype.undo = function () { + if (this.set.length()) { @@ -59,24 +59,24 @@ index 68dbf2a..9884b75 100644 + // Calculate the corrected position when using `snapToGrid` PaintHandler.prototype.snapToGrid = function (draw) { - + @@ -371,14 +384,14 @@ - + this.set.clear(); - + - for (var i = 0; i < array.length; ++i) { + for (var i = 0; i < array.length - 1; ++i) { - + this.p.x = array[i][0] this.p.y = array[i][1] - + var p = this.p.matrixTransform(this.parent.node.getScreenCTM().inverse().multiply(this.el.node.getScreenCTM())); - + - this.set.add(this.parent.circle(5).stroke({width: 1}).fill('#ccc').center(p.x, p.y)); + this.set.add(this.parent.circle(5).stroke({width: 1}).fill('#ccc').center(p.x, p.y)).addClass("svg_draw_point"); } } - + diff --git a/cvat/apps/engine/static/engine/js/3rdparty/svg.resize.js b/cvat/apps/engine/static/engine/js/3rdparty/svg.resize.js index 0c3b63d..fb5dc26 100644 --- a/cvat/apps/engine/static/engine/js/3rdparty/svg.resize.js @@ -91,27 +91,53 @@ index 0c3b63d..fb5dc26 100644 + y: event.clientY != null ? event.clientY : event.touches[0].clientY }; }; - + @@ -343,6 +343,7 @@ } return; } + this.m = this.el.node.getScreenCTM().inverse(); - + // Calculate the difference between the mouseposition at start and now var txPt = this._extractPosition(event); diff --git a/cvat/apps/engine/static/engine/js/3rdparty/svg.select.js b/cvat/apps/engine/static/engine/js/3rdparty/svg.select.js -index 47e07bd..f1d0c02 100644 +index 47e07bd..cee6d34 100644 --- a/cvat/apps/engine/static/engine/js/3rdparty/svg.select.js +++ b/cvat/apps/engine/static/engine/js/3rdparty/svg.select.js @@ -160,6 +160,7 @@ SelectHandler.prototype.drawPoints = function () { ev.preventDefault ? ev.preventDefault() : ev.returnValue = false; ev.stopPropagation(); - + + if (ev.which != 1) return false; var x = ev.pageX || ev.touches[0].pageX; var y = ev.pageY || ev.touches[0].pageY; _this.el.fire('point', {x: x, y: y, i: k, event: ev}); --- +@@ -361,6 +362,7 @@ SelectHandler.prototype.cleanup = function () { + // stop watching the element, remove the selection + this.rectSelection.set.each(function () { + this.remove(); ++ SVG.off(this.node); + }); + + this.rectSelection.set.clear(); +@@ -371,6 +373,7 @@ SelectHandler.prototype.cleanup = function () { + // Remove all points, clear the set, stop watching the element + this.pointSelection.set.each(function () { + this.remove(); ++ SVG.off(this.node); + }); + + this.pointSelection.set.clear(); +@@ -379,8 +382,8 @@ SelectHandler.prototype.cleanup = function () { + + if (!this.pointSelection.isSelected && !this.rectSelection.isSelected) { + this.nested.remove(); ++ SVG.off(this.node); + delete this.nested; +- + } + }; + +-- 2.7.4 diff --git a/cvat/apps/engine/static/engine/js/player.js b/cvat/apps/engine/static/engine/js/player.js index dcfad56c..3c859f54 100644 --- a/cvat/apps/engine/static/engine/js/player.js +++ b/cvat/apps/engine/static/engine/js/player.js @@ -44,6 +44,8 @@ class FrameProvider extends Listener { this._loaded = frame; this._frameCollection[frame] = image; this._loadAllowed = true; + image.onload = null; + image.onerror = null; this.notify(); } @@ -109,6 +111,8 @@ class FrameProvider extends Listener { image.onload = this._onImageLoad.bind(this, image, frame); image.onerror = () => { this._loadAllowed = true; + image.onload = null; + image.onerror = null; }; image.src = `get/task/${this._tid}/frame/${frame}`; }.bind(this), 25); diff --git a/cvat/apps/engine/static/engine/js/shapes.js b/cvat/apps/engine/static/engine/js/shapes.js index 20392394..5f85904a 100644 --- a/cvat/apps/engine/static/engine/js/shapes.js +++ b/cvat/apps/engine/static/engine/js/shapes.js @@ -1608,8 +1608,8 @@ class ShapeView extends Listener { _removeShapeUI() { if (this._uis.shape) { - this._uis.shape.off('click'); this._uis.shape.remove(); + SVG.off(this._uis.shape.node); this._uis.shape = null; } } @@ -1618,6 +1618,7 @@ class ShapeView extends Listener { _removeShapeText() { if (this._uis.text) { this._uis.text.remove(); + SVG.off(this._uis.text.node); this._uis.text = null; } } From 2696240c481cd5de26d63049489192463289982d Mon Sep 17 00:00:00 2001 From: Ajay Ramesh Date: Thu, 20 Sep 2018 01:32:40 -0500 Subject: [PATCH 11/19] #35 CVAT - AWS-Deployment guide (#47) --- README.md | 1 + cvat/apps/documentation/AWS-Deployment-Guide.md | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 cvat/apps/documentation/AWS-Deployment-Guide.md diff --git a/README.md b/README.md index 63f26ee7..0d750d0c 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ CVAT is completely re-designed and re-implemented version of [Video Annotation T - [User's guide](cvat/apps/documentation/user_guide.md) - [XML annotation format](cvat/apps/documentation/xml_format.md) +- [AWS Deployment Guide](cvat/apps/documentation/AWS-Deployment-Guide.md) ## Screencasts diff --git a/cvat/apps/documentation/AWS-Deployment-Guide.md b/cvat/apps/documentation/AWS-Deployment-Guide.md new file mode 100644 index 00000000..5b40ee39 --- /dev/null +++ b/cvat/apps/documentation/AWS-Deployment-Guide.md @@ -0,0 +1,9 @@ +### AWS-Deployment Guide + +There are two ways of deploying the CVAT. +1. **On Nvidia GPU Machine:** Tensorflow annotation feature is dependent on GPU hardware. One of the easy ways to launch CVAT with the tf-annotation app is to use AWS P3 instances, which provides the NVIDIA GPU. Read more about [P3 instances here.](https://aws.amazon.com/about-aws/whats-new/2017/10/introducing-amazon-ec2-p3-instances/) +Overall setup instruction is explained in [main readme file](https://github.com/opencv/cvat/), except Installing Nvidia drivers. So we need to download the drivers and install it. For Amazon P3 instances, download the Nvidia Drivers from Nvidia website. For more check [Installing the NVIDIA Driver on Linux Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html) link. + +2. **On Any other AWS Machine:** We can follow the same instruction guide mentioned in the [Readme file](https://github.com/opencv/cvat/). The additional step is to add a [security group and rule to allow incoming connections](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html). + +For any of above, don't forget to add exposed AWS public IP address to `docker-compose.override.com`. From 366ad6abecb41e701bc73c550ab538996e2b2a1b Mon Sep 17 00:00:00 2001 From: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> Date: Thu, 20 Sep 2018 12:11:59 +0300 Subject: [PATCH 12/19] Contribution guidelines (#69) --- CONTRIBUTING.md | 149 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 146 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 35615780..a2ef25bf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,147 @@ -# How to contribute to Computer Vision Annotation Tool (CVAT) +# Contributing to this project -When contributing to this repository, please first discuss the change you wish to make via issue, -email, or any other method with the owners of this repository before making a change. +Please take a moment to review this document in order to make the contribution +process easy and effective for everyone involved. + +Following these guidelines helps to communicate that you respect the time of +the developers managing and developing this open source project. In return, +they should reciprocate that respect in addressing your issue or assessing +patches and features. + +## Branching model + +The project uses [a successful Git branching model](https://nvie.com/posts/a-successful-git-branching-model). +Thus it has a couple of branches. Some of them are described below: + +- `origin/master` to be the main branch where the source code of +HEAD always reflects a production-ready state. +- `origin/develop` to be the main branch where the source code of +HEAD always reflects a state with the latest delivered development +changes for the next release. Some would call this the “integration branch”. + +## Using the issue tracker + +The issue tracker is the preferred channel for [bug reports](#bugs), +[features requests](#features) and [submitting pull +requests](#pull-requests), but please respect the following restrictions: + +* Please **do not** use the issue tracker for personal support requests (use + [Stack Overflow](http://stackoverflow.com)). + +* Please **do not** derail or troll issues. Keep the discussion on topic and + respect the opinions of others. + + +## Bug reports + +A bug is a _demonstrable problem_ that is caused by the code in the repository. +Good bug reports are extremely helpful - thank you! + +Guidelines for bug reports: + +1. **Use the GitHub issue search** — check if the issue has already been + reported. + +2. **Check if the issue has been fixed** — try to reproduce it using the + latest `develop` branch in the repository. + +3. **Isolate the problem** — ideally create a reduced test case. + +A good bug report shouldn't leave others needing to chase you up for more +information. Please try to be as detailed as possible in your report. What is +your environment? What steps will reproduce the issue? What browser(s) and OS +experience the problem? What would you expect to be the outcome? All these +details will help people to fix any potential bugs. + +Example: + +> Short and descriptive example bug report title +> +> A summary of the issue and the browser/OS environment in which it occurs. If +> suitable, include the steps required to reproduce the bug. +> +> 1. This is the first step +> 2. This is the second step +> 3. Further steps, etc. +> +> +> Any other information you want to share that is relevant to the issue being +> reported. This might include the lines of code that you have identified as +> causing the bug, and potential solutions (and your opinions on their +> merits). + + +## Feature requests + +Feature requests are welcome. But take a moment to find out whether your idea +fits with the scope and aims of the project. It's up to *you* to make a strong +case to convince the project's developers of the merits of this feature. Please +provide as much detail and context as possible. + + +## Pull requests + +Good pull requests - patches, improvements, new features - are a fantastic +help. They should remain focused in scope and avoid containing unrelated +commits. + +**Please ask first** before embarking on any significant pull request (e.g. +implementing features, refactoring code, porting to a different language), +otherwise you risk spending a lot of time working on something that the +project's developers might not want to merge into the project. + +Please adhere to the coding conventions used throughout a project (indentation, +accurate comments, etc.) and any other requirements (such as test coverage). + +Follow this process if you'd like your work considered for inclusion in the +project: + +1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork, + and configure the remotes: + + ```bash + # Clone your fork of the repo into the current directory + git clone https://github.com// + # Navigate to the newly cloned directory + cd + # Assign the original repo to a remote called "upstream" + git remote add upstream https://github.com// + ``` + +2. If you cloned a while ago, get the latest changes from upstream: + + ```bash + git checkout + git pull upstream + ``` + +3. Create a new topic branch (off the main project development branch) to + contain your feature, change, or fix: + + ```bash + git checkout -b + ``` + +4. Commit your changes in logical chunks. Please adhere to these [git commit + message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) + or your code is unlikely be merged into the main project. Use Git's + [interactive rebase](https://help.github.com/articles/interactive-rebase) + feature to tidy up your commits before making them public. + +5. Locally merge (or rebase) the upstream development branch into your topic branch: + + ```bash + git pull [--rebase] upstream + ``` + +6. Push your topic branch up to your fork: + + ```bash + git push origin + ``` + +7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) + with a clear title and description. + +**IMPORTANT**: By submitting a patch, you agree to allow the project owner to +license your work under the same license as that used by the project. From 2d0079fb9f6fea6159153221ac35139e62bcd6e3 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Thu, 20 Sep 2018 16:42:27 +0300 Subject: [PATCH 13/19] CVAT links to specific frame or object/objects (#73) * URL search parameter for frame and for filter --- .../engine/static/engine/js/annotationUI.js | 2 +- cvat/apps/engine/static/engine/js/base.js | 40 +++++++++++++++- cvat/apps/engine/static/engine/js/player.js | 5 +- .../static/engine/js/polyshapeEditor.js | 5 +- .../engine/static/engine/js/shapeCreator.js | 6 +-- .../engine/static/engine/js/shapeFilter.js | 48 ++++++++++++++----- tests/eslintrc.conf.js | 2 + 7 files changed, 88 insertions(+), 20 deletions(-) diff --git a/cvat/apps/engine/static/engine/js/annotationUI.js b/cvat/apps/engine/static/engine/js/annotationUI.js index f0c5fab4..e2bfce72 100644 --- a/cvat/apps/engine/static/engine/js/annotationUI.js +++ b/cvat/apps/engine/static/engine/js/annotationUI.js @@ -137,7 +137,7 @@ function buildAnnotationUI(job, shapeData, loadJobEvent) { playerModel.subscribe(shapeBufferView); playerModel.subscribe(shapeGrouperView); playerModel.subscribe(polyshapeEditorView); - playerModel.shift(0); + playerModel.shift(getURISearchParameter('frame') || 0, true); let shortkeys = window.cvat.config.shortkeys; diff --git a/cvat/apps/engine/static/engine/js/base.js b/cvat/apps/engine/static/engine/js/base.js index dc9fb1ef..e5d59c99 100644 --- a/cvat/apps/engine/static/engine/js/base.js +++ b/cvat/apps/engine/static/engine/js/base.js @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -/* exported confirm showMessage showOverlay dumpAnnotationRequest */ +/* exported confirm showMessage showOverlay dumpAnnotationRequest getURISearchParameter setURISearchParameter */ "use strict"; Math.clamp = function(x, min, max) { @@ -161,6 +161,44 @@ function dumpAnnotationRequest(dumpButton, taskID) { } +function setURISearchParameter(name, value) { + let searchParams = new URLSearchParams(window.location.search); + if (typeof value === 'undefined' || value === null) { + if (searchParams.has(name)) { + searchParams.delete(name); + } + } + else searchParams.set(name, value); + + window.history.replaceState(null, null, `?${searchParams.toString()}`); +} + + +function resetURISearchParameters() { + let searchParams = new URLSearchParams(); + searchParams.set('id', window.cvat.job.id); + window.history.replaceState(null, null, `?${searchParams.toString()}`); +} + + +function getURISearchParameter(name) { + let decodedURI = ''; + try { + decodedURI = decodeURIComponent(window.location.search); + } + catch (error) { + showMessage('Bad URL has been found'); + resetURISearchParameters(); + } + + let urlSearchParams = new URLSearchParams(decodedURI); + if (urlSearchParams.has(name)) { + return urlSearchParams.get(name); + } + else return null; +} + + /* These HTTP methods do not require CSRF protection */ function csrfSafeMethod(method) { return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); diff --git a/cvat/apps/engine/static/engine/js/player.js b/cvat/apps/engine/static/engine/js/player.js index 3c859f54..70731b60 100644 --- a/cvat/apps/engine/static/engine/js/player.js +++ b/cvat/apps/engine/static/engine/js/player.js @@ -778,7 +778,10 @@ class PlayerView { } this._loadingUI.addClass('hidden'); - this._playerBackgroundUI.css('background-image', 'url(' + '"' + image.src + '"' + ')'); + if (this._playerBackgroundUI.css('background-image').slice(5,-2) != image.src) { + this._playerBackgroundUI.css('background-image', 'url(' + '"' + image.src + '"' + ')'); + setURISearchParameter('frame', frames.current); + } if (model.playing) { this._playButtonUI.addClass('hidden'); diff --git a/cvat/apps/engine/static/engine/js/polyshapeEditor.js b/cvat/apps/engine/static/engine/js/polyshapeEditor.js index 2f5c61fb..4ed27168 100644 --- a/cvat/apps/engine/static/engine/js/polyshapeEditor.js +++ b/cvat/apps/engine/static/engine/js/polyshapeEditor.js @@ -52,7 +52,10 @@ class PolyshapeEditorModel extends Listener { cancel() { if (this._active) { this._active = false; - if (window.cvat.mode === this._modeName) { + if (window.cvat.mode != this._modeName) { + throw Error(`Inconsistent behaviour has been detected. Edit mode is activated, but mode variable is '${window.cvat.mode}'`); + } + else { window.cvat.mode = null; } diff --git a/cvat/apps/engine/static/engine/js/shapeCreator.js b/cvat/apps/engine/static/engine/js/shapeCreator.js index eebcb878..6a04c406 100644 --- a/cvat/apps/engine/static/engine/js/shapeCreator.js +++ b/cvat/apps/engine/static/engine/js/shapeCreator.js @@ -268,7 +268,7 @@ class ShapeCreatorView { let lastPoint = { x: null, y: null, - } + }; if (this._polyShapeSize) { let size = this._polyShapeSize; @@ -296,14 +296,14 @@ class ShapeCreatorView { lastPoint = { x: e.detail.event.clientX, y: e.detail.event.clientY, - } + }; }); this._drawInstance.on('drawpoint', (e) => { lastPoint = { x: e.detail.event.clientX, y: e.detail.event.clientY, - } + }; }); this._frameContent.on('mousedown.shapeCreator', (e) => { diff --git a/cvat/apps/engine/static/engine/js/shapeFilter.js b/cvat/apps/engine/static/engine/js/shapeFilter.js index 9781812b..be030fc6 100644 --- a/cvat/apps/engine/static/engine/js/shapeFilter.js +++ b/cvat/apps/engine/static/engine/js/shapeFilter.js @@ -64,9 +64,15 @@ class FilterModel { } } - updateFilter(value) { + updateFilter(value, silent) { this._filter = value; - this._update(); + if (!silent) { + this._update(); + } + } + + get filterRow() { + return this._filter; } } @@ -75,27 +81,31 @@ class FilterController { this._model = filterModel; } - updateFilter(value) { + updateFilter(value, silent) { if (value.length) { + value = value.split('|').map(x => '/d:data/' + x).join('|').toLowerCase().replace(/-/g, "_"); try { document.evaluate(value, document, () => 'ns'); } catch (error) { return false; } - this._model.updateFilter(value); + this._model.updateFilter(value, silent); return true; } else { - this._model.updateFilter(value); + this._model.updateFilter('', silent); return true; } - } deactivate() { this._model.active = false; } + + get filterRow() { + return this._model.filterRow; + } } @@ -109,14 +119,14 @@ class FilterView { this._filterString.on('keypress keydown keyup', (e) => e.stopPropagation()); this._filterString.on('change', (e) => { let value = $.trim(e.target.value); - if (value.length) { - value = value.split('|').map(x => '/d:data/' + x).join('|').toLowerCase().replace(/-/g, "_"); - } - if (this._controller.updateFilter(value)) { + + if (this._controller.updateFilter(value, false)) { this._filterString.css('color', 'green'); + setURISearchParameter('filter', value || null); } else { this._filterString.css('color', 'red'); + setURISearchParameter('filter', null); } }); @@ -127,9 +137,21 @@ class FilterView { this._resetFilterButton.on('click', () => { this._filterString.prop('value', ''); - this._controller.updateFilter(''); + this._controller.updateFilter('', false); + setURISearchParameter('filter', null); }); - } - + if (getURISearchParameter('filter')) { + let value = getURISearchParameter('filter'); + this._filterString.prop('value', value); + if (this._controller.updateFilter(value, true)) { + this._filterString.css('color', 'green'); + } + else { + setURISearchParameter('filter', null); + this._filterString.prop('value', ''); + this._filterString.css('color', 'red'); + } + } + } } diff --git a/tests/eslintrc.conf.js b/tests/eslintrc.conf.js index 7771a024..cd8affdc 100644 --- a/tests/eslintrc.conf.js +++ b/tests/eslintrc.conf.js @@ -49,6 +49,8 @@ module.exports = { 'showOverlay': true, 'confirm': true, 'dumpAnnotationRequest': true, + 'getURISearchParameter': true, + 'setURISearchParameter': true, // from shapeCollection.js 'ShapeCollectionModel': true, 'ShapeCollectionController': true, From 64962abdde8b86a5309a4796b2b85f4e552c88cf Mon Sep 17 00:00:00 2001 From: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> Date: Fri, 21 Sep 2018 10:53:51 +0300 Subject: [PATCH 14/19] Add gitter badge into README. (#75) --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0d750d0c..5eef2a53 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Computer Vision Annotation Tool (CVAT) +[![Gitter chat](https://badges.gitter.im/opencv-cvat/gitter.png)](https://gitter.im/opencv-cvat) + CVAT is completely re-designed and re-implemented version of [Video Annotation Tool from Irvine, California](http://carlvondrick.com/vatic/) tool. It is free, online, interactive video and image annotation tool for computer vision. It is being used by our team to annotate million of objects with different properties. Many UI and UX decisions are based on feedbacks from professional data annotation team. ![CVAT screenshot](cvat/apps/documentation/static/documentation/images/gif003.gif) @@ -132,7 +134,7 @@ services: CVAT_SHARE_URL: "Mounted from /mnt/share host directory" volumes: cvat_share:/home/django/share:ro - + volumes: cvat_share: driver_opts: @@ -140,4 +142,4 @@ volumes: device: /mnt/share o: bind ``` -You can change the share device path to your actual share. For user convenience we have defined the enviroment variable $CVAT_SHARE_URL. This variable contains a text (url for example) which will be being shown in the client-share browser. +You can change the share device path to your actual share. For user convenience we have defined the enviroment variable $CVAT_SHARE_URL. This variable contains a text (url for example) which will be being shown in the client-share browser. From 93eaaf7fdb70bb34a374886e17fb35f66788530e Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Fri, 21 Sep 2018 17:23:11 +0300 Subject: [PATCH 15/19] Ability to change an opacity for selected shapes (#77) * Feature has been implemented: ability to change selected opacity for shapes * Floats used in ranges --- cvat/apps/engine/static/engine/js/base.js | 2 +- .../engine/static/engine/js/shapeCollection.js | 15 +++++++++++++-- cvat/apps/engine/static/engine/js/shapeFilter.js | 8 -------- cvat/apps/engine/static/engine/js/shapes.js | 6 +++++- cvat/apps/engine/templates/engine/annotation.html | 11 ++++++----- 5 files changed, 25 insertions(+), 17 deletions(-) diff --git a/cvat/apps/engine/static/engine/js/base.js b/cvat/apps/engine/static/engine/js/base.js index e5d59c99..a164e3cd 100644 --- a/cvat/apps/engine/static/engine/js/base.js +++ b/cvat/apps/engine/static/engine/js/base.js @@ -216,7 +216,7 @@ $.ajaxSetup({ $(document).ready(function(){ $('body').css({ - width: window.screen.width * 0.95 + 'px', + width: window.screen.width + 'px', height: window.screen.height * 0.95 + 'px' }); }); diff --git a/cvat/apps/engine/static/engine/js/shapeCollection.js b/cvat/apps/engine/static/engine/js/shapeCollection.js index 67cbc9ee..d9132b9d 100644 --- a/cvat/apps/engine/static/engine/js/shapeCollection.js +++ b/cvat/apps/engine/static/engine/js/shapeCollection.js @@ -999,6 +999,7 @@ class ShapeCollectionView { this._labelsContent = $('#labelsContent'); this._showAllInterpolationBox = $('#showAllInterBox'); this._fillOpacityRange = $('#fillOpacityRange'); + this._selectedFillOpacityRange = $('#selectedFillOpacityRange'); this._blackStrokeCheckbox = $('#blackStrokeCheckbox'); this._colorByInstanceRadio = $('#colorByInstanceRadio'); this._colorByGroupRadio = $('#colorByGroupRadio'); @@ -1020,7 +1021,7 @@ class ShapeCollectionView { let value = Math.clamp(+e.target.value, +e.target.min, +e.target.max); e.target.value = value; if (value >= 0) { - this._colorSettings["fill-opacity"] = value / 5; + this._colorSettings["fill-opacity"] = value; delete this._colorSettings['white-opacity']; for (let view of this._currentViews) { @@ -1029,7 +1030,7 @@ class ShapeCollectionView { } else { value *= -1; - this._colorSettings["white-opacity"] = value / 5; + this._colorSettings["white-opacity"] = value; for (let view of this._currentViews) { view.updateColorSettings(this._colorSettings); @@ -1037,6 +1038,16 @@ class ShapeCollectionView { } }); + this._selectedFillOpacityRange.on('input', (e) => { + let value = Math.clamp(+e.target.value, +e.target.min, +e.target.max); + e.target.value = value; + this._colorSettings["selected-fill-opacity"] = value; + + for (let view of this._currentViews) { + view.updateColorSettings(this._colorSettings); + } + }); + this._blackStrokeCheckbox.on('click', (e) => { this._colorSettings["black-stroke"] = e.target.checked; diff --git a/cvat/apps/engine/static/engine/js/shapeFilter.js b/cvat/apps/engine/static/engine/js/shapeFilter.js index eeb67066..36d86d2c 100644 --- a/cvat/apps/engine/static/engine/js/shapeFilter.js +++ b/cvat/apps/engine/static/engine/js/shapeFilter.js @@ -70,10 +70,6 @@ class FilterModel { this._update(); } } - - get filterRow() { - return this._filter; - } } class FilterController { @@ -102,10 +98,6 @@ class FilterController { deactivate() { this._model.active = false; } - - get filterRow() { - return this._model.filterRow; - } } diff --git a/cvat/apps/engine/static/engine/js/shapes.js b/cvat/apps/engine/static/engine/js/shapes.js index 5f85904a..9c61f930 100644 --- a/cvat/apps/engine/static/engine/js/shapes.js +++ b/cvat/apps/engine/static/engine/js/shapes.js @@ -1400,7 +1400,7 @@ class ShapeView extends Listener { this._appearance = { colors: shapeModel.color, fillOpacity: 0, - selectedFillOpacity: 0.1, + selectedFillOpacity: 0.2, }; this._flags = { @@ -2645,6 +2645,10 @@ class ShapeView extends Listener { } } + if ('selected-fill-opacity' in settings) { + this._appearance.selectedFillOpacity = settings['selected-fill-opacity']; + } + if (settings['black-stroke']) { this._appearance['stroke'] = 'black'; } diff --git a/cvat/apps/engine/templates/engine/annotation.html b/cvat/apps/engine/templates/engine/annotation.html index 33dea2ad..0042b798 100644 --- a/cvat/apps/engine/templates/engine/annotation.html +++ b/cvat/apps/engine/templates/engine/annotation.html @@ -142,16 +142,17 @@
-
+
-
+
-
-
+
+
- +
+
From e600c329cce30ccca47a92571bec23f1551f4fa3 Mon Sep 17 00:00:00 2001 From: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> Date: Fri, 21 Sep 2018 18:07:45 +0300 Subject: [PATCH 16/19] Update README (#79) (#80) * Added new screenshot + screencasts. --- README.md | 9 +++++---- .../static/documentation/images/cvat.jpg | Bin 0 -> 259195 bytes 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100755 cvat/apps/documentation/static/documentation/images/cvat.jpg diff --git a/README.md b/README.md index 5eef2a53..52263f01 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ CVAT is completely re-designed and re-implemented version of [Video Annotation Tool from Irvine, California](http://carlvondrick.com/vatic/) tool. It is free, online, interactive video and image annotation tool for computer vision. It is being used by our team to annotate million of objects with different properties. Many UI and UX decisions are based on feedbacks from professional data annotation team. -![CVAT screenshot](cvat/apps/documentation/static/documentation/images/gif003.gif) +![CVAT screenshot](cvat/apps/documentation/static/documentation/images/cvat.jpg) ## Documentation @@ -14,9 +14,10 @@ CVAT is completely re-designed and re-implemented version of [Video Annotation T ## Screencasts -- [Annotation mode](https://www.youtube.com/watch?v=uSqaQENdyJE) -- [Interpolation mode](https://www.youtube.com/watch?v=sc5X5hvxNfA) -- [Attribute mode](https://www.youtube.com/watch?v=5yXaG0V7X0Q) +- [Annotation mode](https://youtu.be/6h7HxGL6Ct4) +- [Interpolation mode](https://youtu.be/U3MYDhESHo4) +- [Attribute mode](https://youtu.be/UPNfWl8Egd8) +- [Segmentation mode](https://youtu.be/6IJ0QN7PBKo) ## LICENSE diff --git a/cvat/apps/documentation/static/documentation/images/cvat.jpg b/cvat/apps/documentation/static/documentation/images/cvat.jpg new file mode 100755 index 0000000000000000000000000000000000000000..eb512b7da3c392c28aa3d0ecfed4a3aa2c05c651 GIT binary patch literal 259195 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¨Hw8Y`^!l??PR9_Z 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 Date: Fri, 21 Sep 2018 19:06:41 +0300 Subject: [PATCH 17/19] Release 0.2 (#83) * Improve documentation for overlap parameter. (#82) Fix #22 (Improve documentation for overlap parameter) * Improve description how to specify labels with attributes. (#81) Fix #67 (clarify how to create multiple labels) --- cvat/apps/documentation/user_guide.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cvat/apps/documentation/user_guide.md b/cvat/apps/documentation/user_guide.md index 5a3105e6..05c74b19 100644 --- a/cvat/apps/documentation/user_guide.md +++ b/cvat/apps/documentation/user_guide.md @@ -32,9 +32,13 @@ There you can: ![](static/documentation/images/image005.jpg) - __Labels__. Use the following schema to create labels: ``label_name input_type=attribute_name:attribute_value1,attribute_value2`` + __Labels__. Use the following schema to create labels: ``label_name input_type=attribute_name:attribute_value1,attribute_value2``. You can specify multiple labels and multiple attributes separated by space. Attributes belong to previous label. - Example: ``vehicle @select=type:__undefined__,car,truck,bus,train ~radio=quality:good,bad ~checkbox=parked:false`` + Example: + - ``vehicle @select=type:__undefined__,car,truck,bus,train ~radio=quality:good,bad ~checkbox=parked:false`` - + one label with multiple attributes + - ``car person bike`` - three labels without attributes + - ``circle @radio=color:green,red,blue @number=radius:0,10,0.1 line square`` - one label with two attributes and two labels without attributes ``label_name``: for example *vehicle, person, face etc.* @@ -61,7 +65,11 @@ There you can: __Z-Order__. Defines the order on drawn polygons. Check the box for enable layered dislaying. - __Overlap Size__. Use this option to make overlapped segments. The option makes tracks continuous from one segment into another. Use it for interpolation mode. + __Overlap Size__. Use this option to make overlapped segments. The option makes tracks continuous from one segment into another. Use it for interpolation mode. There are several use cases for the parameter: + - For an interpolation task (video sequence) if an object exists on overlapped segments it will be automatically merged into one track if overlap is greater than zero and annotation is good enough on adjacent segments. If overlap equals to zero or annotation is poor on adjacent segments inside a dumped annotation file you will have several tracks, one for each segment, which correspond to the object). + - For an annotation task (independent images) if an object exists on overlapped segments bounding boxes will be automatically merged into one if overlap is greater than zero and annotation is good enough on adjacent segments. If overlap equals to zero or annotation is poor on adjacent segments inside a dumped annotation file you will have several bounding boxes for the same object. + + Thus you annotate an object on first segment. You annotate the same object on second segment and if you do it right you will have one track inside your annotation file. If annotations on different segments (on overlapped frames) are very different or overlap is zero you will have two tracks for the same object. The functionality only works for bounding boxes. Polygon, polyline, points don't support automatic merge on overlapped segments even the overlap parameter isn't zero and match between corresponding shapes on adjacent segments is perfect. __Segment size__. Use this option to divide huge dataset by a few less size segments. From 53722203feb81475ae9c02bc5d45e5c70b017118 Mon Sep 17 00:00:00 2001 From: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> Date: Tue, 25 Sep 2018 16:15:52 +0300 Subject: [PATCH 18/19] Port changes from release-0.2 branch (#87) * Add CHANGELOG.md (#85) --- CHANGELOG.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..8feb27e4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,81 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] +### Added +- New annotation shapes: polygons, polylines, points +- Undo/redo feature +- Grid to estimate size of objects +- Context menu for shapes +- A converter to PASCAL VOC format +- A converter to MS COCO format +- A converter to mask format +- License header for most of all files +- .gitattribute to avoid problems with bash scripts inside a container +- CHANGELOG.md itself +- Drawing size of a bounding box during resize +- Color by instance, group, label +- Group objects +- Object propagation on next frames +- Full screen view + +### Changed +- Documentation, screencasts, the primary screenshot +- Content-type for save_job request is application/json + +### Fixed +- Player navigation if the browser's window is scrolled +- Filter doesn't support dash (-) +- Several memory leaks +- Inconsistent extensions between filenames in an annotation file and real filenames + +## [0.1.2] - 2018-08-07 +### Added +- 7z archive support when creating a task +- .vscode/launch.json file for developing with VS code + +### Fixed +- #14: docker-compose down command as written in the readme does not remove volumes +- #15: all checkboxes in temporary attributes are checked when reopening job after saving the job +- #18: extend CONTRIBUTING.md +- #19: using the same attribute for label twice -> stuck + +### Changed +- More strict verification for labels with attributes + +## [0.1.1] - 2018-07-6 +### Added +- Links on a screenshot, documentation, screencasts into README.md +- CONTRIBUTORS.md + +### Fixed +- GitHub documentation + +## 0.1.0 - 2018-06-29 +### Added +- Initial version + +## Template +``` +## [Unreleased] +### Added +- + +### Changed +- + +### Deprecated +- + +### Removed +- + +### Fixed +- + +### Security +- +``` From 0338afbceaef598121d322b4ad3cb0969a5668e7 Mon Sep 17 00:00:00 2001 From: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> Date: Tue, 25 Sep 2018 18:04:53 +0300 Subject: [PATCH 19/19] Describe XML format v1.1 (#88) (#91) --- cvat/apps/documentation/user_guide.md | 2 +- cvat/apps/documentation/xml_format.md | 252 +++++++++++++++++++++++++- cvat/apps/engine/annotation.py | 2 +- 3 files changed, 253 insertions(+), 3 deletions(-) diff --git a/cvat/apps/documentation/user_guide.md b/cvat/apps/documentation/user_guide.md index 05c74b19..3fe1defd 100644 --- a/cvat/apps/documentation/user_guide.md +++ b/cvat/apps/documentation/user_guide.md @@ -217,7 +217,7 @@ Usage examples: ![](static/documentation/images/image028.jpg) -3. The annotation will be written into **.xml** file. To find the annotation file go to the directory where your browser saves downloaded files by default. For more information visit [.xml format page](./documentation/xml_format.html). +3. The annotation will be written into **.xml** file. To find the annotation file go to the directory where your browser saves downloaded files by default. For more information visit [.xml format page](/documentation/xml_format.html). ![](static/documentation/images/image029.jpg) diff --git a/cvat/apps/documentation/xml_format.md b/cvat/apps/documentation/xml_format.md index a3506f07..6257ea66 100644 --- a/cvat/apps/documentation/xml_format.md +++ b/cvat/apps/documentation/xml_format.md @@ -2,6 +2,255 @@ When you want to download annotations from Computer Vision Annotation Tool (CVAT) you can choose one of several data formats. The document describes XML annotation format. Each format has X.Y version (e.g. 1.0). In general the major version (X) is incremented then the data format has incompatible changes and the minor version (Y) is incremented then the data format is slightly modified (e.g. it has one or several extra fields inside meta information). The document will describe all changes for all versions of XML annotation format. +## Version 1.1 + +There are two different formats for annotation and interpolation modes at the moment. Both formats has a common part which is described below. From previous version `flipped` tag was added. Also `original_size` tag was added for interpolation mode to specify frame size. In annotation mode each image tag has `width` and `height` attributes for the same purpose. + +```xml + + + 1.1 + + + Number: id of the task + String: some task name + Number: count of frames/images in the task + String: interpolation or annotation + Number: number of overlaped frames between segments + String: URL on an page which describe the task + Boolean: were images of the task flipped? (True/False) + String: date when the task was created + String: date when the task was updated + + + + + + Number: id of the segment + Number: first frame + Number: last frame + String: URL (e.g. http://cvat.example.com/?id=213) + + + + String: the author of the task + String: email of the author + + + Number: frame width + Number: frame height + + + String: date when the annotation was dumped + + ... + +``` + +### Annotation +Below you can find description of the data format for annotation mode. In the mode images are annotated. On each image it is possible to have many different objects. Each object can have multiple attributes. If an annotation task has been +created with `z_order` flag then each object will have `z_order` attribute which is used to draw objects properly when they are intersected (if `z_order` is bigger the object is closer to camera). In previous version of the format only `box` shape was available. In the release `polygon`, `polyline`, and `points` were added. Please see below for more details: + +```xml + + + ... + + + String: the attribute value + ... + + + String: the attribute value + ... + + + String: the attribute value + ... + + + String: the attribute value + ... + + + String: the attribute value + ... + + ... + + ... + +``` + +Example: +```xml + + + 1.1 + + + 4 + segmentation + 27 + annotation + 0 + + False + 2018-09-25 11:34:24.617558+03:00 + 2018-09-25 11:38:27.301183+03:00 + + + + + + + + + 4 + 0 + 26 + http://localhost:8080/?id=4 + + + + admin + + + + 2018-09-25 11:38:28.799808+03:00 + + + + + + + + + + + + + + +``` + +### Interpolation +Below you can find description of the data format for interpolation mode. In the mode frames are annotated. The annotation contains tracks. Each track corresponds to an object which can be presented on multiple frames. The same object cannot be presented on the same frame in multiple locations. Each location of the object can have multiple attributes even if an attribute is immutable for the object it will be cloned for each location (a known redundancy). + +```xml + + + ... + + + String: the attribute value + ... + + + String: the attribute value + + + String: the attribute value + + + String: the attribute value + + ... + + ... + +``` + +Example: +```xml + + + 1.1 + + + 5 + interpolation + 4620 + interpolation + 5 + + False + 2018-09-25 12:32:09.868194+03:00 + 2018-09-25 16:05:05.619841+03:00 + + + + + + + 5 + 0 + 4619 + http://localhost:8080/?id=5 + + + + admin + + + + 640 + 480 + + + 2018-09-25 16:05:07.134046+03:00 + + + + + + + + + + + + + + + + +``` + ## Version 1 There are two different formats for annotation and interpolation modes at the moment. Both formats has a common part which is described below: @@ -9,7 +258,7 @@ There are two different formats for annotation and interpolation modes at the mo ```xml - String: version of the format (e.g 1.0) + 1.0 Number: id of the task @@ -131,6 +380,7 @@ Example: ### Interpolation Below you can find description of the data format for interpolation mode. In the mode frames are annotated. The annotation contains tracks. Each track corresponds to an object which can be presented on multiple frames. The same object cannot be presented on the same frame in multiple locations. Each location of the object can have multiple attributes even if an attribute is immutable for the object it will be cloned for each location (a known redundancy). + ```xml diff --git a/cvat/apps/engine/annotation.py b/cvat/apps/engine/annotation.py index f6c28376..35265cb0 100644 --- a/cvat/apps/engine/annotation.py +++ b/cvat/apps/engine/annotation.py @@ -1282,7 +1282,7 @@ class _AnnotationWriter: class _XmlAnnotationWriter(_AnnotationWriter): def __init__(self, file): - super().__init__(file, "1.0") + super().__init__(file, "1.1") self.xmlgen = XMLGenerator(self.file, 'utf-8') self._level = 0