From b71e77b17b78837b1affbcbd7332682cdb000e9c Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Mon, 14 Sep 2020 09:11:59 +0300 Subject: [PATCH] =?UTF-8?q?Using=20serverside=20paremeter=20min=5Fpos=5Fpo?= =?UTF-8?q?ints,=20right=20colors=20of=20labels=20in=20=E2=80=A6=20(#2162)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Using serverside paremeter min_pos_points, right colors of labels in detector runner * Updated changelog & versions * Using color from consts instead of literal --- CHANGELOG.md | 1 + cvat-core/package-lock.json | 2 +- cvat-core/package.json | 2 +- cvat-core/src/lambda-manager.js | 6 +- cvat-core/src/ml-model.js | 15 ++++ cvat-ui/package-lock.json | 2 +- cvat-ui/package.json | 2 +- cvat-ui/src/actions/annotation-actions.ts | 2 +- .../controls-side-bar/tools-control.tsx | 2 +- .../model-runner-modal/detector-runner.tsx | 86 +++++++------------ cvat-ui/src/reducers/interfaces.ts | 3 + cvat/apps/lambda_manager/views.py | 2 + 12 files changed, 59 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b4ef95f..ec03b776 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - UI models (like DEXTR) were redesigned to be more interactive () - Used Ubuntu:20.04 as a base image for CVAT Dockerfile () +- Right colors of label tags in label mapping when a user runs automatic detection () ### Deprecated - diff --git a/cvat-core/package-lock.json b/cvat-core/package-lock.json index 55038b63..5b0644a8 100644 --- a/cvat-core/package-lock.json +++ b/cvat-core/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "3.6.1", + "version": "3.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-core/package.json b/cvat-core/package.json index 869464ac..013ed713 100644 --- a/cvat-core/package.json +++ b/cvat-core/package.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "3.6.1", + "version": "3.7.0", "description": "Part of Computer Vision Tool which presents an interface for client-side integration", "main": "babel.config.js", "scripts": { diff --git a/cvat-core/src/lambda-manager.js b/cvat-core/src/lambda-manager.js index 4b936cd2..36a8788f 100644 --- a/cvat-core/src/lambda-manager.js +++ b/cvat-core/src/lambda-manager.js @@ -29,11 +29,7 @@ class LambdaManager { for (const model of result) { models.push(new MLModel({ - id: model.id, - name: model.name, - description: model.description, - framework: model.framework, - labels: [...model.labels], + ...model, type: model.kind, })); } diff --git a/cvat-core/src/ml-model.js b/cvat-core/src/ml-model.js index 4169be8e..b60e6d9e 100644 --- a/cvat-core/src/ml-model.js +++ b/cvat-core/src/ml-model.js @@ -15,6 +15,11 @@ class MLModel { this._framework = data.framework; this._description = data.description; this._type = data.type; + this._params = { + canvas: { + minPosVertices: data.min_pos_points, + }, + }; } /** @@ -68,6 +73,16 @@ class MLModel { get type() { return this._type; } + + /** + * @returns {object} + * @readonly + */ + get params() { + return { + canvas: { ...this._params.canvas }, + }; + } } module.exports = MLModel; diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index 1638260a..98558e5f 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.9.3", + "version": "1.9.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-ui/package.json b/cvat-ui/package.json index f504a65b..9e988afb 100644 --- a/cvat-ui/package.json +++ b/cvat-ui/package.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.9.3", + "version": "1.9.4", "description": "CVAT single-page application", "main": "src/index.tsx", "scripts": { diff --git a/cvat-ui/src/actions/annotation-actions.ts b/cvat-ui/src/actions/annotation-actions.ts index e6b3ef2f..856427fd 100644 --- a/cvat-ui/src/actions/annotation-actions.ts +++ b/cvat-ui/src/actions/annotation-actions.ts @@ -1446,7 +1446,7 @@ export function repeatDrawShapeAsync(): ThunkAction { canvasInstance.interact({ enabled: true, shapeType: 'points', - minPosVertices: 4, // TODO: Add parameter to interactor + ...activeInteractor.params.canvas, }); dispatch(interactWithCanvas(activeInteractor, activeLabelID)); } diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/tools-control.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/tools-control.tsx index 83db38e2..89d89912 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/tools-control.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/controls-side-bar/tools-control.tsx @@ -657,8 +657,8 @@ export class ToolsControlComponent extends React.PureComponent { canvasInstance.cancel(); canvasInstance.interact({ shapeType: 'points', - minPosVertices: 4, // TODO: Add parameter to interactor enabled: true, + ...activeInteractor.params.canvas, }); onInteractionStart(activeInteractor, activeLabelID); diff --git a/cvat-ui/src/components/model-runner-modal/detector-runner.tsx b/cvat-ui/src/components/model-runner-modal/detector-runner.tsx index 12c1f78c..862f29a4 100644 --- a/cvat-ui/src/components/model-runner-modal/detector-runner.tsx +++ b/cvat-ui/src/components/model-runner-modal/detector-runner.tsx @@ -10,34 +10,15 @@ import Select, { OptionProps } from 'antd/lib/select'; import Checkbox, { CheckboxChangeEvent } from 'antd/lib/checkbox'; import Tooltip from 'antd/lib/tooltip'; import Tag from 'antd/lib/tag'; -import notification from 'antd/lib/notification'; import Text from 'antd/lib/typography/Text'; import InputNumber from 'antd/lib/input-number'; - -import { Model, StringObject } from 'reducers/interfaces'; import Button from 'antd/lib/button'; +import notification from 'antd/lib/notification'; +import { Model, StringObject } from 'reducers/interfaces'; -function colorGenerator(): () => string { - const values = [ - 'magenta', 'green', 'geekblue', - 'orange', 'red', 'cyan', - 'blue', 'volcano', 'purple', - ]; - - let index = 0; - - return (): string => { - const color = values[index++]; - if (index >= values.length) { - index = 0; - } - - return color; - }; -} -const nextColor = colorGenerator(); +import consts from 'consts'; interface Props { withCleanup: boolean; @@ -56,7 +37,6 @@ function DetectorRunner(props: Props): JSX.Element { const [modelID, setModelID] = useState(null); const [mapping, setMapping] = useState({}); - const [colors, setColors] = useState({}); const [threshold, setThreshold] = useState(0.5); const [distance, setDistance] = useState(50); const [cleanup, setCleanup] = useState(false); @@ -90,10 +70,7 @@ function DetectorRunner(props: Props): JSX.Element { function updateMatch(modelLabel: string | null, taskLabel: string | null): void { if (match.model && taskLabel) { const newmatch: { [index: string]: string } = {}; - const newcolor: { [index: string]: string } = {}; newmatch[match.model] = taskLabel; - newcolor[match.model] = nextColor(); - setColors({ ...colors, ...newcolor }); setMapping({ ...mapping, ...newmatch }); setMatch({ model: null, task: null }); return; @@ -101,10 +78,7 @@ function DetectorRunner(props: Props): JSX.Element { if (match.task && modelLabel) { const newmatch: { [index: string]: string } = {}; - const newcolor: { [index: string]: string } = {}; newmatch[modelLabel] = match.task; - newcolor[modelLabel] = nextColor(); - setColors({ ...colors, ...newcolor }); setMapping({ ...mapping, ...newmatch }); setMatch({ model: null, task: null }); return; @@ -157,18 +131,15 @@ function DetectorRunner(props: Props): JSX.Element { onChange={(_modelID: string): void => { const newmodel = models .filter((_model): boolean => _model.id === _modelID)[0]; - const newcolors: StringObject = {}; const newmapping = task.labels .reduce((acc: StringObject, label: any): StringObject => { if (newmodel.labels.includes(label.name)) { acc[label.name] = label.name; - newcolors[label.name] = nextColor(); } return acc; }, {}); setMapping(newmapping); - setColors(newcolors); setMatch({ model: null, task: null }); setModelID(_modelID); }} @@ -180,29 +151,34 @@ function DetectorRunner(props: Props): JSX.Element { { isDetector && !!Object.keys(mapping).length && ( - Object.keys(mapping).map((modelLabel: string) => ( - - - {modelLabel} - - - {mapping[modelLabel]} - - - - { - const newmapping = { ...mapping }; - delete newmapping[modelLabel]; - setMapping(newmapping); - }} - /> - - - - )) + Object.keys(mapping).map((modelLabel: string) => { + const label = task.labels + .filter((_label: any): boolean => _label.name === mapping[modelLabel])[0]; + const color = label ? label.color : consts.NEW_LABEL_COLOR; + return ( + + + {modelLabel} + + + {mapping[modelLabel]} + + + + { + const newmapping = { ...mapping }; + delete newmapping[modelLabel]; + setMapping(newmapping); + }} + /> + + + + ); + }) )} { isDetector && !!taskLabels.length && !!modelLabels.length && ( <> diff --git a/cvat-ui/src/reducers/interfaces.ts b/cvat-ui/src/reducers/interfaces.ts index 4febb3a7..86dffa46 100644 --- a/cvat-ui/src/reducers/interfaces.ts +++ b/cvat-ui/src/reducers/interfaces.ts @@ -141,6 +141,9 @@ export interface Model { framework: string; description: string; type: string; + params: { + canvas: object; + }; } export enum RQStatus { diff --git a/cvat/apps/lambda_manager/views.py b/cvat/apps/lambda_manager/views.py index 52c1de41..4e5ede35 100644 --- a/cvat/apps/lambda_manager/views.py +++ b/cvat/apps/lambda_manager/views.py @@ -109,6 +109,7 @@ class LambdaFunction: self.framework = data['metadata']['annotations'].get('framework') # display name for the function self.name = data['metadata']['annotations'].get('name', self.id) + self.min_pos_points = int(data['metadata']['annotations'].get('min_pos_points', 1)) self.gateway = gateway def to_dict(self): @@ -120,6 +121,7 @@ class LambdaFunction: 'description': self.description, 'framework': self.framework, 'name': self.name, + 'min_pos_points': self.min_pos_points } return response