From 5331c13ba1cacad13bf14bad6ab7621b8b791ef9 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Tue, 17 Dec 2019 18:48:02 +0300 Subject: [PATCH 01/14] Fixed number attribute (#972) --- .../components/labels-editor/label-form.tsx | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/cvat-ui/src/components/labels-editor/label-form.tsx b/cvat-ui/src/components/labels-editor/label-form.tsx index 6bd5630a04dc..6ad63efdfd37 100644 --- a/cvat-ui/src/components/labels-editor/label-form.tsx +++ b/cvat-ui/src/components/labels-editor/label-form.tsx @@ -52,22 +52,30 @@ class LabelForm extends React.PureComponent { onSubmit, } = this.props; - form.validateFields((error, values): void => { + form.validateFields((error, formValues): void => { if (!error) { onSubmit({ - name: values.labelName, + name: formValues.labelName, id: label ? label.id : idGenerator(), - attributes: values.keys.map((key: number, index: number): Attribute => ( - { - name: values.attrName[key], - type: values.type[key], - mutable: values.mutable[key], + attributes: formValues.keys.map((key: number, index: number): Attribute => { + let attrValues = formValues.values[key]; + if (!Array.isArray(attrValues)) { + if (formValues.type[key] === AttributeType.NUMBER) { + attrValues = attrValues.split(';'); + } else { + attrValues = [attrValues]; + } + } + + return { + name: formValues.attrName[key], + type: formValues.type[key], + mutable: formValues.mutable[key], id: label && index < label.attributes.length ? label.attributes[index].id : key, - values: Array.isArray(values.values[key]) - ? values.values[key] : [values.values[key]], - } - )), + values: attrValues, + }; + }), }); form.resetFields(); From 20a0e662385d0d49bd0c2eb0654e5460ad343f77 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Tue, 17 Dec 2019 19:50:31 +0300 Subject: [PATCH 02/14] CSS Enhancement (#971) * Removed vendor/specific rules * Sass for CVAT, less for Antd, added autoprefixer and css polyfills * Removed extra line * Changed update state --- cvat-ui/package-lock.json | 2176 ++++++++++++++++- cvat-ui/package.json | 6 + cvat-ui/postcss.config.js | 9 + .../objects-side-bar/objects-side-bar.tsx | 10 +- cvat-ui/src/components/cvat-app.tsx | 4 +- .../src/{stylesheet.css => stylesheet.scss} | 222 +- cvat-ui/webpack.config.js | 22 +- 7 files changed, 2153 insertions(+), 296 deletions(-) create mode 100644 cvat-ui/postcss.config.js rename cvat-ui/src/{stylesheet.css => stylesheet.scss} (72%) diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index 83facc507da3..41ef8cc917d1 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -953,6 +953,12 @@ "to-fast-properties": "^2.0.0" } }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "dev": true + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1384,6 +1390,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1432,6 +1444,12 @@ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -1545,6 +1563,48 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1582,6 +1642,12 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -1629,6 +1695,15 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -1667,6 +1742,12 @@ } } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -1694,6 +1775,12 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -1705,12 +1792,111 @@ "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.11.5.tgz", "integrity": "sha512-XNtCsMAeAH1pdLMEg1z8/Bb3a8cdCbui9QbJATRFHHHW5kT6+NPI3zSVQUXgikTFITzsg+kYY5NTWhM2Orwt9w==" }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "autoprefixer": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.3.tgz", + "integrity": "sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==", + "dev": true, + "requires": { + "browserslist": "^4.8.0", + "caniuse-lite": "^1.0.30001012", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.23", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "browserslist": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", + "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001015", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.42" + } + }, + "caniuse-lite": { + "version": "1.0.30001016", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz", + "integrity": "sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.322", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", + "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", + "dev": true + }, + "node-releases": { + "version": "1.1.42", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.42.tgz", + "integrity": "sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "postcss": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.25.tgz", + "integrity": "sha512-NXXVvWq9icrm/TgQC0O6YVFi4StfJz46M1iNd/h6B26Nvh/HKI+q4YZtFN/EjcInZliEscO/WL10BXnc1E5nwg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", + "dev": true + }, "axobject-query": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.1.tgz", @@ -1863,6 +2049,15 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -1875,6 +2070,15 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", @@ -2181,6 +2385,30 @@ "unset-value": "^1.0.0" } }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -2197,12 +2425,36 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, "caniuse-lite": { "version": "1.0.30001006", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz", "integrity": "sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2342,6 +2594,23 @@ } } }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "coa": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", @@ -2382,6 +2651,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -2522,6 +2800,12 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -2633,6 +2917,30 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -2680,6 +2988,16 @@ "object-assign": "^4.1.1" } }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -2708,6 +3026,44 @@ "component-classes": "^1.2.5" } }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, "css-loader": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.0.tgz", @@ -2728,6 +3084,15 @@ "schema-utils": "^2.0.0" } }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -2770,6 +3135,12 @@ "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "dev": true + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2790,6 +3161,15 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.7.tgz", "integrity": "sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==" }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -2802,6 +3182,15 @@ "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -2950,6 +3339,18 @@ "rimraf": "^2.6.3" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -3194,6 +3595,16 @@ } } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3839,6 +4250,12 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -3925,6 +4342,12 @@ } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -4060,6 +4483,12 @@ "resolve-dir": "^1.0.1" } }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -4128,6 +4557,23 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -4789,6 +5235,18 @@ } } }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4801,10 +5259,63 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, "get-value": { @@ -4813,6 +5324,15 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", @@ -4909,6 +5429,17 @@ } } }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -4931,6 +5462,22 @@ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4940,6 +5487,15 @@ "function-bind": "^1.1.1" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -4951,6 +5507,12 @@ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -5248,6 +5810,17 @@ "micromatch": "^3.1.10" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -5283,11 +5856,46 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, "immutable": { "version": "3.7.6", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -5304,6 +5912,21 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -5490,6 +6113,12 @@ } } }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -5502,6 +6131,15 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -5595,6 +6233,18 @@ "has-symbols": "^1.0.0" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5633,6 +6283,18 @@ "whatwg-fetch": ">=0.10.0" } }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "dev": true + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -5654,6 +6316,12 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -5665,12 +6333,24 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, "json2mq": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", @@ -5717,6 +6397,18 @@ } } }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "jsx-ast-utils": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", @@ -5748,6 +6440,43 @@ "invert-kv": "^2.0.0" } }, + "less": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz", + "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + } + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -5811,6 +6540,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -5828,6 +6563,25 @@ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, "lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -5853,12 +6607,32 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", "dev": true }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -5890,6 +6664,12 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -5975,6 +6755,105 @@ } } }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -6205,8 +7084,7 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true + "dev": true }, "nanomatch": { "version": "1.2.13", @@ -6269,6 +7147,34 @@ "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", "dev": true }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -6357,25 +7263,92 @@ } } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node-sass": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", + "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", @@ -6384,6 +7357,18 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -6393,12 +7378,24 @@ "boolbase": "~1.0.0" } }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6591,6 +7588,12 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -6641,6 +7644,22 @@ } } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -6968,6 +7987,304 @@ } } }, + "postcss-attribute-case-insensitive": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz", + "integrity": "sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dev": true, + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-initial": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "dev": true, + "requires": { + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, "postcss-modules-extract-imports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", @@ -7009,6 +8326,146 @@ "postcss": "^7.0.6" } }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dev": true, + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, "postcss-selector-parser": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", @@ -7026,6 +8483,17 @@ "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", "dev": true }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", @@ -7094,6 +8562,18 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", + "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==", + "dev": true + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -7980,6 +9460,16 @@ } } }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, "redux": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", @@ -8122,6 +9612,51 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8175,103 +9710,342 @@ "dependencies": { "global-modules": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rmc-feedback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rmc-feedback/-/rmc-feedback-2.0.0.tgz", + "integrity": "sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.5" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" } } } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rmc-feedback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rmc-feedback/-/rmc-feedback-2.0.0.tgz", - "integrity": "sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ==", - "requires": { - "babel-runtime": "6.x", - "classnames": "^2.2.5" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "sass-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", + "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", "dev": true, "requires": { - "ret": "~0.1.10" + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -8297,6 +10071,27 @@ "ajv-keywords": "^3.4.1" } }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -8488,6 +10283,15 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, "shallow-equal": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.0.tgz", @@ -8807,6 +10611,23 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -8849,6 +10670,47 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -9042,6 +10904,15 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, "style-loader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", @@ -9122,6 +10993,17 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, "terser": { "version": "4.3.9", "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz", @@ -9319,6 +11201,39 @@ "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", "dev": true }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -9340,6 +11255,21 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -9652,6 +11582,17 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "vm-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", @@ -10041,6 +11982,15 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -10116,6 +12066,12 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, "yargs": { "version": "13.2.4", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", diff --git a/cvat-ui/package.json b/cvat-ui/package.json index 33b41f0801d2..eb3ca983d9ee 100644 --- a/cvat-ui/package.json +++ b/cvat-ui/package.json @@ -25,7 +25,13 @@ "eslint-plugin-react": "^7.17.0", "eslint-plugin-react-hooks": "^1.7.0", "html-webpack-plugin": "^3.2.0", + "less": "^3.10.3", + "less-loader": "^5.0.0", + "node-sass": "^4.13.0", + "postcss-loader": "^3.0.0", + "postcss-preset-env": "^6.7.0", "react-svg-loader": "^3.0.3", + "sass-loader": "^8.0.0", "style-loader": "^1.0.0", "typescript": "^3.7.3", "webpack": "^4.41.2", diff --git a/cvat-ui/postcss.config.js b/cvat-ui/postcss.config.js new file mode 100644 index 000000000000..543f8754145b --- /dev/null +++ b/cvat-ui/postcss.config.js @@ -0,0 +1,9 @@ +/* eslint-disable */ +module.exports = { + parser: false, + plugins: { + 'postcss-preset-env': { + browsers: '> 2%', // https://github.com/browserslist/browserslist + }, + }, +}; diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/objects-side-bar.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/objects-side-bar.tsx index 78e0b4ae0f7b..8a7645512170 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/objects-side-bar.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/objects-side-bar.tsx @@ -36,11 +36,15 @@ export default class StandardWorkspaceComponent extends React.PureComponent<{}, ant-layout-sider-zero-width-trigger ant-layout-sider-zero-width-trigger-left`} onClick={ - (): void => this.setState({ collapsed: !collapsed }) + (): void => this.setState( + (prevState: State): State => ({ + collapsed: !prevState.collapsed, + }), + ) } > - {collapsed && } - {!collapsed && } + {collapsed ? + : } Right sidebar diff --git a/cvat-ui/src/components/cvat-app.tsx b/cvat-ui/src/components/cvat-app.tsx index 8ec464a26e0b..c0ed7ed8a14e 100644 --- a/cvat-ui/src/components/cvat-app.tsx +++ b/cvat-ui/src/components/cvat-app.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import 'antd/dist/antd.css'; -import '../stylesheet.css'; +import 'antd/dist/antd.less'; +import '../stylesheet.scss'; import { BrowserRouter } from 'react-router-dom'; import { Switch, diff --git a/cvat-ui/src/stylesheet.css b/cvat-ui/src/stylesheet.scss similarity index 72% rename from cvat-ui/src/stylesheet.css rename to cvat-ui/src/stylesheet.scss index 5fed0d58e168..b08ca57c3a37 100644 --- a/cvat-ui/src/stylesheet.css +++ b/cvat-ui/src/stylesheet.scss @@ -6,8 +6,6 @@ hr { } .cvat-header.ant-layout-header { - display: -webkit-box; - display: -ms-flexbox; display: flex; padding-left: 0px; padding-right: 0px; @@ -18,40 +16,24 @@ hr { .cvat-left-header { width: 50%; - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + justify-content: flex-start; + align-items: center; } .cvat-right-header { width: 50%; - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + justify-content: flex-end; + align-items: center; } .cvat-flex { - display: -webkit-box; - display: -ms-flexbox; display: flex; } .cvat-flex-center { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + align-items: center; } .cvat-black-color { @@ -70,9 +52,7 @@ hr { } .anticon.cvat-logo-icon > svg { - -webkit-transform: scale(0.7); - -ms-transform: scale(0.7); - transform: scale(0.7); + transform: scale(0.7); } .ant-btn.cvat-header-button { @@ -83,20 +63,14 @@ hr { .ant-dropdown-trigger.cvat-header-menu-dropdown { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + align-items: center; border-left: 1px solid #c3c3c3; padding: 0px 20px; } .anticon.cvat-header-account-icon > svg { - -webkit-transform: scale(0.4); - -ms-transform: scale(0.4); - transform: scale(0.4); + transform: scale(0.4); } .anticon.cvat-header-menu-icon { @@ -124,18 +98,12 @@ hr { } .cvat-tasks-page > div:nth-child(2) > div:nth-child(1) { - display: -webkit-box; - display: -ms-flexbox; display: flex; } .cvat-tasks-page > div:nth-child(2) > div:nth-child(2) { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; + justify-content: flex-end; } .cvat-tasks-page > div:nth-child(2) > div:nth-child(1) > span:nth-child(2) { @@ -144,10 +112,7 @@ hr { } .cvat-tasks-page > span.ant-typography { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + user-select: none; } .cvat-tasks-page { @@ -204,12 +169,8 @@ hr { } .ant-pagination.cvat-tasks-pagination { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; + justify-content: center; } .cvat-task-list { @@ -245,12 +206,8 @@ hr { } .cvat-tasks-list-item > div:nth-child(4) > div:nth-child(2) > div { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + align-items: center; } .cvat-task-item-menu-icon > img { @@ -258,13 +215,11 @@ hr { } .cvat-task-item-menu-icon > img:hover { - -webkit-filter: invert(0.5); - filter: invert(0.5); + filter: invert(0.5); } .ant-menu.cvat-actions-menu { - -webkit-box-shadow: 0 0 17px rgba(0,0,0,0.2); - box-shadow: 0 0 17px rgba(0,0,0,0.2); + box-shadow: 0 0 17px rgba(0,0,0,0.2); } .cvat-actions-menu > hr { @@ -309,12 +264,8 @@ hr { } .cvat-task-item-preview-wrapper { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; + justify-content: center; overflow: hidden; margin: 20px; margin-top: 0px; @@ -373,10 +324,7 @@ hr { } .cvat-dataset-repository-url > .ant-tag-red { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + user-select: none; opacity: 0.4; } @@ -399,8 +347,6 @@ hr { } .cvat-task-job-list > div:nth-child(1) > div:nth-child(1) { - display: -webkit-box; - display: -ms-flexbox; display: flex; } @@ -415,12 +361,8 @@ hr { } .cvat-task-preview-wrapper { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: start; + justify-content: flex-start; overflow: hidden; margin-bottom: 20px; } @@ -436,8 +378,7 @@ hr { textarea.ant-input.cvat-raw-labels-viewer { border-color: #d9d9d9; - -webkit-box-shadow: none; - box-shadow: none; + box-shadow: none; border-top: none; border-radius: 0px 0px 5px 5px; min-height: 9em; @@ -446,50 +387,35 @@ textarea.ant-input.cvat-raw-labels-viewer { .cvat-raw-labels-viewer:focus { border-color: #d9d9d9; - -webkit-box-shadow: none; - box-shadow: none; + box-shadow: none; } .cvat-raw-labels-viewer:hover { border-color: #d9d9d9; - -webkit-box-shadow: none; - box-shadow: none; + box-shadow: none; } .cvat-constructor-viewer { border: 1px solid #d9d9d9; - -webkit-box-shadow: none; - box-shadow: none; + box-shadow: none; border-top: none; border-radius: 0px 0px 5px 5px; padding: 5px; - display: -webkit-box; - display: -ms-flexbox; display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; overflow-y: auto; min-height: 9em; + flex-wrap: wrap; } .cvat-constructor-viewer-item { - height: -webkit-fit-content; - height: -moz-fit-content; height: fit-content; - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + align-items: center; padding: 2px 10px; border-radius: 2px; margin: 2px; margin-left: 8px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + user-select: none; border: 1px solid rgba(0, 0, 0, 0); opacity: 0.6; } @@ -509,23 +435,14 @@ textarea.ant-input.cvat-raw-labels-viewer { } .cvat-constructor-viewer-new-item { - height: -webkit-fit-content; - height: -moz-fit-content; height: fit-content; - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + align-items: center; padding: 2px 10px; border-radius: 2px; margin: 2px; margin-left: 8px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + user-select: none; opacity: 1; } @@ -615,8 +532,6 @@ textarea.ant-input.cvat-raw-labels-viewer { } .cvat-share-tree { - height: -webkit-fit-content; - height: -moz-fit-content; height: fit-content; min-height: 10em; max-height: 20em; @@ -634,18 +549,12 @@ textarea.ant-input.cvat-raw-labels-viewer { } .cvat-models-page > div:nth-child(1) > div:nth-child(1) { - display: -webkit-box; - display: -ms-flexbox; display: flex; } .cvat-models-page > div:nth-child(1) > div:nth-child(2) { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; + justify-content: flex-end; } /* empty-models icon */ @@ -688,32 +597,24 @@ textarea.ant-input.cvat-raw-labels-viewer { } .cvat-models-list-item > div { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + align-items: center; } .cvat-models-list-item > div:nth-child(2) > span { - -o-text-overflow: ellipsis; - text-overflow: ellipsis; + text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } .cvat-models-list-item > div:nth-child(3) > span { - -o-text-overflow: ellipsis; - text-overflow: ellipsis; + text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } .cvat-menu-icon { - -webkit-transform: scale(0.5); - -ms-transform: scale(0.5); - transform: scale(0.5); + transform: scale(0.5); } .cvat-create-model-form-wrapper { @@ -770,7 +671,6 @@ textarea.ant-input.cvat-raw-labels-viewer { width: 100%; height: 100%; min-height: 100%; - display: -ms-grid; display: grid; } @@ -807,8 +707,7 @@ textarea.ant-input.cvat-raw-labels-viewer { } .cvat-annotation-header-left-group > div:first-child { - -webkit-filter: invert(0.9); - filter: invert(0.9); + filter: invert(0.9); background: white; border-radius: 0px; width: 70px; @@ -824,22 +723,16 @@ textarea.ant-input.cvat-raw-labels-viewer { } .cvat-annotation-header-left-group > div > i { - -webkit-transform: scale(0.8); - -ms-transform: scale(0.8); - transform: scale(0.8); + transform: scale(0.8); padding: 3px; } .cvat-annotation-header-left-group > div:hover > i { - -webkit-transform: scale(0.9); - -ms-transform: scale(0.9); - transform: scale(0.9); + transform: scale(0.9); } .cvat-annotation-header-left-group > div:active > i { - -webkit-transform: scale(0.8); - -ms-transform: scale(0.8); - transform: scale(0.8); + transform: scale(0.8); } .cvat-annotation-header-player-group > div { @@ -847,33 +740,23 @@ textarea.ant-input.cvat-raw-labels-viewer { } .cvat-annotation-header-player-buttons { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + align-items: center; position: relative; height: 100%; margin-right: 10px; } .cvat-annotation-header-player-buttons > i { - -webkit-transform: scale(0.6); - -ms-transform: scale(0.6); - transform: scale(0.6); + transform: scale(0.6); } .cvat-annotation-header-player-buttons > i:hover { - -webkit-transform: scale(0.7); - -ms-transform: scale(0.7); - transform: scale(0.7); + transform: scale(0.7); } .cvat-annotation-header-player-buttons > i:active { - -webkit-transform: scale(0.6); - -ms-transform: scale(0.6); - transform: scale(0.6); + transform: scale(0.6); } .cvat-annotation-header-player-controls { @@ -898,8 +781,7 @@ textarea.ant-input.cvat-raw-labels-viewer { .cvat-annotation-header-filename-wrapper { max-width: 180px; overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; + text-overflow: ellipsis; } .cvat-annotation-header-frame-selector { @@ -928,22 +810,16 @@ textarea.ant-input.cvat-raw-labels-viewer { } .cvat-annotation-header-right-group > div > i { - -webkit-transform: scale(0.8); - -ms-transform: scale(0.8); - transform: scale(0.8); + transform: scale(0.8); padding: 3px; } .cvat-annotation-header-right-group > div:hover > i { - -webkit-transform: scale(0.9); - -ms-transform: scale(0.9); - transform: scale(0.9); + transform: scale(0.9); } .cvat-annotation-header-right-group > div:active > i { - -webkit-transform: scale(0.8); - -ms-transform: scale(0.8); - transform: scale(0.8); + transform: scale(0.8); } .cvat-annotation-header-workspace-selector { @@ -973,17 +849,13 @@ textarea.ant-input.cvat-raw-labels-viewer { .cvat-annotation-page-controls-sidebar > div > i { border-radius: 3.3px; - -webkit-transform: scale(0.65); - -ms-transform: scale(0.65); - transform: scale(0.65); + transform: scale(0.65); padding: 2px; } .cvat-annotation-page-controls-sidebar > div > i:hover { background: #D8D8D8; - -webkit-transform: scale(0.75); - -ms-transform: scale(0.75); - transform: scale(0.75); + transform: scale(0.75); } .cvat-annotation-page-controls-sidebar > div > i:active { @@ -991,7 +863,5 @@ textarea.ant-input.cvat-raw-labels-viewer { } .cvat-annotation-page-controls-sidebar > div > i > svg { - -webkit-transform: scale(0.8); - -ms-transform: scale(0.8); - transform: scale(0.8); + transform: scale(0.8); } diff --git a/cvat-ui/webpack.config.js b/cvat-ui/webpack.config.js index 0dcde962a173..ba1e2dbb6503 100644 --- a/cvat-ui/webpack.config.js +++ b/cvat-ui/webpack.config.js @@ -39,9 +39,7 @@ module.exports = { }]], presets: [ ['@babel/preset-env', { - targets: { - chrome: 58, - }, + targets: '> 3%', // https://github.com/browserslist/browserslist }], ['@babel/preset-react'], ['@babel/typescript'], @@ -50,8 +48,22 @@ module.exports = { }, }, }, { - test: /\.(css|sass)$/, - use: ['style-loader', 'css-loader'] + test: /node_modules\/antd\/[\w\/]*.less$/, + use: ['style-loader', 'css-loader', { + loader: 'less-loader', + options: { + javascriptEnabled: true, + }, + }] + }, { + test: /\.(css|scss)$/, + exclude: /node_modules/, + use: ['style-loader', { + loader: 'css-loader', + options: { + importLoaders: 2, + }, + }, 'postcss-loader', 'sass-loader'] }, { test: /\.svg$/, exclude: /node_modules/, From c84daaf2ef245df3fa875a7681a7d9fd8490b814 Mon Sep 17 00:00:00 2001 From: zhiltsov-max Date: Tue, 17 Dec 2019 22:03:16 +0300 Subject: [PATCH 03/14] [Datumaro] VOC labelmap support (#957) * Add import result checks and options to skip * Add label-specific attributes * Overwrite option for export * Add labelmap file support in voc * Add labelmap tests * Little refactoring --- datumaro/datumaro/cli/project/__init__.py | 14 +- datumaro/datumaro/cli/source/__init__.py | 24 +- .../datumaro/components/converters/voc.py | 246 +++++++++++++----- datumaro/datumaro/components/extractor.py | 18 +- .../datumaro/components/extractors/voc.py | 179 ++++++------- datumaro/datumaro/components/formats/voc.py | 106 +++++++- datumaro/datumaro/util/mask_tools.py | 10 + datumaro/tests/test_voc_format.py | 199 +++++++++++--- 8 files changed, 576 insertions(+), 220 deletions(-) diff --git a/datumaro/datumaro/cli/project/__init__.py b/datumaro/datumaro/cli/project/__init__.py index bd43a72db51c..05e222ab77ba 100644 --- a/datumaro/datumaro/cli/project/__init__.py +++ b/datumaro/datumaro/cli/project/__init__.py @@ -68,6 +68,8 @@ def build_import_parser(parser): help="Overwrite existing files in the save directory") parser.add_argument('--copy', action='store_true', help="Copy the dataset instead of saving source links") + parser.add_argument('--skip-check', action='store_true', + help="Skip source checking") # parser.add_argument('extra_args', nargs=argparse.REMAINDER, # help="Additional arguments for importer (pass '-- -h' for help)") return parser @@ -99,7 +101,9 @@ def import_command(args): project.config.project_name = project_name project.config.project_dir = project_dir - dataset = project.make_dataset() + if not args.skip_check or args.copy: + log.info("Checking the dataset...") + dataset = project.make_dataset() if args.copy: log.info("Cloning data...") dataset.save(merge=True, save_images=True) @@ -127,6 +131,8 @@ def build_export_parser(parser): help="Output format") parser.add_argument('-p', '--project', dest='project_dir', default='.', help="Directory of the project to operate on (default: current dir)") + parser.add_argument('--overwrite', action='store_true', + help="Overwrite existing files in the save directory") parser.add_argument('extra_args', nargs=argparse.REMAINDER, default=None, help="Additional arguments for converter (pass '-- -h' for help)") return parser @@ -135,7 +141,11 @@ def export_command(args): project = load_project(args.project_dir) dst_dir = osp.abspath(args.dst_dir) - os.makedirs(dst_dir, exist_ok=False) + if not args.overwrite and osp.isdir(dst_dir) and os.listdir(dst_dir): + log.error("Directory '%s' already exists " + "(pass --overwrite to force creation)" % dst_dir) + return 1 + os.makedirs(dst_dir, exist_ok=args.overwrite) project.make_dataset().export( save_dir=dst_dir, diff --git a/datumaro/datumaro/cli/source/__init__.py b/datumaro/datumaro/cli/source/__init__.py index 605d222b2131..61c5b49c933f 100644 --- a/datumaro/datumaro/cli/source/__init__.py +++ b/datumaro/datumaro/cli/source/__init__.py @@ -62,14 +62,16 @@ def build_import_parser(parser): dir_parser.add_argument('url', help="Path to the source directory") dir_parser.add_argument('--copy', action='store_true', - help="Copy data to the project") + help="Copy the dataset instead of saving source links") + parser.add_argument('-n', '--name', default=None, + help="Name of the new source") parser.add_argument('-f', '--format', default=None, help="Name of the source dataset format (default: 'project')") - parser.add_argument('-n', '--name', default=None, - help="Name of the source to be imported") parser.add_argument('-p', '--project', dest='project_dir', default='.', help="Directory of the project to operate on (default: current dir)") + parser.add_argument('--skip-check', action='store_true', + help="Skip source checking") return parser def import_command(args): @@ -99,6 +101,10 @@ def import_command(args): if args.format: source['format'] = args.format project.add_source(name, source) + + if not args.skip_check: + log.info("Checking the source...") + project.make_source_project(name) project.save() log.info("Source '%s' has been added to the project, location: '%s'" \ @@ -131,6 +137,10 @@ def import_command(args): if args.format: source['format'] = args.format project.add_source(name, source) + + if not args.skip_check: + log.info("Checking the source...") + project.make_source_project(name) project.save() log.info("Source '%s' has been added to the project, location: '%s'" \ @@ -184,6 +194,8 @@ def build_export_parser(parser): help="Output format") parser.add_argument('-p', '--project', dest='project_dir', default='.', help="Directory of the project to operate on (default: current dir)") + parser.add_argument('--overwrite', action='store_true', + help="Overwrite existing files in the save directory") parser.add_argument('extra_args', nargs=argparse.REMAINDER, default=None, help="Additional arguments for converter (pass '-- -h' for help)") return parser @@ -192,7 +204,11 @@ def export_command(args): project = load_project(args.project_dir) dst_dir = osp.abspath(args.dst_dir) - os.makedirs(dst_dir, exist_ok=False) + if not args.overwrite and osp.isdir(dst_dir) and os.listdir(dst_dir): + log.error("Directory '%s' already exists " + "(pass --overwrite to force creation)" % dst_dir) + return 1 + os.makedirs(dst_dir, exist_ok=args.overwrite) source_project = project.make_source_project(args.name) source_project.make_dataset().export( diff --git a/datumaro/datumaro/components/converters/voc.py b/datumaro/datumaro/components/converters/voc.py index d8ba98cf37ab..810036786119 100644 --- a/datumaro/datumaro/components/converters/voc.py +++ b/datumaro/datumaro/components/converters/voc.py @@ -4,18 +4,23 @@ # SPDX-License-Identifier: MIT from collections import OrderedDict, defaultdict +from enum import Enum +from itertools import chain import logging as log from lxml import etree as ET import os import os.path as osp from datumaro.components.converter import Converter -from datumaro.components.extractor import DEFAULT_SUBSET_NAME, AnnotationType -from datumaro.components.formats.voc import VocLabel, VocAction, \ - VocBodyPart, VocPose, VocTask, VocPath, VocColormap, VocInstColormap -from datumaro.util import find +from datumaro.components.extractor import (DEFAULT_SUBSET_NAME, AnnotationType, + LabelCategories +) +from datumaro.components.formats.voc import (VocTask, VocPath, + VocInstColormap, VocPose, + parse_label_map, make_voc_label_map, make_voc_categories, write_label_map +) from datumaro.util.image import save_image -from datumaro.util.mask_tools import apply_colormap +from datumaro.util.mask_tools import apply_colormap, remap_mask def _write_xml_bbox(bbox, parent_elem): @@ -27,13 +32,12 @@ def _write_xml_bbox(bbox, parent_elem): ET.SubElement(bbox_elem, 'ymax').text = str(y + h) return bbox_elem -class _Converter: - _LABELS = set([entry.name for entry in VocLabel]) - _BODY_PARTS = set([entry.name for entry in VocBodyPart]) - _ACTIONS = set([entry.name for entry in VocAction]) +LabelmapType = Enum('LabelmapType', ['voc', 'source', 'guess']) + +class _Converter: def __init__(self, extractor, save_dir, - tasks=None, apply_colormap=True, save_images=False): + tasks=None, apply_colormap=True, save_images=False, label_map=None): assert tasks is None or isinstance(tasks, (VocTask, list)) if tasks is None: tasks = list(VocTask) @@ -49,14 +53,12 @@ def __init__(self, extractor, save_dir, self._apply_colormap = apply_colormap self._save_images = save_images - self._label_categories = extractor.categories() \ - .get(AnnotationType.label) - self._mask_categories = extractor.categories() \ - .get(AnnotationType.mask) + self._load_categories(label_map) def convert(self): self.init_dirs() self.save_subsets() + self.save_label_map() def init_dirs(self): save_dir = self._save_dir @@ -94,7 +96,8 @@ def init_dirs(self): self._images_dir = images_dir def get_label(self, label_id): - return self._label_categories.items[label_id].name + return self._extractor.categories()[AnnotationType.label] \ + .items[label_id].name def save_subsets(self): subsets = self._extractor.subsets() @@ -167,56 +170,64 @@ def save_subsets(self): layout_bboxes = [] for bbox in bboxes: label = self.get_label(bbox.label) - if label in self._LABELS: - main_bboxes.append(bbox) - elif label in self._BODY_PARTS: + if self._is_part(label): layout_bboxes.append(bbox) + elif self._is_label(label): + main_bboxes.append(bbox) for new_obj_id, obj in enumerate(main_bboxes): attr = obj.attributes obj_elem = ET.SubElement(root_elem, 'object') - ET.SubElement(obj_elem, 'name').text = self.get_label(obj.label) + + obj_label = self.get_label(obj.label) + ET.SubElement(obj_elem, 'name').text = obj_label pose = attr.get('pose') if pose is not None: - ET.SubElement(obj_elem, 'pose').text = VocPose[pose].name + pose = VocPose[pose] + else: + pose = VocPose.Unspecified + ET.SubElement(obj_elem, 'pose').text = pose.name truncated = attr.get('truncated') if truncated is not None: - ET.SubElement(obj_elem, 'truncated').text = '%d' % truncated + truncated = int(truncated) + else: + truncated = 0 + ET.SubElement(obj_elem, 'truncated').text = '%d' % truncated difficult = attr.get('difficult') if difficult is not None: - ET.SubElement(obj_elem, 'difficult').text = '%d' % difficult + difficult = int(difficult) + else: + difficult = 0 + ET.SubElement(obj_elem, 'difficult').text = '%d' % difficult bbox = obj.get_bbox() if bbox is not None: _write_xml_bbox(bbox, obj_elem) - for part in VocBodyPart: - part_bbox = find(layout_bboxes, lambda x: \ - obj.id == x.group and \ - self.get_label(x.label) == part.name) - if part_bbox is not None: - part_elem = ET.SubElement(obj_elem, 'part') - ET.SubElement(part_elem, 'name').text = part.name - _write_xml_bbox(part_bbox.get_bbox(), part_elem) + for part_bbox in filter(lambda x: obj.id == x.group, + layout_bboxes): + part_elem = ET.SubElement(obj_elem, 'part') + ET.SubElement(part_elem, 'name').text = \ + self.get_label(part_bbox.label) + _write_xml_bbox(part_bbox.get_bbox(), part_elem) - objects_with_parts.append(new_obj_id) + objects_with_parts.append(new_obj_id) - actions = [x for x in labels - if obj.id == x.group and \ - self.get_label(x.label) in self._ACTIONS] - if len(actions) != 0: - actions_elem = ET.SubElement(obj_elem, 'actions') - for action in VocAction: - presented = find(actions, lambda x: \ - self.get_label(x.label) == action.name) is not None - ET.SubElement(actions_elem, action.name).text = \ - '%d' % presented + actions = {k: v for k, v in obj.attributes.items() + if self._is_action(obj_label, k)} + actions_elem = ET.Element('actions') + for action in self._get_actions(obj_label): + presented = action in actions and actions[action] + ET.SubElement(actions_elem, action).text = \ + '%d' % presented - objects_with_actions[new_obj_id][action] = presented + objects_with_actions[new_obj_id][action] = presented + if len(actions) != 0: + obj_elem.append(actions_elem) if set(self._tasks) & set([None, VocTask.detection, @@ -232,7 +243,7 @@ def save_subsets(self): for label_obj in labels: label = self.get_label(label_obj.label) - if label not in self._LABELS: + if not self._is_label(label): continue class_list = class_lists.get(item_id, set()) class_list.add(label_obj.label) @@ -244,7 +255,7 @@ def save_subsets(self): if mask_obj.attributes.get('class') == True: self.save_segm(osp.join(self._segm_dir, item_id + VocPath.SEGM_EXT), - mask_obj, self._mask_categories.colormap) + mask_obj) if mask_obj.attributes.get('instances') == True: self.save_segm(osp.join(self._inst_dir, item_id + VocPath.SEGM_EXT), @@ -284,9 +295,11 @@ def save_action_lists(self, subset_name, action_list): if len(action_list) == 0: return - for action in VocAction: + all_actions = set(chain(*(self._get_actions(l) + for l in self._label_map))) + for action in all_actions: ann_file = osp.join(self._action_subsets_dir, - '%s_%s.txt' % (action.name, subset_name)) + '%s_%s.txt' % (action, subset_name)) with open(ann_file, 'w') as f: for item, objs in action_list.items(): if not objs: @@ -302,23 +315,17 @@ def save_class_lists(self, subset_name, class_lists): if len(class_lists) == 0: return - label_cat = self._extractor.categories().get(AnnotationType.label, None) - if not label_cat: - log.warn("Unable to save classification task lists " - "as source does not provide class labels. Skipped.") - return - - for label in VocLabel: + for label in self._label_map: ann_file = osp.join(self._cls_subsets_dir, - '%s_%s.txt' % (label.name, subset_name)) + '%s_%s.txt' % (label, subset_name)) with open(ann_file, 'w') as f: for item, item_labels in class_lists.items(): if not item_labels: continue - item_labels = [label_cat.items[l].name for l in item_labels] - presented = label.name in item_labels - f.write('%s % d\n' % \ - (item, 1 if presented else -1)) + item_labels = [self._strip_label(self.get_label(l)) + for l in item_labels] + presented = label in item_labels + f.write('%s % d\n' % (item, 1 if presented else -1)) def save_clsdet_lists(self, subset_name, clsdet_list): os.makedirs(self._cls_subsets_dir, exist_ok=True) @@ -348,17 +355,124 @@ def save_layout_lists(self, subset_name, layout_list): else: f.write('%s\n' % (item)) - def save_segm(self, path, annotation, colormap): + def save_segm(self, path, annotation, colormap=None): data = annotation.image if self._apply_colormap: if colormap is None: - colormap = VocColormap + colormap = self._categories[AnnotationType.mask].colormap + data = self._remap_mask(data) data = apply_colormap(data, colormap) save_image(path, data) + def save_label_map(self): + path = osp.join(self._save_dir, VocPath.LABELMAP_FILE) + write_label_map(path, self._label_map) + + @staticmethod + def _strip_label(label): + return label.lower().strip() + + def _load_categories(self, label_map_source=None): + if label_map_source == LabelmapType.voc.name: + # strictly use VOC default labelmap + label_map = make_voc_label_map() + + elif label_map_source == LabelmapType.source.name: + # generate colormap from the input dataset + labels = self._extractor.categories() \ + .get(AnnotationType.label, LabelCategories()) + label_map = OrderedDict( + (item.name, [None, [], []]) for item in labels.items) + + elif label_map_source in [LabelmapType.guess.name, None]: + # generate colormap for union of VOC and input dataset labels + label_map = make_voc_label_map() + + rebuild_colormap = False + source_labels = self._extractor.categories() \ + .get(AnnotationType.label, LabelCategories()) + for label in source_labels.items: + label_name = self._strip_label(label.name) + if label_name not in label_map: + rebuild_colormap = True + if label.attributes or label_name not in label_map: + label_map[label_name] = [None, [], label.attributes] + + if rebuild_colormap: + for item in label_map.values(): + item[0] = None + + elif isinstance(label_map_source, dict): + label_map = label_map_source + + elif isinstance(label_map_source, str) and osp.isfile(label_map_source): + label_map = parse_label_map(label_map_source) + + else: + raise Exception("Wrong labelmap specified, " + "expected one of %s or a file path" % \ + ', '.join(t.name for t in LabelmapType)) + + self._categories = make_voc_categories(label_map) + + self._label_map = label_map + colormap = self._categories[AnnotationType.mask].colormap + for label_id, color in colormap.items(): + label_desc = label_map[ + self._categories[AnnotationType.label].items[label_id].name] + label_desc[0] = color + + self._label_id_mapping = self._make_label_id_map() + + def _is_label(self, s): + return self._label_map.get(self._strip_label(s)) is not None + + def _is_part(self, s): + s = self._strip_label(s) + for label_desc in self._label_map.values(): + if s in label_desc[1]: + return True + return False + + def _is_action(self, label, s): + return self._strip_label(s) in self._get_actions(label) + + def _get_actions(self, label): + label_desc = self._label_map.get(self._strip_label(label)) + if not label_desc: + return [] + return label_desc[2] + + def _make_label_id_map(self): + source_labels = { + id: label.name for id, label in + enumerate(self._extractor.categories()[AnnotationType.label].items) + } + target_labels = { + label.name: id for id, label in + enumerate(self._categories[AnnotationType.label].items) + } + id_mapping = { + src_id: target_labels.get(src_label, 0) + for src_id, src_label in source_labels.items() + } + + void_labels = [src_label for src_id, src_label in source_labels.items() + if src_label not in target_labels] + if void_labels: + log.warn("The following labels are remapped to background: %s" % + ', '.join(void_labels)) + + def map_id(src_id): + return id_mapping[src_id] + return map_id + + def _remap_mask(self, mask): + return remap_mask(mask, self._label_id_mapping) + class VocConverter(Converter): def __init__(self, - tasks=None, save_images=False, apply_colormap=False, + tasks=None, save_images=False, apply_colormap=False, label_map=None, cmdline_args=None): super().__init__() @@ -366,6 +480,7 @@ def __init__(self, 'tasks': tasks, 'save_images': save_images, 'apply_colormap': apply_colormap, + 'label_map': label_map, } if cmdline_args is not None: @@ -375,6 +490,12 @@ def __init__(self, def _split_tasks_string(s): return [VocTask[i.strip()] for i in s.split(',')] + @staticmethod + def _get_labelmap(s): + if osp.isfile(s): + return s + return LabelmapType[s].name + @classmethod def build_cmdline_parser(cls, parser=None): import argparse @@ -386,6 +507,9 @@ def build_cmdline_parser(cls, parser=None): parser.add_argument('--apply-colormap', type=bool, default=True, help="Use colormap for class and instance masks " "(default: %(default)s)") + parser.add_argument('--label-map', type=cls._get_labelmap, default=None, + help="Labelmap file path or one of %s" % \ + ', '.join(t.name for t in LabelmapType)) parser.add_argument('--tasks', type=cls._split_tasks_string, default=None, help="VOC task filter, comma-separated list of {%s} " diff --git a/datumaro/datumaro/components/extractor.py b/datumaro/datumaro/components/extractor.py index bf73a9f05af9..31d416449836 100644 --- a/datumaro/datumaro/components/extractor.py +++ b/datumaro/datumaro/components/extractor.py @@ -53,6 +53,11 @@ class Categories: def __init__(self, attributes=None): if attributes is None: attributes = set() + else: + if not isinstance(attributes, set): + attributes = set(attributes) + for attr in attributes: + assert isinstance(attr, str) self.attributes = attributes def __eq__(self, other): @@ -62,7 +67,7 @@ def __eq__(self, other): (self.attributes == other.attributes) class LabelCategories(Categories): - Category = namedtuple('Category', ['name', 'parent']) + Category = namedtuple('Category', ['name', 'parent', 'attributes']) def __init__(self, items=None, attributes=None): super().__init__(attributes=attributes) @@ -81,11 +86,18 @@ def _reindex(self): indices[item.name] = index self._indices = indices - def add(self, name, parent=None): + def add(self, name, parent=None, attributes=None): assert name not in self._indices + if attributes is None: + attributes = set() + else: + if not isinstance(attributes, set): + attributes = set(attributes) + for attr in attributes: + assert isinstance(attr, str) index = len(self.items) - self.items.append(self.Category(name, parent)) + self.items.append(self.Category(name, parent, attributes)) self._indices[name] = index def find(self, name): diff --git a/datumaro/datumaro/components/extractors/voc.py b/datumaro/datumaro/components/extractors/voc.py index fdbe7b37d178..f1ad07126c9f 100644 --- a/datumaro/datumaro/components/extractors/voc.py +++ b/datumaro/datumaro/components/extractors/voc.py @@ -4,18 +4,15 @@ # SPDX-License-Identifier: MIT from collections import defaultdict -from itertools import chain import os import os.path as osp from xml.etree import ElementTree as ET from datumaro.components.extractor import (Extractor, DatasetItem, AnnotationType, LabelObject, MaskObject, BboxObject, - LabelCategories, MaskCategories ) -from datumaro.components.formats.voc import (VocLabel, VocAction, - VocBodyPart, VocTask, VocPath, VocColormap, VocInstColormap, - VocIgnoredLabel +from datumaro.components.formats.voc import ( + VocTask, VocPath, VocInstColormap, parse_label_map, make_voc_categories ) from datumaro.util import dir_items from datumaro.util.image import lazy_image @@ -24,31 +21,6 @@ _inverse_inst_colormap = invert_colormap(VocInstColormap) -# pylint: disable=pointless-statement -def _make_voc_categories(): - categories = {} - - label_categories = LabelCategories() - for label in chain(VocLabel, VocAction, VocBodyPart): - label_categories.add(label.name) - categories[AnnotationType.label] = label_categories - - def label_id(class_index): - if class_index in [0, VocIgnoredLabel]: - return class_index - - class_label = VocLabel(class_index).name - label_id, _ = label_categories.find(class_label) - return label_id + 1 - colormap = { label_id(idx): tuple(color) \ - for idx, color in VocColormap.items() } - mask_categories = MaskCategories(colormap) - mask_categories.inverse_colormap # force init - categories[AnnotationType.mask] = mask_categories - - return categories -# pylint: enable=pointless-statement - class VocExtractor(Extractor): class Subset(Extractor): def __init__(self, name, parent): @@ -58,8 +30,8 @@ def __init__(self, name, parent): self.items = [] def __iter__(self): - for item in self.items: - yield self._parent._get(item, self._name) + for item_id in self.items: + yield self._parent._get(item_id, self._name) def __len__(self): return len(self.items) @@ -87,10 +59,10 @@ def _load_cls_annotations(self, subsets_dir, subset_names): label_annotations = defaultdict(list) label_anno_files = [s for s in dir_files \ if '_' in s and s[s.rfind('_') + 1:] in subset_names] - for ann_file in label_anno_files: - with open(osp.join(subsets_dir, ann_file + '.txt'), 'r') as f: - label = ann_file[:ann_file.rfind('_')] - label_id = VocLabel[label].value + for ann_filename in label_anno_files: + with open(osp.join(subsets_dir, ann_filename + '.txt'), 'r') as f: + label = ann_filename[:ann_filename.rfind('_')] + label_id = self._get_label_id(label) for line in f: item, present = line.split() if present == '1': @@ -113,7 +85,11 @@ def _load_det_annotations(self): self._annotations[VocTask.detection] = det_annotations def _load_categories(self): - self._categories = _make_voc_categories() + label_map = None + label_map_path = osp.join(self._path, VocPath.LABELMAP_FILE) + if osp.isfile(label_map_path): + label_map = parse_label_map(label_map_path) + self._categories = make_voc_categories(label_map) def __init__(self, path, task): super().__init__() @@ -146,17 +122,17 @@ def __iter__(self): for item in subset: yield item - def _get(self, item, subset_name): + def _get(self, item_id, subset_name): image = None image_path = osp.join(self._path, VocPath.IMAGES_DIR, - item + VocPath.IMAGE_EXT) + item_id + VocPath.IMAGE_EXT) if osp.isfile(image_path): image = lazy_image(image_path) - annotations = self._get_annotations(item) + annotations = self._get_annotations(item_id) return DatasetItem(annotations=annotations, - id=item, subset=subset_name, image=image) + id=item_id, subset=subset_name, image=image) def _get_label_id(self, label): label_id, _ = self._categories[AnnotationType.label].find(label) @@ -187,11 +163,10 @@ def _get_annotations(self, item): cls_annotations = self._annotations.get(VocTask.classification) if cls_annotations is not None and \ - self._task is VocTask.classification: + self._task is VocTask.classification: item_labels = cls_annotations.get(item) if item_labels is not None: - for label in item_labels: - label_id = self._get_label_id(VocLabel(label).name) + for label_id in item_labels: item_annotations.append(LabelObject(label_id)) det_annotations = self._annotations.get(VocTask.detection) @@ -215,16 +190,16 @@ def _get_annotations(self, item): continue difficult_elem = object_elem.find('difficult') - if difficult_elem is not None: - attributes['difficult'] = (difficult_elem.text == '1') + attributes['difficult'] = difficult_elem is not None and \ + difficult_elem.text == '1' truncated_elem = object_elem.find('truncated') - if truncated_elem is not None: - attributes['truncated'] = (truncated_elem.text == '1') + attributes['truncated'] = truncated_elem is not None and \ + truncated_elem.text == '1' occluded_elem = object_elem.find('occluded') - if occluded_elem is not None: - attributes['occluded'] = (occluded_elem.text == '1') + attributes['occluded'] = occluded_elem is not None and \ + occluded_elem.text == '1' pose_elem = object_elem.find('pose') if pose_elem is not None: @@ -238,34 +213,34 @@ def _get_annotations(self, item): attributes['point'] = point actions_elem = object_elem.find('actions') - if actions_elem is not None and \ - self._task is VocTask.action_classification: - for action in VocAction: - action_elem = actions_elem.find(action.name) - if action_elem is None or action_elem.text != '1': - continue - - act_label_id = self._get_label_id(action.name) - assert group in [None, obj_id] - group = obj_id - item_annotations.append(LabelObject(act_label_id, - group=obj_id)) - - if self._task is VocTask.person_layout: - for part_elem in object_elem.findall('part'): - part = part_elem.find('name').text - part_label_id = self._get_label_id(part) - bbox = self._parse_bbox(part_elem) - group = obj_id - item_annotations.append(BboxObject( - *bbox, label=part_label_id, - group=obj_id)) - - if self._task in [VocTask.action_classification, VocTask.person_layout]: - if group is None: - continue - - item_annotations.append(BboxObject(*obj_bbox, label=obj_label_id, + actions = {a: False + for a in self._categories[AnnotationType.label] \ + .items[obj_label_id].attributes} + if actions_elem is not None: + for action_elem in actions_elem: + actions[action_elem.tag] = (action_elem.text == '1') + for action, present in actions.items(): + attributes[action] = present + + for part_elem in object_elem.findall('part'): + part = part_elem.find('name').text + part_label_id = self._get_label_id(part) + bbox = self._parse_bbox(part_elem) + group = obj_id + + if self._task is not VocTask.person_layout: + break + item_annotations.append(BboxObject( + *bbox, label=part_label_id, + group=obj_id)) + + if self._task is VocTask.person_layout and group is None: + continue + if self._task is VocTask.action_classification and not actions: + continue + + item_annotations.append(BboxObject( + *obj_bbox, label=obj_label_id, attributes=attributes, id=obj_id, group=group)) return item_annotations @@ -283,58 +258,48 @@ def _parse_bbox(object_elem): return None class VocClassificationExtractor(VocExtractor): - _ANNO_DIR = 'Main' - def __init__(self, path): super().__init__(path, task=VocTask.classification) - subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, 'Main') subsets = self._load_subsets(subsets_dir) self._subsets = subsets self._load_cls_annotations(subsets_dir, subsets) class VocDetectionExtractor(VocExtractor): - _ANNO_DIR = 'Main' - def __init__(self, path): super().__init__(path, task=VocTask.detection) - subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, 'Main') subsets = self._load_subsets(subsets_dir) self._subsets = subsets self._load_det_annotations() class VocSegmentationExtractor(VocExtractor): - _ANNO_DIR = 'Segmentation' - def __init__(self, path): super().__init__(path, task=VocTask.segmentation) - subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, 'Segmentation') subsets = self._load_subsets(subsets_dir) self._subsets = subsets class VocLayoutExtractor(VocExtractor): - _ANNO_DIR = 'Layout' - def __init__(self, path): super().__init__(path, task=VocTask.person_layout) - subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, 'Layout') subsets = self._load_subsets(subsets_dir) self._subsets = subsets self._load_det_annotations() class VocActionExtractor(VocExtractor): - _ANNO_DIR = 'Action' - def __init__(self, path): super().__init__(path, task=VocTask.action_classification) - subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, 'Action') subsets = self._load_subsets(subsets_dir) self._subsets = subsets @@ -414,7 +379,7 @@ def _parse_txt_ann(self, path, subsets, annotations, task): if mark != task_desc['mark']: continue - label_id = VocLabel[label].value + label_id = self._get_label_id(label) anns = defaultdict(list) with open(osp.join(task_dir, ann_file + ann_ext), 'r') as f: for line in f: @@ -441,7 +406,11 @@ def _parse_action(self, path, subsets, annotations): VocTask.action_classification) def _load_categories(self): - self._categories = _make_voc_categories() + label_map = None + label_map_path = osp.join(self._path, VocPath.LABELMAP_FILE) + if osp.isfile(label_map_path): + label_map = parse_label_map(label_map_path) + self._categories = make_voc_categories(label_map) def _get_label_id(self, label): label_id = self._categories[AnnotationType.label].find(label) @@ -511,9 +480,8 @@ def _get_annotations(self, item, subset_name): if cls_ann is not None: for desc in cls_ann: label_id, conf = desc - label_id = self._get_label_id(VocLabel(int(label_id)).name) annotations.append(LabelObject( - label_id, + int(label_id), attributes={ 'score': float(conf) } )) @@ -538,11 +506,10 @@ def _get_annotations(self, item, subset_name): if det_ann is not None: for desc in det_ann: label_id, conf, left, top, right, bottom = desc - label_id = self._get_label_id(VocLabel(int(label_id)).name) annotations.append(BboxObject( x=float(left), y=float(top), w=float(right) - float(left), h=float(bottom) - float(top), - label=label_id, + label=int(label_id), attributes={ 'score': float(conf) } )) @@ -639,7 +606,7 @@ def __init__(self, path): conf = float(layout_elem.find('confidence').text) parts = [] for part_elem in layout_elem.findall('part'): - label_id = VocBodyPart[part_elem.find('class').text].value + label_id = self._get_label_id(part_elem.find('class').text) bbox_elem = part_elem.find('bndbox') xmin = float(bbox_elem.find('xmin').text) xmax = float(bbox_elem.find('xmax').text) @@ -671,8 +638,7 @@ def _get_annotations(self, item, subset_name): } for part in parts: - part_id, bbox = part - label_id = self._get_label_id(VocBodyPart(part_id).name) + label_id, bbox = part annotations.append(BboxObject( *bbox, label=label_id, attributes=attributes)) @@ -691,6 +657,12 @@ def __init__(self, path): self._subsets = subsets self._annotations = dict(annotations) + def _load_categories(self): + from collections import OrderedDict + from datumaro.components.formats.voc import VocAction + label_map = OrderedDict((a.name, [[], [], []]) for a in VocAction) + self._categories = make_voc_categories(label_map) + def _get_annotations(self, item, subset_name): annotations = [] @@ -698,9 +670,8 @@ def _get_annotations(self, item, subset_name): if action_ann is not None: for desc in action_ann: action_id, obj_id, conf = desc - label_id = self._get_label_id(VocAction(int(action_id)).name) annotations.append(LabelObject( - label_id, + action_id, attributes={ 'score': conf, 'object_id': int(obj_id), diff --git a/datumaro/datumaro/components/formats/voc.py b/datumaro/datumaro/components/formats/voc.py index 5a9652906a4c..1b5994b7063f 100644 --- a/datumaro/datumaro/components/formats/voc.py +++ b/datumaro/datumaro/components/formats/voc.py @@ -5,8 +5,13 @@ from collections import OrderedDict from enum import Enum +from itertools import chain import numpy as np +from datumaro.components.extractor import (AnnotationType, + LabelCategories, MaskCategories +) + VocTask = Enum('VocTask', [ 'classification', @@ -17,6 +22,7 @@ ]) VocLabel = Enum('VocLabel', [ + ('background', 0), ('aeroplane', 1), ('bicycle', 2), ('bird', 3), @@ -37,10 +43,9 @@ ('sofa', 18), ('train', 19), ('tvmonitor', 20), + ('ignored', 255), ]) -VocIgnoredLabel = 255 - VocPose = Enum('VocPose', [ 'Unspecified', 'Left', @@ -86,7 +91,7 @@ def get_bit(number, index): ) VocColormap = {id: color for id, color in generate_colormap(256).items() - if id in [l.value for l in VocLabel] + [0, VocIgnoredLabel]} + if id in [l.value for l in VocLabel]} VocInstColormap = generate_colormap(256) class VocPath: @@ -97,6 +102,7 @@ class VocPath: SUBSETS_DIR = 'ImageSets' IMAGE_EXT = '.jpg' SEGM_EXT = '.png' + LABELMAP_FILE = 'labelmap.txt' TASK_DIR = { VocTask.classification: 'Main', @@ -104,4 +110,96 @@ class VocPath: VocTask.segmentation: 'Segmentation', VocTask.action_classification: 'Action', VocTask.person_layout: 'Layout', - } \ No newline at end of file + } + + +def make_voc_label_map(): + labels = sorted(VocLabel, key=lambda l: l.value) + label_map = OrderedDict( + (label.name, [VocColormap[label.value], [], []]) for label in labels) + label_map[VocLabel.person.name][1] = [p.name for p in VocBodyPart] + label_map[VocLabel.person.name][2] = [a.name for a in VocAction] + return label_map + +def parse_label_map(path): + if not path: + return None + + label_map = OrderedDict() + with open(path, 'r') as f: + for line in f: + # skip empty and commented lines + line = line.strip() + if not line or line and line[0] == '#': + continue + + # name, color, parts, actions + label_desc = line.strip().split(':') + name = label_desc[0] + + if 1 < len(label_desc) and len(label_desc[1]) != 0: + color = label_desc[1].split(',') + assert len(color) == 3, \ + "Label '%s' has wrong color, expected 'r,g,b', got '%s'" % \ + (name, color) + color = tuple([int(c) for c in color][::-1]) + else: + color = None + + if 2 < len(label_desc) and len(label_desc[2]) != 0: + parts = label_desc[2].split(',') + else: + parts = [] + + if 3 < len(label_desc) and len(label_desc[3]) != 0: + actions = label_desc[3].split(',') + else: + actions = [] + + label_map[name] = [color, parts, actions] + return label_map + +def write_label_map(path, label_map): + with open(path, 'w') as f: + f.write('# label:color_rgb:parts:actions\n') + for label_name, label_desc in label_map.items(): + if label_desc[0]: + color_rgb = ','.join(str(c) for c in label_desc[0][::-1]) + else: + color_rgb = '' + + parts = ','.join(str(p) for p in label_desc[1]) + actions = ','.join(str(a) for a in label_desc[2]) + + f.write('%s\n' % ':'.join([label_name, color_rgb, parts, actions])) + +# pylint: disable=pointless-statement +def make_voc_categories(label_map=None): + if label_map is None: + label_map = make_voc_label_map() + + categories = {} + + label_categories = LabelCategories() + label_categories.attributes.update(['difficult', 'truncated', 'occluded']) + + for label, desc in label_map.items(): + label_categories.add(label, attributes=desc[2]) + for part in OrderedDict((k, None) for k in chain( + *(desc[1] for desc in label_map.values()))): + label_categories.add(part) + categories[AnnotationType.label] = label_categories + + has_colors = sum(v[0] is not None for v in label_map.values()) + if not has_colors: + colormap = generate_colormap(len(label_map)) + else: + label_id = lambda label: label_categories.find(label)[0] + colormap = { label_id(name): desc[0] + for name, desc in label_map.items() } + mask_categories = MaskCategories(colormap) + mask_categories.inverse_colormap # force init + categories[AnnotationType.mask] = mask_categories + + return categories +# pylint: enable=pointless-statement \ No newline at end of file diff --git a/datumaro/datumaro/util/mask_tools.py b/datumaro/datumaro/util/mask_tools.py index d9c7fe9235d7..e4f885ae9017 100644 --- a/datumaro/datumaro/util/mask_tools.py +++ b/datumaro/datumaro/util/mask_tools.py @@ -69,6 +69,16 @@ def apply_colormap(mask, colormap=None): painted_mask = np.reshape(painted_mask, (*mask.shape, 3)) return painted_mask.astype(np.float32) +def remap_mask(mask, map_fn): + # Changes mask elements from one colormap to another + assert len(mask.shape) == 2 + + shape = mask.shape + mask = np.reshape(mask, (-1, 1)) + mask = np.apply_along_axis(map_fn, 1, mask) + mask = np.reshape(mask, shape) + return mask + def load_mask(path, colormap=None): mask = load_image(path) diff --git a/datumaro/tests/test_voc_format.py b/datumaro/tests/test_voc_format.py index fac5c27e37ef..04754075f553 100644 --- a/datumaro/tests/test_voc_format.py +++ b/datumaro/tests/test_voc_format.py @@ -1,5 +1,4 @@ import cv2 -from itertools import zip_longest import numpy as np import os import os.path as osp @@ -235,6 +234,7 @@ def test_can_load_voc_det(self): { 'pose': VOC.VocPose(1).name, 'truncated': True, + 'occluded': False, 'difficult': False, }, obj1.attributes) @@ -365,16 +365,9 @@ def test_can_load_voc_action(self): self.assertFalse(obj2 is None) self.assertListEqual([4, 5, 2, 2], obj2.get_bbox()) - count = 1 for action in VOC.VocAction: - if action.value % 2 == 1: - count += 1 - ann = find(item.annotations, - lambda x: x.type == AnnotationType.label and \ - get_label(extractor, x.label) == action.name) - self.assertFalse(ann is None) - self.assertTrue(obj2.id == ann.group) - self.assertEqual(count, len(item.annotations)) + attr = obj2.attributes[action.name] + self.assertEqual(attr, action.value % 2) subset_name = 'test' generated_subset = generated_subsets[subset_name] @@ -388,50 +381,66 @@ def test_can_load_voc_action(self): self.assertEqual(0, len(item.annotations)) class VocConverterTest(TestCase): - def _test_can_save_voc(self, extractor_type, converter_type, test_dir): - dummy_dir = osp.join(test_dir, 'dummy') - generate_dummy_voc(dummy_dir) - gen_extractor = extractor_type(dummy_dir) + def _test_can_save_voc(self, src_extractor, converter, test_dir, + target_extractor=None): + converter(src_extractor, test_dir) - conv_dir = osp.join(test_dir, 'converted') - converter = converter_type() - converter(gen_extractor, conv_dir) + result_extractor = VocImporter()(test_dir).make_dataset() + if target_extractor is None: + target_extractor = src_extractor - conv_extractor = extractor_type(conv_dir) - for item_a, item_b in zip_longest(gen_extractor, conv_extractor): + if AnnotationType.label in target_extractor.categories(): + self.assertEqual( + target_extractor.categories()[AnnotationType.label].items, + result_extractor.categories()[AnnotationType.label].items) + if AnnotationType.mask in target_extractor.categories(): + self.assertEqual( + target_extractor.categories()[AnnotationType.mask].colormap, + result_extractor.categories()[AnnotationType.mask].colormap) + + self.assertEqual(len(target_extractor), len(result_extractor)) + for item_a, item_b in zip(target_extractor, result_extractor): self.assertEqual(item_a.id, item_b.id) self.assertEqual(len(item_a.annotations), len(item_b.annotations)) for ann_a, ann_b in zip(item_a.annotations, item_b.annotations): self.assertEqual(ann_a.type, ann_b.type) + def _test_can_save_voc_dummy(self, extractor_type, converter, test_dir): + dummy_dir = osp.join(test_dir, 'dummy') + generate_dummy_voc(dummy_dir) + gen_extractor = extractor_type(dummy_dir) + + self._test_can_save_voc(gen_extractor, converter, + osp.join(test_dir, 'converted')) + def test_can_save_voc_cls(self): with TestDir() as test_dir: - self._test_can_save_voc( - VocClassificationExtractor, VocClassificationConverter, + self._test_can_save_voc_dummy( + VocClassificationExtractor, VocClassificationConverter(label_map='voc'), test_dir.path) def test_can_save_voc_det(self): with TestDir() as test_dir: - self._test_can_save_voc( - VocDetectionExtractor, VocDetectionConverter, + self._test_can_save_voc_dummy( + VocDetectionExtractor, VocDetectionConverter(label_map='voc'), test_dir.path) def test_can_save_voc_segm(self): with TestDir() as test_dir: - self._test_can_save_voc( - VocSegmentationExtractor, VocSegmentationConverter, + self._test_can_save_voc_dummy( + VocSegmentationExtractor, VocSegmentationConverter(label_map='voc'), test_dir.path) def test_can_save_voc_layout(self): with TestDir() as test_dir: - self._test_can_save_voc( - VocLayoutExtractor, VocLayoutConverter, + self._test_can_save_voc_dummy( + VocLayoutExtractor, VocLayoutConverter(label_map='voc'), test_dir.path) def test_can_save_voc_action(self): with TestDir() as test_dir: - self._test_can_save_voc( - VocActionExtractor, VocActionConverter, + self._test_can_save_voc_dummy( + VocActionExtractor, VocActionConverter(label_map='voc'), test_dir.path) def test_can_save_dataset_with_no_subsets(self): @@ -451,28 +460,121 @@ def __iter__(self): for item in items: yield item + def categories(self): + return VOC.make_voc_categories() + + with TestDir() as test_dir: + self._test_can_save_voc(TestExtractor(), VocConverter(label_map='voc'), + test_dir.path) + + def test_dataset_with_voc_labelmap(self): + class SrcExtractor(Extractor): + def __iter__(self): + yield DatasetItem(id=1, annotations=[ + BboxObject(2, 3, 4, 5, label=0, id=1), + BboxObject(1, 2, 3, 4, label=1, id=2), + ]) + def categories(self): label_cat = LabelCategories() - for label in VOC.VocLabel: - label_cat.add(label.name) + label_cat.add(VOC.VocLabel(1).name) + label_cat.add('non_voc_label') return { AnnotationType.label: label_cat, } + class DstExtractor(Extractor): + def __iter__(self): + yield DatasetItem(id=1, annotations=[ + BboxObject(2, 3, 4, 5, label=0, id=1), + ]) + + def categories(self): + return VOC.make_voc_categories() + with TestDir() as test_dir: - src_extractor = TestExtractor() - converter = VocConverter() + self._test_can_save_voc( + SrcExtractor(), VocConverter(label_map='voc'), + test_dir.path, target_extractor=DstExtractor()) - converter(src_extractor, test_dir.path) + def test_dataset_with_guessed_labelmap(self): + class SrcExtractor(Extractor): + def __iter__(self): + yield DatasetItem(id=1, annotations=[ + BboxObject(2, 3, 4, 5, label=0, id=1), + BboxObject(1, 2, 3, 4, label=1, id=2), + ]) - dst_extractor = VocImporter()(test_dir.path).make_dataset() + def categories(self): + label_cat = LabelCategories() + label_cat.add(VOC.VocLabel(1).name) + label_cat.add('non_voc_label') + return { + AnnotationType.label: label_cat, + } + + class DstExtractor(Extractor): + def __iter__(self): + yield DatasetItem(id=1, annotations=[ + BboxObject(2, 3, 4, 5, label=0, id=1), + BboxObject(1, 2, 3, 4, + label=self.categories()[AnnotationType.label] \ + .find('non_voc_label')[0], id=2), + ]) - self.assertEqual(len(src_extractor), len(dst_extractor)) - for item_a, item_b in zip_longest(src_extractor, dst_extractor): - self.assertEqual(item_a.id, item_b.id) - self.assertEqual(len(item_a.annotations), len(item_b.annotations)) - for ann_a, ann_b in zip(item_a.annotations, item_b.annotations): - self.assertEqual(ann_a.type, ann_b.type) + def categories(self): + label_map = VOC.make_voc_label_map() + label_map['non_voc_label'] = [None, [], []] + for label_desc in label_map.values(): + label_desc[0] = None # rebuild colormap + return VOC.make_voc_categories(label_map) + + with TestDir() as test_dir: + self._test_can_save_voc( + SrcExtractor(), VocConverter(label_map='guess'), + test_dir.path, target_extractor=DstExtractor()) + + def test_dataset_with_fixed_labelmap(self): + class SrcExtractor(Extractor): + def __iter__(self): + yield DatasetItem(id=1, annotations=[ + BboxObject(2, 3, 4, 5, label=0, id=1), + BboxObject(1, 2, 3, 4, label=1, id=2, group=2, + attributes={'act1': True}), + BboxObject(2, 3, 4, 5, label=2, id=3, group=2), + BboxObject(2, 3, 4, 6, label=3, id=4, group=2), + ]) + + def categories(self): + label_cat = LabelCategories() + label_cat.add('foreign_label') + label_cat.add('label', attributes=['act1', 'act2']) + label_cat.add('label_part1') + label_cat.add('label_part2') + return { + AnnotationType.label: label_cat, + } + + label_map = { + 'label': [None, ['label_part1', 'label_part2'], ['act1', 'act2']] + } + + class DstExtractor(Extractor): + def __iter__(self): + yield DatasetItem(id=1, annotations=[ + BboxObject(1, 2, 3, 4, label=0, id=2, group=2, + attributes={'act1': True, 'act2': False}), + BboxObject(2, 3, 4, 5, label=1, id=3, group=2), + BboxObject(2, 3, 4, 6, label=2, id=4, group=2), + ]) + + def categories(self): + return VOC.make_voc_categories(label_map) + + with TestDir() as test_dir: + self._test_can_save_voc( + SrcExtractor(), VocConverter(label_map=label_map), + test_dir.path, target_extractor=DstExtractor()) class VocImporterTest(TestCase): def test_can_import(self): @@ -486,4 +588,17 @@ def test_can_import(self): self.assertEqual(set(subsets), set(dataset.subsets())) self.assertEqual( sum([len(s) for _, s in subsets.items()]), - len(dataset)) \ No newline at end of file + len(dataset)) + +class VocFormatTest(TestCase): + def test_can_write_and_parse_labelmap(self): + src_label_map = VOC.make_voc_label_map() + src_label_map['qq'] = [None, ['part1', 'part2'], ['act1', 'act2']] + + with TestDir() as test_dir: + file_path = osp.join(test_dir.path, 'test.txt') + + VOC.write_label_map(file_path, src_label_map) + dst_label_map = VOC.parse_label_map(file_path) + + self.assertEqual(src_label_map, dst_label_map) \ No newline at end of file From 4c72bc3fda43f5f4cf51e87ed235c89711901dca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2019 22:27:33 +0300 Subject: [PATCH 04/14] Bump tensorflow from 1.12.3 to 1.15.0 in /cvat/requirements (#968) * Bump tensorflow from 1.12.3 to 1.15.0 in /cvat/requirements Bumps [tensorflow](https://github.com/tensorflow/tensorflow) from 1.12.3 to 1.15.0. - [Release notes](https://github.com/tensorflow/tensorflow/releases) - [Changelog](https://github.com/tensorflow/tensorflow/blob/master/RELEASE.md) - [Commits](https://github.com/tensorflow/tensorflow/compare/v1.12.3...v1.15.0) Signed-off-by: dependabot[bot] * Update pip because tensorflow 1.15 cannot not be found. * Fix a typo (pip -> pip3) * Replaced pip3 by python3 -m pip. --- Dockerfile | 9 +++++---- components/cuda/install.sh | 4 ++-- cvat/apps/documentation/installation.md | 2 +- cvat/requirements/base.txt | 2 +- utils/open_model_zoo/yolov3/README.md | 10 +++++----- utils/tfrecords/converter.md | 14 +++++++------- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index cb5da2f40539..4b2a04484adf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,7 +47,8 @@ RUN apt-get update && \ git-core \ libsm6 \ libxext6 && \ - pip3 install -U setuptools && \ + python3 -m pip install -U pip && \ + python3 -m pip install -U setuptools && \ ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime && \ dpkg-reconfigure -f noninteractive tzdata && \ add-apt-repository --remove ppa:mc3man/gstffmpeg-keep -y && \ @@ -115,9 +116,9 @@ RUN if [ "$WITH_TESTS" = "yes" ]; then \ # Install and initialize CVAT, copy all necessary files COPY cvat/requirements/ /tmp/requirements/ COPY supervisord.conf mod_wsgi.conf wait-for-it.sh manage.py ${HOME}/ -RUN pip3 install --no-cache-dir -r /tmp/requirements/${DJANGO_CONFIGURATION}.txt +RUN python3 -m pip install --no-cache-dir -r /tmp/requirements/${DJANGO_CONFIGURATION}.txt # pycocotools package is impossible to install with its dependencies by one pip install command -RUN pip3 install --no-cache-dir pycocotools==2.0.0 +RUN python3 -m pip install --no-cache-dir pycocotools==2.0.0 # Install git application dependencies RUN apt-get update && \ @@ -156,7 +157,7 @@ COPY cvat-core/ ${HOME}/cvat-core COPY tests ${HOME}/tests COPY datumaro/ ${HOME}/datumaro -RUN sed -r "s/^(.*)#.*$/\1/g" ${HOME}/datumaro/requirements.txt | xargs -n 1 -L 1 pip3 install --no-cache-dir +RUN sed -r "s/^(.*)#.*$/\1/g" ${HOME}/datumaro/requirements.txt | xargs -n 1 -L 1 python3 -m pip install --no-cache-dir # Binary option is necessary to correctly apply the patch on Windows platform. # https://unix.stackexchange.com/questions/239364/how-to-fix-hunk-1-failed-at-1-different-line-endings-message diff --git a/components/cuda/install.sh b/components/cuda/install.sh index 2cda99fcb769..757120468a70 100755 --- a/components/cuda/install.sh +++ b/components/cuda/install.sh @@ -33,5 +33,5 @@ apt-get update && apt-get install -y --no-install-recommends --allow-unauthentic rm -rf /var/lib/apt/lists/* \ /etc/apt/sources.list.d/nvidia-ml.list /etc/apt/sources.list.d/cuda.list -pip3 uninstall -y tensorflow -pip3 install --no-cache-dir tensorflow-gpu==1.12.3 +python3 -m pip uninstall -y tensorflow +python3 -m pip install --no-cache-dir tensorflow-gpu==1.15.0 diff --git a/cvat/apps/documentation/installation.md b/cvat/apps/documentation/installation.md index 7fb94fc7eee0..4c9fc0ee3f7c 100644 --- a/cvat/apps/documentation/installation.md +++ b/cvat/apps/documentation/installation.md @@ -58,7 +58,7 @@ server. Proxy is an advanced topic and it is not covered by the guide. ```bash sudo apt-get install -y python3-pip - sudo pip3 install docker-compose + sudo python3 -m pip install docker-compose ``` - Clone _CVAT_ source code from the diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index aad7a1be1278..5fe31b00964c 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -40,7 +40,7 @@ django-rest-auth[with_social]==0.9.5 cython==0.29.13 matplotlib==3.0.3 scikit-image==0.15.0 -tensorflow==1.12.3 +tensorflow==1.15.0 keras==2.2.5 opencv-python==4.1.0.25 h5py==2.9.0 diff --git a/utils/open_model_zoo/yolov3/README.md b/utils/open_model_zoo/yolov3/README.md index 28cbac5ef372..2e47953cb3f8 100644 --- a/utils/open_model_zoo/yolov3/README.md +++ b/utils/open_model_zoo/yolov3/README.md @@ -6,17 +6,17 @@ As of OpenVINO 2019 R3, only tensorflow 1.13 and NetworkX 2.3. These can be explicitly installed using the following command. ```bash -$ pip3 install tensorflow==1.13 networkx==2.3 +python3 -m pip install tensorflow==1.13 networkx==2.3 ``` Additionally, at the time of writing, the model optimizer required an input shape. ``` bash -$ python3 mo_tf.py \ - --input_model /path/to/yolo_v3.pb \ - --tensorflow_use_custom_operations_config $MO_ROOT/extensions/front/tf/yolo_v3.json \ - --input_shape [1,416,416,3] +python3 mo_tf.py \ + --input_model /path/to/yolo_v3.pb \ + --tensorflow_use_custom_operations_config $MO_ROOT/extensions/front/tf/yolo_v3.json \ + --input_shape [1,416,416,3] ``` [1]: https://docs.openvinotoolkit.org/latest/_docs_MO_DG_prepare_model_convert_model_tf_specific_Convert_YOLO_From_Tensorflow.html diff --git a/utils/tfrecords/converter.md b/utils/tfrecords/converter.md index 96d56ffcb58e..875f165f37db 100644 --- a/utils/tfrecords/converter.md +++ b/utils/tfrecords/converter.md @@ -23,7 +23,7 @@ sudo apt-get install -y --no-install-recommends python3-pip python3-dev ``` ``` bash -pip3 install -r requirements.txt +python3 -m pip install -r requirements.txt ``` ### 2. Install the tensorflow object detection API @@ -38,12 +38,12 @@ git clone https://github.com/tensorflow/models.git ``` ```bash # install some dependencies -pip3 install --user Cython -pip3 install --user contextlib2 -pip3 install --user pillow -pip3 install --user lxml -pip3 install --user jupyter -pip3 install --user matplotlib +python3 -m pip install --user Cython +python3 -m pip install --user contextlib2 +python3 -m pip install --user pillow +python3 -m pip install --user lxml +python3 -m pip install --user jupyter +python3 -m pip install --user matplotlib ``` ```bash # clone and compile the cocoapi From 728a51c8e6039d03101281d0355bf192eaaf2056 Mon Sep 17 00:00:00 2001 From: Maksim Markelov Date: Wed, 18 Dec 2019 16:24:53 +0300 Subject: [PATCH 05/14] Change-submit-button-style (#976) * UI/UX improvement. Changed buttons type for create task / upload model --- .../src/components/create-model-page/create-model-content.tsx | 2 +- cvat-ui/src/components/create-task-page/create-task-content.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cvat-ui/src/components/create-model-page/create-model-content.tsx b/cvat-ui/src/components/create-model-page/create-model-content.tsx index 228cf9803c64..9a4ac7aaca3c 100644 --- a/cvat-ui/src/components/create-model-page/create-model-content.tsx +++ b/cvat-ui/src/components/create-model-page/create-model-content.tsx @@ -145,7 +145,7 @@ export default class CreateModelContent extends React.PureComponent { diff --git a/cvat-ui/src/components/tasks-page/empty-list.tsx b/cvat-ui/src/components/tasks-page/empty-list.tsx index da2f9cfab522..afc08f23f2f6 100644 --- a/cvat-ui/src/components/tasks-page/empty-list.tsx +++ b/cvat-ui/src/components/tasks-page/empty-list.tsx @@ -12,7 +12,7 @@ import { EmptyTasksIcon } from '../../icons'; export default function EmptyListComponent(): JSX.Element { return ( -
+
diff --git a/cvat-ui/src/components/tasks-page/styles.scss b/cvat-ui/src/components/tasks-page/styles.scss new file mode 100644 index 000000000000..25765ddac9b7 --- /dev/null +++ b/cvat-ui/src/components/tasks-page/styles.scss @@ -0,0 +1,160 @@ +@import '../../base.scss'; + +.cvat-tasks-page { + padding-top: 15px; + height: 100%; + + > div:nth-child(1) { + margin-bottom: 10px; + + div > { + span { + color: $text-color; + } + } + } + + > div:nth-child(2) { + > div:nth-child(1) { + display: flex; + + > span:nth-child(2) { + width: 200px; + margin-left: 10px; + } + } + + > div:nth-child(2) { + display: flex; + justify-content: flex-end; + } + } + + > div:nth-child(3) { + height: 83%; + margin-top: 10px; + } + + > div:nth-child(4) { + margin-top: 10px; + } +} + +/* empty-tasks icon */ +.cvat-empty-tasks-list { + > div:nth-child(1) { + margin-top: 50px; + } + + > div:nth-child(2) { + > div { + margin-top: 20px; + + /* No tasks created yet */ + > span { + font-size: 20px; + color: $text-color; + } + } + } + + /* To get started with your annotation project .. */ + > div:nth-child(3) { + margin-top: 10px; + } +} + +.cvat-tasks-pagination { + display: flex; + justify-content: center; +} + +.cvat-tasks-list { + height: 100%; + overflow-y: auto; +} + +.cvat-tasks-list-item { + width: 100%; + height: 120px; + border: 1px solid $border-color-1; + border-radius: 3px; + margin-bottom: 15px; + padding-top: 20px; + background: $background-color-1; + + /* description */ + > div:nth-child(2) { + word-break: break-all; + max-height: 100%; + overflow: hidden; + } + + /* open, actions */ + div:nth-child(4) { + > div { + margin-right: 20px; + } + + /* actions */ + > div:nth-child(2) { + margin-right: 5px; + margin-top: 10px; + + > div { + display: flex; + align-items: center; + } + } + } + + &:hover { + border: 1px solid $border-color-hover; + } +} + + +.cvat-task-item-preview-wrapper { + display: flex; + justify-content: center; + overflow: hidden; + margin: 20px; + margin-top: 0px; + + > .cvat-task-item-preview { + max-width: 140px; + max-height: 80px; + } +} + +.cvat-task-progress { + width: 100%; +} + +.cvat-task-completed-progress { + color: $completed-progress-color; + fill: $completed-progress-color; + margin-right: 5px; +} + +.cvat-task-completed-progress { + div.ant-progress-bg { + background: $completed-progress-color !important; /* csslint allow: important */ + } +} + +.cvat-task-progress-progress { + color: $inprogress-progress-color; + fill: $inprogress-progress-color; + margin-right: 5px; +} + +.cvat-task-pending-progress { + color: $pending-progress-color; + fill: $pending-progress-color; + margin-right: 5px; +} + +#cvat-create-task-button { + padding: 0 30px; +} diff --git a/cvat-ui/src/components/tasks-page/task-item.tsx b/cvat-ui/src/components/tasks-page/task-item.tsx index 8e14d6089a38..09799c6444ea 100644 --- a/cvat-ui/src/components/tasks-page/task-item.tsx +++ b/cvat-ui/src/components/tasks-page/task-item.tsx @@ -52,7 +52,7 @@ class TaskItemComponent extends React.PureComponent {`#${id}: `} - {name} + {name}
{ owner && ( @@ -171,7 +171,7 @@ class TaskItemComponent extends React.PureComponent - Actions + Actions }> diff --git a/cvat-ui/src/components/tasks-page/task-list.tsx b/cvat-ui/src/components/tasks-page/task-list.tsx index 5e306e8de936..936276eb4408 100644 --- a/cvat-ui/src/components/tasks-page/task-list.tsx +++ b/cvat-ui/src/components/tasks-page/task-list.tsx @@ -30,7 +30,7 @@ export default function TaskListComponent(props: ContentListProps): JSX.Element return ( <> - + { taskViews } diff --git a/cvat-ui/src/components/tasks-page/tasks-page.tsx b/cvat-ui/src/components/tasks-page/tasks-page.tsx index 278641d1bcde..3a21a978f151 100644 --- a/cvat-ui/src/components/tasks-page/tasks-page.tsx +++ b/cvat-ui/src/components/tasks-page/tasks-page.tsx @@ -1,3 +1,4 @@ +import './styles.scss'; import React from 'react'; import { RouteComponentProps } from 'react-router'; import { withRouter } from 'react-router-dom'; @@ -15,7 +16,7 @@ import { } from '../../reducers/interfaces'; import TopBar from './top-bar'; -import FeedbackComponent from '../feedback'; +import FeedbackComponent from '../feedback/feedback'; import EmptyListComponent from './empty-list'; import TaskListContainer from '../../containers/tasks-page/tasks-list'; diff --git a/cvat-ui/src/stylesheet.scss b/cvat-ui/src/stylesheet.scss deleted file mode 100644 index b08ca57c3a37..000000000000 --- a/cvat-ui/src/stylesheet.scss +++ /dev/null @@ -1,867 +0,0 @@ -hr { - border: 0; - height: 0; - border-top: 1px solid rgba(0, 0, 0, 0.1); - border-bottom: 1px solid rgba(255, 255, 255, 0.3); -} - -.cvat-header.ant-layout-header { - display: flex; - padding-left: 0px; - padding-right: 0px; - line-height: 0px; - height: 44px; - background: #D8D8D8; -} - -.cvat-left-header { - width: 50%; - display: flex; - justify-content: flex-start; - align-items: center; -} - -.cvat-right-header { - width: 50%; - display: flex; - justify-content: flex-end; - align-items: center; -} - -.cvat-flex { - display: flex; -} - -.cvat-flex-center { - align-items: center; -} - -.cvat-black-color { - color: #363435; -} - -.cvat-feedback-button { - position: absolute; - bottom: 20px; - right: 20px; - padding: 0px; -} - -.cvat-feedback-button > i { - font-size: 40px; -} - -.anticon.cvat-logo-icon > svg { - transform: scale(0.7); -} - -.ant-btn.cvat-header-button { - color: black; - padding: 0px 10px; - margin-right: 10px; -} - - -.ant-dropdown-trigger.cvat-header-menu-dropdown { - display: flex; - align-items: center; - border-left: 1px solid #c3c3c3; - padding: 0px 20px; -} - -.anticon.cvat-header-account-icon > svg { - transform: scale(0.4); -} - -.anticon.cvat-header-menu-icon { - margin-left: 16px; - margin-right: 0px; -} - -.cvat-title { - font-weight: 400; - font-size: 21px; - color: black; - padding-top: 5px; -} - -.cvat-tasks-page { - padding-top: 30px; -} - -.cvat-tasks-page > div:nth-child(1) { - margin-bottom: 10px; -} - -.cvat-tasks-page > div:nth-child(1) > div > span { - color: black; -} - -.cvat-tasks-page > div:nth-child(2) > div:nth-child(1) { - display: flex; -} - -.cvat-tasks-page > div:nth-child(2) > div:nth-child(2) { - display: flex; - justify-content: flex-end; -} - -.cvat-tasks-page > div:nth-child(2) > div:nth-child(1) > span:nth-child(2) { - width: 200px; - margin-left: 10px; -} - -.cvat-tasks-page > span.ant-typography { - user-select: none; -} - -.cvat-tasks-page { - height: 100%; -} - -.cvat-tasks-page > div:nth-child(4) { - margin-top: 10px; -} - -.cvat-tasks-page > div:nth-child(3) { - margin-top: 10px; -} - -/* > 1280 */ -@media only screen and (min-height: 1280px) { - .cvat-tasks-page > div:nth-child(3) { - height: 80%; - } -} - -/* 769 => 1280 */ -@media only screen and (max-height: 1280px) { - .cvat-tasks-page > div:nth-child(3) { - height: 80%; - } -} - -/* 0 => 768 */ -@media only screen and (max-height: 768px) { - .cvat-tasks-page > div:nth-child(3) { - height: 70%; - } -} - -/* empty-tasks icon */ -.cvat-empty-task-list > div:nth-child(1) { - margin-top: 50px; -} - -.cvat-empty-task-list > div:nth-child(2) > div { - margin-top: 20px; -} - -/* No tasks created yet */ -.cvat-empty-task-list > div:nth-child(2) > div > span { - font-size: 20px; - color: #4A4A4A; -} - -/* To get started with your annotation project .. */ -.cvat-empty-task-list > div:nth-child(3) { - margin-top: 10px; -} - -.ant-pagination.cvat-tasks-pagination { - display: flex; - justify-content: center; -} - -.cvat-task-list { - height: 100%; - overflow-y: auto; -} - -.cvat-tasks-list-item { - width: 100%; - height: 120px; - border: 1px solid #c3c3c3; - border-radius: 3px; - margin-bottom: 15px; - padding-top: 20px; - background: white; -} - -.cvat-tasks-list-item:hover { - border: 1px solid #40a9ff; -} - -.cvat-tasks-list-item > div:nth-child(2) { - word-break: break-all; -} - -.cvat-tasks-list-item > div:nth-child(4) > div { - margin-right: 20px; -} - -.cvat-tasks-list-item > div:nth-child(4) > div:nth-child(2) { - margin-right: 5px; - margin-top: 10px; -} - -.cvat-tasks-list-item > div:nth-child(4) > div:nth-child(2) > div { - display: flex; - align-items: center; -} - -.cvat-task-item-menu-icon > img { - height: 20px; -} - -.cvat-task-item-menu-icon > img:hover { - filter: invert(0.5); -} - -.ant-menu.cvat-actions-menu { - box-shadow: 0 0 17px rgba(0,0,0,0.2); -} - -.cvat-actions-menu > hr { - border: 0.5px solid #D6D6D6; -} - -.cvat-actions-menu > *:hover { - background-color: rgba(24,144,255,0.05); -} - -.cvat-actions-menu-load-submenu-item:hover { - background-color: rgba(24,144,255,0.05); -} - -.cvat-actions-menu-dump-submenu-item > button { - text-align: start; -} - -.cvat-actions-menu-export-submenu-item:hover { - background-color: rgba(24,144,255,0.05); -} - -.cvat-actions-menu-export-submenu-item > button { - text-align: start; -} - -.cvat-actions-menu-dump-submenu-item:hover { - background-color: rgba(24,144,255,0.05); -} - -.cvat-actions-menu > li:nth-child(2) > div > span { - margin-right: 15px; -} - -.cvat-actions-menu > .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow { - width: 0px; -} - -.cvat-task-item-preview { - max-width: 140px; - max-height: 80px; -} - -.cvat-task-item-preview-wrapper { - display: flex; - justify-content: center; - overflow: hidden; - margin: 20px; - margin-top: 0px; -} - -.cvat-task-progress { - width: 100%; -} - -.cvat-task-completed-progress { - color: #61C200; - fill: #61C200; - margin-right: 5px; -} - -.cvat-task-completed-progress > div > div > div > div.ant-progress-bg { - background: #52c41a !important; /* csslint allow: important */ -} - -.cvat-task-progress-progress { - color: #1890FF; - fill: #1890FF; - margin-right: 5px; -} - -.cvat-task-pending-progress { - color: #C1C1C1; - fill: #C1C1C1; - margin-right: 5px; -} - -.cvat-task-details-wrapper { - overflow-y: auto; - height: 100%; -} - -.cvat-task-details { - width: 100%; - height: auto; - border: 1px solid #c3c3c3; - border-radius: 3px; - padding: 20px; - background: white; -} - -.cvat-task-details > div:nth-child(2) > div:nth-child(2) { - padding-left: 20px; -} - -.cvat-task-details > div:nth-child(2) > div:nth-child(2) > div:not(:first-child) { - margin-top: 20px; -} - -.cvat-dataset-repository-url > a { - margin-right: 10px; -} - -.cvat-dataset-repository-url > .ant-tag-red { - user-select: none; - opacity: 0.4; -} - -.cvat-dataset-repository-url > .ant-tag-red:hover { - opacity: 0.8; -} - -.cvat-dataset-repository-url > .ant-tag-red:active { - opacity: 1; -} - -.cvat-task-job-list { - width: 100%; - height: auto; - border: 1px solid #c3c3c3; - border-radius: 3px; - margin-top: 20px; - padding: 20px; - background: white; -} - -.cvat-task-job-list > div:nth-child(1) > div:nth-child(1) { - display: flex; -} - -.cvat-task-top-bar { - margin-top: 20px; - margin-bottom: 10px; -} - -.cvat-task-preview { - max-width: 252px; - max-height: 144px; -} - -.cvat-task-preview-wrapper { - display: flex; - justify-content: flex-start; - overflow: hidden; - margin-bottom: 20px; -} - -.cvat-user-selector { - margin-left: 10px; - width: 150px; -} - -.cvat-open-bug-tracker-button { - margin-left: 15px; -} - -textarea.ant-input.cvat-raw-labels-viewer { - border-color: #d9d9d9; - box-shadow: none; - border-top: none; - border-radius: 0px 0px 5px 5px; - min-height: 9em; - font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace; -} - -.cvat-raw-labels-viewer:focus { - border-color: #d9d9d9; - box-shadow: none; -} - -.cvat-raw-labels-viewer:hover { - border-color: #d9d9d9; - box-shadow: none; -} - -.cvat-constructor-viewer { - border: 1px solid #d9d9d9; - box-shadow: none; - border-top: none; - border-radius: 0px 0px 5px 5px; - padding: 5px; - display: flex; - overflow-y: auto; - min-height: 9em; - flex-wrap: wrap; -} - -.cvat-constructor-viewer-item { - height: fit-content; - display: flex; - align-items: center; - padding: 2px 10px; - border-radius: 2px; - margin: 2px; - margin-left: 8px; - user-select: none; - border: 1px solid rgba(0, 0, 0, 0); - opacity: 0.6; -} - -.cvat-constructor-viewer-item > span { - margin-left: 5px; - color: white; -} - -.cvat-constructor-viewer-item > span > i:hover { - color: #111111; -} - -.cvat-constructor-viewer-item:hover { - opacity: 1; - border: 1px solid rgba(0, 0, 0, 255); -} - -.cvat-constructor-viewer-new-item { - height: fit-content; - display: flex; - align-items: center; - padding: 2px 10px; - border-radius: 2px; - margin: 2px; - margin-left: 8px; - user-select: none; - opacity: 1; -} - -.labels-editor-new-label-button > i { - margin-left: 10px; -} - -.labels-editor-new-label-button > i:hover { - color: #111111; -} - -.cvat-label-constructor-creator > form:first-child { - margin-top: 10px; -} - -.cvat-label-constructor-updater > form:first-child { - margin-top: 10px; -} - -.cvat-attribute-constructor-form > div:first-child > div:nth-child(4) { - display: contents; -} - -.cvat-save-attribute-button:hover > i { - color: black; -} - -.cvat-delete-attribute-button:hover > i { - color: red; -} - -.ant-typography.cvat-jobs-header { - margin-bottom: 0px; - font-size: 20px; - font-weight: bold; -} - -/* Pagination in center */ -.cvat-task-jobs-table > div > div { - text-align: center; -} -.cvat-task-jobs-table > div > div > .ant-table-pagination.ant-pagination { - float: none; -} - -.cvat-job-completed-color { - color: #61C200; -} - -.cvat-job-validation-color { - color: #1890FF; -} - -.cvat-job-annotation-color { - color: #C1C1C1; -} - -.cvat-create-task-form-wrapper { - text-align: center; - margin-top: 40px; - overflow-y: auto; - height: 90%; -} - -.cvat-create-task-form-wrapper > div > span { - font-size: 36px; -} - -.cvat-create-task-content { - margin-top: 20px; - width: 100%; - height: auto; - border: 1px solid #c3c3c3; - border-radius: 3px; - padding: 20px; - background: white; - text-align: initial; -} - -.cvat-create-task-content > div:not(first-child) { - margin-top: 10px; -} - -.cvat-create-task-content > div:nth-child(7) > button { - float: right; - width: 120px; -} - -.cvat-share-tree { - height: fit-content; - min-height: 10em; - max-height: 20em; - overflow: auto; -} - -.cvat-models-page { - padding-top: 30px; - height: 100%; - overflow: auto; -} - -.cvat-models-page > div:nth-child(1) { - margin-bottom: 10px; -} - -.cvat-models-page > div:nth-child(1) > div:nth-child(1) { - display: flex; -} - -.cvat-models-page > div:nth-child(1) > div:nth-child(2) { - display: flex; - justify-content: flex-end; -} - -/* empty-models icon */ -.cvat-empty-models-list > div:nth-child(1) { - margin-top: 50px; -} - -.cvat-empty-models-list > div:nth-child(2) > div { - margin-top: 20px; -} - -/* No models uploaded yet */ -.cvat-empty-models-list > div:nth-child(2) > div > span { - font-size: 20px; - color: #4A4A4A; -} - -/* To annotate your task automatically */ -.cvat-empty-models-list > div:nth-child(3) { - margin-top: 10px; -} - -.cvat-models-list { - height: 100%; - overflow-y: auto; -} - -.cvat-models-list-item { - width: 100%; - height: 60px; - border: 1px solid #c3c3c3; - border-radius: 3px; - margin-bottom: 15px; - padding: 15px; - background: white; -} - -.cvat-models-list-item:hover { - border: 1px solid #40a9ff; -} - -.cvat-models-list-item > div { - display: flex; - align-items: center; -} - -.cvat-models-list-item > div:nth-child(2) > span { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.cvat-models-list-item > div:nth-child(3) > span { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.cvat-menu-icon { - transform: scale(0.5); -} - -.cvat-create-model-form-wrapper { - text-align: center; - margin-top: 40px; - overflow-y: auto; - height: 90%; -} - -.cvat-create-model-form-wrapper > div > span { - font-size: 36px; -} - -.cvat-create-model-content { - margin-top: 20px; - width: 100%; - height: auto; - border: 1px solid #c3c3c3; - border-radius: 3px; - padding: 20px; - background: white; - text-align: initial; -} - -.cvat-create-model-content > div:nth-child(1) > i { - float: right; - font-size: 20px; - color: red; -} - -.cvat-create-model-content > div:nth-child(4) { - margin-top: 10px; -} - -.cvat-create-model-content > div:nth-child(6) > button { - margin-top: 10px; - float: right; - width: 120px; -} - -.cvat-run-model-dialog > div:not(first-child) { - margin-top: 10px; -} - -.cvat-run-model-dialog-info-icon { - color: blue; -} - -.cvat-run-model-dialog-remove-mapping-icon { - color: red; -} - -#root { - width: 100%; - height: 100%; - min-height: 100%; - display: grid; -} - -#cvat-create-task-button { - padding: 0 30px; -} - -#cvat-create-model-button { - padding: 0 30px; -} - -/* Annotation view */ -.cvat-annotation-page.ant-layout { - height: 100% -} - -.ant-layout-header.cvat-annotation-page-header { - background-color: #F1F1F1; - border-bottom: 1px solid #D7D7D7; - height: 54px; - padding: 0px; -} - -.cvat-annotation-header-left-group { - height: 100%; -} - -.cvat-annotation-header-left-group > div { - padding: 0px; - width: 54px; - height: 54px; - float: left; - text-align: center; -} - -.cvat-annotation-header-left-group > div:first-child { - filter: invert(0.9); - background: white; - border-radius: 0px; - width: 70px; -} - -.cvat-annotation-header-left-group > div > * { - display: block; - line-height: 0px; -} - -.cvat-annotation-header-left-group > div > span { - font-size: 10px; -} - -.cvat-annotation-header-left-group > div > i { - transform: scale(0.8); - padding: 3px; -} - -.cvat-annotation-header-left-group > div:hover > i { - transform: scale(0.9); -} - -.cvat-annotation-header-left-group > div:active > i { - transform: scale(0.8); -} - -.cvat-annotation-header-player-group > div { - height: 54px; -} - -.cvat-annotation-header-player-buttons { - display: flex; - align-items: center; - position: relative; - height: 100%; - margin-right: 10px; -} - -.cvat-annotation-header-player-buttons > i { - transform: scale(0.6); -} - -.cvat-annotation-header-player-buttons > i:hover { - transform: scale(0.7); -} - -.cvat-annotation-header-player-buttons > i:active { - transform: scale(0.6); -} - -.cvat-annotation-header-player-controls { - position: relative; - height: 100%; - line-height: 27px; -} - -.cvat-annotation-header-player-controls > div { - position: relative; - height: 50%; -} - -.cvat-annotation-header-player-slider { - width: 350px; -} - -.cvat-annotation-header-player-slider > .ant-slider-rail { - background-color: #979797; -} - -.cvat-annotation-header-filename-wrapper { - max-width: 180px; - overflow: hidden; - text-overflow: ellipsis; -} - -.cvat-annotation-header-frame-selector { - width: 5em; - margin-right: 0.5em; -} - -.cvat-annotation-header-right-group { - height: 100%; -} - -.cvat-annotation-header-right-group > div { - height: 54px; - float: left; - text-align: center; - margin-right: 20px; -} - -.cvat-annotation-header-right-group > div:not(:nth-child(3)) > * { - display: block; - line-height: 0px; -} - -.cvat-annotation-header-right-group > div > span { - font-size: 10px; -} - -.cvat-annotation-header-right-group > div > i { - transform: scale(0.8); - padding: 3px; -} - -.cvat-annotation-header-right-group > div:hover > i { - transform: scale(0.9); -} - -.cvat-annotation-header-right-group > div:active > i { - transform: scale(0.8); -} - -.cvat-annotation-header-workspace-selector { - width: 150px; -} - -.cvat-annotation-page-controls-sidebar { - background-color: #F1F1F1; - border-right: 1px solid #D7D7D7; -} - -.cvat-annotation-page-objects-sidebar { - background-color: #F1F1F1; - border-left: 1px solid #D7D7D7; -} - -.cvat-annotation-page-canvas-container { - background-color: white; -} - -.cvat-annotation-page-objects-sidebar { - top: 0px; - right: 0px; - left: auto; - background: white; -} - -.cvat-annotation-page-controls-sidebar > div > i { - border-radius: 3.3px; - transform: scale(0.65); - padding: 2px; -} - -.cvat-annotation-page-controls-sidebar > div > i:hover { - background: #D8D8D8; - transform: scale(0.75); -} - -.cvat-annotation-page-controls-sidebar > div > i:active { - background: #C3C3C3; -} - -.cvat-annotation-page-controls-sidebar > div > i > svg { - transform: scale(0.8); -} From e9f1db00db0f4cb884e4d8293a63e708766d5f95 Mon Sep 17 00:00:00 2001 From: zhiltsov-max Date: Wed, 18 Dec 2019 19:04:33 +0300 Subject: [PATCH 08/14] Add polygon point count checks (#975) --- cvat/apps/annotation/coco.py | 8 ++++++++ datumaro/datumaro/components/extractor.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/cvat/apps/annotation/coco.py b/cvat/apps/annotation/coco.py index ec80b399d1cf..5e41b0678931 100644 --- a/cvat/apps/annotation/coco.py +++ b/cvat/apps/annotation/coco.py @@ -247,6 +247,10 @@ def insert_annotation_data(image, category_map, segm_id, obj, result_annotation) new_anno['image_id'] = image.frame new_anno['iscrowd'] = 0 new_anno['segmentation'] = obj['points'] + if len(obj['points'][0]) < 6: + raise Exception("Unable to export frame #{}: " + "a polygon has too few points ({})".format( + image.frame, len(obj['points'][0]))) area, bbox = polygon_area_and_bbox(obj['points'], image.height, image.width) new_anno['area'] = float(np.sum(area)) new_anno['bbox'] = bbox @@ -367,6 +371,10 @@ def load(file_object, annotations): group = group_idx for polygon in polygons: + if len(polygon) < 6: + raise Exception("Unable to import annotation #{}: " + "a polygon has too few points ({})".format( + ann['id'], len(polygon))) annotations.add_shape(annotations.LabeledShape( type='polygon', frame=frame_number, diff --git a/datumaro/datumaro/components/extractor.py b/datumaro/datumaro/components/extractor.py index 31d416449836..a91f3c4fe183 100644 --- a/datumaro/datumaro/components/extractor.py +++ b/datumaro/datumaro/components/extractor.py @@ -276,6 +276,8 @@ class PolygonObject(ShapeObject): # pylint: disable=redefined-builtin def __init__(self, points=None, label=None, id=None, attributes=None, group=None): + if points is not None: + assert len(points) % 2 == 0 and 3 <= len(points) // 2, "Wrong polygon points: %s" % points super().__init__(type=AnnotationType.polygon, points=points, label=label, id=id, attributes=attributes, group=group) From 6584f7fb21c5550c4da316562a95f3be1bccb096 Mon Sep 17 00:00:00 2001 From: TOsmanov <54434686+TOsmanov@users.noreply.github.com> Date: Wed, 18 Dec 2019 19:10:02 +0300 Subject: [PATCH 09/14] User Guide update (#953) --- .../static/documentation/images/image001.jpg | Bin 12719 -> 16406 bytes .../static/documentation/images/image002.jpg | Bin 6996 -> 11555 bytes .../static/documentation/images/image003.jpg | Bin 31181 -> 25063 bytes .../static/documentation/images/image004.jpg | Bin 9367 -> 13514 bytes .../static/documentation/images/image005.jpg | Bin 105424 -> 18152 bytes .../documentation/images/image006_DETRAC.jpg | Bin 67689 -> 13965 bytes .../static/documentation/images/image074.jpg | Bin 29606 -> 20437 bytes .../static/documentation/images/image123.jpg | Bin 0 -> 10771 bytes .../static/documentation/images/image124.jpg | Bin 0 -> 15567 bytes .../static/documentation/images/image125.jpg | Bin 0 -> 30966 bytes .../static/documentation/images/image126.jpg | Bin 0 -> 39226 bytes .../static/documentation/images/image127.jpg | Bin 0 -> 18378 bytes .../static/documentation/images/image128.jpg | Bin 0 -> 34272 bytes .../static/documentation/images/image130.jpg | Bin 0 -> 11726 bytes .../static/documentation/images/image131.jpg | Bin 0 -> 64287 bytes cvat/apps/documentation/user_guide.md | 206 +++++++++++------- 16 files changed, 127 insertions(+), 79 deletions(-) create mode 100644 cvat/apps/documentation/static/documentation/images/image123.jpg create mode 100644 cvat/apps/documentation/static/documentation/images/image124.jpg create mode 100644 cvat/apps/documentation/static/documentation/images/image125.jpg create mode 100644 cvat/apps/documentation/static/documentation/images/image126.jpg create mode 100644 cvat/apps/documentation/static/documentation/images/image127.jpg create mode 100644 cvat/apps/documentation/static/documentation/images/image128.jpg create mode 100644 cvat/apps/documentation/static/documentation/images/image130.jpg create mode 100644 cvat/apps/documentation/static/documentation/images/image131.jpg diff --git a/cvat/apps/documentation/static/documentation/images/image001.jpg b/cvat/apps/documentation/static/documentation/images/image001.jpg index 0fd9e9e68f272bd6179c63f614d515c5f54c5e27..e51b6da2f52c6982c96ff505292beaa92a283ac1 100644 GIT binary patch literal 16406 zcmeHM2Ut|emcC7sg94JX1VNx_a?VQ5S+ayC=cWM(HiCdQX+S|m1O*Wg0YP#`$%tf- zMnFJl1VNA-d)s;QoY~p=zTMeil(Xoxkd0-(x=ll-lZA>Hr7? z0J`6rwE)PaEibw0;dT476AhQ4tN6&fDhmc1ObA$0|ryT9oK>Y z0stI)z@1T$y14}g`pH6}K5!uiXJ1E{kdv=BG{nIVDk3Bd1>}`N{2ZJ-VSyZuFjsdU z1>Udq&Ac4$&I-I15_-aVewScw?wX+iFq2SyQ>Rc*CmCm6B}EES`4HIIE#ruoW;bPr6fe8MO{Q3Ie+Qi+382`eux0CpZj)pg2KFD-Y}m) zI1UXFC@1u9gZ^LbQ&Ha8N!BR<<`C!`@VD+wVE+Fz%)Hzce@7(cq2IB?wg0Vv>j5{3 zBqSvA(BF3cv(j&z|3w=&hq%&@8OQyTwRNxGw6%A1c6Ij*4UdeDjlZ8j z&(6(%T3Ey^eO})9wz;*vv%9x{@ZB#E0REd>KRo-LUsO21@bK}$_(b3R0^tSY1Wbib za9)IvTE&RS!T%hm=nY~T)s!b?tt4Dx#_P0>0fVG;+~Tu58{b{~*|YzeV^RMt&we=e zt6yk<91Oxu9+(PH0uIzse2?+|PbErc@=D2EW%?pb&HZyM5RNk+5iQFep#WbF>MxOv z{;2G43gN0);N?$PVDObi*?3Yo4HigQnWI0x8F!MHQ9pC*AZ;vVecrn1Wl++bfcdwn z&?nN2Z1XZXPiwDcryj+oElVt_y*M&hcexSnwXJu3S}w-Bl*QxQUB$$gtobX}b?TMR zR(8n3a%NP*ygJ#Og&4p~5ogOvmG(3~W}m?Vud9bkeFE#{4vV(L3>4l92vBP=2ef=V zbN^uMY&2wky>yjg4nlU>9;%bx-|vY~67;TQa2h6ff7VH_#8SFhsU_{JMuyU8zt+at zwzFg*#-F__S6#@gV}bqiRvN$-k0CWtZ4Nv8o*l+~xMI@V?&4ad^ii+cZPqcf{a2fy ziioj~KZTTv?(ychPYXmK+fKMDqm4&gn%p)6qEr}KoFXSWf}NH`j8plHB@JOl-1oFJ+mtE*nM}|4(&<1X-F+qu$eUc#Xm|eN{w=qXX<5E>UAx# zp^BN?S!YJKOTRplv#-inuNu`AEy`94z$-gAXR8S^X+un<5kek;kmat~O9a@$B!qQHeGfBXdtb!%( z9jE@|WV^H}BMlwl6?oT+>nukq>rvhLd(7?WPMYpyPpxjsguutyxxfc_*IN1lPw@6a zJ5g6ul2oQ`oqF zQMkyskA!D$G1(kpah}RGv9~+*x&<*wn!2*9jEZS_ACqIP?4zMV66}>W%NdmeZR5M% z_c*q}!_pY;?9lVMdRr$iWFnr{VF8Pad&w=KS!El+${TtWJMm7>+Nj+=1yPsvX5S^? zIG!CrN%(@6?_mL^ifsBf3OS#5%%^oz#Hus&xmhS`I^W41j6XKI95HE~hXtr~rW+56 zB032+d|S}j$>DM^hunU5@~YjaASwNxydcq!-sTuVfw~y-pp9H7{>Lm47q^VcU;5A( zsR93RF}3%oW_3+IIi!gwnK=n-#{v;3ARQII8iWNlr=f>mjCSgg`(NpgclhwE_@R}P zSfD?o`D>X5dKC*`8tix9KPGW2Xd3s$0t$0jpsAhRvlX2 z|Mkcy@Fdyn`;;ct>$`zQ{vc9lX~%`HZn+vpv|gpqF|xq|&)K&JmA1|+Q{T98qa_Db zR3M{+*hh=Il5xk6T8t|+Re(HDPh7gHOKD&9iL==)^7P*H+Ul=a)gS%J{c_l9j`GEv z=J*-uH?oDt6o73`ft`J2NuDd{+ZbcIdCKITY6(1Rr0Yl}zuSptaeqEmG*=Ye%Piwt zM{B7Po<%qi5JFSxCtmR4%^a(^C1hBSGgs$RjOR5v12IOllRyo%EIB+SDJS<{JCm*$ zLtd6yptGfzw-Bcg$QI*6N%SoTG|MK5x6F#C{gyav~7Lp*(kb+{slG z`*|~Ls7Y^CeVuBR?(h>EDxR2bEwCzXFG^3m%`QrNRi%|c6Q5F@n2R%#_fIdvPa10I zg2X<&?248ADcOd6JXuGmbWUKVqEDd4UD!T|nuUDpgc9Igm%z-66p_!)R{Q2jlh%BjTyrb;V0$R*Xhf;HL<_Pfrp=A9+P zN<)#{&#UROJ?aeP39Hq*R6|_){b%s<4z+_VHIB=D*K=1d9#0^@4kKd#6`s^if0`Y) zvYM;hlP%6)Q`Czb(Mk6tDgua~deH>gwpwb!xcyUpk}fBDA?HS|oGbd(j8T`8An`b4|l0ln1mH#&qt??T7?*Qaw8?{SOLL^}`mdb?%Z zT#K)k!SfP$%<&NruE7VV3Oqa1Mh4j*Zq3YUpiK^O33}!k79bUjd{aK)ijs42GbS6nRda=Ou zhev!rEUOM5Y+(TonMMQUQ3QpJ_K^C31_FOjrs;udj;zQfypq=;zV}nFu}ZhEM9{f? zyv^-)zq3#$cqBXR(fgp4SoTth;vX(2SLE-)ut2lk2~A-2_V7`3UUTV+N!EzG6g;3@ zhgm?odKJOqxNIHKGx&w0oBeHm;YX^;W+pVx?P1&)gfuUU*1zh?`KFV3XXfosgz_MC z@o}C~J@okCx3fZaS%7-bDB?ff0DoVU{|K<37yZ9aD*LY(d|&l{9q|u~Kd<_KFrWV< z=81Hu4anL#dNlK{ghscPiZ`xbsD;U|e>T9N`&v1bZsY=71y2=@w#0iGODd|49et(MM`hEoeC2}WtHy42!+tVxpKugWk z+rmI|^=a54OsAY~Dxn9zZHpMb>59&(i+O0<>rw5;e2Yf@pMp!At+0-Ftzr5W%B_ zT|v?FiBGx4!4mUBy+wPd-BmH|H6~s9she?N1*Mw+$q~i1y|*53q}w$fG{s%uqAr-= z3F>z(fB^>JGkK^xs}*@2$=tMJfQnz#zUrDs#?$j7!`C9ytE|Edd0a0N%oo*51MBV%CJ2HM%(^#ixW{ENf6clxe` zkI$Ct2fGHtr;D58wrVB1B;sC~AbsiY&`c)xWNswP*J2nKOa3770kE^gZUU|a=tKp4 z*@yf0JR6%sCf>m_ldjFv=EGcl^RK*db!9+J<5P7+-lVU!;KW{1IxJA8;r@HqRiq7uuaq|9;@FI=K7K?M5l%--(pHqf9`X z5w7*5h!XuSi}+)7VCMCT?DfftN9B$LGVQp-4xPOTZ5YmZr8LVk(7Ys( zkNjwbOl1G9X0n6DzWoO_^u51Gv0!o~L+{gTWa7qh#_NR944?uLN0`JFj(MhMD?<4plt=J6okglSUS<7vnKSnu$v_5XuT-|=2p2a#UK@t0IKsarJ(;`dU zopc+`c;l+vPa@+3V`NkY_cHW*`${*ZLPAkCg|_?lM+rRwRx@vy+CPZs5ag7=hEW#Pezw}l7U@!6`1&dDb&D`6KK+X_0yg2s z4d=LDmT7Ta?P>W&yyW@WV?U$mLFv6Y=ssfe_-tO6(gLP;o0Ko7$?(AM_xa*~QZI3x zgC5;x*yDy`Rb(4>cZ&^Cwa}5sKTcw#sKIcd-N) z>(R77w_nP*xf2@GV0HbHE(ABs2ec2WA83I@-i63?$c_tO0pc}WepL>`0!IYM_1qJx zDc_UGT`aIiiUnqEX!#6N!(VANRewe5V_>qCImb(q_14uhlLuBz{(G@Qa*rr_bS?C2 zQ!V{+7b%2htFsMk%qZARqYX9~MlM(~onJgE0Qo*()Igfkvj2N`lJ_(a%?IEaEbtLG ziWr~VSR?;Mt7p|~lgGMKx;oiPLe&O7lT1NPoE33agC%I0gdj;J*SiFakT^z`t^H1$ z;1Z9D=2_M;+_HBTi3K7{PiT;@<%+Su02>y-0wDV%{?BzZQ}aB#2hAhzJQ{}dp$1Uy z=1Y>e*vS6Uz*}NBtpN-R9!uZkcmzg+%10O7aw2gd{m&_dMFu=oiDB{-Rhq?9gJqeNPow*+ z3!ueKlleC2uM?QI!L^Q{PfpTD90WypkLcFU)mQu;>&NMr_!9lajk_YH z89G%>H(J@Xm!R@SuCCX_^(fw^Sl4yJ5lmp(dP!jhj6$n45hI4y#AMwoG$|zy9bXk2 zA%8h))~P=OWqMa2>*iyH5DwE|MdFHwcG-reFA=qAum?Ub=v>JGcCJ)O3@foufTxC! zFLdQ#o5%j%+qx6T%S4Awt{M}_=9N`G(WEm{Qu0uJB--Ap(ers{7z_?~#~-@Ilgja! zPqdu+%!f<_K6#3zg&mbn;w6(h>++}_LG>)V%ha=Q4oqrz#e8!8SE~c_Eb+bz)4gv+ z@83Cl-p1FdS5nS770Hy8g&g1BWVc^Azyh(t6-Y)2Ox%}J-@uiax`rT4$P?0z08uUb zhmpXiGP`W;$)QR&i4a(b@fGK&OEd$z^>(}f3nd9Fu?&6`g`-u7;#@~ZkASzS;DJ|? z*Mj5(Y4W44m3qv|2VqaO5J9k$n zQfB{KbBvY2S^M`>@6bYJJ32bItz4_pM|8^GFQ6o6t9dh75;CqA&E6e3QgJ9`zQbfa z-yeBFtz&G8O+N(vVK;B$Y>|syY0)y;D`-#+vDp0#&9hiAZM6vd0I~sfD5unPPSLCy zE@RrQV3qf7l{i+8q`OPzHBc9iLF8O>VAvO+lcw)-oYm$5+Uib^Qbe(Y(m@$%RS zUs-kKNXDwO_qb#+9s!D+YLO0nKA!xH-?jN@bBRXP-9zI}jiEdp&-nIKi`u}M1@(vU z%1}CC3=~S0BRX{#{ z;3s16VYD=uHo4KsN+cerGE#aWmp9IMY|^;4VHDGt*$L(rDROo2&S$pRGf+I*=!0~k ziXr)dspzFnFsH44!818mF9(~och?;rJ&EkUko-kpCB9e^V>~i6=gFL&c`az#>ZQnC zG~s+wZTE#jn?24U@6ZSpHJ>y`6@JI*^F&QvPrgZNprJA zol)V;i3pNLXnK`Egr1!18dQ_Z+4pHVcjMi))(&ODL?Sgkx*^SUIc|4$cm!&|I$t+p zz+h49MOOn$cacgM&o}J>+sfCktWUOY^mp~wbCYkhumo-`=Q0VM3{L7vP0uVkn2l%! z2;~*A(^<}FxlyCn_`b5v$GSTi#*E9@F=QU)S1GJ$pX|SIB2TxFa*hg`e4Ywye^5RS z@D!SS!|qx(85DKxl4;3`<-%H zV82d$%x5btheu{T$5UbZll^9noGSr}u#!hjNWbj$yO!M)MV2avFvy6yb1XjdYjBjc zKX7$pyjUBt^w98-wJ~q1?e?p8Zu87nrv^m0;nAstnlBEONc*3uxuAWXa@JNwPS!Wp zIH!@(G1|VtKR3cu%NCFDeBK)jE4VeZkh10&0``Rg)cIWQ98Qgztp%|4&WHKalM$ut z9wP*6Uj^12(yHd=kEffC`4_6vcuE?tAz256r(#5v9Y2XC;4v$ROtL5HHWhaZ*{)(1 iumFDEYHiw1^S#~XLv!~*HQE*g0gaLJznZXPC;klw)U%ub literal 12719 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 diff --git a/cvat/apps/documentation/static/documentation/images/image002.jpg b/cvat/apps/documentation/static/documentation/images/image002.jpg index 7c4eb8c314c992b1140c13f628bea6a3e088ee11..e7887de78c216e778fd9b00662ca52b033b9502b 100644 GIT binary patch literal 11555 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 literal 6996 zcmb7obyQVN+xJOA5YB-^*CC{lkQNY-?oi;+2ugQ%3(_eiAS&HRr-w#qBt#kk>6TF7 zJ9yvEv%dAc??2yf&z`kru9>}N&o#d*=4R$*2>?@)Q!EimDnn-vN&SU=ZlGU;x1sC=L_~fk5wIV`Jgq-@(VnyMu>!mw*U%mjF(H zhX*5t!HE$hBqaERWaOj>av}r?;`SpzFlG(}iVKC}BJSedMf`u`rV{|i0Z0Lj!9X|w z1P6lQz?*IW6=wYaFy;@|``A!Q(dprD{67%W5sh5@c54ncuOP?)qd zL?#l3RFS+Dg+V~KLIoTg_XkzompQcIr7QIXO+FLGYTx{^M6FajoWK8Q@qXAkPnlM5 ztzT&rCC_*E+4WPexy$QiH}kgadJg*?AO5;8#~trCI>+{tMa4W~KIYQCn)y*7*YV`? zSSF))Y&Y6B4rj~KE7IRFce>iHJtBH+<;2yu_=tvouXcWQ+J+8y%jwE9`}OFCDRFo3)GIykb?5V%36yXcP92PW(npgmI<8m2q$UKZZ-|8$DR_ekoeP z6vo-jAVo3OFa&XTtxX7q!9W-&NJ`^M-r^nrNe@$z+|ug&pF12BCdCU;3<|>R zUJ?wXbUPP>ivt8=w*DSQjZ82ArUMKBLcsqj84Lk}08lJA0!D;nav~-n#V8ar9sq=b zuI`G677Io;XW^;X1H&HL5E9}kD38@eMk7`u+H@zVCm+XOTTLf51c>?6^u9soH%`E{ ztSfx!`+k4ZRdzA-^L{6yO2M6&XJh24EmIq!@KQ!!PBnE*AAh`g-r%=8SqbM{(&QZ} zf&B`2fBtem=j7I`%+AouAI3`#YT%&WoSK#XRNR@p#|>^;N2X*ydY;Kwv*{$wd~5fSE(_z`jh4M1_;4c zh+B1H*_f@4e?GJvL1K9a&qyZJpl1A9M`Gb)*|zA#w&?jbNcq0`evFxWwk2xnwyOL_ zY#?rFBBa685bSrr9j3kA5k^c4J^s}0MK*HhV%bCtZ{t>wqQThk(-ET+0XP5%20=g= zGw`oYFm!^0>4}JWr8Lnn=fu1*2m;B-BkdGiz0ANTsb%)=;IEP}Tzv#QCzyKnL4hns zfhWr0KGhKlTd|oF$$!0;B=w-i7Y`r7Mg(Menqm=mCzVeB({|`WWGK$46K}IS!_>;8 z(7>Aw)2y;4TcoY{7na9@?D=&12j2lT)CyqtB(JhG1+bg-%c^XL%+8D0WNVR6@D8Re z89}M1D79>ZP4Lx_NICyUKy-QHN}jxoG{Y6vJnX%r>9i~{*6{##Zg^q)T1!IQ<8rMw~P_CHr1l z-P7q@~F(wiW!N!LEqdFi64gf=l=y?%RiNu=P&QJ!k;A->%36had+9{7mQfqAa zuj)Xzs=JC1s#*Npr;z6_QhOA?-WXg<@uA6Mx9&^F1D$U@Q}w;i%JA62 zY|psXMc%v4@07mYS?HveHt3g%9muKs7(K#9J9OF`L*LqIwaG*3ULfO_O4jZ!IOx6f( zu1%>+byUGF1!Qn@O}D(-%P5CsUYGbVnum$J6fZT9Qxz$)PkV8$#bL0s@JL15z;eVx zD1Ie)Fzh#BXKcOjb9hk{>Es}LV&2z@2Y4KI#iLQ~4?J|_9N$Yh@VKMCQ2*XcUq0Ois{-6>-rYH&n8n z7C_`P7^-H%Rb)>Gv8+SC1p1rbH`)m?Y%VlPA*f-a5?znH?qoGfkt@JHx&NI^m#ygc ztEg@R!(yl4b=%k;ukx?cR8fZp#id>wGB}$0f{As`UKyPC;iCJ74jerW1&wpMQS++K zjg=(LnXAsm9PR?WE3Gda{YXNJk;-1XsV5{8s3;zPCYE!IkoC5eaHU94T@ zlBz>xFWm1^wk$RLD$ZEouv!VA659x>iqWBWo-wf0b$y$vWJv%J^YT@WxZTebOp< z2)};9BI4CAKeyjsckXi~EeKBZSsoG3Xf{j}=JyiW9`T)FeQ=DbgVFa<5By-Mnr){h zzgFX>(p~;}h04!0)K-|Ll&NZ$%NFa{D{R&=;z^(g6uh!o#NzFJ%$-r4C$Cfb%ze1vw^ z?Jr-hmK$yELHqSDx=MQ{_}Q0;@v=S4HjLkGL-pDE+S_u9pomu0t|I#jm^W5VV#PFq zr7FQ@>~LylY|(b3%gLb{qsNF>9!Fq~Wg~TS4ODdc2*J?u1JWa#NBRv@+hG|lOBde9 zLtcfeA57q7@*?w6!;5tW0*jGo7vWFo_K9lqN0`$}`U`h*ca6Qe-2l78rkcm33ljaT z^gNxl@1()zV8C!z-nHydfApH1=7H8Xw7>P;L08+aYf7Ry-IJYjUSYaSDABE_Pc{0E zLZ@PD$u#s0KQ!L}(tBwFeKN;4y5FULu`?%ThsILX%k!RoXgDuoNuS&1z}xyXp>B1Z zJxd;cF5nAGwO?KO!%rl9RFU%((0usN`c7~b$d4f9PqiuikmzYy=cF)Ag zKQl&mQ^A{>wyIXJV=A{Yh5$si@(2bg;f5b`lkj;Kc(sfG!Ph z#j%hlcHSE7aoGZ&`~FPybjR60%3=PT`wN%TQaP_*fRB^(fTB(Q70=LhSS-Ssg4~|5 z0wuB7Rs2rQVa;|leue|{vQ~LYdvA(uO1&b$!jk(>@2%v2eYLuye8aCp|C$0e7$)ig zVcaS7KcOiQ0H?=T0W(-Ik_Qt6nN}YhI-&n@pP2CU5&e~r%k}dw=Z;HFE^C*I`In0W zdNCQ1Pp0sRsv3gj@XYcW8&%C1HxelkBfUzZrVuN8SOX4?747wtpDE5Ioh z=SSqM_F1%pmXxsmvQLG?<*!5iRj#WuXJpVBFQ0-)Q^R>DAtZd8B68No#;SZihJ(F; zBRt)!0zHmu=r^6FEg)Kqe2FNS&yL9G8<$t`x8{gHVd|(DUol~KXDJ7R$Dq_oFWWsY z_Q}wFyv)hn@@T{qvP9rUS@ofizutI3!x3TQLAvcB8xw*ltx< zp;TYG6Co%uW4sleU*O#v$twE8@Y&KH%=Dy|Fr*a?&=V3>>!+^up3X?gR=xq~W!=lk zZME?l?zas(aV#nx6+%2yG+e%yyQLF&#mrNpF*n0aKosg^ogR{y0A^2LBixu`S6n&e z-U~P;@?xmv^2(>_+$PY7RWwobRgI)N<+#k3g+``(D9${k zI2(SmN$1oJ);`P0oCWGU3~E=C7!{xBfBDE9ALYU1-qRFwX9wyM*FI<#9pz7ZR8l5! zn1I0Z^`cLInr{}mpAmwJn{0DB7F5BeG^P!pOi4{iNoCj4(tY=aV@kp1R~jM1_a+od zQBhG{mK9!v>u|9CyzR5nNkCgQ$M#0J^8JRxlN9EaTG|@`%MjwY2Lk)F7sfPwPKEJ9 ze-mH8Z6*anJ)ei4{oZfiEI(G|A3I32tJ#bEeRa0zHg!>uX?3npgW{I)esQ_qtQ^=r z#DBGfvTK-M7jU+bO*H{zPi>g3gN;f$HqQ2DwsReiKQiRqb#>UZ8^uvJNl0SMxKw-{ zfVJT!zqsH2yP#o+e?q=f_Vso%dAn!Ll$s4B z1+fu<>QSjF3&QWU5#6c>AIG`ZZN>pXgT{iV6Iu3BNZMrA@|L75cRrO(Ty4p07NO!8 zSqAl(=i^ZXI*s?LwwZ~}#Fa~$iSeym3y)42K1rr#kx6db*-yQ>%H!$v7r0Iqkp;<< zTAcf65-J(4Je%j+(Rh?e$5JSfsTD$>GV#1#3w;A0bi#17f2oD^e zzVQ!CTSC>0`F}Qf7~Q^X2ygVaDa?OonkSD9fS4;2!&(is)9gHyIBR92DNJKF_&*8V zUs<<`oSEkg@hkl9lly0t-j%plurKu_#%^F+-a8F1EX@^PY~T7FKUEQZy09GANH!Ce z()w9DKi=mZ$7h`?zno|y0)(Q37J1#{{43ii@Sk!fByx6HccfOzVoU47)I|qPY=B5W zBbs(%w?)&b047(WvN!89*7%hC1=`ckQ9eY-1w~t}%tc|;awoqTvSFaCnKS^0x{q&A zt-KuoW(N%yuw}}?i4qvq+g}v)FK(sLv@A}&CfQa&t+3^}Rrv0mw7-+E(b3*}#DCRZ z)W0A>a5*~TSqv}MQ&GlpF4)#~rB%+MDE=3JRE6?)m>7EYbB*k^wY4vDJ3FE4iEJE8 z@Rx;ct^pu{3Y(nMA;ZbP*+ z=n#MV-Q62NUrf^-qofFKKhGG|_gL0*$C1_wkuC>f*Qh9Cl2;oMITC|+C@Gmw^AE+B zz9vZ984MgwAweIQNB46?8yK{n$jtxDG4A*sqDlJB6TYvRE-8lI3SS`bRez!(eu*YY z(NI%2=;b1=;#Yp$(nsU>qf>H*=w#&bqMgSXhCmipuQK3Bg8pbtOk~oa08@zV!yw1$(zq|dq)?L|S;rxStZ54J^0^}y zPLqOVPyKWbKE}_ZdB$_y6*tIr!T~eidm$>t%&Y6(j=8dy1db3$ zxwlgHe;x8_Z}5f;d>A%LN@V?kBK*QDjTq>SPa~D^JwMGJr^jP z>KF!$C9|ABtUm$#@JHGLj<-x&cb+J;)e-AD7btd5!Z_wI6#4o9(|wt?FOmQIcFg{N z8^r;KU>1hZgO1~mbSHnE#68&UCG9N(A(+eDTl}RU3=@7GAf1EJ7&kHYZ{h`f1ZzIW zJlhq`+w0pa+ZFBio3~eP+wJ$;9iwk+Oh-lY#qF5N=!)j^+jeDiW!4I2{QC|0;almN zgnRRL%Ej1mg74IJg%Ra;8q-D-| z1H7b0p-{kCN_daRLmGL~+W*GSRpT8f<#A{#Zz+@b%K@N2n{Nav51@`#mbS(3FNt;#$!gW7?b`;ET8#2?x5y9ApJ`cJ`jJ?T31?1+w4d zCC5>Psw`$^sBQSAV#s`{EF0GuZ;Z>9Xl(EsR)Qxh2SHciN@}9mem24$NHx7^ib3nUz`1l0xcg=cxq|f7D6Pcg9;mo4Pe9Vr*jzBb({pEbM7r^7v{Gwj3ZZO#tl6w)_^?I< z4H@AN8uJV((p>H`{=;B-LpOHXiIwN}nsqAGaat^GPlZf1ethuv3%F!)E3ACljjd+s zXXW3=4122R&m!EN@Y3+p)1$-bVXSJyN^Uo2c1&(1?1Ye6eCt?GOklcZ95FEvXi1Y1 zp^T$18xJ*Rrd`kVMVEDpZ0>VS$BC?}MFn*Xew?>jk<^lheV)U%=(@ zqq~$RI#Sr)k=f8DvVP&K?^AhWOD{`hetZ^SbK!JxX3rhGoJQFW$D4(km-U>sGKXa& zTWczQKwcmB`%qXOr}T4tq2s}`)Gdrl#v?AF$DI>V8;NzWi2xZ~U=jGDHD2SXk%)3* z?RL^HgfpPbEh#fsh>k<}-6M;fu9)$MhTd_up#~Rv5zGTD zGx59+er_XaR@$h$zP2Rf{CWn2W3#Ch;9|oeh?)~pg2tAeSa4JZG@d4|{k{ud*3W}S zqyUQzt%-ymDcG;`$PbR(HoE$(Z0?b9;)RG21by}j68$;vF$Oc66{kwnDk$AYQxYrs z9kc?UR01py9WOGjS}JRvlthM`r~@-Xc=M12rDE2|E2i<%YW{l|4{$0aroc(UvbOo^Rryq<4bW%Kd-ap cVb2cQkz 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

r@XLX5jH>Q~|YVooR;_7sZ zF9HltiL1lYc7%E4&WYPcDsB6Wsxg-r+M!W20=K)`ZU$u5N;$s|8-CZ)H2A!y4z^X{X@lp!IjGH4^@`@f=i=fY zb3W-_T}f-gwNHYh>7M4(-VzPM;vGdrj7L3|L?EY-;DM;DRNbD3e zd}W{P53kT9-bW3}Kyr%iDTCR2wD+faJ36e@SN;6vrHI{{TweKZ#+R>$EY_=XVa2-{ z6T^q{wySIDWtF?*BO}+W?H$VekaSD0{qTbYn~Te9dtBHXk~yj-Em0s(T1V8C}_;(gN4gpsf9PSSgf_X-R*`2&Vq z_l5T|my3nSrlnP5h+SMCfcN4mHe28Qia12{!&-^A+TW> zI31F^J)Vm5a@1S`*y}?ngHv{cP=sd9%X5L=MN3V-*Vl82o04fST5H~Vv*99o@|Yg9 zD-C37q3XT?*D`m9e{`JK$X}prQQC+(5|qD6+19!#dZZ~&K-tu~A$mj(FaY9oWFk*O z+1$F}bi^osh4TGRgp#tkeRJx^4?ieNRM<@BkB5E?@-Oi6irZszc`-(4^d@8o?iYX9 zcCsm7r?bv7-MdbE_`dRFwshpoPb<_|BUE|t5pt$r=TJ6Dod`!Xb!=)ZTUodEk_{0> zX>{Hp41*~J6e_AI7);^?Db=_xPT60*Za3A`DmJ%}$2fY~I{4_gzn8Jv^$E(fMs|Yh z3pI^9wd8zHm{5D}yiD?Y_f{thE3hZsrH^jtjbU3LYVRAt5$|mikz2LQ%x3hL;fS_Q zuB=ylSt4aU3n69W0nTpDy`Ig_c|ewBdafi1Lpp-JabFj$CilTHv)h>4{$;12`!_I< ztfQJ`hOM0$Mwvdw#<8m2cJ0L4nNVYQU1nti5lP0B8dEdhakzgodc(hYLqjl5gEQ`< zV1^G31R{x}yA}20;LQmTrKw9(4T%Tlw|3Lg)})>7qyo_4vq+cOfUu1`)#pVUuQ*eGyx`#LHhf^W&)v?qvk0;nO*8Y7; znW`1mC{pYf+6|yqg_%BjxmlS-*MORrfH-bj3N*qbTf<#?bkK0wry?=ssHc&=sH14x z;85T=-49_NYcQ+7&*Z0Oj{Y+L^biV&If^=0w!Drq8gCSJui(6n#v6HlB882RBJ9c* z)W>70OH2(MfkeiOV|ybLji1)tUKz1g-&QzLaVtQFX76E><>#pM{-6?!UN-3DxIO$(R_?46_Fnv+NU=8WW>LG zeH25S&lpfhJ@%0ofB6PIMK|+WrK`%0A>k8?cJ8{S6ia(n=0fVl8-FA@Vajj76hAq_ z63OSv1cdvfK_-ZIt+eVK5Bm5zJEBx3*{Lq|P>Wq*j!@UUiiczL(O(nEDY7#ggaH#m z8sh3-dwasJ+5gRLV`~G|8zlMTD*Y?9;jEpY)}Bu8Y)j)W`18IVogBJDcYS-1Zqv)* z=!BFSITUnrkn|3#F!)JID*XdaWoIO5H5G^vA0WrrOo7JELN4#V1Z?PpMv1_ib zGBPr*-#k=T;KO(ix{xs}{@a>ZY;$Cl;HR9ZbQ&5ZHYT1n720<6w^6`*{-c zX{{K%)?`<(CAOwYa{fGl*t}VnloDm$JbDHmjK)yK`nSEck=|Ay?d~GP$@UUd|c$$-e^4@yRN>M;~gj0$vm5p6YZi_!!aKFy<>0IdrNL#4#|9! z@pc4>-J2Jpdas~JZPK%l2DC;3633FbCipgd{NmSu0>6_dXbmRK8E39TY)%o@%mIPi zkoshT;uyE{Yeo!Re>aQYO=>YylXzo_`4gqev(dR3Tf)uyC->2JB&0mYr8DHF=mdK* z49v8>ciiqb2nqBVI+<9#ZviEB-Ib+Z=&q)|n}ddeHD{!rCSL8&A!?r07L#A1oM+8> z$b>g)@qJ|P;xKYbI<5XWPSoDCBVMg|$eTtLEOB5Ua%+d#+m1#&O!P;w^Xv+OC0tDr zU!aO?A(fPVwQl>%0owPqFV7jZJM6yPPTx-7fNSIhOvPe|jW){4WU$bzv@{oK>F`;% ziviSx%4RfLj5I@r?yP3lXFjrXC&pNDD&Pg7R#ntXEKDCn?09<4O;0&UrQRc8j3&1U z)InxUR@{MBr9N41>NV)LC~@rozZ+EpLy@lO$vH1Ra8ZNvqoobWTUC+KBpHT$B^0xI zY4q^Qeu!sZ04XGU@L6VIHFMxz`PQDbLmtJnU7MTi{w8)QTm-A{w;GaYwB#*flM&~2 zi!+1Lws6SHXi3~?<`Oy)KGH?d+9~JBB)jWxcGSCyIjgw(0Zj$}rmVup*V@~A8W5N( zg>N?U=W7c6p8&Pq3G`;|NBM`qKVTUG3tbYBu7`;EW5~(GNB^~>ilghM-&@}lGe=Xp z<}uB~;TED%t?~kYk_f>4{D}ZZp1+_Q^8b-I3XXwd2^}w|JItT1yOgH2zcIGo2!p+2 zu+|C4(!3A?!w&(v_kQqx`j)Eq$Wd!)v$;7)3@)e`E=F=h3JM^2$b^jR=wl=poSVgd zgdl&Ix?FpuIDt14M;#g*)WFtG-sp`+$BO7(TV+_uotBpD8U9LPP~x!U^Z_~_y2Gs= zo$RiLqLg%?xcQz*c?-@gEtWuB#H=7N6=$+n%q?rTkoH8=Lvh=A$EZ)H`@1uthuZ5> zU+bCxf#lg&8%SvF10N$-y1IxAoFK zx70d)yYXmf2DKwBDl>$mdm=rS1q+0%!}f+;>++C$rNAuCN$RueB1N@{VO{2ZcPS}v zQ%}hw`$-o?5TR$=GQ+5u@m;X`9=zd?2z7e$4q30-i9NrB;PE13bTRRhsOnJ(icU@1 zKKD`D*jEk96DEvaOx7{&v~C`4NUl)kxBYWtqkFFWgLzIb+izse$&OdCE}Q^=Kc_7k z<;Nr`$5gAz$;jU`glpeN#v0q+$*5jd8;IA|fr0@yQ;&VsYXFGH=9_k$VV{&6l z?Ph5TqhhWzFWjY|4a!b!*JUqisLF;nsKLw{Cd(jlAfPi*w)CS=xjvn)S*Tg)%`u-7jx1cbltDId{S%8f1l)=yyw`o#>-QS=#t;9_ zKB)~;O}&<&UF#K!hUmLSCl@n>uJ`X- z_B)&4po}@g@p`H-Ba*$o5Bt7z_}Zy6v^SHv_6dJzDm=)3($hCKj#1H3d&iU zfU3sgQ%;UsogwCj{=WYHz|R~Ye}Bhw((%{vSMz@gkO4qX{Sg42VLE_@|GDOGZ8bm> zai)7M3`(Cj0CcAie7XwsPki&u1NtrOb~6TnmgYC_TWdV!83VxKA0(~k5}op0jNL!N zKLh+{n8j`tHbkP$4V(%N2g-x<<3Bt9JBnytfl(T5cwzT@gN6`5b>9n%-9cw$P#T@F K0ETNk9sWP|LMe~{ diff --git a/cvat/apps/documentation/static/documentation/images/image004.jpg b/cvat/apps/documentation/static/documentation/images/image004.jpg index 8622bd77217aeee710b9ed03adaa8200966c2e94..ecdd8fef662dc9f1d115fb66087465a860bed601 100644 GIT binary patch literal 13514 zcmeHt2UJtr)^1cp<$y|8s)Qy9MLz2=(ho8O#s?X~yLVgKPrz(o}W zWd*>A6DI(_9(@6aLx6h#N{Z8zrzt2YPg9;bLwT0!A{EuSb5soHFHm1(X1H{TnSqIk zg`Jm^g_WC)iRp^q6>dI$0g%9DPN8c;SFiD26}Wn=e<)6$JVklp%-N$})r)`=r%s+Y zcls11HO1-E$3iDgo}!>VO-Ikb$fc!?>7W$7qZtV_Ph}E&;P|BQ4EOcBI&h~bY|5KX ziF?j(#U;&91fHT#pTAffX=6E><^Pg8x>MtSR z1s#_thF(nb0p%UXl)^U*j86^+0n|r2PST#D1>6GcCfmz3?A*7S7XO=A*_lHHJ({t=TT zS~%7o#SY~tL0+jd}QFoH(d-dNyN*S8{{Ry@^&k_OEp6yw|6#vvhMdwQ^!_P zem#YIC#n+9rjX2&9-yLpX|u*?6|<<23K|G{*W6zz8PC6{&Jm4jQzfWw{IT5;S5{^Y zZ_1w3-37Z6CATR`rhceB%kW}^#@PH(PI{y=TaO0_vX_{Ev$QnmH57{3_4?&vu9M@E zROeGEjtTFp7TUTKA3DrdI=UNj!=nf9s$mOT+>B$&yc3*PhsdXEerTmq6)7(6(OC=C zAqgO@&Ea3j#KqwEaEMJhgakEwJhUA@G`JuoCnjfQL1UqA5lS74HBB_NBueQNBg-=Yr=3+8G^s7jOaS}_9;U~e!N~zjHQ=SkB2;S5#LNmP#I*%5|-t0 zLgXjhx2b=o8St}7|LOV<8$YGse{XC+1f4Eg(ff^Giq3VKNXv>$X>;(zgd;%wS9pI) z$Zea-JA-@Ra~X@eLWchBemYhh3-VMhwip6JLQ)x9Vi@boI`nqBQ}kv}nuSmRPkgG| z)OdJ%6VwQc8tF9za>G4i%g^Z_XX2f&NqN<9@ZqIF=eR-`Pl2s#3Z_R0>eN%#tiacn z;8hjwY@DB#6B(CpKJgyPLjaZZM)0=TVNl+9e3h&}C${3JWtU-HE-f{yK*e1=t|}Iv zVQY^P)myV6f;W6AMG3^=^Im$*iMGdT)oa5aI=))TwvszPic!wvJb z2E=T8arn}dj$g|YOCD1uXtUBiUd_einpzsO4mX0lsq)|&xvC$Ef4a8ZxnT2<2jbMJ zG|?)C05$AR%JnLwT8xYtuyQX#Php$!paxuA2AaRAKsBHmZqPeY+C1b7)T{ie;u48f z%*Wib>y2#dgr`L~L4oYV7Bq!(1BnEaUrH@%RHej6I95IXx)xFY?aI(JeNDde7JYqZ z+*+X`TW*Y!5ou*Kn6)D$Qi@lM5$?*{_f8ft^Ye0p$QL?gW>0T@FhL9sd?-KRQKI-*H8B)O=wbj?Z>GBdn4G1!~YCoCnkO0bPp!($1fzpDSl zpT7_U{+r}Ob}TDalc_mD(>BL)M^k0Ab7E~IDb>!{87}g~I5OWqXaW1Vrn}^ilAngA zQRmuo-8pUK2&3mi%H?5+!h}s@*>hLUTbGT5yp?f$#(Q3zb?IGmz+)_(QqojNPMb{h zVu?+8I9cMjIMe8PYKvjv5MbdLV@BLbyi4G%0?Vt2Nvx6}gS9G26mm}kIQo>s8bc70 z$toH7-lyPnQtcQ_G~NbhXs_YYo`URiWNrFdT!_81CHVF-MRZpSuNqr<>bTY&FiWn7 z1x}Jzts4P~@)YQ&Qh#se%;?-xq%;W9pXCZ}g+S2yMKv6-LiwjN@g>6wD=f#w$ttF= z$8U{5hPShYlHADnNr=shIN=gZZ|$(ZlPAA_DdpX~xCiDuW}+5`KB7hirg^BoZFjD| zx$ltfPvyL3x#`ga;(k9$fx7$718)wkX~^=k(-}g&N*e z(`GUXDkL(^7wX~i4gn;GsZg^+fNo{b=)L3OZlKuv_74PI=^QapqEzS&;ssqC9!?t1 z@i_$GNoOM#(9AsgbUZ7DTr9IZ2s~{N8Ogg`NV}v_yx{VKb&2eU#Z5RnpuB*19#UqY znWQi}rmbCGBKXxQUkgnW#P}r%N^USYKNIbCQ?R`>mV_MLmWP#9%RZm^A$O;x+ZE;K z;ng)HR9$N$R8(GbUo0b7?Uk&vRD$_B&Zpe=QZg=RE z;fsW#Zm~*%0kVhmvUvh9wPCut0PYZ5TyNrIwIj%v99gn%=hdmc)yeA>(QL?n2nf7` zH?DW!Ixc`zpY?u3z<(O7P5;&us=7?o0FB7m+IWE%xfn;81A_k6}u>bGPaAgizcMk&1Qe@y|1l^QEdRz zX4m{OR`yPJzPRFt@hNSHj|`06ivg)p(&6D4slg?MyspIxTFZrZ;^|p>mhopNpo-}l zy7;ArqH38^Df_yDp9UMUvNG7ACDZh}6-si3gOZwfwri2zlQGAOMFe|*wAK-u-6qTF zNB7o0MlmveX_KIV=n&EwFNC+D;V`nawt3!~a2NWGCvVWF{wl^CIJHd-I>*U6Sy4Sk zM+YU>9O_~?_U8VM!uM6^_W~{{>MWa4@_Rc)AfLfN9L&vP+ZZcwFL&gdBd+p~Gf#sH!BiXiHVqzwp7@f|3b|n`FiZdodh<^Hv*J zr;Qsh0vq&=Gcqh>XXpAD#^|P!eT2Am96sb}Ox65~$g-P70M{5hBwFY>Hq#h^UOA5k z$%>hnFVR5Q*-pMTd8rUg^Qs^SS^}J&2Xp=%3xQxl-SX?;dCCq zXD%@AmsdEImTh5&Xb6gd88Zq8;cZd}r=yKy-^>ccox1wKQ!A-BA5l8DHQ0^hu3|O= zo+TLkw&0UmP>gzj`sBipXUPrHRpw;Dfs?1mIEj|ZPfo9{X#Kk7&DNo&rp$nP$MUu@ z)lLC4#&>|=kNzn(vXw$q%VwU#-ke`OQu}L7F^m$%_9aEB<80jBJJbtD_(2 zzdV&Pqw?ZkpYWeZN}F_<>8+m^3F!Ki_jW|XSRVZ@TUqQy4(lkc)DYy!w0nE*$vtM| zZw)u~Y(PbDhR-$n*w4yr$S{J^lyn;e1uXC@@Sw$2YSQ)o+M+UP$q0vZ=*Z*Fap{&k zmxrawv1G?0?Fbq9XVfJ}Xk~gdrE`=yk=Jr8(?bNZyh=1n^#%v^;hJc;0!G)j44gE@MHAE!0AY>bt*QR#Ce5jH(*Y}rJ4M35w6tA zpsKJW{a;Xobfm?C;g((5s7-Rsjd)xLS_cKp!uHVb#Pr03ECE+oz~!M$Bh-1=peYc@ zJ>|7t=<(Qq<1XG4X2Rb^qE81^9E(0YQV+b(1pGctFobFl_bk^^0(7@e&<0pzh%?wA z0KE@RHjEr&edGj>lnyB?3kLe7!O}y#5)(^Phnl)>Oy|ttqWsh`-dUE_5t(6_U_p)?UdSK@3m)l?$J1M&LxU(+8=z%=ib*2 z@L3!ihSUAFBaw?;Y*CsB4;75isex(Fd@&*KYG@`Gqy@+emVcTo99|HMN846+N!0t| zerq48+zlv?SXaNiTjuMSQf^UlF?UT``z~6kr=4UrnYYkwuZ7!ue3_5NWY#?Rb)hML z>zgMY#{%xTH+3Ba%t#0l<(@pIQ?{abXG(QrTHRc4grig z&*N0a9>KMSv=0HLTC#d}Mn&Cs`!PIOP<_p18!^GsL0opy+*6L^va4}njw}3+ii3la zjjB7>|7W~;FPL~{*;%xGMDum=@I@#b3NbWxO*O5Syrl6A@kYI`nJn&%-|D$xy)?34XQa53MZG^%Tizv1d%x)+8Tv#kQ+8fk zwwqwAZPz0kd_CzU-rMO4-pZ0aCc$JFUj`OKP?_0jC1Q9poXT4g88eDuD zRSL2q#!d8#M4J;^eMH#c?kEG(mDE4#L1{SOoIaM$yd3@IrY^?1$aZ}fTZaa%0MJ?ejrztm7Y>y|2q$|aZNC*0q; z%5Y<@m7X;(uMU}9?k(gc6kgQZ+0Jb=RWg@v<-pf&9=Xd_(@eDUSzqv#ez{q;eEV?? zlOYHMI&o81dO^n=!|2sH+Y~S?8Z?#HzkFIzY}RJXI@UcIBa$Eo?tVnKUDR2vtR<0o zd8@}W18$hQX=f+{Ms97h>INeOi1lsw)fm!{XX@sDU_7M8cCA1&9X8djvd##?Xq>m? z2r6s#sEkigGWc5`@FCYX#R}hM(FuO#|7{q{H#sdnKc=4nK$YSj;?n){XhB?P9rcCM z(S{_TsiX%YyOVd-I>RFblXRN(YWxOd+6rsmE8-;oY=_3_;Qk@t^`=rnTQYXe29A(6 znuNkvU}v8JPXFbmfBndI2>5j7K&kOor}8Ez(_-viPpEH>@2GcK*|iqU{sk+R$76!+ z8J>C#5=PTPl^FV}?FN}ApSF^Pv<=x_bf1&KE}4B?t!S>^wGHg)a(nFIwQboZLC-mq zRo1tb|rWO=rt0}~t0y2`5wXo35Rp)hJkvG}VGY@H;XNzJBq*`>?yRlYle$ZU}A z!%zNf`8K5$&_OhOxuv>v(`4u(VOv0PM^|)@&T&O6VlDSb|MbzjjRKK)hmkgPlwCwi zBj|DA&WlfNk~auW?j@#nxSW`RWkr4zZk0={RAKgE(AYi6-S6}p}xY|qjvk{dRu&(fYvdZ8PyvshLHAGAbVFUD zYU@b9T!<|8%`oSD!!P$26DZ5V9!n|lz1&BxTkjO;Cg*WU`dYK2O#|E;m0W^oQ^vCR zeafc=+u*;5`_nPg)-=oa&W4%a6509mvMxa&Az47n)n-pcV-0J%OUL=@n#N~?3u|8v z0po#9Gp}#TN|ZP?l()eZ!mm3jynrk~ohF=I^I}_fmd-aSKGPIk)UAFk%7}~6F^cYY zPik}uEgL|qUoH;{+Mk>)N#gK{g?(C`(3Vy``0xTCZ(jVbhw(p3a=f8>Prx;Aa2rPk z4Y>oivN|8z*Bt`d_p^2lc&>~1O4WUMXma2Xm?GFG+v*>uCGKY$r^c^Oec0@AE?N-OW{$!<`h*ZFi{@R@3{AzL=@nSL26(E4)XV?A4A3itw#* z+svI8S&=pJy`Zt`i=oK-Wvq=&QfiC$%}%0NNFr+HeW1DdQ}?-F&&L1NY#~*jGy4enP`x*taBPE#+6)Zvqj_x7 zFSLKNkf~nnXp+xs-|T~({Qtd4QAmH}D=)bt)~B{S=>GV7^NsB>Sz{NDJz2x??6u&( z(}ew<*?%DVADUlzZ#m}u5YTZH8oYjAz4$f6MCv}o0D_Mo_;5VEyScI__os{h>fG?U zi%x1949Nzf7K`6X~sIBARInsZv?~?UA)vYn9?C+Hv zSOjGZhEACFMOKOknz(q(|ct3=@B2e1*`LXD6=+=D*TWf9Jklt290w-@a z830G9*ibl@M?5ModX>l!WNA}&C36kAL?u91jnyJ}@%WjOgnft={9{jaB>q)eR;xq~ z)&eOZ&Gis@@gLLi-)T!dI0Q@|bnWL|Pk4O@SUm(hI_M3iYeshw4Fhl`wq*zYM8(0) zsn1x`tewk9~9BnD^=oh ze#s-@@*pTnxKTh^@tGQ7QS0F8S(MjQju)g}&h?gV@80BX&MenU-8VJ-o{A2?do%6#^1 zBts}Pvu)CHkThoFJtUtRbc5-ZcF_2epPsp;c>H>BQ%DG|2MIDc=zDLt05hzgRoOv; zE`dh0sqYi4M;I4NdiVDho-IsBMZLIuihBO&@V>~s>W|h-*5+dlqDc|nU+ZZ<)%B|q z+nvHj9j=K{R;{^hFHQyK2-*y9te(1N7Afj0UDaUdcC4$lbURDDwRD;PNbYj4gH+s{ z(z`wK6y@!A7G^$9?#b5rRinRJQKJT`M$K=uO|71~VjgpJkZZADaXR(kYhCsTiu98g z*V@J1rJrF!w@IzkZ_thjq*n0Y%f#O;sE<&nKj7#&)(W*34OI-_ac_{GTQ}tP5;_FT zn#YWgrygZz1>i{Hmw~_$T9W4prc&aUH)=d*#~OuOGjR(gyU%-vt*)C*n_)P*Rnw7t zjkXnT+c_39FDA|Kn($E9eabA&Kc=PM2Z!Wux7Z&74h8^$l7c~vR;fOYxS)k}nABkD zNUf>kyr>m#q{6LPCr!avREey^M->+unWX3$b9nW#1MAqb+=q{!gOfQp)ehEAQQe&C zku&Hgo26;a#@c09k2J%$H1CT=DpsT6hyfXlVDLKq?Z5Jiu?HIk)yA+WKCd^cnZf0^ zph|?wEc1Nn>N_L^wOZIB%#Aj@dQ1V_-DU#R`Br9%+_oWWB^U%zGHjc!oSCkem=4$xI1+MJ4 zo+8MG=%rqXMIAWY5SKcJx%`44ZHtj>LX!{!w0VX&pzu&s425cjHDTRe9pN!lx6EA^ z@P^3_p1oPL+EUxi}xNj z8adf6&6XWoRur8xJT`A`;)K1Cn#P)u4|BV3QRZ@9t!G6`navT-!ypFZL+Wc9FQge% zGJ1(&ZSkK*K61VLqHm3qd;KI^)!5sXx%!m}&Zu0H{T$;K zo|gBO4x}bB!R`3O+4Qc%0d?)BFI24H{f#<<1?aYk zWhOJVw1D&7EKW>epPWw=R1y?6;HZlpWqLbC!7Hg0pCIVyXx6m+UMztQ#n*WDoluXC zj$#>-0lTgWTf7_R$X{tzUQlmC(8J-7IYN>i0l2)7ke%K_d~s%WgJzj(T2lQNe-9im zRCZ+9a&EOeRIrABj^huzI>emA`YoW(g$#Z03taVF;C#WGL%2E{9Rm z7IwXx#3m{j3B=jLfW~kH@nS13X_j|`gWE!jRHTik?UWM3g%HI+NB`;hBI~?n2Z2ZO zK#|pQ#e=~U>kN?af_oB*{a6~PVD>w-(r|>mq3t3r*-AiPWrjB{Bmyl#AmW{upaZRE z)s<;Ag!nu46?WVW(B>0Ph1}O?9ljvTI;x&kv@A%Z@Q{Gu&##IV zHzQ4;4Cfxc7|!rQ2IWC@iA;S<@Ez(-6}T?&rbLTs=D;C9TDGeV5Xe0m^hmL(#$t9l z%fc2VYSrQj(~>JQF8i{>jPdKeFFN)})-SDy>P*k<7NGvZM4q*C`6K^%`C1+s=8 z40k2wI6HKvyXkh2m8L~!dU=;4@zJp*og-vg+7)Rp4aALPiy3mJi>_s^4oaxNE~K=& zVA_%>^lP}U1eE}0WuFg$fj#rPzSk|+Chh{rf?{YKA|a-9tJmAQMGYSJxR#t1c(H9f zWf=wBj+v!+G~6wABzH8D=U(@FF8kL-qzg`}Bew-QEQqDcx-srC_OIH+o2dMi>07_B z0|gx8t>!qa%tvm6#3P#dwdFP{c)KxajlS^#wq{a9LCVW0dupN-%_|!H|Aq>ycKM&V z2Kr3W8w`V@JvB+1o}lf*^gS|cbYpD(dV8Rjjx@Wb8g;%}P=Oif5Fl=nSyy`}W53IT z3F*}z)GV7|$}T<~Vhz?+>d?evM~+^tmk%X|dM7qjyrkKujNMe5k&tKIp^;ij_~6bM zsf!ZYSiNF~lIZ*(!O`RTyaxh31Y|UfXapQQRol&6lhppy9leau?z%^h6^d>++Ebp* zRu0P$sBRP(;!GUNlb^iVknx9Hyld!MRmh^m~bVZZ>$JIO|gf zDSR-8UU68bnhjcip8Gk?U?DIK)8q5(TaBP>OPy;_J*nLFA%?c71y`3Y`tKN zp-V+ZshhXJhvwLeUhPT7^jcT@`y|?2mYoNGhq#`JCOb{mj(5aBP<9IB5qdCxqNOL@*^f6xEW{SQg`GFkG&dq}BY` z8V8ZeIsT6BiWDBj#)L>I3u0NV|L(yDu)bfemNE}2Q>#`ei0p)s#0?x7p;mJ?Fy|?- zTbY{-ZP7ucrd2NW7{}=n$XQQNfE=HTaaS?YxrDT+FK)23m5q!xWj|0;LhPs zuqV+z2u<*sT!sq&A#gJDsoXtwaV@X}?XAm9TDCA_x>?H|HD&)y)RKpEECL9&FVnTi z>n;W$)SxnvafQvTK^R(tt)8Yyn7*sDY)#aq&pk?$=42?cp-_CF6bAQlT{MBd;5|$8 zO3e(b-n5}T0I`eNDCu!1v;Lp~c=fNRGcI`4Jv!M^18IqiID>uRr4f_wqGV2j+p7?5 zk9;PCp_})8H6;Kp%zUE}sKX0o`=YQ_6s*1zw%P$_-D=U73-fO_S%+(!=0$G`$Tn!X zzmyGRY zGT6hH&eaSOt9!{hWyWFS&gJrqh@iff__U1RE|pynxg^KMkSox-FhtguGVR@OBwYhg zd8b}-p6;ZCkN=>*q^RM|g9|obUVH>i&IhASo!+}4{l-zNFFA%%-TFtiq_bTRX20o^ z3o`3Xc64z)T?&{+&~{07u*Htx%lil=ly~8F+fLV#cCNI1|K8O8qs^-qcfs2hwM7Tn z&eNjbH*JDf09XHYYX4D^_4_?=JVdPGjPk?bH77!TNU~D$t@{|Whq+mHs`}@bBxcbc zZzXtyiw>Vzbu_tLp)}%pm zng3Ny7yBQ+lItvAC0^b43QHZ;xV_B`tr}B21n?fbSUR;`miy26w;lohMbU2P*T2HO zw%z?<=7_f)qzHoM+VR|`&qY2iL4vVSA-@vuBoQy-6=LP>8vipV3;nSig&;_%Ks#RM(yn@mHKRwT?bLfOf)+vrp(XS)g2cl@DZIX z8)R-_J7TU$zs>T^hCeB%dqe+sf@%NLeH5(!7t_LuoK401DS^z;4|$MA6fV|NBiJF~Z34rV5QX}p^U1Om|iN|=}!n3&jD_k@j)^PBKV@d@$o z3n?)f(E}nfVmgY44=Lz?wA8dfb`}n~lwLWB1rV!dVJR&D0PXbLzdK2ba}h7=M#_{` zo|9aT0P`&T{bo`c>+}g~Om;j~Ep0X5#I^gI7dETHrXth#FRQHV!b(O&^G*YvOeg6a@MS%0JMdl zVs)?A{GeOq%q6^?Pz96pehGls$Xh(wC?x=)#P5MGhN6U2{?r0MyVvx0dw#D40}K66 zEogt!;{5_^@hYzvg1(hQ%-n9-mCauPctBt@{ez`gNi%TjJS>bAPrcQ({~JJ5=w+!V z`NucdYri$21;uY4_}r`Fz4rkc8X77(ItIp{>M#K4n5bwZC|D24$cczaDIPJh2x0@- z_$3%vpGm&4{|n|&umN{~oc>IKEvez4j~vf6oj8jwFK=4ie$v&L-)3_ftVnT_0sre2 z6KWuoT`= z|LqK6a4;lFFfZk^B;8lZf!3MGvj2fn6sc2_C^s*-t5=rS|F>#}qs~SF{`Q;W$sYZr zd6jnQ6igs>={5m7#iS zrunaxo|px!o$_cMDI{s>h&o$Yh~8@KtES@~JPf0x9pJFcU6=ag^Cm#Bd`?aCW0XT;+@e;L?cnSO7*AS# zq+zly-n@I;DAqQ_oodz)YuBTPU=1oMb`qVv+q3I}~|ivii1X`Ndn!=!DAG&+?8H6Ueh(FX5VtJCAbuU)yrYq7f5 z=_AmTBBHOD3Nedynj;pC<43UV++a) zI?()in%a zN1VLiia(&uLQi@57|VzH0gFhqVu7yA`~+Vxw(~Pm9>TfL$4rj|>I~Cq4mg-`7rrRL z9OOTdXtaYp(TY%`!mBb59V;}%!^KN%^$Dox1|wQ;{2Z%}^!pl$!X$#RglFZm@H}E{ zsokr`#xYnW&4{&M419fpL1^aM(Ph0Cn{pf8)@v-8v*6KMUITLssi5QL>sg8m2^h)e zHshLaCLjqMkVB1)NIY!EGGapgR%`Obn3pK^(&p?~PT+L$V}q*EJ_h86k#AL37tztR z<5NSseJOT{nM&Q8ThaDG$<8|f%%&^7AHBQw!qJFjke_6Bc#bMjF16>~Tv*!nu$=cj zYzpsTlQS1zC$0PCNH(*D&IA4&mqQv@240L#Zn0EB#vwCx9y4^X>wIug6_)%CV*zW~ z*Fboh+suoXeaP)EA~M?tVBGt9R%@zpBeHqf?NY{(Vh)>Kdp1_H_D0@x$A@FHZVCe3 zDJOlVmD-$1iY#$|&wxv=M4TT_Q<)6>+jgbBaVXA}<{#1#Q!vRgPY*h*nzfFO>EFXO zVW$GLr!AVS2#XB>y0BY$)e(Rv5`wf zrUdr=@-&J3^!oxyEhyAjf4Ol*>%Ubr7JG>_!@HH;1I9G5rUv}uxp5)&Pk6r}{*Nr{ z%90u-1Kkk@s~*`0J5{rG`Q(3OO$VPKaqyjvzf0?oum*V$)qqI+NjQA z4F&f>w|57;lc0^-#ye*4yd>^_ndQ>$KkK8OeWDVNKEM-lsru79u{>l)=ciYayJ;(Z z9&F`Gy>`GV;!8vegKURB|MW(AuGHB(gGjv5Y!7}OaM1SG7AlHd+3SC7`%`Q@S4n)W z`egjZM|NOf>kd$IAL>B<2z3A$n0RQ|*qCVdQPA(m4S+&|NlcnBM#czyHaO~+q?ARO`gAgK39=AN`}0{zt0 zy`?OQtOD-a4o*13NdRc=uqCTbNXpXn{=2- zAYHjQzVfe#>Plz`!X7;WqDn|mbOwIfPGrW-$vq)eQZ!||;>{bQKd$+gRs6B=ZSALt z6`@XcL>dq)@h04V!46)lg`rhn(>P7k`V%uex{%raseG>Kr*0`I?1>Sjq91sB3Vt{* zo&OJdE;Yxuh;Bcs*S8=8mnjN*e~s-v^xsRr4_eq~@Q<#H1IB<8EA1|hwmia zHhoRG9PrWJ^e7+WGH@+2Tp|7ipN#f4ez@mui`4ybq}_1q`4e}lCWK?@*0L%}-eJ?Z zZ*s<9xeZqG;Me4Vr=CO2!PfVy(pF1vx~4w*aW0)I`Nr_zHaW}dOJ`0we_447I=)EETn_R>)Tkd?9>9y@d0RPHIAW}o7L)V%TzLMC)w z^rB9q5{VbmgwAin_~o&F;Tt^mCO3$|WpWuSHBV z&S7}S*uq!2zuJL=LtDm>Ha;OW`K%{DE980lkB-#I8`8}67LUQ!M4fZK)H^^$$5w&P zGYi+jS>XBklow~5yb!u^Oc)V6INNFCMw$7Q0;CS-rdy2HB*7-SeM)~qu2(F{v^bF{0^O4*EI7|}?Sy+-kdP7Fh zlgTQ${7TuzXzaJ08b8&%yX=BU=fD$nbK1C+Tn4uMk%JO)CylPP!qA$jfcns|G^aE$ zw}uOQgOV9|J*L?056l6^%_^I8MWD_bw}IpZY`nECyQ|f6 z45)cMWg9a%c$(w_1_D0MEz4U@Ll}64f?AMDZcj^EXPni7gKCgV5nim5U%o9bsgj;7<7Q9BRBPiX zhIO`OBbk)Wh(z+|$r*SYESm4Vx7X?9NTi29*5-4h`5{Zhz^V0(nrSVyllY*d=h|z> zQI{iAliX*!E_HBqmHs=x2K8#nly9>;0lv(DLGijyaiOoaH0wJeZ!hrl9!F&O%~T;; zvKZ5wgFP9}bzNUvsSh|$Vv?RDChSl^ry`qSe7PY3+xc}HyM^GyB*pkRsTV4m)3u^g zTS$`TCxfV6G+8gP{4JTOr6i4rXyaxaS4DKH87&@R1Kq;Q-Q5_9_bR8@_f(rLUDzZVVBN*4&w0mnaBsP%39_RWmLWnQZR zz*)$plJN2!=L89g!LHDRaMC!9ecLij`7!wrC{n;WEI&sk4CMhrsBZtZ%JJsnyH9&V zf@M71u<$dym*=qPy_BJ|kSrc1%@^Sr`yP5TT{UoJS&W4BL<)*K+6CKtV{zAzN!e4< z?^nI&hyBw@CC&hWE3ojGB3(MTQz+^c3h3d6`FW!z$N}X($E8)UB}Oy7x30 z5(g}4CDpSgqm0U>6y1okB>QVA?WsE6*B`T~Jb{p~uP?+T%uGJZYC8YQ^}Pe^t0MTq z#*~>KKwBygu|!dRJrCiv+Y34)FNWR`Y_JtHKEBbSyU>O zsHOS}5DW>il+BHAHg`n?c!8pckl~w)=@F%JGyauu&J6+GA`^ED0Z`k#hS7H)v+UNq zNelG_H7AVn&=lE5r(Oe~1vFy338M66{#7v5QRK5&DWT-v7)AdQM6=ZA#(F9^v$h{a z3`na-U#TfE*!Brogy>umHunmXgCC_S5LniG6k5zrf&Gyoaz59w735(5>tUbNX}7_SL}K!cgoNhCw5F^ol?<8(i<#;vbJ^XTK8${L+=S3lR3{C(75 zyi5wxm=IE3luqOj0J7!U=+ZP@z*{7H!|{j^i&~f(REqSz;JG!BBh{Ag^MFox4%eH_s3CeGlZo6dupeOm$FYFDpbCbB%Nrulff{ z4;CP3O;qO~b4JVr-UQC`V$niiy&M&0>?fiV}uxTv$Ge5fN}o zpK*7u#XUalvc!$woAOLEzEA93YIz=oC323RP=d*~R?mK0ue0R#O~2W`$#TP>Ck4UC z9l)q8c3vSj>(geRsKb!G#w=h>M<1b96@sv*h}qzwr6L%4nX%Yl9F9?*BCQeLroph0 z3;Q(>?d)Nw#WCsm zfzGQ7xoTx#pBaS{Xf5W&@E2^n9Gb*lZY_ovvB3gczr$6-?!2?m=^rihc?KznPq%u;9gk&kp2^HOM1pTmY0a5mQ6`1w^&n!ear-q{CKC3p)R_&x#l z+}~}JtGA0=aVW!E=8r3+T>Z7rPc{D3Y6Vq8bQOpMn((Ln_E^B{+H-^%Tr)shi1RcR>F75#eLkFLQ0}!Q?e5Rj8CZ1br?7a zW#B#depuqE$|zruWy1NI1LbLq2y>j=*_4i^S(!xWa@?!=f;z}FFR!dd4Gwwfr|%v$ zN5fJrwp`~WsxF4+t%`M1K!x1M&Oo_Fpw1EOvaxaZ`985-lPp2XK_K3{h5hU#`B+>~ z8B%Y0Z>#X4bg`5xuI@?92H^zg0TVH=fP_f7m;2RGS*`&_2DnzHLd=W%p#WeoR4#OY zuF3sejmeGctKFihn#xnPhjxsNb1`8icE8Rh`OAFU=KU>kaHYyh(HpL0iWfQEYbI>u z8WLl*WorAP`bb|CVnojkjGn4-DdGh;6- z8QU_dTfXOp5tLU+9dg|s6Z-7#t)_8< zv4eqVF^=Y1tpZjmau^JCheR~89lO(QBDm+xbyLV|*FOxo129%_e}r>DZ@MIn0JIY1 zwM<55UUVfqshL44l~zk(23;mQ<{$EGC&R8ht_ov+wjP0^yDmJKy?L5OnU3Eth0((g z&*W|lU2|ktuUkmODHgZ??}f$+!M;LDo(Pf880>Wu!GaITzQ zgZ$5RbkN7J*$>XE%+RgtqW^TzKhvNJQIoGM=6D|;pk5va&Jd21-nqR}3J-125U{SX z%aO5CML+IT<&nM^|IgQLA~fkq_1`rzC=1nEOTx;(yGSqTDNij*bSxy79JJJ8hfBJl z$^j1=GU|0<33EDkUdmY&Td#92tdDl*TD0V5T2ge?frnniEl&Nv+VNcc=6-dVUAY6a zkJku_3!==Dke-awYQ%^eNh9QUlx@7C}eh3{(JFhmtlnhg8o zlR3+eKo8O77{MRP^Rv>nW&|w>{}nd6GI*&U&r|%^_CD1oPJI8wiH?Scjg9sDwevUq zex@ZR!2re)F+P)&Qc+dQS^17hMlPUkoc)PcLfOc{$v>9Q#NN?wboI}tToe>>zz=vi zQ$~jVjF95|W3E)KcTSW?wY;>LUI!7aU*gttyQsEDk8Sa%{#UGx~=etuf9Cinz=lIGT;JhpWr^ zml&cjO`|M|y^KQHEA6A0B%bia!Jh@uY?c=yX`~_*fndw54VKCAv~GrBwp}uDO<}J_uYit# zs=0idVMj83nqx3>C0Y36*P|-1Dqr%ph{i;;kL(9Mbx4$&-|91_;TCeCFgoY$Pt9_t zdM8e-Reg{?s~F&pr8)S?57n7?KEU(iJU9 z|8ZQcCkJtsbU^7EB-qNLGD?X&W89V%Seoh=NvG~SpwK-XYoK`nU*)b}Zwsm_KO*M6-7P;N!WzoxU5&{IDctcCuEV#) z@TYVKS24%csitZt@#i)(3hw|l$~^&rn@&lYqpH3SPUZ}h7E9U^RWS zr*59N0@!xgbT&I|RSyu3wM%Rk-iz>f*{!(H1;uM00MS;~J1R24nJJ;d6l*sh3HmN& zYpT&-b3T%<3s;vMGjF6@cG34ctE7!YRcnS(?r(55xMX|;^9}l$u#2pxXi5uahJQWR zR*|^vVi$IY75F(H-ikl>J7+{x_*PE;cP!jvOVILGH2P><(=wkAd~>x-q;{t7OYXG<5vsqK%gznG)snsB-zW@@=pI86@ diff --git a/cvat/apps/documentation/static/documentation/images/image005.jpg b/cvat/apps/documentation/static/documentation/images/image005.jpg index 1beb9a7e2008f4f1dad1475af348b4fe1f97c1c5..5916feb155301595c2243b84013f48ad692994cb 100644 GIT binary patch literal 18152 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 T_isG=ANg`aSN@SQpcwmaP=Loi literal 105424 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 V>vH)|REPgVO7nk#Gx6i=e*pKQ;86eo diff --git a/cvat/apps/documentation/static/documentation/images/image006_DETRAC.jpg b/cvat/apps/documentation/static/documentation/images/image006_DETRAC.jpg index d566dd2145577f6eb04f7d17d85bbd33b066c949..7a6fb764dbfd64c91ebb004b5a251e442338747b 100644 GIT binary patch literal 13965 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 WwQ%30j`|bDzwYn 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 diff --git a/cvat/apps/documentation/static/documentation/images/image123.jpg b/cvat/apps/documentation/static/documentation/images/image123.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9427659043ce55de4cd4af04b4d9553a11f59055 GIT binary patch literal 10771 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 Nzff1N@JZLA{&K zWQT9X*$gV&+1mYnspk*xFps_Jabojk8191EYu9PlwIo)IB3(uh0V9fjf^yGzt6?rm zm(bu=xX&8j5$w%^Hkl@_k-MH!o$(&gSLhcRJ;-ojy3`K+7~yZU%MWg~2@DEdwtFbh zneu+dep7R?|J|c9KJlvAcFGd!^UrqrQkWIi`B3$LOe2erYt&<-p$7;Y2^gLbfuY17 z(P(;v^*nUp`otO|Y_36E7`BbJYOEwR{~ zM9&}0%LJ%*=|A1NAFQEDr`DFchH70&@lWzsxtEsW{avI9G?a5P%EM7{*4g*l%so!H zY8MC(U3_D9-;aV(-!OZA7& z{ek(^_N*XHRkM(PPxq&V>5|C0nfrE%M&gOMHB;dcOnQ5oEH8s6!n-I7rf<=cwn3h{ zEuGICD#gft2WF|_@-EIO2uxBI$xSBz?nLo_b^n|5$U3UOIrWqoI&Jz+4ff#T-w)l8 H5r+N)N;<7< literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/static/documentation/images/image125.jpg b/cvat/apps/documentation/static/documentation/images/image125.jpg new file mode 100644 index 0000000000000000000000000000000000000000..389e876de0764aa81fd60f4bd2489b00a67180a8 GIT binary patch literal 30966 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 ACjbBd literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/static/documentation/images/image126.jpg b/cvat/apps/documentation/static/documentation/images/image126.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a0f14dabd0bdd16bdc7ba715f2b886a4f0abb11 GIT binary patch literal 39226 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 literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/static/documentation/images/image127.jpg b/cvat/apps/documentation/static/documentation/images/image127.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45313ff04ef05b3e491f86505f7ed15f6cb7c3e4 GIT binary patch literal 18378 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

kLrS=hQ4=o4;mN^*y`xpysdPUFMaCQ6P2! z?PE=i0NyQUUPGwt>s)ZAfx)z*DD@^~v;xv~B8plzu#z-2NO!D3FxN9+(dT=%&Fw2X z3pFv+EgM;xxc84_b&Dylwo`uH${Yrk50k{-2J$^DY9;zXD8-VhgY7bn%PsQPsjpDx zN-9^Ajp?q(x2P{OZ;=Dh6+^l4{ za0{%Imwm3NuCaS-m*B(5&rv5`;h5(}4F_UQK*)fii>j=#IpK$ST&)lOv8P0_Y{ zTdc9~a}A%0V=ArqHLkG5s_kv_s%ll&X>-L%*-incowgYNtkKG+y61^er&dqkWhh4X zg6dfhScMCuXr|uXC9O(xskx5h+vbd_Wj|ZZhg=wIsHYU!O7K*Dz<`L+sOBLx>f_QE z=@%QFnvd3k*I|8*oEzHV$vK8%&%^w>w$%b#lH{s$9G9wI!n_i!V7J~$p>L6c0~)`q ziB&1y{nJXyzpB9ar}gQAhxuR)l2aFKc!9f5{y71DE%4X2u|GI|FspEj?1WC3phub+ z!h=wJ)Cb!pa^zD%zC+%u6kiBC*9u?0K71z;Pf2*mgGWxyR^uMsi}UF-&qT7s6M3^k zzdQ1C;Hs&?NP8<{53&#E^xraGi^xylL~He{ZPmY7i;=T|O;XS5$8M8vaan^~>5htR zx$*dB?-k!pj1n~$kZ{f%{VG^InD9R84Cb=RA~9UWolaZ|p8~rdE=|$3GPSPA2d5&t zh@sf`d|pn|$VP7(x<0)MLI%O(*-;ODu1zw$>hQbMad5?kvM(T$&Z$0*Ip-&dGCv33 zh9@C?DA?VzrVlX3>dEc3&T5fhnUEeo65FABbTIqZUHPjyNaGflZsy9te?+ZYMTryd z$f_Itq>ElCfuUAo!L4T)Pt!P2pDsRjDiC#*YJng=3-V6R-uC>kD2qaY)YI2T|IM8pnpl97R zByA3B%#|>Q>dEl6&Z+^*9mdPwE=!Cp_4Re55QsyvgiYlsRz4`F+JJDThsO5bG+X@z z`*55|qo2k#XCLSV5|hBGDe>wow!uO({Ug0QYR5H)BBJKK*gl85XTP|+EXVE2u$W%r zkswvB;`(W;Sj|0`QFWjl{7p8HpA@BjQrx+BoP~0$9(9zLmHLv}3i~Cx^J%ZdB;d>? z2Jq1rVTg4n3k_ihr#OZXw#nbzuEg?R_~vd6^Gme z=gsQ-*92#_w2VA~Kvr1<$0Dom8Bjh+ zPI;-c(1k31{LAor1=l)1GiAext+0lFuSmNu;DZC(t1jl>ly_M-eP*G?vMayVC-0ce zHC6nj_HgM7qtLYE`B*U}P9m~PqQEP^Hh8{vInvM(E4~E8V5Ft{&QGvd#}GzO0Ialx z9qz|7)Z&c}AvaxC7O^kLdi@rUcr~Gb9+X?nZ=Q+ub{0bqEEue#uQL3MMt17h%jmDw z2PbFyTLUvc0jnar@T3!Coryosbp47Q2)GeU@TM~Am#?cJH(!-tH#9#$3G4L literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/static/documentation/images/image128.jpg b/cvat/apps/documentation/static/documentation/images/image128.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96b35592beeeb3b0a235119783d7ecd15d84d11c GIT binary patch literal 34272 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 literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/static/documentation/images/image130.jpg b/cvat/apps/documentation/static/documentation/images/image130.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa952e60827337911932f104c153561ac109a1f4 GIT binary patch literal 11726 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 CNg$N~ literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/static/documentation/images/image131.jpg b/cvat/apps/documentation/static/documentation/images/image131.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0bf3f140f15c9a9cb3397e6389287e8bd3eb9f41 GIT binary patch literal 64287 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 literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/user_guide.md b/cvat/apps/documentation/user_guide.md index 5c3947e9c433..118dcbc8cf89 100644 --- a/cvat/apps/documentation/user_guide.md +++ b/cvat/apps/documentation/user_guide.md @@ -28,6 +28,8 @@ - [Annotation with polygons](#annotation-with-polygons) - [Annotation with polylines](#annotation-with-polylines) - [Annotation with points](#annotation-with-points) + - [Points in annotation mode](#points-in-annotation-mode) + - [Linear interpolation with one point](#linear-interpolation-with-one-point) - [Annotation with Auto Segmentation](#annotation-with-auto-segmentation) - [Auto annotation](#auto-annotation) - [Shape grouping](#shape-grouping) @@ -55,6 +57,8 @@ computer vision tasks developed by our team. ![](static/documentation/images/image001.jpg) +- For register a new user press "Create an account" + ![](static/documentation/images/image002.jpg) - You can register a user but by default it will not have rights even to view @@ -80,67 +84,71 @@ Go to the [Django administration panel](http://localhost:8080/admin). There you ### Creating an annotation task -1. Create an annotation task pressing ``Create New Task`` button on the main page. - - ![](static/documentation/images/image004.jpg) - -1. Specify mandatory parameters of the task. - You have to fill in ``Name``, ``Labels`` and press the ``Select Files`` button. - After that you have to choose data you want to annotate. - - ![](static/documentation/images/image005.jpg) - - **Labels**. Use the following layout to create labels: - ``label_name input_type=attribute_name:attribute_value1,attribute_value2``. - You can specify multiple labels and attributes and divide them pressing the space button. - Attributes belong to a previous label. - - 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 +1. Create an annotation task pressing ``Create new task`` button on the main page. +![](static/documentation/images/image004.jpg) - ``label_name``: for example _vehicle, person, face etc._ +1. Specify parameters of the task: - ````: - - Use ``@`` for unique attributes which cannot be changed from frame to frame _(e.g. age, gender, color, etc.)_ - - Use ``~`` for temporary attributes which can be changed on any frame _(e.g. quality, pose, truncated, etc.)_ + #### Basic configuration - ``input_type``: the following input types are available ``select``, ``checkbox``, ``radio``, ``number``, ``text``. + **Name** The name of the task to be created. - ``attribute_name``: for example, _age, quality, parked_ - - ``attribute_value``: for example, _middle-age, good, true_ - - Default value for an attribute is the first value after "``:``". - - For ``select`` and ``radio`` input types the special value is available: ``__undefined__``. - Specify this value first if an attribute should be annotated explicitly. - - **Bug Tracker**. Specify full bug tracker's URL if you have it. - - **Dataset Repository**. URL link of the repository optionally specifies the path to the repository for storage - (``default: annotation / .zip``). - The .zip and .xml file extension of annotation are supported. - Field format: ``URL [PATH]`` example: ``https://github.com/project/repos.git [1/2/3/4/annotation.xml]`` + ![](static/documentation/images/image005.jpg) - Supported URL formats : - - ``https://github.com/project/repos[.git]`` - - ``github.com/project/repos[.git]`` - - ``git@github.com:project/repos[.git]`` + **Labels**. There are two ways of working with labels: + - The ``Constructor`` is a simple way to add and adjust labels. To add a new label click the ``Add label`` button. + ![](static/documentation/images/image123.jpg) + + You can set a name of the label in the ``Label name`` field. + + ![](static/documentation/images/image124.jpg) + + If necessary you can add an attribute and set its properties by clicking ``Add an attribute``: + + ![](static/documentation/images/image125.jpg) + + The following actions are available here: + 1. Set the attribute’s name. + 1. Choose the way to display the attribute: + - Select — drop down list of value + - Radio — is used when it is necessary to choose just one option out of few suggested. + - Checkbox — is used when it is necessary to choose any number of options out of suggested. + - Text — is used when an attribute is entered as a text. + - Number — is used when an attribute is entered as a number. + 1. Set values for the attribute. The values could be separated by pressing ``Enter``. + The entered value is displayed as a separate element which could be deleted + by pressing ``Backspace`` or clicking the close button (x). + If the specified way of displaying the attribute is Text or Number, + the entered value will be displayed as text by default (e.g. you can specify the text format). + 1. Checkbox ``Mutable`` determines if an attribute would be changed frame to frame. + 1. You can delete the attribute by clicking the close button (x). + + Click the ``Continue`` button to add more labels. + If you need to cancel adding a label - press the ``Cancel`` button. + After all the necessary labels are added click the ``Done`` button. + After clicking ``Done`` the added labels would be displayed as separate elements of different colour. + You can edit or delete labels by clicking ``Update attributes`` or ``Delete label``. + + - The ``Raw`` is a way of working with labels for an advanced user. + Raw presents label data in _json_ format with an option of editing and copying labels as a text. + The ``Done`` button applies the changes and the ``Reset`` button cancels the changes. + ![](static/documentation/images/image126.jpg) + + **Select files**. Press tab ``My computer`` to choose some files for annotation from your PC. + If you select tab ``Connected file share`` you can choose files for annotation from your network. + If you select `` Remote source`` , you'll see a field where you can enter a list of URLs (one URL per line). + + ![](static/documentation/images/image127.jpg) - The task will be highlighted in red after creation if annotation isn't synchronized with the repository. + #### Advanced configuration - **Use LFS**. If the annotation file is large, you can create a repository with - [LFS](https://git-lfs.github.com/) support. - - **Source**. Choose "Local" if you want to use files from your PC. - Choose the "Remote" option if you want to use a one url-adress or a list. - To create huge tasks please use shared server directory (choose "Share"). + ![](static/documentation/images/image128.jpg) **Z-Order**. Defines the order on drawn polygons. Check the box for enable layered displaying. + + **Image Quality**. Use this option to specify quality of uploaded images. + The option helps to load high resolution datasets faster. + Use the value from ``1`` (completely compressed images) to ``95`` (almost not compressed images). **Overlap Size**. Use this option to make overlapped segments. The option makes tracks continuous from one segment into another. @@ -168,17 +176,29 @@ Go to the [Django administration panel](http://localhost:8080/admin). There you Thus using "segment size" you can create several jobs for the same annotation task. It will help you to parallel data annotation process. - **Image Quality**. Use this option to specify quality of uploaded images. - The option helps to load high resolution datasets faster. - Use the value from ``1`` (completely compressed images) to ``95`` (almost not compressed images). + **Start frame**. Frame from which video in task begins. + + **Stop frame**. Frame on which video in task ends. **Frame Filter**. Use this option to filter video frames. For example, enter ``step=25`` to leave every twenty fifth frame in the video. Use this option on video files only. - **Select files or URL list**. If you select `` Remote`` in `` Source``, you'll see a field where you can enter - a list of URLs (one URL per line). - Press `` Local`` or `` Share`` in the `` source`` field to choose some files - for anotation from your local PC or a network folder respectively. + **Dataset Repository**. URL link of the repository optionally specifies the path to the repository for storage + (``default: annotation / .zip``). + The .zip and .xml file extension of annotation are supported. + Field format: ``URL [PATH]`` example: ``https://github.com/project/repos.git [1/2/3/4/annotation.xml]`` + + Supported URL formats : + - ``https://github.com/project/repos[.git]`` + - ``github.com/project/repos[.git]`` + - ``git@github.com:project/repos[.git]`` + + The task will be highlighted in red after creation if annotation isn't synchronized with the repository. + + **Use LFS**. If the annotation file is large, you can create a repository with + [LFS](https://git-lfs.github.com/) support. + + **Issue tracker**. Specify full issue tracker's URL if it's necessary. Push ``Submit`` button and it will be added into the list of annotation tasks. Then, the created task will be displayed on a dashboard: @@ -186,35 +206,63 @@ Go to the [Django administration panel](http://localhost:8080/admin). There you ![](static/documentation/images/image006_DETRAC.jpg) 1. The Dashboard contains elements and each of them relates to a separate task. They are sorted in creation order. - Each element contains: task name, preview, execution status, buttons, and one or more links. - Each button is responsible for a specific function: + Each element contains: task name, preview, progress bar, button ``Open``, and menu ``Actions``. + Each button is responsible for a in menu ``Actions`` specific function: - ``Dump Annotation`` — download an annotation file from a task. Several formats are available: - [CVAT XML 1.1 for video](/cvat/apps/documentation/xml_format.md#interpolation) - is highlighted if a task has the interpolation mode + is highlighted if a task has the interpolation mode. - [CVAT XML 1.1 for images](/cvat/apps/documentation/xml_format.md#annotation) - is highlighted if a task has the annotation mode + is highlighted if a task has the annotation mode. - [PASCAL VOC ZIP 1.0](http://host.robots.ox.ac.uk/pascal/VOC/) - [YOLO ZIP 1.0](https://pjreddie.com/darknet/yolo/) - [COCO JSON 1.0](http://cocodataset.org/#format-data) - ``MASK ZIP 1.0`` — archive contains a mask of each frame in the png format and a text file - with the value of each color + with the value of each color. - [TFRecord ZIP 1.0](https://www.tensorflow.org/tutorials/load_data/tf_records) + - [MOT CSV 1.0](https://motchallenge.net/) + - [LabelMe ZIP 3.0 for image](http://labelme.csail.mit.edu/Release3.0/) - ``Upload annotation`` is possible in same format as ``Dump annotation``, with exception of ``MASK ZIP 1.0`` - format and without choosing whether [CVAT XML 1.1](/cvat/apps/documentation/xml_format.md) + format and without choosing whether [CVAT XML 1.1](/cvat/apps/documentation/xml_format.md) + and [LabelMe ZIP 3.0](http://labelme.csail.mit.edu/Release3.0/) refers to an image or video. - - ``Update Task`` — bring up "Update task" panel. It is used to edit or add labels line - - ``Delete Task`` — delete the task - - ``Git Repository Sync`` — sync annotation with the dataset repository. - It is available only if you specify a dataset repository when the task has been created. - - ``Run TF Annotation`` — automatic annotation with Tensorflow Object Detection API. - Presence depends on how you build CVAT instance - - ``Run Auto Annotation`` — automatic annotation with OpenVINO toolkit. + - ``Export as a dataset`` — download a data set from a task. Several formats are available: + - [Datumaro](https://github.com/opencv/cvat/blob/develop/datumaro/docs/design.md) + - [Pascal VOC 2012](http://host.robots.ox.ac.uk/pascal/VOC/) + - [MS COCO](http://cocodataset.org/#format-data) + - [YOLO](https://pjreddie.com/darknet/yolo/) + - ``Auto Annotation`` — automatic annotation with OpenVINO toolkit. Presence depends on how you build CVAT instance. - - Item color depends on status of synchronization with the dataset repository: - ``red`` means annotations are not synchronized with the repository, - ``yellow`` means annotations are in a temporary branch of the repository, - ``green`` means annotations are merged into the repository. + - ``Open bug tracker`` — opens a link to Issue tracker. + - ``Delete`` — delete task. + + Push ``Open`` button to go to task details. + +1. Task details is a task page which contains a preview, a progress bar + and the details of the task (specified when the task was created) and the jobs section. + + ![](static/documentation/images/image131.jpg) + + - The next actions are available on this page: + 1. Change the task’s title. + 1. Open ``Actions`` menu. + 1. Change issue tracker or open issue tracker if it is specified. + 1. Change labels. + You can add new labels or add attributes for the existing labels in the Raw mode or the Constructor mode. + By clicking ``Copy`` you will copy the labels to the clipboard. + 1. Assigned to — is used to assign a task to a person. Start typing an assignee’s name and/or + choose the right person out of the dropdown list. + - ``Jobs`` — is a list of all jobs for a particular task. Here you can find the next data: + - Jobs name whit a hyperlink to it. + - Frames — the frame interval. + - A status of the job. The status is specified by the user in the menu inside the job. + There are three types of status: annotation, validation or completed. + The status of the job is changes the progress bar of the task. + - Started on — start date of this job. + - Duration — is the amount of time the job is being worked. + - Assignee is the user who is working on the job. + You can start typing an assignee’s name and/or choose the right person out of the dropdown list. + - ``Copy``. By clicking Copy you will copy the job list to the clipboard. + The job list contains direct links to jobs. 1. Follow a link inside ``Jobs`` section to start annotation process. In some cases, you can have several links. It depends on size of your @@ -466,7 +514,7 @@ Usage examples: ### Task synchronization with a repository 1. At the end of the annotation process, a task is synchronized clicking - the `` Git Repository Sync`` on the main page. Notice: this feature + the `` Synchronize`` on the task page. Notice: this feature works only if a git repository was specified when the task was created. ![](static/documentation/images/image106.jpg) @@ -881,7 +929,7 @@ By default, objects in the mode are zoomed. Check It is used for semantic / instance segmentation. -Be sure ``Z-Order`` flag in ``Create task`` dialog is enabled if you want to +Be sure ``Z-Order`` flag in ``Create new task`` dialog is enabled if you want to annotate polygons. Z-Order flag defines order of drawing. It is necessary to get right annotation mask without extra work (additional drawing of borders). Z-Order can be changed by ``+``/``-`` which set maximum/minimum z-order From 8edfe0dcb4068821c60216aaa219dc04dbe7ea68 Mon Sep 17 00:00:00 2001 From: Nikita Manovich <40690625+nmanovic@users.noreply.github.com> Date: Wed, 18 Dec 2019 19:29:01 +0300 Subject: [PATCH 10/14] Swagger documentation (#978) * Fix swagger problems (exceptions, /api/swagger.json, /api/docs/) --- cvat-ui/.gitignore | 2 ++ cvat/apps/engine/serializers.py | 19 +++++++++++++------ cvat/apps/engine/urls.py | 9 ++++++--- cvat/apps/engine/views.py | 16 ++++++++++++++++ cvat/requirements/base.txt | 4 ++-- cvat/settings/base.py | 2 +- 6 files changed, 40 insertions(+), 12 deletions(-) diff --git a/cvat-ui/.gitignore b/cvat-ui/.gitignore index 841dae587e89..4952a5fa8bd9 100644 --- a/cvat-ui/.gitignore +++ b/cvat-ui/.gitignore @@ -2,4 +2,6 @@ /node_modules /dist +/build +/yarn.lock diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index 9ef3556d4c2e..08903d7efc06 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -26,8 +26,12 @@ def to_internal_value(self, data): return attribute def to_representation(self, instance): - attribute = super().to_representation(instance) - attribute['values'] = attribute['values'].split('\n') + if instance: + attribute = super().to_representation(instance) + attribute['values'] = attribute['values'].split('\n') + else: + attribute = instance + return attribute class LabelSerializer(serializers.ModelSerializer): @@ -75,8 +79,11 @@ def to_internal_value(self, data): # pylint: disable=no-self-use def to_representation(self, instance): - upload_dir = instance.task.get_upload_dirname() - return instance.file.path[len(upload_dir) + 1:] + if instance: + upload_dir = instance.task.get_upload_dirname() + return instance.file.path[len(upload_dir) + 1:] + else: + return instance class ServerFileSerializer(serializers.ModelSerializer): class Meta: @@ -89,7 +96,7 @@ def to_internal_value(self, data): # pylint: disable=no-self-use def to_representation(self, instance): - return instance.file + return instance.file if instance else instance class RemoteFileSerializer(serializers.ModelSerializer): class Meta: @@ -102,7 +109,7 @@ def to_internal_value(self, data): # pylint: disable=no-self-use def to_representation(self, instance): - return instance.file + return instance.file if instance else instance class RqStatusSerializer(serializers.Serializer): state = serializers.ChoiceField(choices=[ diff --git a/cvat/apps/engine/urls.py b/cvat/apps/engine/urls.py index 6631874b3790..eef0ab2e0470 100644 --- a/cvat/apps/engine/urls.py +++ b/cvat/apps/engine/urls.py @@ -37,9 +37,12 @@ path('dashboard/', views.dispatch_request), # documentation for API - path('api/swagger.$', schema_view.without_ui(cache_timeout=0), name='schema-json'), - path('api/swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), - path('api/docs/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'), + path('api/swagger', views.wrap_swagger( + schema_view.without_ui(cache_timeout=0)), name='schema-json'), + path('api/swagger/', views.wrap_swagger( + schema_view.with_ui('swagger', cache_timeout=0)), name='schema-swagger-ui'), + path('api/docs/', views.wrap_swagger( + schema_view.with_ui('redoc', cache_timeout=0)), name='schema-redoc'), # entry point for API path('api/v1/auth/', include('cvat.apps.authentication.api_urls')), diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index b6ad69d68e6a..c4e816474d03 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -55,6 +55,22 @@ from drf_yasg.inspectors import NotHandled, CoreAPICompatInspector from django_filters.rest_framework import DjangoFilterBackend +# drf-yasg component doesn't handle correctly URL_FORMAT_OVERRIDE and +# send requests with ?format=openapi suffix instead of ?scheme=openapi. +# We map the required paramater explicitly and add it into query arguments +# on the server side. +def wrap_swagger(view): + @login_required + def _map_format_to_schema(request, scheme=None): + if 'format' in request.GET: + request.GET = request.GET.copy() + format_alias = settings.REST_FRAMEWORK['URL_FORMAT_OVERRIDE'] + request.GET[format_alias] = request.GET['format'] + + return view(request, format=scheme) + + return _map_format_to_schema + # Server REST API @login_required def dispatch_request(request): diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 5fe31b00964c..7b688b34ec12 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -30,9 +30,9 @@ GitPython==2.1.11 coreapi==2.3.3 django-filter==2.0.0 Markdown==3.0.1 -djangorestframework==3.9.1 +djangorestframework==3.9.3 Pygments==2.3.1 -drf-yasg==1.16.0 +drf-yasg==1.17.0 Shapely==1.6.4.post2 pdf2image==1.6.0 pascal_voc_writer==0.1.4 diff --git a/cvat/settings/base.py b/cvat/settings/base.py index 961c792f0366..08ae7e2b4e0d 100644 --- a/cvat/settings/base.py +++ b/cvat/settings/base.py @@ -145,7 +145,7 @@ def generate_ssh_keys(): 'rest_framework.filters.OrderingFilter'), # Disable default handling of the 'format' query parameter by REST framework - 'URL_FORMAT_OVERRIDE': None, + 'URL_FORMAT_OVERRIDE': 'scheme', } REST_AUTH_REGISTER_SERIALIZERS = { From 36b1e9c1cefc60097f9595e45873b4a8afedddcd Mon Sep 17 00:00:00 2001 From: zhiltsov-max Date: Wed, 18 Dec 2019 22:21:19 +0300 Subject: [PATCH 11/14] [Datumaro] CVAT format import (#974) * Add label-specific attributes * Add CVAT format import * Register CVAT format * Add little more logs * Little refactoring for tests * Cvat format checks * Add missing check * Refactor datumaro format * Little refactoring * Regularize dataset importer logic * Fix project import issue * Refactor coco extractor * Refactor tests * Codacy --- datumaro/datumaro/cli/project/__init__.py | 29 +- datumaro/datumaro/cli/source/__init__.py | 6 +- .../components/converters/__init__.py | 5 +- .../components/converters/datumaro.py | 11 +- datumaro/datumaro/components/extractor.py | 1 + .../components/extractors/__init__.py | 13 +- .../datumaro/components/extractors/cvat.py | 286 ++++++++++++++++++ .../components/extractors/datumaro.py | 125 +++----- .../datumaro/components/extractors/ms_coco.py | 179 +++++------ datumaro/datumaro/components/formats/cvat.py | 10 + .../datumaro/components/importers/__init__.py | 15 +- .../datumaro/components/importers/cvat.py | 46 +++ .../datumaro/components/importers/datumaro.py | 37 ++- .../datumaro/components/importers/ms_coco.py | 39 +-- .../datumaro/components/importers/tfrecord.py | 19 +- datumaro/datumaro/components/importers/voc.py | 6 +- .../datumaro/components/importers/yolo.py | 16 +- datumaro/datumaro/components/project.py | 11 +- datumaro/tests/test_coco_format.py | 73 ++--- datumaro/tests/test_cvat_format.py | 148 +++++++++ datumaro/tests/test_datumaro_format.py | 13 +- datumaro/tests/test_project.py | 30 +- datumaro/tests/test_tfrecord_format.py | 22 +- datumaro/tests/test_voc_format.py | 10 +- datumaro/tests/test_yolo_format.py | 5 +- 25 files changed, 774 insertions(+), 381 deletions(-) create mode 100644 datumaro/datumaro/components/extractors/cvat.py create mode 100644 datumaro/datumaro/components/formats/cvat.py create mode 100644 datumaro/datumaro/components/importers/cvat.py create mode 100644 datumaro/tests/test_cvat_format.py diff --git a/datumaro/datumaro/cli/project/__init__.py b/datumaro/datumaro/cli/project/__init__.py index 05e222ab77ba..cd728ef477f6 100644 --- a/datumaro/datumaro/cli/project/__init__.py +++ b/datumaro/datumaro/cli/project/__init__.py @@ -7,6 +7,7 @@ import logging as log import os import os.path as osp +import shutil from datumaro.components.project import Project from datumaro.components.comparator import Comparator @@ -27,10 +28,13 @@ def create_command(args): project_dir = osp.abspath(args.dst_dir) project_path = make_project_path(project_dir) - if not args.overwrite and osp.isdir(project_dir) and os.listdir(project_dir): - log.error("Directory '%s' already exists " - "(pass --overwrite to force creation)" % project_dir) - return 1 + if osp.isdir(project_dir) and os.listdir(project_dir): + if not args.overwrite: + log.error("Directory '%s' already exists " + "(pass --overwrite to force creation)" % project_dir) + return 1 + else: + shutil.rmtree(project_dir) os.makedirs(project_dir, exist_ok=args.overwrite) if not args.overwrite and osp.isfile(project_path): @@ -78,10 +82,13 @@ def import_command(args): project_dir = osp.abspath(args.dst_dir) project_path = make_project_path(project_dir) - if not args.overwrite and osp.isdir(project_dir) and os.listdir(project_dir): - log.error("Directory '%s' already exists " - "(pass --overwrite to force creation)" % project_dir) - return 1 + if osp.isdir(project_dir) and os.listdir(project_dir): + if not args.overwrite: + log.error("Directory '%s' already exists " + "(pass --overwrite to force creation)" % project_dir) + return 1 + else: + shutil.rmtree(project_dir) os.makedirs(project_dir, exist_ok=args.overwrite) if not args.overwrite and osp.isfile(project_path): @@ -147,7 +154,11 @@ def export_command(args): return 1 os.makedirs(dst_dir, exist_ok=args.overwrite) - project.make_dataset().export( + log.info("Loading the project...") + dataset = project.make_dataset() + + log.info("Exporting the project...") + dataset.export( save_dir=dst_dir, output_format=args.output_format, filter_expr=args.filter, diff --git a/datumaro/datumaro/cli/source/__init__.py b/datumaro/datumaro/cli/source/__init__.py index 61c5b49c933f..6c3f9f993c8b 100644 --- a/datumaro/datumaro/cli/source/__init__.py +++ b/datumaro/datumaro/cli/source/__init__.py @@ -210,8 +210,12 @@ def export_command(args): return 1 os.makedirs(dst_dir, exist_ok=args.overwrite) + log.info("Loading the project...") source_project = project.make_source_project(args.name) - source_project.make_dataset().export( + dataset = source_project.make_dataset() + + log.info("Exporting the project...") + dataset.export( save_dir=dst_dir, output_format=args.output_format, filter_expr=args.filter, diff --git a/datumaro/datumaro/components/converters/__init__.py b/datumaro/datumaro/components/converters/__init__.py index 26c3710966b6..a78ba4a7e202 100644 --- a/datumaro/datumaro/components/converters/__init__.py +++ b/datumaro/datumaro/components/converters/__init__.py @@ -24,10 +24,7 @@ ) from datumaro.components.converters.yolo import YoloConverter - -from datumaro.components.converters.tfrecord import ( - DetectionApiConverter, -) +from datumaro.components.converters.tfrecord import DetectionApiConverter items = [ diff --git a/datumaro/datumaro/components/converters/datumaro.py b/datumaro/datumaro/components/converters/datumaro.py index 4e80b5855aa4..246d1911529a 100644 --- a/datumaro/datumaro/components/converters/datumaro.py +++ b/datumaro/datumaro/components/converters/datumaro.py @@ -11,8 +11,7 @@ from datumaro.components.converter import Converter from datumaro.components.extractor import ( - DEFAULT_SUBSET_NAME, - AnnotationType, Annotation, + DEFAULT_SUBSET_NAME, Annotation, LabelObject, MaskObject, PointsObject, PolygonObject, PolyLineObject, BboxObject, CaptionObject, LabelCategories, MaskCategories, PointsCategories @@ -52,11 +51,13 @@ def items(self): def write_item(self, item): annotations = [] - self.items.append({ + item_desc = { 'id': item.id, - 'path': item.path, 'annotations': annotations, - }) + } + if item.path: + item_desc['path'] = item.path + self.items.append(item_desc) for ann in item.annotations: if isinstance(ann, LabelObject): diff --git a/datumaro/datumaro/components/extractor.py b/datumaro/datumaro/components/extractor.py index a91f3c4fe183..c61b6c17a47d 100644 --- a/datumaro/datumaro/components/extractor.py +++ b/datumaro/datumaro/components/extractor.py @@ -476,6 +476,7 @@ def __eq__(self, other): (self.id == other.id) and \ (self.subset == other.subset) and \ (self.annotations == other.annotations) and \ + (self.path == other.path) and \ (self.has_image == other.has_image) and \ (self.has_image and np.all(self.image == other.image) or \ not self.has_image) diff --git a/datumaro/datumaro/components/extractors/__init__.py b/datumaro/datumaro/components/extractors/__init__.py index 9820a27df4d2..6e5f323b9b5c 100644 --- a/datumaro/datumaro/components/extractors/__init__.py +++ b/datumaro/datumaro/components/extractors/__init__.py @@ -26,14 +26,9 @@ VocComp_9_10_Extractor, ) -from datumaro.components.extractors.yolo import ( - YoloExtractor, -) - -from datumaro.components.extractors.tfrecord import ( - DetectionApiExtractor, -) - +from datumaro.components.extractors.yolo import YoloExtractor +from datumaro.components.extractors.tfrecord import DetectionApiExtractor +from datumaro.components.extractors.cvat import CvatExtractor items = [ ('datumaro', DatumaroExtractor), @@ -59,4 +54,6 @@ ('yolo', YoloExtractor), ('tf_detection_api', DetectionApiExtractor), + + ('cvat', CvatExtractor), ] \ No newline at end of file diff --git a/datumaro/datumaro/components/extractors/cvat.py b/datumaro/datumaro/components/extractors/cvat.py new file mode 100644 index 000000000000..200fe88e9e79 --- /dev/null +++ b/datumaro/datumaro/components/extractors/cvat.py @@ -0,0 +1,286 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import OrderedDict +import os.path as osp +import xml.etree as ET + +from datumaro.components.extractor import (Extractor, DatasetItem, + DEFAULT_SUBSET_NAME, AnnotationType, + PointsObject, PolygonObject, PolyLineObject, BboxObject, + LabelCategories +) +from datumaro.components.formats.cvat import CvatPath +from datumaro.util.image import lazy_image + + +class CvatExtractor(Extractor): + _SUPPORTED_SHAPES = ('box', 'polygon', 'polyline', 'points') + + def __init__(self, path): + super().__init__() + + assert osp.isfile(path) + rootpath = path.rsplit(CvatPath.ANNOTATIONS_DIR, maxsplit=1)[0] + self._path = rootpath + + subset = osp.splitext(osp.basename(path))[0] + if subset == DEFAULT_SUBSET_NAME: + subset = None + self._subset = subset + + items, categories = self._parse(path) + self._items = self._load_items(items) + self._categories = categories + + def categories(self): + return self._categories + + def __iter__(self): + for item in self._items.values(): + yield item + + def __len__(self): + return len(self._items) + + def subsets(self): + if self._subset: + return [self._subset] + return None + + def get_subset(self, name): + if name != self._subset: + return None + return self + + @classmethod + def _parse(cls, path): + context = ET.ElementTree.iterparse(path, events=("start", "end")) + context = iter(context) + + categories = cls._parse_meta(context) + + items = OrderedDict() + + track = None + shape = None + image = None + for ev, el in context: + if ev == 'start': + if el.tag == 'track': + track = { + 'id': el.attrib.get('id'), + 'label': el.attrib.get('label'), + 'group': int(el.attrib.get('group_id', 0)), + } + elif el.tag == 'image': + image = { + 'name': el.attrib.get('name'), + 'frame': el.attrib['id'], + } + elif el.tag in cls._SUPPORTED_SHAPES and (track or image): + shape = { + 'type': None, + 'attributes': {}, + } + if track: + shape.update(track) + if image: + shape.update(image) + elif ev == 'end': + if el.tag == 'attribute' and shape is not None: + shape['attributes'][el.attrib['name']] = el.text + elif el.tag in cls._SUPPORTED_SHAPES: + if track is not None: + shape['frame'] = el.attrib['frame'] + shape['outside'] = (el.attrib.get('outside') == '1') + shape['keyframe'] = (el.attrib.get('keyframe') == '1') + if image is not None: + shape['label'] = el.attrib.get('label') + shape['group'] = int(el.attrib.get('group_id', 0)) + + shape['type'] = el.tag + shape['occluded'] = (el.attrib.get('occluded') == '1') + shape['z_order'] = int(el.attrib.get('z_order', 0)) + + if el.tag == 'box': + shape['points'] = list(map(float, [ + el.attrib['xtl'], el.attrib['ytl'], + el.attrib['xbr'], el.attrib['ybr'], + ])) + else: + shape['points'] = [] + for pair in el.attrib['points'].split(';'): + shape['points'].extend(map(float, pair.split(','))) + + frame_desc = items.get(shape['frame'], { + 'name': shape.get('name'), + 'annotations': [], + }) + frame_desc['annotations'].append( + cls._parse_ann(shape, categories)) + items[shape['frame']] = frame_desc + shape = None + + elif el.tag == 'track': + track = None + elif el.tag == 'image': + image = None + el.clear() + + return items, categories + + @staticmethod + def _parse_meta(context): + ev, el = next(context) + if not (ev == 'start' and el.tag == 'annotations'): + raise Exception("Unexpected token ") + + categories = {} + + has_z_order = False + mode = 'annotation' + labels = OrderedDict() + label = None + + # Recursive descent parser + el = None + states = ['annotations'] + def accepted(expected_state, tag, next_state=None): + state = states[-1] + if state == expected_state and el is not None and el.tag == tag: + if not next_state: + next_state = tag + states.append(next_state) + return True + return False + def consumed(expected_state, tag): + state = states[-1] + if state == expected_state and el is not None and el.tag == tag: + states.pop() + return True + return False + + for ev, el in context: + if ev == 'start': + if accepted('annotations', 'meta'): pass + elif accepted('meta', 'task'): pass + elif accepted('task', 'z_order'): pass + elif accepted('task', 'labels'): pass + elif accepted('labels', 'label'): + label = { 'name': None, 'attributes': set() } + elif accepted('label', 'name', next_state='label_name'): pass + elif accepted('label', 'attributes'): pass + elif accepted('attributes', 'attribute'): pass + elif accepted('attribute', 'name', next_state='attr_name'): pass + elif accepted('annotations', 'image') or \ + accepted('annotations', 'track') or \ + accepted('annotations', 'tag'): + break + else: + pass + elif ev == 'end': + if consumed('meta', 'meta'): + break + elif consumed('task', 'task'): pass + elif consumed('z_order', 'z_order'): + has_z_order = (el.text == 'True') + elif consumed('label_name', 'name'): + label['name'] = el.text + elif consumed('attr_name', 'name'): + label['attributes'].add(el.text) + elif consumed('attribute', 'attribute'): pass + elif consumed('attributes', 'attributes'): pass + elif consumed('label', 'label'): + labels[label['name']] = label['attributes'] + label = None + elif consumed('labels', 'labels'): pass + else: + pass + + assert len(states) == 1 and states[0] == 'annotations', \ + "Expected 'meta' section in the annotation file, path: %s" % states + + common_attrs = ['occluded'] + if has_z_order: + common_attrs.append('z_order') + if mode == 'interpolation': + common_attrs.append('keyframe') + common_attrs.append('outside') + + label_cat = LabelCategories(attributes=common_attrs) + for label, attrs in labels.items(): + label_cat.add(label, attributes=attrs) + + categories[AnnotationType.label] = label_cat + + return categories + + @classmethod + def _parse_ann(cls, ann, categories): + ann_id = ann.get('id') + ann_type = ann['type'] + + attributes = ann.get('attributes', {}) + if 'occluded' in categories[AnnotationType.label].attributes: + attributes['occluded'] = ann.get('occluded', False) + if 'z_order' in categories[AnnotationType.label].attributes: + attributes['z_order'] = ann.get('z_order', 0) + if 'outside' in categories[AnnotationType.label].attributes: + attributes['outside'] = ann.get('outside', False) + if 'keyframe' in categories[AnnotationType.label].attributes: + attributes['keyframe'] = ann.get('keyframe', False) + + group = ann.get('group') + if group == 0: + group = None + + label = ann.get('label') + label_id = categories[AnnotationType.label].find(label)[0] + + points = ann.get('points', []) + + if ann_type == 'polyline': + return PolyLineObject(points, label=label_id, + id=ann_id, attributes=attributes, group=group) + + elif ann_type == 'polygon': + return PolygonObject(points, label=label_id, + id=ann_id, attributes=attributes, group=group) + + elif ann_type == 'points': + return PointsObject(points, label=label_id, + id=ann_id, attributes=attributes, group=group) + + elif ann_type == 'box': + x, y = points[0], points[1] + w, h = points[2] - x, points[3] - y + return BboxObject(x, y, w, h, label=label_id, + id=ann_id, attributes=attributes, group=group) + + else: + raise NotImplementedError("Unknown annotation type '%s'" % ann_type) + + def _load_items(self, parsed): + for item_id, item_desc in parsed.items(): + file_name = item_desc.get('name') + if not file_name: + file_name = item_id + file_name += CvatPath.IMAGE_EXT + image = self._find_image(file_name) + + parsed[item_id] = DatasetItem(id=item_id, subset=self._subset, + image=image, annotations=item_desc.get('annotations', None)) + return parsed + + def _find_image(self, file_name): + images_dir = osp.join(self._path, CvatPath.IMAGES_DIR) + search_paths = [ + osp.join(images_dir, file_name), + osp.join(images_dir, self._subset or DEFAULT_SUBSET_NAME, file_name), + ] + for image_path in search_paths: + if osp.exists(image_path): + return lazy_image(image_path) \ No newline at end of file diff --git a/datumaro/datumaro/components/extractors/datumaro.py b/datumaro/datumaro/components/extractors/datumaro.py index 6bb336533114..8917b8b99e4f 100644 --- a/datumaro/datumaro/components/extractors/datumaro.py +++ b/datumaro/datumaro/components/extractors/datumaro.py @@ -3,70 +3,58 @@ # # SPDX-License-Identifier: MIT -from collections import defaultdict import json import logging as log import os.path as osp from datumaro.components.extractor import (Extractor, DatasetItem, - DEFAULT_SUBSET_NAME, - AnnotationType, + DEFAULT_SUBSET_NAME, AnnotationType, LabelObject, MaskObject, PointsObject, PolygonObject, PolyLineObject, BboxObject, CaptionObject, LabelCategories, MaskCategories, PointsCategories ) from datumaro.components.formats.datumaro import DatumaroPath -from datumaro.util import dir_items from datumaro.util.image import lazy_image from datumaro.util.mask_tools import lazy_mask class DatumaroExtractor(Extractor): - class Subset(Extractor): - def __init__(self, name, parent): - super().__init__() - self._parent = parent - self._name = name - self.items = [] - - def __iter__(self): - for item in self.items: - yield self._parent._get(item, self._name) + def __init__(self, path): + super().__init__() - def __len__(self): - return len(self.items) + assert osp.isfile(path) + rootpath = path.rsplit(DatumaroPath.ANNOTATIONS_DIR, maxsplit=1)[0] + self._path = rootpath - def categories(self): - return self._parent.categories() + subset_name = osp.splitext(osp.basename(path))[0] + if subset_name == DEFAULT_SUBSET_NAME: + subset_name = None + self._subset_name = subset_name - def __init__(self, path): - super().__init__() + with open(path, 'r') as f: + parsed_anns = json.load(f) + self._categories = self._load_categories(parsed_anns) + self._items = self._load_items(parsed_anns) - assert osp.isdir(path) - self._path = path + def categories(self): + return self._categories - annotations = defaultdict(list) - found_subsets = self._find_subsets(path) - parsed_anns = None - subsets = {} - for subset_name, subset_path in found_subsets.items(): - if subset_name == DEFAULT_SUBSET_NAME: - subset_name = None - subset = self.Subset(subset_name, self) - with open(subset_path, 'r') as f: - parsed_anns = json.load(f) + def __iter__(self): + for item in self._items: + yield item - for index, _ in enumerate(parsed_anns['items']): - subset.items.append(index) + def __len__(self): + return len(self._items) - annotations[subset_name] = parsed_anns - subsets[subset_name] = subset - self._annotations = dict(annotations) - self._subsets = subsets + def subsets(self): + if self._subset_name: + return [self._subset_name] + return None - self._categories = {} - if parsed_anns is not None: - self._categories = self._load_categories(parsed_anns) + def get_subset(self, name): + if name != self._subset_name: + return None + return self @staticmethod def _load_categories(parsed): @@ -101,21 +89,24 @@ def _load_categories(parsed): return categories - def _get(self, index, subset_name): - item = self._annotations[subset_name]['items'][index] + def _load_items(self, parsed): + items = [] + for item_desc in parsed['items']: + item_id = item_desc['id'] + image = None + image_path = osp.join(self._path, DatumaroPath.IMAGES_DIR, + item_id + DatumaroPath.IMAGE_EXT) + if osp.exists(image_path): + image = lazy_image(image_path) - item_id = item.get('id') + annotations = self._load_annotations(item_desc) - image_path = osp.join(self._path, DatumaroPath.IMAGES_DIR, - item_id + DatumaroPath.IMAGE_EXT) - image = None - if osp.isfile(image_path): - image = lazy_image(image_path) + item = DatasetItem(id=item_id, subset=self._subset_name, + annotations=annotations, image=image) - annotations = self._load_annotations(item) + items.append(item) - return DatasetItem(id=item_id, subset=subset_name, - annotations=annotations, image=image) + return items def _load_annotations(self, item): parsed = item['annotations'] @@ -182,33 +173,3 @@ def _load_annotations(self, item): raise NotImplementedError() return loaded - - def categories(self): - return self._categories - - def __iter__(self): - for subset_name, subset in self._subsets.items(): - for index in subset.items: - yield self._get(index, subset_name) - - def __len__(self): - length = 0 - for subset in self._subsets.values(): - length += len(subset) - return length - - def subsets(self): - return list(self._subsets) - - def get_subset(self, name): - return self._subsets[name] - - @staticmethod - def _find_subsets(path): - anno_dir = osp.join(path, DatumaroPath.ANNOTATIONS_DIR) - if not osp.isdir(anno_dir): - raise Exception('Datumaro dataset not found at "%s"' % path) - - return { name: osp.join(anno_dir, name + '.json') - for name in dir_items(anno_dir, '.json', truncate_ext=True) - } \ No newline at end of file diff --git a/datumaro/datumaro/components/extractors/ms_coco.py b/datumaro/datumaro/components/extractors/ms_coco.py index 537a297b2d1a..38cb1a38a07c 100644 --- a/datumaro/datumaro/components/extractors/ms_coco.py +++ b/datumaro/datumaro/components/extractors/ms_coco.py @@ -4,6 +4,7 @@ # SPDX-License-Identifier: MIT from collections import OrderedDict +from itertools import chain import numpy as np import os.path as osp @@ -11,7 +12,7 @@ import pycocotools.mask as mask_utils from datumaro.components.extractor import (Extractor, DatasetItem, - AnnotationType, + DEFAULT_SUBSET_NAME, AnnotationType, LabelObject, MaskObject, PointsObject, PolygonObject, BboxObject, CaptionObject, LabelCategories, PointsCategories @@ -42,46 +43,46 @@ def __eq__(self, other): return super().__eq__(other) return self._rle == other._rle - class CocoExtractor(Extractor): - class Subset(Extractor): - def __init__(self, name, parent): - super().__init__() - self._name = name - self._parent = parent - self.loaders = {} - self.items = OrderedDict() - - def __iter__(self): - for img_id in self.items: - yield self._parent._get(img_id, self._name) - - def __len__(self): - return len(self.items) - - def categories(self): - return self._parent.categories() - def __init__(self, path, task, merge_instance_polygons=False): super().__init__() + assert osp.isfile(path) rootpath = path.rsplit(CocoPath.ANNOTATIONS_DIR, maxsplit=1)[0] self._path = rootpath self._task = task - self._subsets = {} - subset_name = osp.splitext(osp.basename(path))[0] \ + subset = osp.splitext(osp.basename(path))[0] \ .rsplit('_', maxsplit=1)[1] - subset = CocoExtractor.Subset(subset_name, self) + if subset == DEFAULT_SUBSET_NAME: + subset = None + self._subset = subset + + self._merge_instance_polygons = merge_instance_polygons + loader = self._make_subset_loader(path) - subset.loaders[task] = loader - for img_id in loader.getImgIds(): - subset.items[img_id] = None - self._subsets[subset_name] = subset + self._load_categories(loader) + self._items = self._load_items(loader) - self._load_categories() + def categories(self): + return self._categories - self._merge_instance_polygons = merge_instance_polygons + def __iter__(self): + for item in self._items.values(): + yield item + + def __len__(self): + return len(self._items) + + def subsets(self): + if self._subset: + return [self._subset] + return None + + def get_subset(self, name): + if name != self._subset: + return None + return self @staticmethod def _make_subset_loader(path): @@ -95,31 +96,17 @@ def _make_subset_loader(path): coco_api.createIndex() return coco_api - def _load_categories(self): - loaders = {} - - for subset in self._subsets.values(): - loaders.update(subset.loaders) - + def _load_categories(self, loader): self._categories = {} - label_loader = loaders.get(CocoTask.labels) - instances_loader = loaders.get(CocoTask.instances) - person_kp_loader = loaders.get(CocoTask.person_keypoints) - - if label_loader is None and instances_loader is not None: - label_loader = instances_loader - if label_loader is None and person_kp_loader is not None: - label_loader = person_kp_loader - if label_loader is not None: - label_categories, label_map = \ - self._load_label_categories(label_loader) + if self._task in [CocoTask.instances, CocoTask.labels, + CocoTask.person_keypoints, CocoTask.stuff, CocoTask.panoptic]: + label_categories, label_map = self._load_label_categories(loader) self._categories[AnnotationType.label] = label_categories self._label_map = label_map - if person_kp_loader is not None: - person_kp_categories = \ - self._load_person_kp_categories(person_kp_loader) + if self._task == CocoTask.person_keypoints: + person_kp_categories = self._load_person_kp_categories(loader) self._categories[AnnotationType.points] = person_kp_categories # pylint: disable=no-self-use @@ -142,76 +129,47 @@ def _load_person_kp_categories(self, loader): categories = PointsCategories() for cat in cats: - label_id, _ = self._categories[AnnotationType.label].find(cat['name']) + label_id = self._label_map[cat['id']] categories.add(label_id=label_id, labels=cat['keypoints'], adjacent=cat['skeleton']) return categories - def categories(self): - return self._categories + def _load_items(self, loader): + items = OrderedDict() - def __iter__(self): - for subset in self._subsets.values(): - for item in subset: - yield item + for img_id in loader.getImgIds(): + image_info = loader.loadImgs(img_id)[0] + image = self._find_image(image_info['file_name']) - def __len__(self): - length = 0 - for subset in self._subsets.values(): - length += len(subset) - return length + anns = loader.getAnnIds(imgIds=img_id) + anns = loader.loadAnns(anns) + anns = list(chain(*( + self._load_annotations(ann, image_info) for ann in anns))) - def subsets(self): - return list(self._subsets) + items[img_id] = DatasetItem(id=img_id, subset=self._subset, + image=image, annotations=anns) - def get_subset(self, name): - return self._subsets[name] - - def _get(self, img_id, subset): - file_name = None - image_info = None - image = None - annotations = [] - for ann_type, loader in self._subsets[subset].loaders.items(): - if image is None: - image_info = loader.loadImgs(img_id)[0] - file_name = image_info['file_name'] - if file_name != '': - image_dir = osp.join(self._path, CocoPath.IMAGES_DIR) - search_paths = [ - osp.join(image_dir, file_name), - osp.join(image_dir, subset, file_name), - ] - for image_path in search_paths: - if osp.exists(image_path): - image = lazy_image(image_path) - break - - annIds = loader.getAnnIds(imgIds=img_id) - anns = loader.loadAnns(annIds) - - for ann in anns: - self._parse_annotation(ann, ann_type, annotations, image_info) - return DatasetItem(id=img_id, subset=subset, - image=image, annotations=annotations) - - def _parse_label(self, ann): + return items + + def _get_label_id(self, ann): cat_id = ann.get('category_id') if cat_id in [0, None]: return None return self._label_map[cat_id] - def _parse_annotation(self, ann, ann_type, parsed_annotations, - image_info=None): + def _load_annotations(self, ann, image_info=None): + parsed_annotations = [] + ann_id = ann.get('id') + attributes = {} if 'score' in ann: attributes['score'] = ann['score'] - if ann_type is CocoTask.instances: + if self._task is CocoTask.instances: x, y, w, h = ann['bbox'] - label_id = self._parse_label(ann) + label_id = self._get_label_id(ann) group = None is_crowd = bool(ann['iscrowd']) @@ -253,18 +211,17 @@ def _parse_annotation(self, ann, ann_type, parsed_annotations, BboxObject(x, y, w, h, label=label_id, id=ann_id, attributes=attributes, group=group) ) - elif ann_type is CocoTask.labels: - label_id = self._parse_label(ann) + elif self._task is CocoTask.labels: + label_id = self._get_label_id(ann) parsed_annotations.append( - LabelObject(label=label_id, - id=ann_id, attributes=attributes) + LabelObject(label=label_id, id=ann_id, attributes=attributes) ) - elif ann_type is CocoTask.person_keypoints: + elif self._task is CocoTask.person_keypoints: keypoints = ann['keypoints'] points = [p for i, p in enumerate(keypoints) if i % 3 != 2] visibility = keypoints[2::3] bbox = ann.get('bbox') - label_id = self._parse_label(ann) + label_id = self._get_label_id(ann) group = None if bbox is not None: group = ann_id @@ -276,7 +233,7 @@ def _parse_annotation(self, ann, ann_type, parsed_annotations, parsed_annotations.append( BboxObject(*bbox, label=label_id, group=group) ) - elif ann_type is CocoTask.captions: + elif self._task is CocoTask.captions: caption = ann['caption'] parsed_annotations.append( CaptionObject(caption, @@ -287,6 +244,16 @@ def _parse_annotation(self, ann, ann_type, parsed_annotations, return parsed_annotations + def _find_image(self, file_name): + images_dir = osp.join(self._path, CocoPath.IMAGES_DIR) + search_paths = [ + osp.join(images_dir, file_name), + osp.join(images_dir, self._subset or DEFAULT_SUBSET_NAME, file_name), + ] + for image_path in search_paths: + if osp.exists(image_path): + return lazy_image(image_path) + class CocoImageInfoExtractor(CocoExtractor): def __init__(self, path, **kwargs): super().__init__(path, task=CocoTask.image_info, **kwargs) diff --git a/datumaro/datumaro/components/formats/cvat.py b/datumaro/datumaro/components/formats/cvat.py new file mode 100644 index 000000000000..e0c7a10476ae --- /dev/null +++ b/datumaro/datumaro/components/formats/cvat.py @@ -0,0 +1,10 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +class CvatPath: + IMAGES_DIR = 'images' + ANNOTATIONS_DIR = 'annotations' + + IMAGE_EXT = '.jpg' diff --git a/datumaro/datumaro/components/importers/__init__.py b/datumaro/datumaro/components/importers/__init__.py index 5d2923b8141e..7c952d2cbbbf 100644 --- a/datumaro/datumaro/components/importers/__init__.py +++ b/datumaro/datumaro/components/importers/__init__.py @@ -4,19 +4,16 @@ # SPDX-License-Identifier: MIT from datumaro.components.importers.datumaro import DatumaroImporter - -from datumaro.components.importers.ms_coco import ( - CocoImporter, -) +from datumaro.components.importers.ms_coco import CocoImporter from datumaro.components.importers.voc import ( VocImporter, VocResultsImporter, ) -from datumaro.components.importers.tfrecord import ( - DetectionApiImporter, -) +from datumaro.components.importers.tfrecord import DetectionApiImporter +from datumaro.components.importers.yolo import YoloImporter +from datumaro.components.importers.cvat import CvatImporter items = [ @@ -27,5 +24,9 @@ ('voc', VocImporter), ('voc_results', VocResultsImporter), + ('yolo', YoloImporter), + ('tf_detection_api', DetectionApiImporter), + + ('cvat', CvatImporter), ] \ No newline at end of file diff --git a/datumaro/datumaro/components/importers/cvat.py b/datumaro/datumaro/components/importers/cvat.py new file mode 100644 index 000000000000..efdeff2963e7 --- /dev/null +++ b/datumaro/datumaro/components/importers/cvat.py @@ -0,0 +1,46 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from glob import glob +import logging as log +import os.path as osp + +from datumaro.components.formats.cvat import CvatPath + + +class CvatImporter: + EXTRACTOR_NAME = 'cvat' + + def __call__(self, path, **extra_params): + from datumaro.components.project import Project # cyclic import + project = Project() + + if path.endswith('.xml') and osp.isfile(path): + subset_paths = [path] + else: + subset_paths = glob(osp.join(path, '*.xml')) + + if osp.basename(osp.normpath(path)) != CvatPath.ANNOTATIONS_DIR: + path = osp.join(path, CvatPath.ANNOTATIONS_DIR) + subset_paths += glob(osp.join(path, '*.xml')) + + if len(subset_paths) == 0: + raise Exception("Failed to find 'cvat' dataset at '%s'" % path) + + for subset_path in subset_paths: + if not osp.isfile(subset_path): + continue + + log.info("Found a dataset at '%s'" % subset_path) + + subset_name = osp.splitext(osp.basename(subset_path))[0] + + project.add_source(subset_name, { + 'url': subset_path, + 'format': self.EXTRACTOR_NAME, + 'options': extra_params, + }) + + return project diff --git a/datumaro/datumaro/components/importers/datumaro.py b/datumaro/datumaro/components/importers/datumaro.py index 40939b90cf18..9c2a162b8cc8 100644 --- a/datumaro/datumaro/components/importers/datumaro.py +++ b/datumaro/datumaro/components/importers/datumaro.py @@ -3,23 +3,44 @@ # # SPDX-License-Identifier: MIT +from glob import glob +import logging as log import os.path as osp +from datumaro.components.formats.datumaro import DatumaroPath + class DatumaroImporter: EXTRACTOR_NAME = 'datumaro' - def __call__(self, path): + def __call__(self, path, **extra_params): from datumaro.components.project import Project # cyclic import project = Project() - if not osp.exists(path): + if path.endswith('.json') and osp.isfile(path): + subset_paths = [path] + else: + subset_paths = glob(osp.join(path, '*.json')) + + if osp.basename(osp.normpath(path)) != DatumaroPath.ANNOTATIONS_DIR: + path = osp.join(path, DatumaroPath.ANNOTATIONS_DIR) + subset_paths += glob(osp.join(path, '*.json')) + + if len(subset_paths) == 0: raise Exception("Failed to find 'datumaro' dataset at '%s'" % path) - source_name = osp.splitext(osp.basename(path))[0] - project.add_source(source_name, { - 'url': path, - 'format': self.EXTRACTOR_NAME, - }) + for subset_path in subset_paths: + if not osp.isfile(subset_path): + continue + + log.info("Found a dataset at '%s'" % subset_path) + + subset_name = osp.splitext(osp.basename(subset_path))[0] + + project.add_source(subset_name, { + 'url': subset_path, + 'format': self.EXTRACTOR_NAME, + 'options': extra_params, + }) - return project \ No newline at end of file + return project diff --git a/datumaro/datumaro/components/importers/ms_coco.py b/datumaro/datumaro/components/importers/ms_coco.py index 30d959b0024e..e7a0d26ca018 100644 --- a/datumaro/datumaro/components/importers/ms_coco.py +++ b/datumaro/datumaro/components/importers/ms_coco.py @@ -4,7 +4,8 @@ # SPDX-License-Identifier: MIT from collections import defaultdict -import os +from glob import glob +import logging as log import os.path as osp from datumaro.components.formats.ms_coco import CocoTask, CocoPath @@ -19,9 +20,6 @@ class CocoImporter: CocoTask.image_info: 'coco_images', } - def __init__(self, task_filter=None): - self._task_filter = task_filter - def __call__(self, path, **extra_params): from datumaro.components.project import Project # cyclic import project = Project() @@ -33,6 +31,8 @@ def __call__(self, path, **extra_params): for ann_files in subsets.values(): for ann_type, ann_file in ann_files.items(): + log.info("Found a dataset at '%s'" % ann_file) + source_name = osp.splitext(osp.basename(ann_file))[0] project.add_source(source_name, { 'url': ann_file, @@ -43,28 +43,29 @@ def __call__(self, path, **extra_params): return project @staticmethod - def find_subsets(dataset_dir): - ann_dir = os.path.join(dataset_dir, CocoPath.ANNOTATIONS_DIR) - if not osp.isdir(ann_dir): - raise NotADirectoryError( - 'COCO annotations directory not found at "%s"' % ann_dir) + def find_subsets(path): + if path.endswith('.json') and osp.isfile(path): + subset_paths = [path] + else: + subset_paths = glob(osp.join(path, '*_*.json')) + + if osp.basename(osp.normpath(path)) != CocoPath.ANNOTATIONS_DIR: + path = osp.join(path, CocoPath.ANNOTATIONS_DIR) + subset_paths += glob(osp.join(path, '*_*.json')) subsets = defaultdict(dict) - for ann_file in os.listdir(ann_dir): - subset_path = osp.join(ann_dir, ann_file) - if not subset_path.endswith('.json'): - continue + for subset_path in subset_paths: + name_parts = osp.splitext(osp.basename(subset_path))[0] \ + .rsplit('_', maxsplit=1) - name_parts = osp.splitext(ann_file)[0].rsplit('_', maxsplit=1) ann_type = name_parts[0] try: ann_type = CocoTask[ann_type] except KeyError: - raise Exception( - 'Unknown subset type %s, only known are: %s' % \ - (ann_type, - ', '.join([e.name for e in CocoTask]) - )) + log.warn("Skipping '%s': unknown subset " + "type '%s', the only known are: %s" % \ + (subset_path, ann_type, + ', '.join([e.name for e in CocoTask]))) subset_name = name_parts[1] subsets[subset_name][ann_type] = subset_path return dict(subsets) \ No newline at end of file diff --git a/datumaro/datumaro/components/importers/tfrecord.py b/datumaro/datumaro/components/importers/tfrecord.py index c42c2e174389..c1506211142d 100644 --- a/datumaro/datumaro/components/importers/tfrecord.py +++ b/datumaro/datumaro/components/importers/tfrecord.py @@ -4,32 +4,39 @@ # SPDX-License-Identifier: MIT from glob import glob +import logging as log import os.path as osp class DetectionApiImporter: EXTRACTOR_NAME = 'tf_detection_api' - def __call__(self, path): + def __call__(self, path, **extra_params): from datumaro.components.project import Project # cyclic import project = Project() - subset_paths = glob(osp.join(path, '*.tfrecord')) + if path.endswith('.tfrecord') and osp.isfile(path): + subset_paths = [path] + else: + subset_paths = glob(osp.join(path, '*.tfrecord')) + + if len(subset_paths) == 0: + raise Exception( + "Failed to find 'tf_detection_api' dataset at '%s'" % path) for subset_path in subset_paths: if not osp.isfile(subset_path): continue + log.info("Found a dataset at '%s'" % subset_path) + subset_name = osp.splitext(osp.basename(subset_path))[0] project.add_source(subset_name, { 'url': subset_path, 'format': self.EXTRACTOR_NAME, + 'options': extra_params, }) - if len(project.config.sources) == 0: - raise Exception( - "Failed to find 'tf_detection_api' dataset at '%s'" % path) - return project diff --git a/datumaro/datumaro/components/importers/voc.py b/datumaro/datumaro/components/importers/voc.py index 432cf374141e..e71327893b0e 100644 --- a/datumaro/datumaro/components/importers/voc.py +++ b/datumaro/datumaro/components/importers/voc.py @@ -19,7 +19,7 @@ class VocImporter: (VocTask.action_classification, 'voc_action', 'Action'), ] - def __call__(self, path): + def __call__(self, path, **extra_params): from datumaro.components.project import Project # cyclic import project = Project() @@ -31,6 +31,7 @@ def __call__(self, path): project.add_source(task.name, { 'url': path, 'format': extractor_type, + 'options': extra_params, }) if len(project.config.sources) == 0: @@ -53,7 +54,7 @@ class VocResultsImporter: ('comp10', 'voc_comp_9_10', 'Action'), ] - def __call__(self, path): + def __call__(self, path, **extra_params): from datumaro.components.project import Project # cyclic import project = Project() @@ -68,6 +69,7 @@ def __call__(self, path): project.add_source(task_name, { 'url': task_dir, 'format': extractor_type, + 'options': extra_params, }) if len(project.config.sources) == 0: diff --git a/datumaro/datumaro/components/importers/yolo.py b/datumaro/datumaro/components/importers/yolo.py index 4254b803e14c..2a22117edd23 100644 --- a/datumaro/datumaro/components/importers/yolo.py +++ b/datumaro/datumaro/components/importers/yolo.py @@ -3,8 +3,9 @@ # # SPDX-License-Identifier: MIT +from glob import glob +import logging as log import os.path as osp -from datumaro.util import dir_items class YoloImporter: @@ -15,13 +16,14 @@ def __call__(self, path, **extra_params): if not osp.exists(path): raise Exception("Failed to find 'yolo' dataset at '%s'" % path) - configs = [] - if osp.isfile(path): - configs = path - elif osp.isdir(path): - configs = [osp.join(path, p) for p in dir_items(path, '.data')] + if path.endswith('.data') and osp.isfile(path): + config_paths = [path] + else: + config_paths = glob(osp.join(path, '*.data')) + + for config_path in config_paths: + log.info("Found a dataset at '%s'" % config_path) - for config_path in configs: source_name = osp.splitext(osp.basename(config_path))[0] project.add_source(source_name, { 'url': config_path, diff --git a/datumaro/datumaro/components/project.py b/datumaro/datumaro/components/project.py index a648f461e593..e03aad631a5d 100644 --- a/datumaro/datumaro/components/project.py +++ b/datumaro/datumaro/components/project.py @@ -269,6 +269,8 @@ def categories(self): class DatasetItemWrapper(DatasetItem): def __init__(self, item, path, annotations, image=None): self._item = item + if path is None: + path = [] self._path = path self._annotations = annotations self._image = image @@ -334,7 +336,10 @@ def __init__(self, project): own_source = None own_source_dir = osp.join(config.project_dir, config.dataset_dir) if osp.isdir(own_source_dir): - own_source = env.make_extractor(DEFAULT_FORMAT, own_source_dir) + log.disable(log.INFO) + own_source = env.make_importer(DEFAULT_FORMAT)(own_source_dir) \ + .make_dataset() + log.disable(log.NOTSET) # merge categories # TODO: implement properly with merging and annotations remapping @@ -351,7 +356,7 @@ def __init__(self, project): # merge items subsets = defaultdict(lambda: Subset(self)) for source_name, source in self._sources.items(): - log.info("Loading '%s' source contents..." % source_name) + log.debug("Loading '%s' source contents..." % source_name) for item in source: if dataset_filter and not dataset_filter(item): continue @@ -387,7 +392,7 @@ def __init__(self, project): # override with our items, fallback to existing images if own_source is not None: - log.info("Loading own dataset...") + log.debug("Loading own dataset...") for item in own_source: if dataset_filter and not dataset_filter(item): continue diff --git a/datumaro/tests/test_coco_format.py b/datumaro/tests/test_coco_format.py index 17d7155752f8..580136ef428d 100644 --- a/datumaro/tests/test_coco_format.py +++ b/datumaro/tests/test_coco_format.py @@ -7,9 +7,7 @@ from unittest import TestCase from datumaro.components.project import Project -from datumaro.components.extractor import ( - DEFAULT_SUBSET_NAME, - Extractor, DatasetItem, +from datumaro.components.extractor import (Extractor, DatasetItem, AnnotationType, LabelObject, MaskObject, PointsObject, PolygonObject, BboxObject, CaptionObject, LabelCategories, PointsCategories @@ -150,10 +148,8 @@ def _test_save_and_load(self, source_dataset, converter, test_dir, if target_dataset is not None: source_dataset = target_dataset - source_subsets = [s if s else DEFAULT_SUBSET_NAME - for s in source_dataset.subsets()] self.assertListEqual( - sorted(source_subsets), + sorted(source_dataset.subsets()), sorted(parsed_dataset.subsets()), ) @@ -172,7 +168,7 @@ def _test_save_and_load(self, source_dataset, converter, test_dir, def test_can_save_and_load_captions(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=0, subset='train', annotations=[ CaptionObject('hello', id=1), @@ -188,11 +184,7 @@ def __iter__(self): CaptionObject('word', id=1), ] ), - ] - return iter(items) - - def subsets(self): - return ['train', 'val'] + ]) with TestDir() as test_dir: self._test_save_and_load(TestExtractor(), @@ -201,7 +193,7 @@ def subsets(self): def test_can_save_and_load_instances(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=0, subset='train', image=np.ones((4, 4, 3)), annotations=[ # Bbox + single polygon @@ -234,11 +226,7 @@ def __iter__(self): attributes={ 'is_crowd': True }, label=4, group=3, id=3), ]), - ] - return iter(items) - - def subsets(self): - return ['train', 'val'] + ]) def categories(self): label_categories = LabelCategories() @@ -255,7 +243,7 @@ def categories(self): def test_can_save_and_load_instances_with_mask_conversion(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=0, image=np.zeros((5, 5, 3)), subset='train', annotations=[ BboxObject(0, 0, 5, 5, label=3, id=4, group=4, @@ -276,11 +264,7 @@ def __iter__(self): label=3, id=4, group=4), ] ), - ] - return iter(items) - - def subsets(self): - return ['train'] + ]) def categories(self): label_categories = LabelCategories() @@ -302,7 +286,7 @@ def test_can_merge_instance_polygons_to_mask_in_coverter(self): class SrcTestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=0, image=np.zeros((5, 10, 3)), annotations=[ PolygonObject([0, 0, 4, 0, 4, 4], @@ -313,15 +297,14 @@ def __iter__(self): attributes={ 'is_crowd': False }), ] ), - ] - return iter(items) + ]) def categories(self): return { AnnotationType.label: label_categories } class DstTestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=0, image=np.zeros((5, 10, 3)), annotations=[ BboxObject(1, 0, 8, 4, label=3, id=4, group=4, @@ -339,8 +322,7 @@ def __iter__(self): label=3, id=4, group=4), ] ), - ] - return iter(items) + ]) def categories(self): return { AnnotationType.label: label_categories } @@ -353,7 +335,7 @@ def categories(self): def test_can_save_and_load_images(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=0, subset='train'), DatasetItem(id=1, subset='train'), @@ -362,11 +344,7 @@ def __iter__(self): DatasetItem(id=4, subset='val'), DatasetItem(id=5, subset='test'), - ] - return iter(items) - - def subsets(self): - return ['train', 'val', 'test'] + ]) with TestDir() as test_dir: self._test_save_and_load(TestExtractor(), @@ -375,7 +353,7 @@ def subsets(self): def test_can_save_and_load_labels(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=0, subset='train', annotations=[ LabelObject(4, id=1), @@ -390,11 +368,7 @@ def __iter__(self): annotations=[ LabelObject(2, id=1), ]), - ] - return iter(items) - - def subsets(self): - return ['train', 'val'] + ]) def categories(self): label_categories = LabelCategories() @@ -411,7 +385,7 @@ def categories(self): def test_can_save_and_load_keypoints(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=0, subset='train', annotations=[ PointsObject([1, 2, 0, 2, 4, 1], [0, 1, 2], @@ -433,11 +407,7 @@ def __iter__(self): group=3, id=3), BboxObject(0, 2, 4, 4, label=2, group=3), ]), - ] - return iter(items) - - def subsets(self): - return ['train', 'val'] + ]) def categories(self): label_categories = LabelCategories() @@ -458,7 +428,7 @@ def categories(self): def test_can_save_dataset_with_no_subsets(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=1, annotations=[ LabelObject(2, id=1), ]), @@ -470,10 +440,7 @@ def __iter__(self): PolygonObject([0, 0, 4, 0, 4, 4], label=3, id=4, group=4, attributes={ 'is_crowd': False }), ]), - ] - - for item in items: - yield item + ]) def categories(self): label_cat = LabelCategories() diff --git a/datumaro/tests/test_cvat_format.py b/datumaro/tests/test_cvat_format.py new file mode 100644 index 000000000000..bc06b0561396 --- /dev/null +++ b/datumaro/tests/test_cvat_format.py @@ -0,0 +1,148 @@ +import numpy as np +import os +import os.path as osp +from xml.etree import ElementTree as ET + +from unittest import TestCase + +from datumaro.components.extractor import (Extractor, DatasetItem, + AnnotationType, PointsObject, PolygonObject, PolyLineObject, BboxObject, + LabelCategories, +) +from datumaro.components.importers.cvat import CvatImporter +import datumaro.components.formats.cvat as Cvat +from datumaro.util.image import save_image +from datumaro.util.test_utils import TestDir + + +class CvatExtractorTest(TestCase): + @staticmethod + def generate_dummy_cvat(path): + images_dir = osp.join(path, Cvat.CvatPath.IMAGES_DIR) + anno_dir = osp.join(path, Cvat.CvatPath.ANNOTATIONS_DIR) + + os.makedirs(images_dir) + os.makedirs(anno_dir) + + root_elem = ET.Element('annotations') + ET.SubElement(root_elem, 'version').text = '1.1' + + meta_elem = ET.SubElement(root_elem, 'meta') + task_elem = ET.SubElement(meta_elem, 'task') + ET.SubElement(task_elem, 'z_order').text = 'True' + ET.SubElement(task_elem, 'mode').text = 'interpolation' + + labels_elem = ET.SubElement(task_elem, 'labels') + + label1_elem = ET.SubElement(labels_elem, 'label') + ET.SubElement(label1_elem, 'name').text = 'label1' + label1_attrs_elem = ET.SubElement(label1_elem, 'attributes') + + label1_a1_elem = ET.SubElement(label1_attrs_elem, 'attribute') + ET.SubElement(label1_a1_elem, 'name').text = 'a1' + ET.SubElement(label1_a1_elem, 'input_type').text = 'checkbox' + ET.SubElement(label1_a1_elem, 'default_value').text = 'false' + ET.SubElement(label1_a1_elem, 'values').text = 'false\ntrue' + + label1_a2_elem = ET.SubElement(label1_attrs_elem, 'attribute') + ET.SubElement(label1_a2_elem, 'name').text = 'a2' + ET.SubElement(label1_a2_elem, 'input_type').text = 'radio' + ET.SubElement(label1_a2_elem, 'default_value').text = 'v1' + ET.SubElement(label1_a2_elem, 'values').text = 'v1\nv2\nv3' + + label2_elem = ET.SubElement(labels_elem, 'label') + ET.SubElement(label2_elem, 'name').text = 'label2' + + # item 1 + save_image(osp.join(images_dir, 'img0.jpg'), np.ones((8, 8, 3))) + item1_elem = ET.SubElement(root_elem, 'image') + item1_elem.attrib.update({ + 'id': '0', 'name': 'img0', 'width': '8', 'height': '8' + }) + + item1_ann1_elem = ET.SubElement(item1_elem, 'box') + item1_ann1_elem.attrib.update({ + 'label': 'label1', 'occluded': '1', 'z_order': '1', + 'xtl': '0', 'ytl': '2', 'xbr': '4', 'ybr': '4' + }) + item1_ann1_a1_elem = ET.SubElement(item1_ann1_elem, 'attribute') + item1_ann1_a1_elem.attrib['name'] = 'a1' + item1_ann1_a1_elem.text = 'true' + item1_ann1_a2_elem = ET.SubElement(item1_ann1_elem, 'attribute') + item1_ann1_a2_elem.attrib['name'] = 'a2' + item1_ann1_a2_elem.text = 'v3' + + item1_ann2_elem = ET.SubElement(item1_elem, 'polyline') + item1_ann2_elem.attrib.update({ + 'label': '', 'points': '1.0,2;3,4;5,6;7,8' + }) + + # item 2 + save_image(osp.join(images_dir, 'img1.jpg'), np.ones((10, 10, 3))) + item2_elem = ET.SubElement(root_elem, 'image') + item2_elem.attrib.update({ + 'id': '1', 'name': 'img1', 'width': '8', 'height': '8' + }) + + item2_ann1_elem = ET.SubElement(item2_elem, 'polygon') + item2_ann1_elem.attrib.update({ + 'label': '', 'points': '1,2;3,4;6,5', 'z_order': '1', + }) + + item2_ann2_elem = ET.SubElement(item2_elem, 'points') + item2_ann2_elem.attrib.update({ + 'label': 'label2', 'points': '1,2;3,4;5,6', 'z_order': '2', + }) + + with open(osp.join(anno_dir, 'train.xml'), 'w') as f: + f.write(ET.tostring(root_elem, encoding='unicode')) + + def test_can_load(self): + class TestExtractor(Extractor): + def __iter__(self): + return iter([ + DatasetItem(id=1, subset='train', image=np.ones((8, 8, 3)), + annotations=[ + BboxObject(0, 2, 4, 2, label=0, + attributes={ + 'occluded': True, 'z_order': 1, + 'a1': 'true', 'a2': 'v3' + }), + PolyLineObject([1, 2, 3, 4, 5, 6, 7, 8], + attributes={'occluded': False, 'z_order': 0}), + ]), + DatasetItem(id=2, subset='train', image=np.ones((10, 10, 3)), + annotations=[ + PolygonObject([1, 2, 3, 4, 6, 5], + attributes={'occluded': False, 'z_order': 1}), + PointsObject([1, 2, 3, 4, 5, 6], label=1, + attributes={'occluded': False, 'z_order': 2}), + ]), + ]) + + def categories(self): + label_categories = LabelCategories() + for i in range(10): + label_categories.add('label_' + str(i)) + return { + AnnotationType.label: label_categories, + } + + with TestDir() as test_dir: + self.generate_dummy_cvat(test_dir.path) + source_dataset = TestExtractor() + + parsed_dataset = CvatImporter()(test_dir.path).make_dataset() + + self.assertListEqual( + sorted(source_dataset.subsets()), + sorted(parsed_dataset.subsets()), + ) + self.assertEqual(len(source_dataset), len(parsed_dataset)) + for subset_name in source_dataset.subsets(): + source_subset = source_dataset.get_subset(subset_name) + parsed_subset = parsed_dataset.get_subset(subset_name) + for item_a, item_b in zip(source_subset, parsed_subset): + self.assertEqual(len(item_a.annotations), len(item_b.annotations)) + for ann_a, ann_b in zip(item_a.annotations, item_b.annotations): + self.assertEqual(ann_a, ann_b) \ No newline at end of file diff --git a/datumaro/tests/test_datumaro_format.py b/datumaro/tests/test_datumaro_format.py index 3402ccba22f3..3a83c424ca0e 100644 --- a/datumaro/tests/test_datumaro_format.py +++ b/datumaro/tests/test_datumaro_format.py @@ -1,4 +1,3 @@ -from itertools import zip_longest import numpy as np from unittest import TestCase @@ -17,7 +16,7 @@ class DatumaroConverterTest(TestCase): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=100, subset='train', image=np.ones((10, 6, 3)), annotations=[ CaptionObject('hello', id=1), @@ -47,11 +46,10 @@ def __iter__(self): ]), DatasetItem(id=42, subset='test'), - ] - return iter(items) - def subsets(self): - return ['train', 'val', 'test'] + DatasetItem(id=42), + DatasetItem(id=43), + ]) def categories(self): label_categories = LabelCategories() @@ -91,8 +89,9 @@ def test_can_save_and_load(self): for subset_name in source_dataset.subsets(): source_subset = source_dataset.get_subset(subset_name) parsed_subset = parsed_dataset.get_subset(subset_name) + self.assertEqual(len(source_subset), len(parsed_subset)) for idx, (item_a, item_b) in enumerate( - zip_longest(source_subset, parsed_subset)): + zip(source_subset, parsed_subset)): self.assertEqual(item_a, item_b, str(idx)) self.assertEqual( diff --git a/datumaro/tests/test_project.py b/datumaro/tests/test_project.py index 1d9df96f14ab..7f67e1d9e18f 100644 --- a/datumaro/tests/test_project.py +++ b/datumaro/tests/test_project.py @@ -137,9 +137,6 @@ def __iter__(self): for i in range(self.n): yield DatasetItem(id=i, subset='train', image=i) - def subsets(self): - return ['train'] - class TestLauncher(Launcher): def __init__(self, **kwargs): pass @@ -178,9 +175,6 @@ def __iter__(self): yield DatasetItem(id=i, subset='train', image=i, annotations=[ LabelObject(i) ]) - def subsets(self): - return ['train'] - class TestLauncher(Launcher): def __init__(self, **kwargs): pass @@ -207,17 +201,10 @@ def __iter__(self): index = osp.splitext(osp.basename(path))[0] subset = f.readline()[:-1] label = int(f.readline()[:-1]) - assert(subset == 'train') + assert subset == 'train' yield DatasetItem(id=index, subset=subset, annotations=[ LabelObject(label) ]) - def __len__(self): - return len(self.items) - - def subsets(self): - return ['train'] - - model_name = 'model' launcher_name = 'custom_launcher' extractor_name = 'custom_extractor' @@ -251,9 +238,6 @@ def __iter__(self): for i in range(self.n): yield DatasetItem(id=self.s + i, subset='train') - def subsets(self): - return ['train'] - e_name1 = 'e1' e_name2 = 'e2' n1 = 2 @@ -279,9 +263,6 @@ def __iter__(self): for i in range(self.n): yield DatasetItem(id=i, subset='train') - def subsets(self): - return ['train'] - e_type = 'type' project = Project() project.env.extractors.register(e_type, TestExtractor) @@ -353,9 +334,6 @@ def __iter__(self): else: yield v2_item - def subsets(self): - return ['train'] - project = Project() project.env.extractors.register('t1', lambda p: TestExtractor(p, v=1)) project.env.extractors.register('t2', lambda p: TestExtractor(p, v=2)) @@ -379,9 +357,6 @@ def __iter__(self): for i in range(self.n): yield DatasetItem(id=i, subset='train') - def subsets(self): - return ['train'] - def test_xpathfilter_can_be_applied(self): extractor = self.TestExtractor('', n=4) dataset_filter = XPathDatasetFilter('/item[id > 1]') @@ -433,9 +408,6 @@ def __iter__(self): DatasetItem(id=3, subset='test'), ]) - def subsets(self): - return ['train', 'test'] - extractor_name = 'ext1' project = Project() project.env.extractors.register(extractor_name, CustomExtractor) diff --git a/datumaro/tests/test_tfrecord_format.py b/datumaro/tests/test_tfrecord_format.py index 8511dc14e9aa..e6ac60c4c84e 100644 --- a/datumaro/tests/test_tfrecord_format.py +++ b/datumaro/tests/test_tfrecord_format.py @@ -6,12 +6,8 @@ from datumaro.components.extractor import (Extractor, DatasetItem, AnnotationType, BboxObject, LabelCategories ) -from datumaro.components.extractors.tfrecord import ( - DetectionApiExtractor, -) -from datumaro.components.converters.tfrecord import ( - DetectionApiConverter, -) +from datumaro.components.extractors.tfrecord import DetectionApiExtractor +from datumaro.components.converters.tfrecord import DetectionApiConverter from datumaro.util import find from datumaro.util.test_utils import TestDir @@ -47,7 +43,7 @@ def _test_can_save_and_load(self, source_dataset, converter, test_dir, def test_can_save_bboxes(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=1, subset='train', image=np.ones((16, 16, 3)), annotations=[ @@ -67,10 +63,7 @@ def __iter__(self): DatasetItem(id=3, subset='test', image=np.ones((5, 4, 3)) * 3, ), - ] - - for item in items: - yield item + ]) def categories(self): label_cat = LabelCategories() @@ -88,7 +81,7 @@ def categories(self): def test_can_save_dataset_with_no_subsets(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=1, image=np.ones((16, 16, 3)), annotations=[ @@ -107,10 +100,7 @@ def __iter__(self): DatasetItem(id=3, image=np.ones((8, 4, 3)) * 3, ), - ] - - for item in items: - yield item + ]) def categories(self): label_cat = LabelCategories() diff --git a/datumaro/tests/test_voc_format.py b/datumaro/tests/test_voc_format.py index 04754075f553..0c9c8eea5301 100644 --- a/datumaro/tests/test_voc_format.py +++ b/datumaro/tests/test_voc_format.py @@ -27,6 +27,7 @@ VocSegmentationConverter, ) from datumaro.components.importers.voc import VocImporter +from datumaro.components.project import Project from datumaro.util import find from datumaro.util.test_utils import TestDir @@ -446,7 +447,7 @@ def test_can_save_voc_action(self): def test_can_save_dataset_with_no_subsets(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=1, annotations=[ BboxObject(2, 3, 4, 5, label=2, id=1), BboxObject(2, 3, 4, 5, label=3, id=2), @@ -455,10 +456,7 @@ def __iter__(self): DatasetItem(id=2, annotations=[ BboxObject(5, 4, 6, 5, label=3, id=1), ]), - ] - - for item in items: - yield item + ]) def categories(self): return VOC.make_voc_categories() @@ -582,7 +580,7 @@ def test_can_import(self): dummy_dir = osp.join(test_dir.path, 'dummy') subsets = generate_dummy_voc(dummy_dir) - dataset = VocImporter()(dummy_dir).make_dataset() + dataset = Project.import_from(dummy_dir, 'voc').make_dataset() self.assertEqual(len(VOC.VocTask), len(dataset.sources)) self.assertEqual(set(subsets), set(dataset.subsets())) diff --git a/datumaro/tests/test_yolo_format.py b/datumaro/tests/test_yolo_format.py index 364c91a04b54..6b24ba5d927d 100644 --- a/datumaro/tests/test_yolo_format.py +++ b/datumaro/tests/test_yolo_format.py @@ -14,7 +14,7 @@ class YoloFormatTest(TestCase): def test_can_save_and_load(self): class TestExtractor(Extractor): def __iter__(self): - items = [ + return iter([ DatasetItem(id=1, subset='train', image=np.ones((8, 8, 3)), annotations=[ BboxObject(0, 2, 4, 2, label=2), @@ -34,8 +34,7 @@ def __iter__(self): BboxObject(0, 2, 4, 2, label=6), BboxObject(0, 7, 3, 2, label=7), ]), - ] - return iter(items) + ]) def categories(self): label_categories = LabelCategories() From 216416703a429836bdbda2011c34b218ecda3445 Mon Sep 17 00:00:00 2001 From: vugia truong Date: Thu, 19 Dec 2019 17:57:11 +0900 Subject: [PATCH 12/14] Fix label for mask rcnn (#980) --- cvat/apps/auto_segmentation/views.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/cvat/apps/auto_segmentation/views.py b/cvat/apps/auto_segmentation/views.py index 0f73ee29229f..1f47d1ec1df7 100644 --- a/cvat/apps/auto_segmentation/views.py +++ b/cvat/apps/auto_segmentation/views.py @@ -230,20 +230,20 @@ def create(request, tid): auto_segmentation_labels = { "BG": 0, "person": 1, "bicycle": 2, "car": 3, "motorcycle": 4, "airplane": 5, "bus": 6, "train": 7, "truck": 8, "boat": 9, "traffic_light": 10, - "fire_hydrant": 11, "stop_sign": 13, "parking_meter": 14, "bench": 15, - "bird": 16, "cat": 17, "dog": 18, "horse": 19, "sheep": 20, "cow": 21, - "elephant": 22, "bear": 23, "zebra": 24, "giraffe": 25, "backpack": 27, - "umbrella": 28, "handbag": 31, "tie": 32, "suitcase": 33, "frisbee": 34, - "skis": 35, "snowboard": 36, "sports_ball": 37, "kite": 38, "baseball_bat": 39, - "baseball_glove": 40, "skateboard": 41, "surfboard": 42, "tennis_racket": 43, - "bottle": 44, "wine_glass": 46, "cup": 47, "fork": 48, "knife": 49, "spoon": 50, - "bowl": 51, "banana": 52, "apple": 53, "sandwich": 54, "orange": 55, "broccoli": 56, - "carrot": 57, "hot_dog": 58, "pizza": 59, "donut": 60, "cake": 61, "chair": 62, - "couch": 63, "potted_plant": 64, "bed": 65, "dining_table": 67, "toilet": 70, - "tv": 72, "laptop": 73, "mouse": 74, "remote": 75, "keyboard": 76, "cell_phone": 77, - "microwave": 78, "oven": 79, "toaster": 80, "sink": 81, "refrigerator": 83, - "book": 84, "clock": 85, "vase": 86, "scissors": 87, "teddy_bear": 88, "hair_drier": 89, - "toothbrush": 90 + "fire_hydrant": 11, "stop_sign": 12, "parking_meter": 13, "bench": 14, + "bird": 15, "cat": 16, "dog": 17, "horse": 18, "sheep": 19, "cow": 20, + "elephant": 21, "bear": 22, "zebra": 23, "giraffe": 24, "backpack": 25, + "umbrella": 26, "handbag": 27, "tie": 28, "suitcase": 29, "frisbee": 30, + "skis": 31, "snowboard": 32, "sports_ball": 33, "kite": 34, "baseball_bat": 35, + "baseball_glove": 36, "skateboard": 37, "surfboard": 38, "tennis_racket": 39, + "bottle": 40, "wine_glass": 41, "cup": 42, "fork": 43, "knife": 44, "spoon": 45, + "bowl": 46, "banana": 47, "apple": 48, "sandwich": 49, "orange": 50, "broccoli": 51, + "carrot": 52, "hot_dog": 53, "pizza": 54, "donut": 55, "cake": 56, "chair": 57, + "couch": 58, "potted_plant": 59, "bed": 60, "dining_table": 61, "toilet": 62, + "tv": 63, "laptop": 64, "mouse": 65, "remote": 66, "keyboard": 67, "cell_phone": 68, + "microwave": 69, "oven": 70, "toaster": 71, "sink": 72, "refrigerator": 73, + "book": 74, "clock": 75, "vase": 76, "scissors": 77, "teddy_bear": 78, "hair_drier": 79, + "toothbrush": 80 } labels_mapping = {} From f57586a03cffdc99d1f41b6f9fdf1944b7cec1f8 Mon Sep 17 00:00:00 2001 From: Boris Sekachev <40690378+bsekachev@users.noreply.github.com> Date: Thu, 19 Dec 2019 16:17:36 +0300 Subject: [PATCH 13/14] UI Enhancements (#985) * Single import of basic styles * A little bit redesigned header * Specified min resolution 1280x768 * Getting a job instance * Improved handling when task doesn't exist --- cvat-ui/src/base.scss | 24 ------ .../annotation-page/annotation-page.tsx | 35 ++++++++- .../components/annotation-page/styles.scss | 64 ++++++++------- .../annotation-page/top-bar/top-bar.tsx | 23 +++--- cvat-ui/src/components/cvat-app.tsx | 6 +- .../model-runner-modal/model-runner-modal.tsx | 2 +- .../components/models-page/models-page.tsx | 2 +- .../src/components/task-page/task-page.tsx | 36 ++++----- .../src/components/tasks-page/tasks-page.tsx | 2 +- .../annotation-page/annotation-page.tsx | 78 ++++++++++++++++++- .../src/containers/task-page/task-page.tsx | 24 ++++-- cvat-ui/src/styles.scss | 34 ++++++++ 12 files changed, 225 insertions(+), 105 deletions(-) create mode 100644 cvat-ui/src/styles.scss diff --git a/cvat-ui/src/base.scss b/cvat-ui/src/base.scss index 99fed8f8013e..17348718f067 100644 --- a/cvat-ui/src/base.scss +++ b/cvat-ui/src/base.scss @@ -15,27 +15,3 @@ $danger-icon-color: #FF4136; $info-icon-color: #0074D9; $monospaced-fonts-stack: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace; - -hr { - border: none; - border-top: 1px solid $border-color-1; - height: 1px; -} - -.cvat-text-color { - color: $text-color; -} - -.cvat-title { - font-weight: 400; - font-size: 21px; - color: $text-color; - padding-top: 5px; -} - -#root { - width: 100%; - height: 100%; - min-height: 100%; - display: grid; -} diff --git a/cvat-ui/src/components/annotation-page/annotation-page.tsx b/cvat-ui/src/components/annotation-page/annotation-page.tsx index 0c5d4910f01c..12d0b92833e5 100644 --- a/cvat-ui/src/components/annotation-page/annotation-page.tsx +++ b/cvat-ui/src/components/annotation-page/annotation-page.tsx @@ -3,12 +3,45 @@ import React from 'react'; import { Layout, + Spin, + Result, } from 'antd'; import AnnotationTopBarComponent from './top-bar/top-bar'; import StandardWorkspaceComponent from './standard-workspace/standard-workspace'; -export default function AnnotationPageComponent(): JSX.Element { +interface Props { + jobInstance: any | null | undefined; + fetching: boolean; + getJob(): void; +} + +export default function AnnotationPageComponent(props: Props): JSX.Element { + const { + jobInstance, + fetching, + getJob, + } = props; + + if (jobInstance === null) { + if (!fetching) { + getJob(); + } + + return ; + } + + if (typeof (jobInstance) === 'undefined') { + return ( + + ); + } + return ( diff --git a/cvat-ui/src/components/annotation-page/styles.scss b/cvat-ui/src/components/annotation-page/styles.scss index 6ac4b77fb519..deb40196044b 100644 --- a/cvat-ui/src/components/annotation-page/styles.scss +++ b/cvat-ui/src/components/annotation-page/styles.scss @@ -14,46 +14,48 @@ .cvat-annotation-header-left-group { height: 100%; - > div { - padding: 0px; - width: 54px; - height: 54px; - float: left; - text-align: center; + > div:first-child { + filter: invert(0.9); + background: $background-color-1; + border-radius: 0px; + width: 70px; + } +} - > span { - font-size: 10px; - } +.cvat-annotation-header-button { + padding: 0px; + width: 54px; + height: 54px; + float: left; + text-align: center; + user-select: none; - > i { - transform: scale(0.8); - padding: 3px; - } + > span { + font-size: 10px; + } - &:hover > i { - transform: scale(0.9); - } + > i { + transform: scale(0.8); + padding: 3px; + } - &:active > i { - transform: scale(0.8); - } + &:hover > i { + transform: scale(0.9); + } - > * { - display: block; - line-height: 0px; - } + &:active > i { + transform: scale(0.8); } - > div:first-child { - filter: invert(0.9); - background: $background-color-1; - border-radius: 0px; - width: 70px; + > * { + display: block; + line-height: 0px; } } .cvat-annotation-header-player-group > div { height: 54px; + line-height: 0px; } .cvat-annotation-header-player-buttons { @@ -96,14 +98,16 @@ } .cvat-annotation-header-filename-wrapper { - max-width: 180px; + max-width: 300px; overflow: hidden; text-overflow: ellipsis; + user-select: none; } .cvat-annotation-header-frame-selector { width: 5em; - margin-right: 0.5em; + padding-right: 5px; + margin-left: 5px; } .cvat-annotation-header-right-group { diff --git a/cvat-ui/src/components/annotation-page/top-bar/top-bar.tsx b/cvat-ui/src/components/annotation-page/top-bar/top-bar.tsx index c6ca29e67a61..1e1f25c485a3 100644 --- a/cvat-ui/src/components/annotation-page/top-bar/top-bar.tsx +++ b/cvat-ui/src/components/annotation-page/top-bar/top-bar.tsx @@ -34,25 +34,25 @@ export default function AnnotationPageComponent(): JSX.Element { -

+
Menu
-
+
Save
-
+
Undo
-
+
Redo
- + @@ -68,26 +68,25 @@ export default function AnnotationPageComponent(): JSX.Element { - + filename.png - - - of 200 - + + + -
+
Fullscreen
-
+
Info
diff --git a/cvat-ui/src/components/cvat-app.tsx b/cvat-ui/src/components/cvat-app.tsx index bab6dee9a56a..a1e76e490a42 100644 --- a/cvat-ui/src/components/cvat-app.tsx +++ b/cvat-ui/src/components/cvat-app.tsx @@ -1,5 +1,5 @@ import 'antd/dist/antd.less'; -import '../base.scss'; +import '../styles.scss'; import React from 'react'; import { BrowserRouter } from 'react-router-dom'; import { @@ -262,7 +262,7 @@ export default class CVATApplication extends React.PureComponent { - + { withModels && } { installedAutoAnnotation @@ -289,7 +289,7 @@ export default class CVATApplication extends React.PureComponent { } return ( - + ); } } diff --git a/cvat-ui/src/components/model-runner-modal/model-runner-modal.tsx b/cvat-ui/src/components/model-runner-modal/model-runner-modal.tsx index fc9abff77cc9..eda2bcba7480 100644 --- a/cvat-ui/src/components/model-runner-modal/model-runner-modal.tsx +++ b/cvat-ui/src/components/model-runner-modal/model-runner-modal.tsx @@ -407,7 +407,7 @@ export default class ModelRunnerModalComponent extends React.PureComponent {!modelsInitialized - && } + && } {modelsInitialized && this.renderContent()} ) diff --git a/cvat-ui/src/components/models-page/models-page.tsx b/cvat-ui/src/components/models-page/models-page.tsx index fd79626d8596..4e2a8c3bf062 100644 --- a/cvat-ui/src/components/models-page/models-page.tsx +++ b/cvat-ui/src/components/models-page/models-page.tsx @@ -42,7 +42,7 @@ export default function ModelsPageComponent(props: Props): JSX.Element { props.getModels(); } return ( - + ); } diff --git a/cvat-ui/src/components/task-page/task-page.tsx b/cvat-ui/src/components/task-page/task-page.tsx index f01e03366ffb..0804551cc39b 100644 --- a/cvat-ui/src/components/task-page/task-page.tsx +++ b/cvat-ui/src/components/task-page/task-page.tsx @@ -7,7 +7,7 @@ import { Col, Row, Spin, - notification, + Result, } from 'antd'; import TopBarComponent from './top-bar'; @@ -17,11 +17,11 @@ import ModelRunnerModalContainer from '../../containers/model-runner-dialog/mode import { Task } from '../../reducers/interfaces'; interface TaskPageComponentProps { - task: Task | null; + task: Task | null | undefined; fetching: boolean; deleteActivity: boolean | null; installedGit: boolean; - onFetchTask: (tid: number) => void; + getTask: () => void; } type Props = TaskPageComponentProps & RouteComponentProps<{id: string}>; @@ -38,41 +38,33 @@ class TaskPageComponent extends React.PureComponent { if (deleteActivity) { history.replace('/tasks'); } - - if (this.attempts === 2) { - notification.warning({ - message: 'Something wrong with the task. It cannot be fetched from the server', - }); - } } public render(): JSX.Element { const { - match, task, fetching, - onFetchTask, + getTask, } = this.props; - const { id } = match.params; - const fetchTask = !task; - if (fetchTask) { + if (task === null) { if (!fetching) { - if (!this.attempts) { - this.attempts++; - onFetchTask(+id); - } else { - this.attempts++; - } + getTask(); } + return ( - + ); } if (typeof (task) === 'undefined') { return ( -
+ ); } diff --git a/cvat-ui/src/components/tasks-page/tasks-page.tsx b/cvat-ui/src/components/tasks-page/tasks-page.tsx index 3a21a978f151..51232923bc4d 100644 --- a/cvat-ui/src/components/tasks-page/tasks-page.tsx +++ b/cvat-ui/src/components/tasks-page/tasks-page.tsx @@ -207,7 +207,7 @@ class TasksPageComponent extends React.PureComponent + ); } diff --git a/cvat-ui/src/containers/annotation-page/annotation-page.tsx b/cvat-ui/src/containers/annotation-page/annotation-page.tsx index 541a831884b1..44da61a73f41 100644 --- a/cvat-ui/src/containers/annotation-page/annotation-page.tsx +++ b/cvat-ui/src/containers/annotation-page/annotation-page.tsx @@ -1,9 +1,83 @@ import React from 'react'; +import { connect } from 'react-redux'; +import { withRouter } from 'react-router-dom'; +import { RouteComponentProps } from 'react-router'; import AnnotationPageComponent from '../../components/annotation-page/annotation-page'; +import { getTasksAsync } from '../../actions/tasks-actions'; -export default function AnnotationPageContainer() { +import { + CombinedState, + Task, +} from '../../reducers/interfaces'; + +type OwnProps = RouteComponentProps<{ + tid: string; + jid: string; +}>; + +interface StateToProps { + jobInstance: any | null | undefined; + fetching: boolean; +} + +interface DispatchToProps { + getJob(): void; +} + +function mapStateToProps(state: CombinedState, own: OwnProps): StateToProps { + const { tasks } = state; + const { + gettingQuery, + current, + } = tasks; + const { params } = own.match; + const taskID = +params.tid; + const jobID = +params.jid; + + const filteredTasks = current + .filter((_task: Task) => _task.instance.id === taskID); + const task = filteredTasks[0] || (gettingQuery.id === taskID || Number.isNaN(taskID) + ? undefined : null); + + const job = task ? task.instance.jobs + .filter((_job: any) => _job.id === jobID)[0] : task; + + return { + jobInstance: job, + fetching: tasks.fetching, + }; +} + +function mapDispatchToProps(dispatch: any, own: OwnProps): DispatchToProps { + const { params } = own.match; + const taskID = +params.tid; + + return { + getJob(): void { + dispatch(getTasksAsync({ + id: taskID, + page: 1, + search: null, + owner: null, + assignee: null, + name: null, + status: null, + mode: null, + })); + }, + }; +} + +function AnnotationPageContainer(props: StateToProps & DispatchToProps): JSX.Element { return ( - + ); } + +export default withRouter( + connect( + mapStateToProps, + mapDispatchToProps, + )(AnnotationPageContainer), +); diff --git a/cvat-ui/src/containers/task-page/task-page.tsx b/cvat-ui/src/containers/task-page/task-page.tsx index 1133e16620b3..da2f5aae93a6 100644 --- a/cvat-ui/src/containers/task-page/task-page.tsx +++ b/cvat-ui/src/containers/task-page/task-page.tsx @@ -14,23 +14,29 @@ import { type Props = RouteComponentProps<{id: string}>; interface StateToProps { - task: Task | null; + task: Task | null | undefined; fetching: boolean; deleteActivity: boolean | null; installedGit: boolean; } interface DispatchToProps { - onFetchTask: (tid: number) => void; + getTask: () => void; } function mapStateToProps(state: CombinedState, own: Props): StateToProps { const { plugins } = state.plugins; - const { deletes } = state.tasks.activities; + const { tasks } = state; + const { gettingQuery } = tasks; + const { deletes } = tasks.activities; + const id = +own.match.params.id; - const filtered = state.tasks.current.filter((task) => task.instance.id === id); - const task = filtered[0] || null; + const filteredTasks = state.tasks.current + .filter((task) => task.instance.id === id); + + const task = filteredTasks[0] || (gettingQuery.id === id || Number.isNaN(id) + ? undefined : null); let deleteActivity = null; if (task && id in deletes.byTask) { @@ -45,11 +51,13 @@ function mapStateToProps(state: CombinedState, own: Props): StateToProps { }; } -function mapDispatchToProps(dispatch: any): DispatchToProps { +function mapDispatchToProps(dispatch: any, own: Props): DispatchToProps { + const id = +own.match.params.id; + return { - onFetchTask: (tid: number): void => { + getTask: (): void => { dispatch(getTasksAsync({ - id: tid, + id, page: 1, search: null, owner: null, diff --git a/cvat-ui/src/styles.scss b/cvat-ui/src/styles.scss new file mode 100644 index 000000000000..d3b3c0a7711d --- /dev/null +++ b/cvat-ui/src/styles.scss @@ -0,0 +1,34 @@ +@import './base.scss'; + +hr { + border: none; + border-top: 1px solid $border-color-1; + height: 1px; +} + +.cvat-spinner { + margin: 25% 50%; +} + +.cvat-not-found { + margin: 10% 25%; +} + +.cvat-text-color { + color: $text-color; +} + +.cvat-title { + font-weight: 400; + font-size: 21px; + color: $text-color; + padding-top: 5px; +} + +#root { + width: 100%; + height: 100%; + display: grid; + min-width: 1280px; + min-height: 768px; +} From 458bd2322260ad4b5c1c499c7e3c0073cf0956ed Mon Sep 17 00:00:00 2001 From: vugia truong Date: Thu, 19 Dec 2019 22:52:54 +0900 Subject: [PATCH 14/14] Adding dump for VOC instance mask. (#859) * Add mask instance dumper * Fix bug * Merge mask instance into mask * Merge the change into mask * Create MaskColorizer * Add dump method --- README.md | 1 + cvat/apps/annotation/mask.py | 129 +++++++++++++++++++++++++---------- 2 files changed, 93 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index b3d0480acfd0..931105bc3920 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ Format selection is possible after clicking on the Upload annotation / Dump anno | [YOLO](https://pjreddie.com/darknet/yolo/) | X | X | | [MS COCO Object Detection](http://cocodataset.org/#format-data) | X | X | | PNG mask | X | | +| PNG instance mask | X | | | [TFrecord](https://www.tensorflow.org/tutorials/load_data/tf_records) | X | X | | [MOT](https://motchallenge.net/) | X | X | | [LabelMe](http://labelme.csail.mit.edu/Release3.0) | X | X | diff --git a/cvat/apps/annotation/mask.py b/cvat/apps/annotation/mask.py index b1713fd01af6..ad1b1a6c8089 100644 --- a/cvat/apps/annotation/mask.py +++ b/cvat/apps/annotation/mask.py @@ -6,38 +6,26 @@ "name": "MASK", "dumpers": [ { - "display_name": "{name} {format} {version}", + "display_name": "{name} (by class) {format} {version}", "format": "ZIP", "version": "1.0", - "handler": "dump" + "handler": "dump_by_class" + }, + { + "display_name": "{name} (by instance) {format} {version}", + "format": "ZIP", + "version": "1.0", + "handler": "dump_by_instance" }, ], "loaders": [ ], } -def dump(file_object, annotations): - from zipfile import ZipFile - import numpy as np - import os - from pycocotools import mask as maskUtils - import matplotlib.image - import io - from collections import OrderedDict - - # RGB format, (0, 0, 0) used for background - def genearte_pascal_colormap(size=256): - colormap = np.zeros((size, 3), dtype=int) - ind = np.arange(size, dtype=int) - - for shift in reversed(range(8)): - for channel in range(3): - colormap[:, channel] |= ((ind >> channel) & 1) << shift - ind >>= 3 - - return colormap +MASK_BY_CLASS = 0 +MASK_BY_INSTANCE = 1 - def convert_box_to_polygon(points): +def convert_box_to_polygon(shape): xtl = shape.points[0] ytl = shape.points[1] xbr = shape.points[2] @@ -45,12 +33,64 @@ def convert_box_to_polygon(points): return [xtl, ytl, xbr, ytl, xbr, ybr, xtl, ybr] - colormap = genearte_pascal_colormap() - labels = [label[1]["name"] for label in annotations.meta["task"]["labels"] if label[1]["name"] != 'background'] - labels.insert(0, 'background') - label_colors = OrderedDict((label, colormap[idx]) for idx, label in enumerate(labels)) +def create_mask_colorizer(annotations, colorize_type): + import numpy as np + from collections import OrderedDict + + class MaskColorizer: + + def __init__(self, annotations, colorize_type): + + if colorize_type == MASK_BY_CLASS: + self.colors = self.gen_class_mask_colors(annotations) + elif colorize_type == MASK_BY_INSTANCE: + self.colors = self.gen_instance_mask_colors() + + def generate_pascal_colormap(self, size=256): + # RGB format, (0, 0, 0) used for background + colormap = np.zeros((size, 3), dtype=int) + ind = np.arange(size, dtype=int) + + for shift in reversed(range(8)): + for channel in range(3): + colormap[:, channel] |= ((ind >> channel) & 1) << shift + ind >>= 3 - with ZipFile(file_object, "w") as output_zip: + return colormap + + def gen_class_mask_colors(self, annotations): + colormap = self.generate_pascal_colormap() + labels = [label[1]["name"] for label in annotations.meta["task"]["labels"] if label[1]["name"] != 'background'] + labels.insert(0, 'background') + label_colors = OrderedDict((label, colormap[idx]) for idx, label in enumerate(labels)) + + return label_colors + + def gen_instance_mask_colors(self): + colormap = self.generate_pascal_colormap() + # The first color is black + instance_colors = OrderedDict((idx, colormap[idx]) for idx in range(len(colormap))) + + return instance_colors + + return MaskColorizer(annotations, colorize_type) + +def dump(file_object, annotations, colorize_type): + + from zipfile import ZipFile, ZIP_STORED + import numpy as np + import os + from pycocotools import mask as maskUtils + import matplotlib.image + import io + + colorizer = create_mask_colorizer(annotations, colorize_type=colorize_type) + if colorize_type == MASK_BY_CLASS: + save_dir = "SegmentationClass" + elif colorize_type == MASK_BY_INSTANCE: + save_dir = "SegmentationObject" + + with ZipFile(file_object, "w", ZIP_STORED) as output_zip: for frame_annotation in annotations.group_by_frame(): image_name = frame_annotation.name annotation_name = "{}.png".format(os.path.splitext(os.path.basename(image_name))[0]) @@ -63,18 +103,33 @@ def convert_box_to_polygon(points): if not shapes: continue shapes = sorted(shapes, key=lambda x: int(x.z_order)) - img = np.zeros((height, width, 3)) - buf = io.BytesIO() - for shape in shapes: - points = shape.points if shape.type != 'rectangle' else convert_box_to_polygon(shape.points) + img_mask = np.zeros((height, width, 3)) + buf_mask = io.BytesIO() + for shape_index, shape in enumerate(shapes): + points = shape.points if shape.type != 'rectangle' else convert_box_to_polygon(shape) rles = maskUtils.frPyObjects([points], height, width) rle = maskUtils.merge(rles) mask = maskUtils.decode(rle) - color = label_colors[shape.label] / 255 idx = (mask > 0) - img[idx] = color + # get corresponding color + if colorize_type == MASK_BY_CLASS: + color = colorizer.colors[shape.label] / 255 + elif colorize_type == MASK_BY_INSTANCE: + color = colorizer.colors[shape_index+1] / 255 + + img_mask[idx] = color - matplotlib.image.imsave(buf, img, format='png') - output_zip.writestr(annotation_name, buf.getvalue()) - labels = '\n'.join('{}:{}'.format(label, ','.join(str(i) for i in color)) for label, color in label_colors.items()) + # write mask + matplotlib.image.imsave(buf_mask, img_mask, format='png') + output_zip.writestr(os.path.join(save_dir, annotation_name), buf_mask.getvalue()) + # Store color map for each class + labels = '\n'.join('{}:{}'.format(label, ','.join(str(i) for i in color)) for label, color in colorizer.colors.items()) output_zip.writestr('colormap.txt', labels) + +def dump_by_class(file_object, annotations): + + return dump(file_object, annotations, MASK_BY_CLASS) + +def dump_by_instance(file_object, annotations): + + return dump(file_object, annotations, MASK_BY_INSTANCE)