From d0c30e74a161998e989f21e2098e6fe07c86d7bd Mon Sep 17 00:00:00 2001 From: Dmitry Kruchinin <33020454+dvkruchinin@users.noreply.github.com> Date: Thu, 1 Apr 2021 13:07:08 +0300 Subject: [PATCH 01/81] Cypress test. Crop polygon properly. (#3048) --- .../issue_2992_crop_polygon_properly.js | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/cypress/integration/actions_tasks_objects/issue_2992_crop_polygon_properly.js diff --git a/tests/cypress/integration/actions_tasks_objects/issue_2992_crop_polygon_properly.js b/tests/cypress/integration/actions_tasks_objects/issue_2992_crop_polygon_properly.js new file mode 100644 index 00000000..965bc528 --- /dev/null +++ b/tests/cypress/integration/actions_tasks_objects/issue_2992_crop_polygon_properly.js @@ -0,0 +1,36 @@ +// Copyright (C) 2020-2021 Intel Corporation +// +// SPDX-License-Identifier: MIT + +/// + +import { taskName, labelName } from '../../support/const'; + +context('Crop polygon properly.', () => { + const issueId = '2992'; + + const createPolygonShape = { + reDraw: false, + type: 'Shape', + labelName: labelName, + pointsMap: [ + { x: 200, y: 500 }, + { x: 200, y: 200 }, + { x: 10, y: 250 }, + ], + complete: true, + numberOfPoints: null, + }; + + before(() => { + cy.openTaskJob(taskName); + }); + + describe(`Testing issue "${issueId}"`, () => { + it('Draw a polygon with vertices outside the image', () => { + cy.createPolygon(createPolygonShape); + cy.get('.cvat-canvas-container').click(58, 238); + cy.get('#cvat_canvas_shape_1').should('have.class', 'cvat_canvas_shape_activated'); + }); + }); +}); From a60b4895c2f6fda292cf890c34e24df6535dd2e2 Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Thu, 1 Apr 2021 13:48:46 +0300 Subject: [PATCH 02/81] Added template for v1.4.0-alpha into CHANGELOG and updated server version. --- CHANGELOG.md | 21 +++++++++++++++++++++ cvat/__init__.py | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48129323..4c5d1d3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.4.0] - Unreleased + +### Added +- + +### Changed +- + +### Deprecated +- + +### Removed +- + +### Fixed +- + +### Security +- + + ## [1.3.0] - 3/31/2021 ### Added diff --git a/cvat/__init__.py b/cvat/__init__.py index f92ffbfe..a2e8889c 100644 --- a/cvat/__init__.py +++ b/cvat/__init__.py @@ -4,6 +4,6 @@ from cvat.utils.version import get_version -VERSION = (1, 3, 0, 'final', 0) +VERSION = (1, 4, 0, 'alpha', 0) __version__ = get_version(VERSION) From d7f84b207b449125b0561762bbc2704211f5c329 Mon Sep 17 00:00:00 2001 From: OlgaP Date: Fri, 2 Apr 2021 06:43:01 +0200 Subject: [PATCH 03/81] Update installation.md (#3054) Update installation.md with link to the Scaleway cloud deployment tutorial --- cvat/apps/documentation/installation.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cvat/apps/documentation/installation.md b/cvat/apps/documentation/installation.md index 73eb707b..4523a9b8 100644 --- a/cvat/apps/documentation/installation.md +++ b/cvat/apps/documentation/installation.md @@ -374,6 +374,10 @@ This depends on the email server you are using and is not covered in this tutori [Django SMTP backend configuration](https://docs.djangoproject.com/en/3.1/topics/email/#django.core.mail.backends.smtp.EmailBackend) for details. +### Deploy CVAT on the Scaleway public cloud + +Please follow [this tutorial](https://blog.scaleway.com/smart-data-annotation-for-your-computer-vision-projects-cvat-on-scaleway/) to install and set up remote access to CVAT on a Scaleway cloud instance with data in a mounted object storage bucket. + ### Deploy secure CVAT instance with HTTPS Certificates (issued by let's encrypt) to cloud instance. From 9e3c6940d94c51ec4605632d469679b5edb3244e Mon Sep 17 00:00:00 2001 From: TOsmanov <54434686+TOsmanov@users.noreply.github.com> Date: Fri, 2 Apr 2021 10:29:42 +0300 Subject: [PATCH 04/81] update user_guide.md and images (#3052) --- .../images/image128_use_cache.jpg | Bin 175717 -> 61950 bytes .../documentation/images/image131_detrac.jpg | Bin 81468 -> 89816 bytes cvat/apps/documentation/user_guide.md | 6 ++++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cvat/apps/documentation/static/documentation/images/image128_use_cache.jpg b/cvat/apps/documentation/static/documentation/images/image128_use_cache.jpg index 038e3d4c93007de154a68d21815c23c3bf7e59c7..3080718fca436d3f2935606f9797287f00452b79 100644 GIT binary patch literal 61950 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 b+0wNm5KyB{)sGj(6S2RRy6E}KkI8=lEDYvy literal 175717 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

VH6HIAfoVx9)BL9~ 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�>sd6=<>FkgQW;1M=3zw zaDaU)eblZ72%qlVu=sq>zz(A$l7*A2(nvBgwmEbx9e{g-xv0*vnthG}6(I@v*(gKZ zI)K*8)GxJAtq5Eo$g&qIJmKzOH84yh*8#X-u`&Kv#}4J=0XNT>_YOd{08V~p)_iCs zm_F-?U;9aJ1Qk~wX|;d|D-7#ug?u8a)P;B-L;FfQi`exHw$vJ z0r5mDhoPtmp6iUZ(%HpdL{{JiR6!7+s`2?(_jjB;>gZAAgO5JH@c*)Z$X@sjp>%ZudUPId;QjR_xGrmOi5$)Ybf5sjAj%ZJ4GH~~HeA*? zP5!SKsQw=ogDdA-PcNlM`|k4CRfoJzlSLzBbiuUaT`1d^yGOM+vR6@j+g)Am1oa>( zC+Bzwd_1{Y7CvswsHpIBIC!8*?@nB$x`I0;W0X88z|2Z)I}lYhv}|qAT<~!_nYDyG>zy*oR6J8$|`O-^Mpd@IQNB`@3*86)3xjQ zvaTy@Gex}JLhuj9S5B5)IW4D*EUI-Mcrv@EoLX`v`g+r06cO*9P;GAGc{-;8tlmbQ za)L0`E3p5_+P$95wo!QYtq|fm0(TrsPxCT7?tPT z&0WHGwk$Oi8!bu&)iP#!*wN~HaXdL-`4w8_81gLPl~~VNIaBKbC)`s-^%M<79*sDS zn2+!OXAb`tOufBwN^&-Xow0LF9D0;7>YaKdEy`Ad?(_Sf;NAbd)l?)nyU4Jur&ktzQcY}*7Od@i>}wh9jO>|{*Z;U)x1?Z>?k5e0N>>5h=@nyth#J!$zJ|^@PDuK zlLE{FBot^|+Eq7!tWL`KNTT#VBOlVAGe&|-O;kp={XTvQTzy2uN$${$Yx*9rF4PG~ zay0v84Xe=RJBR*N>?SaC!2#h+W6wZMx!QqvJ5yeegALG%@(BX;66n@LSrWzl= z&7qouKVu_fs#j_I5LW#C{nuU@F4ZJV_w-3ja;*`@*9lhkV`PA^o}H6muf;s*J+P)w z%80-zxNs$rA11RJejozq(G#7^@@G16ndfd2h1S&LUS@qBN;}OE&;RB9XWGz3FulLg zdndHnYG88E?d?-c9j+v3L9MIv7235yHeT3VEne8JXJE8hp;jJT${&&Rj~@1)x>f@+ z)SSAWW5;;9mV*}V=RtW@wXUyaa!8pe3_Oa7vs(XrpMaaC%T(U?c<61qgv-S=M!}R{ z?ZNVp7)Z?u;TVCeN>x2Hx=<-7z-eos?|Vi0(g4S~jP&)Cm(YBMdkzxjPTR9Pdt-Lb z+DlF@=1Z#&`uY^;K7-GU0!9HT-@}XoAdLerH>b|Eg>E<|>nyKIij;Meu*0C$nhB*J z)?p0i`q@e}oADw=hE;;yple)lo8(@@F5$j}swxkZGGof$o1mv_!qE~iwV0hLcH?A~ zDDk}rPnV(qjCu9zN$x=%KAWEA+qT~r!IAn#_hszR#QQSHsY~j=&8}-LsHOOPT(_D; zcNaj$6B^(2>-NCxe5dCmIvYe=bHfWBFzUh+yW}XeN4(xet&U4w*O~GkifidybTAO{ zjSiCbzs$Umc&U3zG{8=Cd(>yP<{91GlIT$+i@*`Jlta`K5e{k~CEGB{eAr9rfcmJh zXs$CC&t{x6sgN{sYsuAaQSW4%TFnfQbX4;G{PE<+KscsYKAG4|)*Z`TjMNLjcLwF2 zRg16H?}9*~d?pWO)okx~%l80bQ7%@4TD09+{wiU4(ck@cwK_9$5;FFh*$i4KDDstf zVk9*Np(gQ$gATl`$8bf4(tVwo0n1;7#n!t;`v!jR#=$WYhI$esc#QsQ>%l~rM3Ab2 z>!8S6XRiUXfmdkD{#kEZxea95X8dx{bBen<8w;8nG2__p_mf?wBf zO#M8H^Z21Byzd@}bn*ngzsp4unwsoiU0>VCe2OVnp%lx!$RgJj^^A}aqo!KrAWENG zy;uz=bk?0M8?wx1%!dZH#~^Sn(p&F-Y+gHCrS|%ft??Pvn?(uCV=bLThrCH}BHh42 zOupwa6CM11A=`fa2lo&CV$a*d9^FB(w?cNMb~D%oSf#BdjAbxawd>KM9+?nzJ+FzY zgLnT(Y1jT%RYBh3$aX_Q*P^|#VNJ?SpP;PU57yx4_NY;--{d`Thdq#OBCuH9y>9Ky z+g%*SLbpEc-~$YzM%D_5c}LQVifSeDDh*aM_r+};D@*;$g_8We&~5juB7=%l9ELm` z`_CDnxrf)jWOOsKdT)eqthCjgijODH_%D{I0E}Uh|tyl<3@H-{pcORew8`kgdBQ$|2>ua^Fgm?-q8ltbt$?GaR$$ zs;i_W%1m+JtV(^@O5VF6Ik0Inaw-$;DR1JvkbbiBO_jQu!RMKxo=CiXT%FMHiOjpG zBS$WB-j}TE{2jE~^-tx3kvE)kEj?!_4Ib6iQDdI5aX^kSR7 zmry&sULKhN(yj^4n6V9AqdHFJ6{Nv~{`0>_+MVnS7GNA&d?bM7sKLMEvq=i*R)_TM z+Q_(=Z_5Y_T%TY2)csJ!m>V|Ew33<7mBKQ_-LB*?z>&$e5ohcty|bd+xdUU1@{oC? zv|ZIyMEUp`9gFu0wuoO|8}G4kZ`XdG!Cd)8W>Wk#nOf!wU0$nm8Ny6hn=wkGLA~{H~{Evn+P07J;6( z@Uv?B+)dpa6L3?;Z)tfC_UQ(_dlW*+c)yJ77^YbLMCVY!c2N5xFT2k%T(5~~9ZJ}- z5rlAMPpm~y(AwF6{cqz)!nbyQ2Fh?iPuHF(%2k89h_b!GlgT_qQP#NC#mv)nx8+2n zKx3l*TfNlty;nfMlp6RCRKR~CguZVeCRmI4!Q3AE%6PecJM}vP_T@(vBV9J@&K_d* zwav+sNky4lR=Cf6GuRQB0YZtXBRc>(J3d>^6Lijg!;aX+VRF;00^e+-RwFuGVrjAF zXP&y8B4e2BznT5sjZJuKAt5_c)q40@1G=O~ps#q;IJ&UX#W4)oxR~P88E7RR|A23h zS0kquwd>_nAkrog1e>UyFbM5pUC?9R{0^@^tsQlk?>$a#D-2HT%NU_M$dA@M z5_SoUy1k9}a#Z1|&aLx2U64`ZWZfL&ND0#i;;xbJUwnVHZ0SlO*G*4NqOhoA9feV5@6e3bGd@U+hi1c<-dOH>()h1!kOO5{^w}u8z=A+HdTR z8YKGr*T`nNvbOsmaGtCAhx7BDx(3vGrQx}KF=ea-7jrc+WA({AH1hs=8>T`I?4yHg)uU)tFxOW7^8f+KwrzibXFjVzbj!IZ8-FY%i^W;M4o{If`qunE4#bLLn-tx`z`VE$Q0o6X%UZ|0C zAWWwrJ1p@cx4lNXH@f90wydm5gNLxJxwKaJ z68W5ftzE)+K%6K&ikIPDP?C7xgYR3BaZ!5&uRsJYz<;C7_5HqDAx1dIEmPzzcLA)J zm(N64W_MGnDnm7EEs_DXvvF=w?U7+^#l>mc`0eZJ%Ex$OdSPw6DpmHCSN+CRC3H^i z438G6a2OBO$l~7)6FZCBC&~;LbJxrp1oCN5+IGg& zt~9=XF-8iG%L6j~cc-NMyH?-F*c%k|=C%}VI(rpJyp8c+-gfN`*p_K$p@^*Y@Ao5U(VZ=uiv!UG?8`On9DbGg zNLhAe&ws!g{-f9@K&qhc_gi*%Nz|E${ff@?{^zUhgn8aq;(jTuV=|C>t?p^Z6>=mr?4n(sC!q) zW+7V96LHV=!&u;0<0%>a4Tt^!XYU5%Kt6ZMA~&0xb?$~<@rE`}oc9c}vvUGXruqq= zU|(E_yLmB;dufUw_wio+AYpgdDZ42Ra?DRQ*olwZol8Ngss?R1JDr&rFUMxt?eawd zb=~0-EL^Fw9-^L-NZIe_Y}EHQEn3sJ_~N^{5*-t9$KLxGh_*EXm#uh$JJh-+sHUQa z;o8w?qjG{ewc&Td0*w9wv1YPudv~GMEpeO;v#)w=3id2!VV6q{>~{BSd~}+w zd@MBB$S$zRbe&H+Mi_Z|;Rfn?Vdqs}ScPymCQ+ZSqiXRuca6_{lGveFizC%Gs#4V+ z-60hmzTzDP4~xsGrVT;Cp)yJ2R6ZCvFS&kY^w2cW^ce6QwwLK}5A9z7<9BwsM9lKA zw?-ZYY)F_eB8xk7pr%fCQCSPJJI%pX^3RMiDaKv@%=T{V{AV&Azp6zskWieNplb>|H>LP%y zi6N?VI&QBe`qZs3xjU%&+?7ooulwyVi63X70xEmV`9+zgGPrNPNO`S8CC&+=TrLL- zGQ@rGP_LEZ{((XGPgoNV1Y_+lJ75F){Fxn1*@w5Zhk%raN(8Su)`8#JF!;K1xPX+w zJ2QH`F#rXXFPPKkn}Gy<2_kd*XX1?i-o{y4&#A96P7BW2Z-#9WWc|n@ zn3)=y93-{#PLOe9#3@@3OLx9pL#Wp+G(8$s70H3uoVR@PER1k6Z z#$j?5zW)t31FPQMa?M{&_=+(;_0_<1Pa$Htc{ahxbbkaU!mW|h?PPfvo&s_G)GBdz zbG`iexmsuC%==SWz20Z4_i@nbO}YA^L`Lp4X)XY<{R{H&zYnH&5Nm5|^prtP+h!cn zI~F)q9-?Qdnt!I%&=^JK;9h`Xnx0RKb0^gff zhreHYF3{#azPgxH@wPKK{9%_zcEHg=0l~rWTS77+uOlPJF%#+2tvefS#zk~pU0}6| zY_KS37?{TW18@2tO_Ct9A9+w&x&WFYxu?D^xhoZ4Kqz5W&>@EuT>!r@qQjC#9`#@d zx^zYM+sN?{Fq>KgHo=H*tf$)P@oDs*(2hKemnYTlC?g}I)9!ZoC=q}64_S6ZTwGji zQc?lho#WyuZTCC<68}|-zrQ`pr?O54nH4!D7z}MgU(gZ6J{_lhnu@Aw_`b0cvqNUa z@EPp~XUz{2*}>1rD#)h3x~+L={p{fRGJxu9e~dl!SxGnY0vNX6HKGo?w?AJvs1dVw z3mz6Q{h8$b4vfzw8unk`A@^mC`yye#?rB{D#^Qwh;l<^HI|SXJe?{=G2>yRx3(BN4 zwzlRXAxxAL^}!c9X4i!HI1e?O2PbESN06Rk94uhyn0KEbOteQ^qf5Qr?1Y;`l<5TO zXJ(X`#9cWfSfs?8&%6Bkcw(q;1?>6q3J5gq?XEa^j@`?ty-umUy^Gmgi*cC+x=w$hT0Z?f-<-sjeNzV7CFgwoPiWL;rBYYcz1H=_CPHtQ!x zfWVSVx_e%kWEIoECOrV(S{={AAzK0(F*X5_`&mi^QP}_7#ed2|fBit;ZN#`k*4*HR zBh#%-OF{yd=pZjMYRGWfM)=_Oxk2Q>-KBr;pBMY@RndTSqBHt+ znfkA;ky-*m4xyx{zj|ibe{TWE^8XbnysNvVSU|pFB+7RL{BvJkO|I~c>Er(kNMq0d diff --git a/cvat/apps/documentation/static/documentation/images/image131_detrac.jpg b/cvat/apps/documentation/static/documentation/images/image131_detrac.jpg index 59697973c3205e3d2f6870e597bad95227716089..fc3251e16c87867318d9ba7f1d488965ef5aeb61 100644 GIT binary patch literal 89816 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

{*`vAUtez&`^R~1aF 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 S0^xxUBk%k%OQPoY(f Date: Fri, 2 Apr 2021 12:30:07 +0300 Subject: [PATCH 05/81] Cypress test. Saving settings to local storage. (#3040) * Cypress test. Saving setting to local storage. * Add css classes * Add cypress command * Updating the test --- .../header/settings-modal/settings-modal.tsx | 2 + .../case_68_saving_settings_local_storage.js | 44 +++++++++++++++++++ tests/cypress/support/commands.js | 10 +++++ 3 files changed, 56 insertions(+) create mode 100644 tests/cypress/integration/actions_tasks_objects/case_68_saving_settings_local_storage.js diff --git a/cvat-ui/src/components/header/settings-modal/settings-modal.tsx b/cvat-ui/src/components/header/settings-modal/settings-modal.tsx index 23143f9e..897c6891 100644 --- a/cvat-ui/src/components/header/settings-modal/settings-modal.tsx +++ b/cvat-ui/src/components/header/settings-modal/settings-modal.tsx @@ -39,6 +39,7 @@ const SettingsModal = (props: SettingsModalProps): JSX.Element => { localStorage.setItem('clientSettings', JSON.stringify(settingsForSaving)); notification.success({ message: 'Settings was successfully saved', + className: 'cvat-notification-notice-save-settings-success', }); }; @@ -62,6 +63,7 @@ const SettingsModal = (props: SettingsModalProps): JSX.Element => { } catch { notification.error({ message: 'Failed to load settings from local storage', + className: 'cvat-notification-notice-load-settings-fail', }); } }, []); diff --git a/tests/cypress/integration/actions_tasks_objects/case_68_saving_settings_local_storage.js b/tests/cypress/integration/actions_tasks_objects/case_68_saving_settings_local_storage.js new file mode 100644 index 00000000..f50d954a --- /dev/null +++ b/tests/cypress/integration/actions_tasks_objects/case_68_saving_settings_local_storage.js @@ -0,0 +1,44 @@ +// Copyright (C) 2021 Intel Corporation +// +// SPDX-License-Identifier: MIT + +/// + +import { taskName } from '../../support/const'; + +context('Saving setting to local storage.', () => { + const caseId = '68'; + + function testCheckedSettings(checked) { + cy.openSettings(); + cy.contains('[role="tab"]', 'Workspace').click(); + for (const ws of [ + '.cvat-workspace-settings-show-interpolated', + '.cvat-workspace-settings-show-text-always', + '.cvat-workspace-settings-autoborders', + ]) { + checked + ? cy.get(ws).find('[type="checkbox"]').should('be.checked') + : cy.get(ws).find('[type="checkbox"]').should('not.be.checked').check().should('be.checked'); + } + } + + before(() => { + cy.openTaskJob(taskName); + }); + + describe(`Testing case "${caseId}"`, () => { + it('Check some settings. Reload a page. The settings are saved.', () => { + testCheckedSettings(); + cy.saveSettings(); + cy.get('.cvat-notification-notice-save-settings-success') + .should('exist') + .find('[data-icon="close"]') + .click(); + cy.closeSettings(); + cy.reload(); + cy.closeModalUnsupportedPlatform(); // If the Firefox browser closes the modal window after reload + testCheckedSettings(true); + }); + }); +}); diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index 373fff9b..052ba548 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -17,6 +17,10 @@ Cypress.Commands.add('login', (username = Cypress.env('user'), password = Cypres cy.get('[placeholder="Password"]').type(password); cy.get('[type="submit"]').click(); cy.url().should('match', /\/tasks$/); + cy.document().then((doc) => { + const loadSettingFailNotice = Array.from(doc.querySelectorAll('.cvat-notification-notice-load-settings-fail')); + loadSettingFailNotice.length > 0 ? cy.closeNotification('.cvat-notification-notice-load-settings-fail') : null; + }); }); Cypress.Commands.add('logout', (username = Cypress.env('user')) => { @@ -322,6 +326,12 @@ Cypress.Commands.add('closeSettings', () => { cy.get('.cvat-settings-modal').should('not.be.visible'); }); +Cypress.Commands.add('saveSettings', () => { + cy.get('.cvat-settings-modal').within(() => { + cy.contains('button', 'Save').click(); + }); +}); + Cypress.Commands.add('changeWorkspace', (mode, labelName) => { cy.get('.cvat-workspace-selector').click(); cy.get('.cvat-workspace-selector-dropdown').within(() => { From beadcb1c76b0a26f2264daf04efee26e7b831382 Mon Sep 17 00:00:00 2001 From: Maxim Zhiltsov Date: Fri, 2 Apr 2021 12:31:03 +0300 Subject: [PATCH 06/81] Fix holes in exported instance masks (#3044) * update datumaro dependency * update coco format * update format docs - Update COCO documentation - Add Datumaro format description - Add TF guide on mask exporting - Add keypoint export guide in COCO * Add mask export docs * update changelog * add camvid * add coco * Update changelog --- CHANGELOG.md | 4 +- cvat/apps/dataset_manager/formats/README.md | 138 +++++++++++++----- cvat/apps/dataset_manager/formats/coco.py | 3 +- .../images/exported_cls_masks_example.png | Bin 0 -> 5719 bytes .../images/exported_inst_masks_example.png | Bin 0 -> 5135 bytes .../images/label_color_picker.jpg | Bin 0 -> 52186 bytes .../images/label_panel_anno_window.jpg | Bin 0 -> 10163 bytes .../images/mask_export_example1_cls_mask.png | Bin 0 -> 3035 bytes .../images/mask_export_example1_editor.png | Bin 0 -> 28770 bytes .../images/mask_export_example1_inst_mask.png | Bin 0 -> 3520 bytes cvat/apps/documentation/user_guide.md | 62 ++++++++ cvat/requirements/base.txt | 2 +- 12 files changed, 170 insertions(+), 39 deletions(-) create mode 100644 cvat/apps/documentation/static/documentation/images/exported_cls_masks_example.png create mode 100644 cvat/apps/documentation/static/documentation/images/exported_inst_masks_example.png create mode 100644 cvat/apps/documentation/static/documentation/images/label_color_picker.jpg create mode 100644 cvat/apps/documentation/static/documentation/images/label_panel_anno_window.jpg create mode 100644 cvat/apps/documentation/static/documentation/images/mask_export_example1_cls_mask.png create mode 100644 cvat/apps/documentation/static/documentation/images/mask_export_example1_editor.png create mode 100644 cvat/apps/documentation/static/documentation/images/mask_export_example1_inst_mask.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c5d1d3c..799d9fc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.4.0] - Unreleased ### Added -- +- Documentation on mask annotation () ### Changed - @@ -20,7 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - ### Fixed -- +- Export of instance masks with holes () ### Security - diff --git a/cvat/apps/dataset_manager/formats/README.md b/cvat/apps/dataset_manager/formats/README.md index cee31854..3af8cbfd 100644 --- a/cvat/apps/dataset_manager/formats/README.md +++ b/cvat/apps/dataset_manager/formats/README.md @@ -11,6 +11,7 @@ - [How to add a format](#how-to-add) - [Format descriptions](#formats) - [CVAT](#cvat) + - [Datumaro](#datumaro) - [LabelMe](#labelme) - [MOT](#mot) - [MOTS](#mots) @@ -175,7 +176,7 @@ features, so it can be used to make data backups. - [Format specification](/cvat/apps/documentation/xml_format.md) -#### CVAT for images dumper +#### CVAT for images export Downloaded file: a ZIP file of the following structure: @@ -189,7 +190,7 @@ taskname.zip/ - tracks are split by frames -#### CVAT for videos dumper +#### CVAT for videos export Downloaded file: a ZIP file of the following structure: @@ -207,6 +208,17 @@ taskname.zip/ Uploaded file: an XML file or a ZIP file of the structures above +### Datumaro format + +[Datumaro](https://github.com/openvinotoolkit/datumaro/) is a tool, which can +help with complex dataset and annotation transformations, format conversions, +dataset statistics, merging, custom formats etc. It is used as a provider +of dataset support in CVAT, so basically, everything possible in CVAT +is possible in Datumaro too, but Datumaro can offer dataset operations. + +- supported annotations: any 2D shapes, labels +- supported attributes: any + ### [Pascal VOC](http://host.robots.ox.ac.uk/pascal/VOC/) - [Format specification](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/devkit_doc.pdf) @@ -219,9 +231,10 @@ Uploaded file: an XML file or a ZIP file of the structures above - supported attributes: - - `occluded` + - `occluded` (both UI option and a separate attribute) - `truncated` and `difficult` (should be defined for labels as `checkbox` -es) - action attributes (import only, should be defined as `checkbox` -es) + - arbitrary attributes (in the `attributes` secion of XML files) #### Pascal VOC export @@ -229,7 +242,7 @@ Downloaded file: a zip archive of the following structure: ```bash taskname.zip/ -├── JpegImages/ +├── JPEGImages/ │   ├── .jpg │   ├── .jpg │   └── .jpg @@ -499,17 +512,47 @@ zip images.zip -j -@ < train.txt - [Format specification](http://cocodataset.org/#format-data) -#### COCO dumper description +#### COCO export -Downloaded file: single unpacked `json`. +Downloaded file: a zip archive with following structure: + +```bash +archive.zip/ +├── images/ +│ ├── +│ ├── +│ └── ... +└── annotations/ +    └── instances_default.json +``` - supported annotations: Polygons, Rectangles +- supported attributes: + - `is_crowd` (checkbox or integer with values 0 and 1) - + specifies that the instance (an object group) should have an + RLE-encoded mask in the `segmentation` field. All the grouped shapes + are merged into a single mask, the largest one defines all + the object properties + - `score` (number) - the annotation `score` field + - arbitrary attributes - will be stored in the `attributes` annotation section + + +*Note*: there is also a [support for COCO keypoints over Datumaro](https://github.com/openvinotoolkit/cvat/issues/2910#issuecomment-726077582) -#### COCO loader description +1. Install [Datumaro](https://github.com/openvinotoolkit/datumaro) + `pip install datumaro` +1. Export the task in the `Datumaro` format, unzip +1. Export the Datumaro project in `coco` / `coco_person_keypoints` formats + `datum export -f coco -p path/to/project [-- --save-images]` -Uploaded file: single unpacked `*.json` . +This way, one can export CVAT points as single keypoints or +keypoint lists (without the `visibility` COCO flag). -- supported annotations: Polygons, Rectangles (if `segmentation` field is empty) +#### COCO import + +Uploaded file: a single unpacked `*.json` or a zip archive with the structure above (without images). + +- supported annotations: Polygons, Rectangles (if the `segmentation` field is empty) #### How to create a task from MS COCO dataset @@ -559,25 +602,48 @@ image_feature_description = { } ``` -#### TFRecord dumper description +#### TFRecord export Downloaded file: a zip archive with following structure: ```bash taskname.zip/ -├── task2.tfrecord +├── default.tfrecord └── label_map.pbtxt + +# label_map.pbtxt +item { + id: 1 + name: 'label_0' +} +item { + id: 2 + name: 'label_1' +} +... ``` -- supported annotations: Rectangles +- supported annotations: Rectangles, Polygons (as masks, manually over [Datumaro](https://github.com/openvinotoolkit/datumaro/blob/develop/docs/user_manual.md)) -#### TFRecord loader description +How to export masks: +1. Export annotations in `Datumaro` format +1. Apply `polygons_to_masks` and `boxes_to_masks` transforms + ```bash + datum transform -t polygons_to_masks -p path/to/proj -o ptm + datum transform -t boxes_to_masks -p ptm -o btm + ``` +1. Export in the `TF Detection API` format + ```bash + datum export -f tf_detection_api -p btm [-- --save-images] + ``` + +#### TFRecord import Uploaded file: a zip archive of following structure: ```bash taskname.zip/ -└── task2.tfrecord +└── .tfrecord ``` - supported annotations: Rectangles @@ -706,7 +772,7 @@ python create_pascal_tf_record.py --data_dir --set train --y ### [MOT sequence](https://arxiv.org/pdf/1906.04567.pdf) -#### MOT Dumper +#### MOT export Downloaded file: a zip archive of the following structure: @@ -735,7 +801,7 @@ person - supported annotations: Rectangle shapes and tracks - supported attributes: `visibility` (number), `ignored` (checkbox) -#### MOT Loader +#### MOT import Uploaded file: a zip archive of the structure above or: @@ -749,7 +815,7 @@ taskname.zip/ ### [MOTS PNG](https://www.vision.rwth-aachen.de/page/mots) -#### MOTS PNG Dumper +#### MOTS PNG export Downloaded file: a zip archive of the following structure: @@ -773,7 +839,7 @@ person - supported annotations: Rectangle and Polygon tracks -#### MOTS PNG Loader +#### MOTS PNG import Uploaded file: a zip archive of the structure above @@ -781,7 +847,7 @@ Uploaded file: a zip archive of the structure above ### [LabelMe](http://labelme.csail.mit.edu/Release3.0) -#### LabelMe Dumper +#### LabelMe export Downloaded file: a zip archive of the following structure: @@ -793,7 +859,7 @@ taskname.zip/ - supported annotations: Rectangles, Polygons (with attributes) -#### LabelMe Loader +#### LabelMe import Uploaded file: a zip archive of the following structure: @@ -811,7 +877,7 @@ taskname.zip/ ### [ImageNet](http://www.image-net.org) -#### ImageNet Dumper +#### ImageNet export Downloaded file: a zip archive of the following structure: @@ -835,7 +901,7 @@ taskname.zip/ - supported annotations: Labels -#### ImageNet Loader +#### ImageNet import Uploaded file: a zip archive of the structure above @@ -843,7 +909,7 @@ Uploaded file: a zip archive of the structure above ### [CamVid](http://mi.eng.cam.ac.uk/research/projects/VideoRec/CamVid/) -#### CamVid Dumper +#### CamVid export Downloaded file: a zip archive of the following structure: @@ -873,7 +939,7 @@ has own color which corresponds to a label. - supported annotations: Rectangles, Polygons -#### CamVid Loader +#### CamVid import Uploaded file: a zip archive of the structure above @@ -881,7 +947,7 @@ Uploaded file: a zip archive of the structure above ### [WIDER Face](http://shuoyang1213.me/WIDERFACE/) -#### WIDER Face Dumper +#### WIDER Face export Downloaded file: a zip archive of the following structure: @@ -899,19 +965,21 @@ taskname.zip/ ``` - supported annotations: Rectangles (with attributes), Labels -- supported attributes: `blur`, `expression`, `illumination`, - `occluded` (both the annotation property & an attribute), `pose`, `invalid` +- supported attributes: + - `blur`, `expression`, `illumination`, `pose`, `invalid` + - `occluded` (both the annotation property & an attribute) -#### WIDER Face Loader +#### WIDER Face import Uploaded file: a zip archive of the structure above - supported annotations: Rectangles (with attributes), Labels -- supported attributes: `blur`, `expression`, `illumination`, `occluded`, `pose`, `invalid` +- supported attributes: + - `blur`, `expression`, `illumination`, `occluded`, `pose`, `invalid` ### [VGGFace2](https://github.com/ox-vgg/vgg_face2) -#### VGGFace2 Dumper +#### VGGFace2 export Downloaded file: a zip archive of the following structure: @@ -934,7 +1002,7 @@ label1 - supported annotations: Rectangles, Points (landmarks - groups of 5 points) -#### VGGFace2 Loader +#### VGGFace2 import Uploaded file: a zip archive of the structure above @@ -942,7 +1010,7 @@ Uploaded file: a zip archive of the structure above ### [Market-1501](https://www.aitribune.com/dataset/2018051063) -#### Market-1501 Dumper +#### Market-1501 export Downloaded file: a zip archive of the following structure: @@ -970,7 +1038,7 @@ s1 - sequence - supported annotations: Label `market-1501` with atrributes (`query`, `person_id`, `camera_id`) -#### Market-1501 Loader +#### Market-1501 import Uploaded file: a zip archive of the structure above @@ -978,7 +1046,7 @@ Uploaded file: a zip archive of the structure above ### [ICDAR13/15](https://rrc.cvc.uab.es/?ch=2) -#### ICDAR13/15 Dumper +#### ICDAR13/15 export Downloaded file: a zip archive of the following structure: @@ -1027,7 +1095,7 @@ taskname.zip/ - supported annotations: Rectangles and Polygons with label `icdar` and attributes `index`, `text`, `color`, `center` -#### ICDAR13/15 Loader +#### ICDAR13/15 import Uploaded file: a zip archive of the structure above diff --git a/cvat/apps/dataset_manager/formats/coco.py b/cvat/apps/dataset_manager/formats/coco.py index 3ec3ab18..3e4fb223 100644 --- a/cvat/apps/dataset_manager/formats/coco.py +++ b/cvat/apps/dataset_manager/formats/coco.py @@ -19,7 +19,8 @@ def _export(dst_file, task_data, save_images=False): dataset = Dataset.from_extractors(CvatTaskDataExtractor( task_data, include_images=save_images), env=dm_env) with TemporaryDirectory() as temp_dir: - dataset.export(temp_dir, 'coco_instances', save_images=save_images) + dataset.export(temp_dir, 'coco_instances', save_images=save_images, + merge_images=True) make_zip_archive(temp_dir, dst_file) diff --git a/cvat/apps/documentation/static/documentation/images/exported_cls_masks_example.png b/cvat/apps/documentation/static/documentation/images/exported_cls_masks_example.png new file mode 100644 index 0000000000000000000000000000000000000000..e0dfa58a630a3c6dffe6cf025e046302f885003f GIT binary patch literal 5719 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 literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/static/documentation/images/exported_inst_masks_example.png b/cvat/apps/documentation/static/documentation/images/exported_inst_masks_example.png new file mode 100644 index 0000000000000000000000000000000000000000..d0362c805aad62b99cc2f62bc7725a13ab45f742 GIT binary patch literal 5135 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 mX)ck^co7G0C0) literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/static/documentation/images/label_color_picker.jpg b/cvat/apps/documentation/static/documentation/images/label_color_picker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd0314768c5f00d2e3aeb833832e3a8878673c06 GIT binary patch literal 52186 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�CLEYp3ZYnJSMILy|I&T(=}L;w{g%f` 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 HeEh!vJ<(?n literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/static/documentation/images/mask_export_example1_editor.png b/cvat/apps/documentation/static/documentation/images/mask_export_example1_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..a53e4ca18d530b48fca1410190b643c8de02b5c3 GIT binary patch literal 28770 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 bJo;B92BW_IF%VJS{R4J&qB_<&1pW3u?Y0ea literal 0 HcmV?d00001 diff --git a/cvat/apps/documentation/user_guide.md b/cvat/apps/documentation/user_guide.md index 2bd85467..bc21e2e5 100644 --- a/cvat/apps/documentation/user_guide.md +++ b/cvat/apps/documentation/user_guide.md @@ -29,6 +29,7 @@ - [OpenCV Tools](#opencv-tools) - [Annotation with rectangle by 4 points](#annotation-with-rectangle-by-4-points) - [Annotation with polygons](#annotation-with-polygons) + - [Creating masks](#creating-masks) - [Annotation with polylines](#annotation-with-polylines) - [Annotation with points](#annotation-with-points) - [Points in shape mode](#points-in-shape-mode) @@ -1282,6 +1283,67 @@ To edit a polygon you have to click on it while holding `Shift`, it will open th ![](static/documentation/images/gif007_mapillary_vistas.gif) +### Cutting holes in polygons + +Currently, CVAT does not support cutting transparent holes in polygons. However, +it is poissble to generate holes in exported instance and class masks. +To do this, one needs to define a background class in the task and draw holes +with it as additional shapes above the shapes needed to have holes: + +The editor window: + ![The editor](static/documentation/images/mask_export_example1_editor.png) + +Remember to use z-axis ordering for shapes by \[\-\] and \[\+\, \=\] keys. + +Exported masks: + ![A class mask](static/documentation/images/mask_export_example1_cls_mask.png) ![An instance mask](static/documentation/images/mask_export_example1_inst_mask.png) + +Notice that it is currently impossible to have a single instance number for +internal shapes (they will be merged into the largest one and then covered by +"holes"). + +### Creating masks + +There are several formats in CVAT that can be used to export masks: +- `Segmentation Mask` (PASCAL VOC masks) +- `CamVid` +- `MOTS` +- `ICDAR` +- `COCO` (RLE-encoded instance masks, [guide](https://github.com/openvinotoolkit/cvat/blob/develop/cvat/apps/dataset_manager/formats/README.md#coco)) +- `TFRecord` ([over Datumaro](https://github.com/openvinotoolkit/datumaro/blob/develop/docs/user_manual.md), [guide](https://github.com/openvinotoolkit/cvat/blob/develop/cvat/apps/dataset_manager/formats/README.md#tfrecord)): +- `Datumaro` + +An example of exported masks (in the `Segmentation Mask` format): + + ![A class mask](static/documentation/images/exported_cls_masks_example.png) ![An instance mask](static/documentation/images/exported_inst_masks_example.png) + +Important notices: +- Both boxes and polygons are converted into masks +- Grouped objects are considered as a single instance and exported as a single + mask (label and attributes are taken from the largest object in the group) + +#### Class colors + +All the labels have associated colors, which are used in the generated masks. +These colors can be changed in the task label properties: + + ![](static/documentation/images/label_color_picker.jpg) + +Label colors are also displayed in the annotation window on the right panel, +where you can show or hide specific labels +(only the presented labels are displayed): + + ![](static/documentation/images/label_panel_anno_window.jpg) + +A background class can be: +- A default class, which is implicitly-added, of black color (RGB 0, 0, 0) +- `background` class with any color (has a priority, name is case-insensitive) +- Any class of black color (RGB 0, 0, 0) + +To change backgound color in generated masks (default is black), +change `background` class color to the desired one. + + ## Annotation with polylines It is used for road markup annotation etc. diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 2d5c8a1f..a6501a4e 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -50,4 +50,4 @@ open3d==0.11.2 # --no-binary=pycocotools: workaround for binary incompatibility on numpy 1.20 # of pycocotools and tensorflow 2.4.1 # when pycocotools is installed by wheel in python 3.8+ -datumaro==0.1.7 --no-binary=datumaro --no-binary=pycocotools +datumaro==0.1.8 --no-binary=datumaro --no-binary=pycocotools From cc6fb68be06bc2f76594b72ccc38d09fc40fe41b Mon Sep 17 00:00:00 2001 From: OlgaP Date: Fri, 2 Apr 2021 11:32:28 +0200 Subject: [PATCH 07/81] Update installation.md (#3057) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated the table of contents in installation.md to include the new section “Deploy CVAT on the Scaleway public cloud” --- cvat/apps/documentation/installation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cvat/apps/documentation/installation.md b/cvat/apps/documentation/installation.md index 4523a9b8..5927bf5a 100644 --- a/cvat/apps/documentation/installation.md +++ b/cvat/apps/documentation/installation.md @@ -10,6 +10,7 @@ - [Advanced settings](#advanced-settings) - [Share path](#share-path) - [Email verification](#email-verification) + - [Deploy CVAT on the Scaleway public cloud](#deploy-cvat-on-the-scaleway-public-cloud) - [Deploy secure CVAT instance with HTTPS](#deploy-secure-cvat-instance-with-https) - [Prerequisites](#prerequisites) - [Roadmap](#roadmap) From df175a856179f1c31ac2b15c80d98986a3d35acf Mon Sep 17 00:00:00 2001 From: Dmitry Kruchinin <33020454+dvkruchinin@users.noreply.github.com> Date: Fri, 2 Apr 2021 16:09:00 +0300 Subject: [PATCH 08/81] Cypress test. Filters, sorting jobs. Tooltip search task filter. (#3053) * Add scc classes * Rework cypress command * Update test to check task search tooltip * Cypress test. Job filter, sorting feature. * Fix eslint * Update cypress/code-coverage version * Replace comments * small fix * Restart CI * Applying comments * Fix typo --- cvat-ui/src/components/task-page/job-list.tsx | 2 + .../case_35_search_task_feature.js | 21 +- .../case_69_filters_sorting_jobs.js | 178 ++++++ .../support/commands_review_pipeline.js | 22 +- tests/package-lock.json | 547 ++++++++++-------- tests/package.json | 2 +- 6 files changed, 507 insertions(+), 265 deletions(-) create mode 100644 tests/cypress/integration/actions_tasks_objects/registration_involved/case_69_filters_sorting_jobs.js diff --git a/cvat-ui/src/components/task-page/job-list.tsx b/cvat-ui/src/components/task-page/job-list.tsx index 55cde2d1..8a7cb460 100644 --- a/cvat-ui/src/components/task-page/job-list.tsx +++ b/cvat-ui/src/components/task-page/job-list.tsx @@ -217,6 +217,7 @@ function JobListComponent(props: Props & RouteComponentProps): JSX.Element { title: 'Assignee', dataIndex: 'assignee', key: 'assignee', + className: 'cvat-job-item-assignee', render: (jobInstance: any): JSX.Element => ( ( { cy.contains('.cvat-item-task-name', taskName).should(result); } + before(() => { + cy.openTask(taskName); + cy.assignTaskToUser(Cypress.env('user')); // Assign a task to an ures to check filter + cy.goToTaskList(); + }); + + after(() => { + cy.goToTaskList(); + cy.openTask(taskName); + cy.assignTaskToUser(''); + }); + describe(`Testing case "${caseId}"`, () => { - it('Type to task search some field and check result.', () => { + it('Tooltip task filter contain all the possible options.', () => { + cy.get('.cvat-task-page-search-task').trigger('mouseover'); + cy.get('.cvat-tasks-search-tooltip').should('be.visible'); + }); + + it('Type to task search some filter and check result.', () => { searchTask(`${taskName.substring(0, 3)}`, 'exist'); searchTask('121212', 'not.exist'); searchTask(`owner: ${Cypress.env('user')}`, 'exist'); - searchTask('mode: annotation', 'exist'); + searchTask(`mode: annotation AND assignee: ${Cypress.env('user')}`, 'exist'); searchTask('status: annotation', 'exist'); searchTask(`mode: interpolation AND owner: ${Cypress.env('user')}`, 'not.exist'); }); diff --git a/tests/cypress/integration/actions_tasks_objects/registration_involved/case_69_filters_sorting_jobs.js b/tests/cypress/integration/actions_tasks_objects/registration_involved/case_69_filters_sorting_jobs.js new file mode 100644 index 00000000..bec7088a --- /dev/null +++ b/tests/cypress/integration/actions_tasks_objects/registration_involved/case_69_filters_sorting_jobs.js @@ -0,0 +1,178 @@ +// Copyright (C) 2021 Intel Corporation +// +// SPDX-License-Identifier: MIT + +/// + +context('Filters, sorting jobs.', () => { + const caseId = '69'; + const labelName = `Case ${caseId}`; + const taskName = `New annotation task for ${labelName}`; + const attrName = `Attr for ${labelName}`; + const textDefaultValue = 'Some default value for type Text'; + const imagesCount = 15; + const imageFileName = `image_${labelName.replace(' ', '_').toLowerCase()}`; + const width = 800; + const height = 800; + const posX = 10; + const posY = 10; + const color = 'gray'; + const archiveName = `${imageFileName}.zip`; + const archivePath = `cypress/fixtures/${archiveName}`; + const imagesFolder = `cypress/fixtures/${imageFileName}`; + const directoryToArchive = imagesFolder; + const advancedConfigurationParams = { + multiJobs: true, + segmentSize: 5, + }; + + const secondUserName = 'Case69'; + const secondUser = { + firstName: `Firtstname`, + lastName: `Lastname`, + emailAddr: `${secondUserName.toLowerCase()}@local.local`, + password: 'Pass!UserCase69', + }; + + function checkJobsTableRowCount(expectedCount) { + if (expectedCount !== 0) { + cy.get('.cvat-task-jobs-table-row').then(($jobsTableRows) => { + expect($jobsTableRows.length).to.be.equal(expectedCount); + }); + } else { + cy.get('.cvat-task-jobs-table-row').should('not.exist'); + } + } + + function checkContentsRow(index, status, assignee, reviewer) { + cy.get('.cvat-task-jobs-table-row').then(($jobsTableRows) => { + cy.get($jobsTableRows[index]).within(() => { + cy.get('.cvat-job-item-status').invoke('text').should('equal', status); + [ + ['.cvat-job-assignee-selector', assignee], + ['.cvat-job-reviewer-selector', reviewer], + ].forEach(([el, val]) => { + cy.get(el).find('[type="search"]').invoke('val').should('equal', val); + }); + }); + }); + } + + function testSetJobFilter({ column, menuItem, reset }) { + cy.get(column).find('[role="button"]').click().wait(300); // Waiting for dropdown menu transition + cy.get('.ant-dropdown') + .not('.ant-dropdown-hidden') + .within(() => { + if (!reset) { + cy.contains('[role="menuitem"]', menuItem) + .find('[type="checkbox"]') + .should('not.be.checked') + .check() + .should('be.checked'); + cy.contains('[type="button"]', 'OK').click(); + } else { + cy.contains('[type="button"]', 'Reset').click(); + } + }); + } + + before(() => { + // Preparing a jobs + cy.visit('auth/register'); + cy.userRegistration( + secondUser.firstName, + secondUser.lastName, + secondUserName, + secondUser.emailAddr, + secondUser.password, + ); + cy.logout(secondUserName); + cy.imageGenerator(imagesFolder, imageFileName, width, height, color, posX, posY, labelName, imagesCount); + cy.createZipArchive(directoryToArchive, archivePath); + cy.login(); + cy.createAnnotationTask( + taskName, + labelName, + attrName, + textDefaultValue, + archiveName, + false, + advancedConfigurationParams, + ); + cy.openTask(taskName); + cy.assignJobToUser(0, secondUserName); + cy.assignJobToUser(1, secondUserName); + cy.reviewJobToUser(1, Cypress.env('user')); + + // The first job is transferred to the validation status + cy.openJob(); + cy.interactMenu('Request a review'); + cy.get('.cvat-request-review-dialog') + .should('exist') + .within(() => { + cy.get('.cvat-user-search-field') + .find('[type="search"]') + .type(`${Cypress.env('user')}{Enter}`); + cy.contains('[type="button"]', 'Submit').click(); + }); + + // The first job is transferred to the complete status + cy.openJob(1); + cy.interactMenu('Finish the job'); + cy.contains('[type="button"]', 'Continue').click(); + }); + + after(() => { + cy.logout(); + cy.deletingRegisteredUsers([secondUserName]); + cy.login(); + cy.deleteTask(taskName); + }); + + describe(`Testing "${labelName}".`, () => { + it('Filtering jobs by status.', () => { + testSetJobFilter({ column: '.cvat-job-item-status', menuItem: 'annotation' }); + checkJobsTableRowCount(1); + checkContentsRow(0, 'annotation', '', ''); + }); + + it('Filtering jobs by status and by assignee.', () => { + testSetJobFilter({ column: '.cvat-job-item-assignee', menuItem: secondUserName }); + checkJobsTableRowCount(0); + testSetJobFilter({ column: '.cvat-job-item-assignee', reset: true }); + checkJobsTableRowCount(1); + }); + + it('Filtering jobs by status. Annotation and validation', () => { + testSetJobFilter({ column: '.cvat-job-item-status', menuItem: 'validation' }); + checkJobsTableRowCount(2); + checkContentsRow(0, 'validation', secondUserName, Cypress.env('user')); + checkContentsRow(1, 'annotation', '', ''); + }); + + it('Filtering jobs by status. Annotation, validation, completed', () => { + testSetJobFilter({ column: '.cvat-job-item-status', menuItem: 'completed' }); + checkJobsTableRowCount(3); + checkContentsRow(0, 'validation', secondUserName, Cypress.env('user')); + checkContentsRow(1, 'completed', secondUserName, Cypress.env('user')); + checkContentsRow(2, 'annotation', '', ''); + testSetJobFilter({ column: '.cvat-job-item-status', reset: true }); // Reset filter by status + }); + + it('Filtering jobs by reviewer and sort by ascending status.', () => { + testSetJobFilter({ column: '.cvat-job-item-reviewer', menuItem: Cypress.env('user') }); + checkContentsRow(0, 'validation', secondUserName, Cypress.env('user')); + checkContentsRow(1, 'completed', secondUserName, Cypress.env('user')); + cy.contains('.cvat-job-item-status', 'Status').click(); + checkContentsRow(0, 'completed', secondUserName, Cypress.env('user')); + checkContentsRow(1, 'validation', secondUserName, Cypress.env('user')); + }); + + it('Filtering jobs by reviewer and sort by ascending status, assignee.', () => { + cy.contains('.cvat-job-item-status', 'Status').click(); + cy.contains('.cvat-job-item-assignee', 'Assignee').click(); + checkContentsRow(0, 'validation', secondUserName, Cypress.env('user')); + checkContentsRow(1, 'completed', secondUserName, Cypress.env('user')); + }); + }); +}); diff --git a/tests/cypress/support/commands_review_pipeline.js b/tests/cypress/support/commands_review_pipeline.js index 0698980c..8b1ccbef 100644 --- a/tests/cypress/support/commands_review_pipeline.js +++ b/tests/cypress/support/commands_review_pipeline.js @@ -6,12 +6,10 @@ Cypress.Commands.add('assignTaskToUser', (user) => { cy.get('.cvat-task-details-user-block').within(() => { - cy.get('.cvat-user-search-field').click(); + user !== '' + ? cy.get('.cvat-user-search-field').find('[type="search"]').type(`${user}{Enter}`) + : cy.get('.cvat-user-search-field').find('[type="search"]').clear().type('{Enter}'); }); - cy.get('.ant-select-dropdown') - .not('.ant-select-dropdown-hidden') - .contains(new RegExp(`^${user}$`, 'g')) - .click(); }); Cypress.Commands.add('assignJobToUser', (jobID, user) => { @@ -28,6 +26,18 @@ Cypress.Commands.add('assignJobToUser', (jobID, user) => { .click(); }); +Cypress.Commands.add('reviewJobToUser', (jobID, user) => { + cy.getJobNum(jobID).then(($job) => { + cy.get('.cvat-task-jobs-table') + .contains('a', `Job #${$job}`) + .parents('.cvat-task-jobs-table-row') + .find('.cvat-job-reviewer-selector') + .find('[type="search"]') + .clear() + .type(`${user}{Enter}`); + }); +}); + Cypress.Commands.add('checkJobStatus', (jobID, status, assignee, reviewer) => { cy.getJobNum(jobID).then(($job) => { cy.get('.cvat-task-jobs-table') @@ -75,7 +85,7 @@ Cypress.Commands.add('collectIssueRegionId', () => { cy.document().then((doc) => { const issueRegionList = Array.from(doc.querySelectorAll('.cvat_canvas_issue_region')); for (let i = 0; i < issueRegionList.length; i++) { - issueRegionIdList.push(Number(issueRegionList[i].id.match(/\-?\d+$/))); + issueRegionIdList.push(Number(issueRegionList[i].id.match(/-?\d+$/))); } return issueRegionIdList; }); diff --git a/tests/package-lock.json b/tests/package-lock.json index d3e5c8f3..d822611d 100644 --- a/tests/package-lock.json +++ b/tests/package-lock.json @@ -11,6 +11,12 @@ "@babel/highlight": "^7.12.13" } }, + "@babel/compat-data": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", + "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", + "dev": true + }, "@babel/core": { "version": "7.4.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", @@ -34,12 +40,12 @@ } }, "@babel/generator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.13.tgz", - "integrity": "sha512-9qQ8Fgo8HaSvHEt6A5+BATP7XktD/AdAnObUeTRz5/e2y3kbrxZgz32qUJJsdmwUvBJzF4AeV21nGTNwv05Mpw==", + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "dev": true, "requires": { - "@babel/types": "^7.12.13", + "@babel/types": "^7.13.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -63,23 +69,43 @@ "@babel/types": "^7.12.13" } }, + "@babel/helper-compilation-targets": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "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 + } + } + }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.13.tgz", - "integrity": "sha512-Vs/e9wv7rakKYeywsmEBSRC9KtmE7Px+YBlESekLeJOF0zbGUicGfXSNi3o+tfXSNS48U/7K9mIOOCR79Cl3+Q==", + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", "dev": true, "requires": { "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", "@babel/helper-split-export-declaration": "^7.12.13" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.13.tgz", - "integrity": "sha512-XC+kiA0J3at6E85dL5UnCYfVOcIZ834QcAY0TIpgUVnz0zDzg+0TtvZTnJ4g9L1dPRGe30Qi03XCIS4tYCLtqw==", + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", @@ -87,12 +113,12 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz", - "integrity": "sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.13.0" } }, "@babel/helper-function-name": { @@ -116,47 +142,47 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz", - "integrity": "sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", - "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.13.12" } }, "@babel/helper-module-imports": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", - "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.13.12" } }, "@babel/helper-module-transforms": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", - "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13", - "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", "@babel/helper-split-export-declaration": "^7.12.13", "@babel/helper-validator-identifier": "^7.12.11", "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13", - "lodash": "^4.17.19" + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" } }, "@babel/helper-optimise-call-expression": { @@ -169,41 +195,41 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz", - "integrity": "sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helper-replace-supers": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", - "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.12", "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" } }, "@babel/helper-simple-access": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", - "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.13.12" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -230,33 +256,39 @@ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, "@babel/helper-wrap-function": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz", - "integrity": "sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", "dev": true, "requires": { "@babel/helper-function-name": "^7.12.13", "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helpers": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", - "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", "dev": true, "requires": { "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -265,20 +297,20 @@ } }, "@babel/parser": { - "version": "7.12.14", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.14.tgz", - "integrity": "sha512-xcfxDq3OrBnDsA/Z8eK5/2iPcLD8qbOaSSfOw4RA6jp4i7e6dEQ7+wTwxItEwzcXPQcsry5nZk96gmVPKletjQ==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz", - "integrity": "sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", + "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-remap-async-to-generator": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { @@ -292,13 +324,13 @@ } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz", - "integrity": "sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-object-rest-spread": { @@ -312,13 +344,13 @@ } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz", - "integrity": "sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-unicode-property-regex": { @@ -377,23 +409,23 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz", - "integrity": "sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz", - "integrity": "sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-remap-async-to-generator": "^7.12.13" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" } }, "@babel/plugin-transform-block-scoped-functions": { @@ -415,36 +447,36 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz", - "integrity": "sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", "@babel/helper-function-name": "^7.12.13", "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz", - "integrity": "sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz", - "integrity": "sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-dotall-regex": { @@ -477,12 +509,12 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz", - "integrity": "sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-function-name": { @@ -514,49 +546,49 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz", - "integrity": "sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz", - "integrity": "sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-simple-access": "^7.12.13", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz", - "integrity": "sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.12.13", - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz", - "integrity": "sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { @@ -588,12 +620,12 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz", - "integrity": "sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-property-literals": { @@ -615,16 +647,16 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.13.tgz", - "integrity": "sha512-hhXZMYR8t9RvduN2uW4sjl6MRtUhzNE726JvoJhpjhxKgRUVkZqTsA0xc49ALZxQM7H26pZ/lLvB2Yrea9dllA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", + "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/types": "^7.13.12" } }, "@babel/plugin-transform-react-jsx-self": { @@ -685,12 +717,12 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz", - "integrity": "sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, @@ -704,12 +736,12 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz", - "integrity": "sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-typeof-symbol": { @@ -788,14 +820,16 @@ }, "dependencies": { "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz", - "integrity": "sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.13" + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" } } } @@ -833,26 +867,25 @@ } }, "@babel/traverse": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", - "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", + "@babel/generator": "^7.13.9", "@babel/helper-function-name": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -913,15 +946,16 @@ } }, "@cypress/code-coverage": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.9.2.tgz", - "integrity": "sha512-YnzkRBxdsY/Ek/68nr+MowqW59UJsd28j10mFOerW/wrSkuxGrWvOldMs8Y4tU70L4fgd4wDPqGGMer3+UzbwA==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.9.4.tgz", + "integrity": "sha512-mFUl1MmfqeQe08eONKnAv9uWXRVW2RprqaYf3lJkI5tEhEAP+I9zB+cmjQWKe15vfmadKxqaLStVNYLM0rpYGA==", "dev": true, "requires": { "@cypress/browserify-preprocessor": "3.0.1", + "dayjs": "1.10.4", "debug": "4.3.1", "execa": "4.1.0", - "globby": "11.0.2", + "globby": "11.0.3", "istanbul-lib-coverage": "3.0.0", "js-yaml": "3.14.1", "nyc": "15.1.0" @@ -1044,9 +1078,9 @@ } }, "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jimp/bmp": { @@ -1664,9 +1698,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -1893,9 +1927,9 @@ "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" }, "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "brace-expansion": { @@ -2235,9 +2269,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001183", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001183.tgz", - "integrity": "sha512-7JkwTEE1hlRKETbCFd8HDZeLiQIUcl8rC6JgNjvHCNaxOeNmQ9V4LvQXRUsKIV2CC73qKxljwVhToaA3kLRqTw==", + "version": "1.0.30001205", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001205.tgz", + "integrity": "sha512-TL1GrS5V6LElbitPazidkBMD9sa448bQDDLrumDqaggmKFcuU2JW1wTOHJPukAcOMtEmLcmDJEzfRrf+GjM0Og==", "dev": true }, "caseless": { @@ -2454,9 +2488,9 @@ "dev": true }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, "colors": { @@ -2592,12 +2626,12 @@ "dev": true }, "core-js-compat": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", - "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.0.tgz", + "integrity": "sha512-9yVewub2MXNYyGvuLnMHcN1k9RkvB7/ofktpeKTIaASyB88YYqGzUnu0ywMMhJrDHOMiTjSHWGzR+i7Wb9Z1kQ==", "dev": true, "requires": { - "browserslist": "^4.16.1", + "browserslist": "^4.16.3", "semver": "7.0.0" }, "dependencies": { @@ -2643,9 +2677,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -3031,9 +3065,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -3095,9 +3129,9 @@ } }, "electron-to-chromium": { - "version": "1.3.653", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.653.tgz", - "integrity": "sha512-LehOhcl74u9fkV9Un6WahJ+Xh+0FZLCCDnKYis1Olx1DX2ugRww5PJicE65OG8yznMj8EOQZRcz6FSV1xKxqsA==", + "version": "1.3.704", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.704.tgz", + "integrity": "sha512-6cz0jvawlUe4h5AbfQWxPzb+8LzVyswGAWiGc32EJEmfj39HTQyNPkLXirc7+L4x5I6RgRkzua8Ryu5QZqc8cA==", "dev": true }, "elegant-spinner": { @@ -3122,9 +3156,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -3447,9 +3481,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -3495,9 +3529,9 @@ "dev": true }, "fastq": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", - "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -3801,9 +3835,9 @@ "dev": true }, "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -3868,9 +3902,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "has-value": { @@ -4327,34 +4361,26 @@ }, "dependencies": { "@babel/core": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.13.tgz", - "integrity": "sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.14.tgz", + "integrity": "sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helpers": "^7.12.13", - "@babel/parser": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-module-transforms": "^7.13.14", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.13", "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, "semver": { @@ -5102,9 +5128,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -5294,9 +5320,9 @@ } }, "node-releases": { - "version": "1.1.70", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", - "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", "dev": true }, "normalize-path": { @@ -5752,9 +5778,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -5793,6 +5819,12 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "ramda": { "version": "0.26.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", @@ -5950,9 +5982,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", - "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -6015,12 +6047,12 @@ "dev": true }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { - "is-core-module": "^2.1.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -6086,10 +6118,13 @@ } }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "rxjs": { "version": "6.6.3", diff --git a/tests/package.json b/tests/package.json index 7f53c583..ce60f762 100644 --- a/tests/package.json +++ b/tests/package.json @@ -4,7 +4,7 @@ "cypress:run:firefox": "cypress run --env coverage=false --headless --browser firefox --config-file cypress_cron_type.json" }, "devDependencies": { - "@cypress/code-coverage": "^3.8.1", + "@cypress/code-coverage": "^3.9.4", "cypress": "^6.4.0", "cypress-file-upload": "^5.0.2", "cypress-localstorage-commands": "^1.3.1", From 6f2fe4657a36efb7235820bd0631f712db85ad05 Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Mon, 5 Apr 2021 10:03:50 +0300 Subject: [PATCH 09/81] fix: cvat/requirements/base.txt to reduce vulnerabilities (#3063) The following vulnerabilities are fixed by pinning transitive dependencies: - https://snyk.io/vuln/SNYK-PYTHON-PILLOW-1090584 - https://snyk.io/vuln/SNYK-PYTHON-PILLOW-1090586 - https://snyk.io/vuln/SNYK-PYTHON-PILLOW-1090587 - https://snyk.io/vuln/SNYK-PYTHON-PILLOW-1090588 --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index a6501a4e..3d1668bc 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -6,7 +6,7 @@ django-cacheops==5.0.1 django-compressor==2.4 django-rq==2.3.2 EasyProcess==0.3 -Pillow==8.1.2 +Pillow==8.2.0 numpy==1.19.5 python-ldap==3.3.1 pytz==2020.1 From 6ecf648dec6f5c97bd0b3146034018a10a8d3d3c Mon Sep 17 00:00:00 2001 From: Dmitry Kruchinin <33020454+dvkruchinin@users.noreply.github.com> Date: Mon, 5 Apr 2021 14:08:34 +0300 Subject: [PATCH 10/81] Cypress test. Shortcuts window. (#3065) * Add css classes. * Cypress test. Shortcuts window. * Fix naming of var --- .../shortcuts-dialog/shortcuts-dialog.tsx | 7 +-- .../case_71_shortcuts_window.js | 46 +++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 tests/cypress/integration/actions_tasks_objects/case_71_shortcuts_window.js diff --git a/cvat-ui/src/components/shortcuts-dialog/shortcuts-dialog.tsx b/cvat-ui/src/components/shortcuts-dialog/shortcuts-dialog.tsx index 9bf13e16..9030009b 100644 --- a/cvat-ui/src/components/shortcuts-dialog/shortcuts-dialog.tsx +++ b/cvat-ui/src/components/shortcuts-dialog/shortcuts-dialog.tsx @@ -2,12 +2,12 @@ // // SPDX-License-Identifier: MIT -import { shortcutsActions } from 'actions/shortcuts-actions'; import Modal from 'antd/lib/modal'; import Table from 'antd/lib/table'; import React from 'react'; -import { getApplicationKeyMap } from 'utils/mousetrap-react'; import { connect } from 'react-redux'; +import { getApplicationKeyMap } from 'utils/mousetrap-react'; +import { shortcutsActions } from 'actions/shortcuts-actions'; import { CombinedState } from 'reducers/interfaces'; interface StateToProps { @@ -93,8 +93,9 @@ function ShorcutsDialog(props: StateToProps & DispatchToProps): JSX.Element | nu onOk={switchShortcutsDialog} cancelButtonProps={{ style: { display: 'none' } }} zIndex={1001} /* default antd is 1000 */ + className='cvat-shortcuts-modal-window' > - +
); } diff --git a/tests/cypress/integration/actions_tasks_objects/case_71_shortcuts_window.js b/tests/cypress/integration/actions_tasks_objects/case_71_shortcuts_window.js new file mode 100644 index 00000000..b96c6332 --- /dev/null +++ b/tests/cypress/integration/actions_tasks_objects/case_71_shortcuts_window.js @@ -0,0 +1,46 @@ +// Copyright (C) 2021 Intel Corporation +// +// SPDX-License-Identifier: MIT + +/// + +import { taskName } from '../../support/const'; + +context('Shortcuts window.', () => { + const caseId = '71'; + const keyCodeF1 = 112; + let shortcutsTableTrCount = 0; + + before(() => { + cy.openTask(taskName); + }); + + describe(`Testing case "${caseId}"`, () => { + it('Press "F1" from a task. Shortcuts window be visible. Closing the modal window by button "OK".', () => { + cy.get('body').trigger('keydown', { keyCode: keyCodeF1 }); + cy.get('.cvat-shortcuts-modal-window').should('exist').and('be.visible').within(() => { + cy.get('.cvat-shortcuts-modal-window-table').within(() => { + cy.get('tr').should('exist').then(($shortcutsTableTrCount) => { + shortcutsTableTrCount = $shortcutsTableTrCount.length; + }); + }); + cy.contains('button', 'OK').click(); + }); + cy.get('.cvat-shortcuts-modal-window').should('not.be.visible'); + }); + + it('Open a job. Press "F1". Shortcuts window be visible. Closing the modal window by F1.', () => { + cy.openJob(); + cy.get('body').trigger('keydown', { keyCode: keyCodeF1 }); + cy.get('.cvat-shortcuts-modal-window').should('exist').and('be.visible').within(() => { + cy.get('.cvat-shortcuts-modal-window-table').within(() => { + cy.get('tr').should('exist').then(($shortcutsTableTrCount) => { + expect($shortcutsTableTrCount.length).to.be.gt(shortcutsTableTrCount); + }); + }); + }); + cy.get('body').trigger('keydown', { keyCode: keyCodeF1 }); + cy.get('.cvat-shortcuts-modal-window').should('not.be.visible'); + }); + }); +}); From 8e1fe94602e1164333cee8ec8e9bbe3a9aa5760f Mon Sep 17 00:00:00 2001 From: Dmitry Kruchinin <33020454+dvkruchinin@users.noreply.github.com> Date: Mon, 5 Apr 2021 14:10:57 +0300 Subject: [PATCH 11/81] Update Cypress test "Button "Continue" in label editor". (#3064) Update cypress command. --- .../case_33_button_continue_label_editor.js | 11 ++++++++++- tests/cypress/support/commands.js | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/cypress/integration/actions_tasks_objects/case_33_button_continue_label_editor.js b/tests/cypress/integration/actions_tasks_objects/case_33_button_continue_label_editor.js index 4c38376e..6b34f1ce 100644 --- a/tests/cypress/integration/actions_tasks_objects/case_33_button_continue_label_editor.js +++ b/tests/cypress/integration/actions_tasks_objects/case_33_button_continue_label_editor.js @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -30,5 +30,14 @@ context('Button "Continue" in label editor.', () => { expect(labelNames).to.include(additionalLabels[2]); }); }); + + it('Try add label with empty name. Alert should be visible.', () => { + cy.get('.cvat-constructor-viewer-new-item').click(); + cy.get('.cvat-label-constructor-creator').within(() => { + cy.contains('button', 'Continue').click(); + cy.contains('[role="alert"]', 'Please specify a name').should('be.visible'); + cy.contains('button', 'Cancel').click(); + }); + }); }); }); diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index 052ba548..c5630e01 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -541,7 +541,7 @@ Cypress.Commands.add('addNewLabel', (newLabelName, additionalAttrs, labelColor) Cypress.Commands.add('addNewLabelViaContinueButton', (additionalLabels) => { cy.collectLabelsName().then((labelsNames) => { if (additionalLabels.some((el) => labelsNames.indexOf(el) === -1)) { - cy.contains('button', 'Add label').click(); + cy.get('.cvat-constructor-viewer-new-item').click(); for (let j = 0; j < additionalLabels.length; j++) { cy.get('[placeholder="Label name"]').type(additionalLabels[j]); if (j !== additionalLabels.length - 1) { From 865274e8ccd589fb1a27c93985b9d4af8babc394 Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Mon, 5 Apr 2021 21:48:27 +0300 Subject: [PATCH 12/81] Added badges for dockerhub. (#3067) --- README.md | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e79deaf7..d3e2970b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # Computer Vision Annotation Tool (CVAT) -[![CI](https://github.com/openvinotoolkit/cvat/workflows/CI/badge.svg?branch=develop)](https://github.com/openvinotoolkit/cvat/actions) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/b9899c72f2764df0b5d26390cb872e21)](https://app.codacy.com/gh/openvinotoolkit/cvat?utm_source=github.com&utm_medium=referral&utm_content=openvinotoolkit/cvat&utm_campaign=Badge_Grade_Dashboard) -[![Gitter chat](https://badges.gitter.im/opencv-cvat/gitter.png)](https://gitter.im/opencv-cvat) -[![Coverage Status](https://coveralls.io/repos/github/openvinotoolkit/cvat/badge.svg?branch=develop)](https://coveralls.io/github/openvinotoolkit/cvat?branch=develop) -[![DOI](https://zenodo.org/badge/139156354.svg)](https://zenodo.org/badge/latestdoi/139156354) +[![CI][ci-img]][ci-url] +[![Gitter chat][gitter-img]][gitter-url] +[![Coverage Status][coverage-img]][coverage-url] +[![server pulls][docker-server-pulls-img]][docker-server-image-url] +[![ui pulls][docker-ui-pulls-img]][docker-ui-image-url] +[![DOI][doi-img]][doi-url] CVAT is free, online, interactive video and image annotation tool for computer vision. It is being used by our team to @@ -57,7 +58,7 @@ For more information about supported formats look at the | Segmentation masks from [PASCAL VOC](http://host.robots.ox.ac.uk/pascal/VOC/) | X | X | | [YOLO](https://pjreddie.com/darknet/yolo/) | X | X | | [MS COCO Object Detection](http://cocodataset.org/#format-data) | X | X | -| [TFrecord](https://www.tensorflow.org/tutorials/load_data/tf_records) | X | X | +| [TFrecord](https://www.tensorflow.org/tutorials/load_data/tfrecord) | X | X | | [MOT](https://motchallenge.net/) | X | X | | [LabelMe 3.0](http://labelme.csail.mit.edu/Release3.0) | X | X | | [ImageNet](http://www.image-net.org) | X | X | @@ -162,3 +163,19 @@ Other ways to ask questions and get our support: - [Onepanel](https://github.com/onepanelio/core) - Onepanel is an open source vision AI platform that fully integrates CVAT with scalable data processing and parallelized training pipelines. + + + + +[docker-server-pulls-img]: https://img.shields.io/docker/pulls/openvino/cvat_server.svg?style=flat-square&label=server%20pulls +[docker-server-image-url]: https://hub.docker.com/r/openvino/cvat_server +[docker-ui-pulls-img]: https://img.shields.io/docker/pulls/openvino/cvat_ui.svg?style=flat-square&label=UI%20pulls +[docker-ui-image-url]: https://hub.docker.com/r/openvino/cvat_ui +[ci-img]: https://github.com/openvinotoolkit/cvat/workflows/CI/badge.svg?branch=develop +[ci-url]: https://github.com/openvinotoolkit/cvat/actions +[gitter-img]: https://badges.gitter.im/opencv-cvat/gitter.png +[gitter-url]: https://gitter.im/opencv-cvat +[coverage-img]: https://coveralls.io/repos/github/openvinotoolkit/cvat/badge.svg?branch=develop +[coverage-url]: https://coveralls.io/github/openvinotoolkit/cvat?branch=develop +[doi-img]: https://zenodo.org/badge/139156354.svg +[doi-url]: https://zenodo.org/badge/latestdoi/139156354 From 92e5ab66e50d3209bde4be2308d1eb30afa1b0e8 Mon Sep 17 00:00:00 2001 From: Dmitry Kruchinin <33020454+dvkruchinin@users.noreply.github.com> Date: Tue, 6 Apr 2021 09:01:21 +0300 Subject: [PATCH 13/81] Cypress test. Mutable attribute. (#3058) * Add mutable condition to cypress command * Cypress test. Mutable attribute. * Small fix * Update tests/cypress/integration/actions_tasks_objects/case_70_mutable_attribute.js Co-authored-by: Boris Sekachev Co-authored-by: Boris Sekachev --- .../case_70_mutable_attribute.js | 76 +++++++++++++++++++ tests/cypress/support/commands.js | 4 + 2 files changed, 80 insertions(+) create mode 100644 tests/cypress/integration/actions_tasks_objects/case_70_mutable_attribute.js diff --git a/tests/cypress/integration/actions_tasks_objects/case_70_mutable_attribute.js b/tests/cypress/integration/actions_tasks_objects/case_70_mutable_attribute.js new file mode 100644 index 00000000..7064da72 --- /dev/null +++ b/tests/cypress/integration/actions_tasks_objects/case_70_mutable_attribute.js @@ -0,0 +1,76 @@ +// Copyright (C) 2021 Intel Corporation +// +// SPDX-License-Identifier: MIT + +// /// + +import { taskName } from '../../support/const'; + +context('Mutable attribute.', () => { + const caseId = '70'; + const labelTrack = `Case ${caseId}`; + const additionalAttrsLabelShape = [ + { additionalAttrName: 'tree', additionalValue: 'birch tree', typeAttribute: 'Text', mutable: true }, + ]; + + const createRectangleTrack2Points = { + points: 'By 2 Points', + type: 'Track', + labelName: labelTrack, + firstX: 260, + firstY: 200, + secondX: 360, + secondY: 250, + }; + + const attrValueSecondFrame = 'aspen'; + const attrValueThirdFrame = 'oak'; + + function testChangingAttributeValue(expectedValue, value) { + cy.get('.cvat-player-next-button').click(); + cy.get('.attribute-annotation-sidebar-attr-elem-wrapper') + .find('[type="text"]') + .should('have.value', expectedValue) + .clear() + .type(value); + } + + function checkObjectDetailValue(frameNum, expectedValue) { + cy.get('.cvat-player-next-button').click(); + cy.goCheckFrameNumber(frameNum); + cy.contains(expectedValue).should('exist').and('be.visible'); + } + + before(() => { + cy.openTask(taskName); + cy.addNewLabel(labelTrack, additionalAttrsLabelShape); + cy.openJob(); + cy.createRectangle(createRectangleTrack2Points); + }); + + describe(`Testing case "${caseId}"`, () => { + it('Go to AAM. For the 2nd and 3rd frames, change the attribute value.', () => { + cy.changeWorkspace('Attribute annotation', labelTrack); + testChangingAttributeValue(additionalAttrsLabelShape[0].additionalValue, attrValueSecondFrame); + testChangingAttributeValue(attrValueSecondFrame, attrValueThirdFrame); + }); + + it('Go to Standard mode. The object detaild have correct values on the corresponding frames.', () => { + cy.changeWorkspace('Standard'); + cy.get('#cvat_canvas_shape_1') + .trigger('mousemove', { scrollBehavior: false }) + .should('have.class', 'cvat_canvas_shape_activated'); + [ + [ + 0, + `${additionalAttrsLabelShape[0].additionalAttrName}: ${additionalAttrsLabelShape[0].additionalValue}`, + ], + [1, `${additionalAttrsLabelShape[0].additionalAttrName}: ${attrValueSecondFrame}`], + [2, `${additionalAttrsLabelShape[0].additionalAttrName}: ${attrValueThirdFrame}`], + [3, `${additionalAttrsLabelShape[0].additionalAttrName}: ${attrValueThirdFrame}`], + ].forEach(([num, val]) => { + checkObjectDetailValue(num, val); + }); + }); + }); +}); diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index c5630e01..f75f13ad 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -420,6 +420,10 @@ Cypress.Commands.add('updateAttributes', (multiAttrParams) => { cy.get(`.ant-select-item-option[title="${multiAttrParams.additionalValue}"]`).click(); }); } + if (multiAttrParams.mutable) { + cy.get('.cvat-attribute-mutable-checkbox') + .find('[type="checkbox"]').should('not.be.checked').check().should('be.checked'); + } }); }); From babf1a3f54f663aa4d5579cd100b3e0e8fced050 Mon Sep 17 00:00:00 2001 From: Dmitry Kruchinin <33020454+dvkruchinin@users.noreply.github.com> Date: Tue, 6 Apr 2021 11:26:20 +0300 Subject: [PATCH 14/81] Update cypress test. Label constructor. Color label. Label name editing. (#3068) * Update Cypress test "Label constructor. Color label. Label name editing" * Fix for Firefox --- ...e_31_label_constructor_color_name_label.js | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tests/cypress/integration/actions_tasks_objects/case_31_label_constructor_color_name_label.js b/tests/cypress/integration/actions_tasks_objects/case_31_label_constructor_color_name_label.js index 11432898..73345f04 100644 --- a/tests/cypress/integration/actions_tasks_objects/case_31_label_constructor_color_name_label.js +++ b/tests/cypress/integration/actions_tasks_objects/case_31_label_constructor_color_name_label.js @@ -125,5 +125,57 @@ context('Label constructor. Color label. Label name editing', () => { }); }); }); + + it('Cancel/reset button interaction when changing color of the label.', () => { + cy.goToTaskList(); + cy.openTask(taskName); + // Adding a label without setting a color + cy.addNewLabel(`Case ${caseId}`); + cy.get('.cvat-constructor-viewer').should('be.visible'); + cy.contains('.cvat-constructor-viewer-item', `Case ${caseId}`) + .invoke('attr', 'style') + .then(($labelColor) => { + // Change the label color and press "Cancel" + cy.contains('.cvat-constructor-viewer-item', `Case ${caseId}`).find('[data-icon="edit"]').click(); + cy.get('.cvat-change-task-label-color-badge') + .children() + .invoke('attr', 'style') + .then(($labelBadgeColor) => { + expect($labelBadgeColor).to.be.equal($labelColor); + }); + cy.get('.cvat-change-task-label-color-button').click(); + cy.get('.cvat-label-color-picker') + .not('.ant-popover-hidden') + .within(() => { + cy.contains('hex').prev().clear().type(labelColor.yellowHex); + cy.contains('button', 'Cancel').click(); + }); + cy.get('.cvat-change-task-label-color-badge') + .children() + .invoke('attr', 'style') + .then(($labelBadgeColor) => { + expect($labelBadgeColor).to.be.equal($labelColor); + }); + + // Change the label color + cy.get('.cvat-change-task-label-color-button').click(); + cy.changeColorViaBadge(labelColor.yellowHex); + + // Reset the label color + cy.get('.cvat-change-task-label-color-button').click(); + cy.get('.cvat-label-color-picker') + .not('.ant-popover-hidden') + .within(() => { + cy.contains('button', 'Reset').click(); + }); + cy.get('.cvat-change-task-label-color-badge') + .children() + .should('have.attr', 'style').and('contain', 'rgb(179, 179, 179)'); + cy.get('.cvat-label-constructor-updater').contains('button', 'Done').click(); + cy.contains('.cvat-constructor-viewer-item', `Case ${caseId}`) + .should('have.attr', 'style') + .and('contain', $labelColor); + }); + }); }); }); From d2a1d12fbac537f8a6c3b813ef7122c3fea74685 Mon Sep 17 00:00:00 2001 From: Dmitry Agapov Date: Tue, 6 Apr 2021 13:09:33 +0300 Subject: [PATCH 15/81] Integration with an internal training server (#2785) Co-authored-by: Boris Sekachev Co-authored-by: Nikita Manovich --- .vscode/settings.json | 2 +- cvat-core/src/api.js | 2 +- cvat-core/src/project.js | 23 ++ cvat-core/src/server-proxy.js | 123 ++++++ cvat-core/src/session.js | 112 +++++- cvat-ui/package-lock.json | 5 + cvat-ui/package.json | 1 + cvat-ui/src/actions/annotation-actions.ts | 126 +++++- cvat-ui/src/actions/boundaries-actions.ts | 6 +- cvat-ui/src/assets/brain.svg | 56 +++ .../annotation-page/appearance-block.tsx | 13 +- .../attribute-editor.tsx | 3 +- .../controls-side-bar/controls-side-bar.tsx | 2 +- .../controls-side-bar/controls-side-bar.tsx | 2 +- .../components/annotation-page/styles.scss | 46 +++ .../shortcuts-select.tsx | 2 +- .../tag-annotation-sidebar.tsx | 2 +- .../annotation-page/top-bar/left-group.tsx | 6 +- .../annotation-page/top-bar/right-group.tsx | 119 +++++- .../annotation-page/top-bar/top-bar.tsx | 15 +- .../change-password-form.tsx | 8 +- .../change-password-modal.tsx | 6 +- .../create-project-content.tsx | 78 +++- .../create-project-page.tsx | 53 ++- .../create-project.context.ts | 31 ++ .../canvas/canvas-context-menu.tsx | 2 +- .../annotation-page/canvas/canvas-wrapper.tsx | 2 +- .../controls-side-bar/controls-side-bar.tsx | 2 +- .../standard-workspace/propagate-confirm.tsx | 10 +- .../annotation-page/top-bar/top-bar.tsx | 29 +- .../containers/file-manager/file-manager.tsx | 6 +- .../containers/models-page/models-page.tsx | 6 +- .../src/containers/tasks-page/tasks-page.tsx | 8 +- cvat-ui/src/icons.tsx | 2 + cvat-ui/src/reducers/annotation-reducer.ts | 54 ++- cvat-ui/src/reducers/interfaces.ts | 18 + cvat-ui/src/reducers/notifications-reducer.ts | 18 + cvat-ui/src/reducers/plugins-reducer.ts | 3 +- .../engine/migrations/0039_auto_training.py | 48 +++ cvat/apps/engine/models.py | 49 ++- cvat/apps/engine/serializers.py | 31 +- cvat/apps/engine/urls.py | 2 + cvat/apps/engine/views.py | 13 +- cvat/apps/training/__init__.py | 1 + cvat/apps/training/apis.py | 362 ++++++++++++++++++ cvat/apps/training/apps.py | 11 + cvat/apps/training/jobs.py | 186 +++++++++ cvat/apps/training/signals.py | 30 ++ cvat/apps/training/urls.py | 11 + cvat/apps/training/views.py | 68 ++++ cvat/settings/base.py | 5 + cvat/settings/testing.py | 2 +- cvat/urls.py | 3 + docker-compose.yml | 1 + 54 files changed, 1743 insertions(+), 82 deletions(-) create mode 100644 cvat-ui/src/assets/brain.svg create mode 100644 cvat-ui/src/components/create-project-page/create-project.context.ts create mode 100644 cvat/apps/engine/migrations/0039_auto_training.py create mode 100644 cvat/apps/training/__init__.py create mode 100644 cvat/apps/training/apis.py create mode 100644 cvat/apps/training/apps.py create mode 100644 cvat/apps/training/jobs.py create mode 100644 cvat/apps/training/signals.py create mode 100644 cvat/apps/training/urls.py create mode 100644 cvat/apps/training/views.py diff --git a/.vscode/settings.json b/.vscode/settings.json index 5718c4b7..cb78ca04 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "python.pythonPath": ".env/bin/python", + "eslint.enable": true, "eslint.probe": [ "javascript", "typescript", diff --git a/cvat-core/src/api.js b/cvat-core/src/api.js index 22dc4858..a5d36b6c 100644 --- a/cvat-core/src/api.js +++ b/cvat-core/src/api.js @@ -573,7 +573,7 @@ function build() { * @param {module:API.cvat.classes.Task} task task to be annotated * @param {module:API.cvat.classes.MLModel} model model used to get annotation * @param {object} [args] extra arguments - * @returns {string} requestID + * @returns {object[]} annotations * @throws {module:API.cvat.exceptions.ServerError} * @throws {module:API.cvat.exceptions.PluginError} * @throws {module:API.cvat.exceptions.ArgumentError} diff --git a/cvat-core/src/project.js b/cvat-core/src/project.js index f389205c..f4609d9d 100644 --- a/cvat-core/src/project.js +++ b/cvat-core/src/project.js @@ -33,6 +33,7 @@ created_date: undefined, updated_date: undefined, task_subsets: undefined, + training_project: undefined, }; for (const property in data) { @@ -64,6 +65,9 @@ } data.task_subsets = Array.from(subsetsSet); } + if (initialData.training_project) { + data.training_project = JSON.parse(JSON.stringify(initialData.training_project)); + } Object.defineProperties( this, @@ -94,6 +98,7 @@ data.name = value; }, }, + /** * @name status * @type {module:API.cvat.enums.TaskStatus} @@ -217,9 +222,21 @@ subsets: { get: () => [...data.task_subsets], }, + _internalData: { get: () => data, }, + + training_project: { + get: () => data.training_project, + set: (training) => { + if (training) { + data.training_project = JSON.parse(JSON.stringify(training)); + } else { + data.training_project = training; + } + }, + }, }), ); } @@ -261,12 +278,17 @@ }; Project.prototype.save.implementation = async function () { + let trainingProject; + if (this.training_project) { + trainingProject = JSON.parse(JSON.stringify(this.training_project)); + } if (typeof this.id !== 'undefined') { const projectData = { name: this.name, assignee_id: this.assignee ? this.assignee.id : null, bug_tracker: this.bugTracker, labels: [...this._internalData.labels.map((el) => el.toJSON())], + training_project: trainingProject, }; await serverProxy.projects.save(this.id, projectData); @@ -276,6 +298,7 @@ const projectSpec = { name: this.name, labels: [...this.labels.map((el) => el.toJSON())], + training_project: trainingProject, }; if (this.bugTracker) { diff --git a/cvat-core/src/server-proxy.js b/cvat-core/src/server-proxy.js index 1e7018c5..f3627d4e 100644 --- a/cvat-core/src/server-proxy.js +++ b/cvat-core/src/server-proxy.js @@ -9,6 +9,31 @@ const config = require('./config'); const DownloadWorker = require('./download.worker'); + function waitFor(frequencyHz, predicate) { + return new Promise((resolve, reject) => { + if (typeof predicate !== 'function') { + reject(new Error(`Predicate must be a function, got ${typeof predicate}`)); + } + + const internalWait = () => { + let result = false; + try { + result = predicate(); + } catch (error) { + reject(error); + } + + if (result) { + resolve(); + } else { + setTimeout(internalWait, 1000 / frequencyHz); + } + }; + + setTimeout(internalWait); + }); + } + function generateError(errorData) { if (errorData.response) { const message = `${errorData.message}. ${JSON.stringify(errorData.response.data) || ''}.`; @@ -993,6 +1018,96 @@ } } + function predictorStatus(projectId) { + const { backendAPI } = config; + + return new Promise((resolve, reject) => { + async function request() { + try { + const response = await Axios.get(`${backendAPI}/predict/status?project=${projectId}`); + return response.data; + } catch (errorData) { + throw generateError(errorData); + } + } + + const timeoutCallback = async () => { + let data = null; + try { + data = await request(); + if (data.status === 'queued') { + setTimeout(timeoutCallback, 1000); + } else if (data.status === 'done') { + resolve(data); + } else { + throw new Error(`Unknown status was received "${data.status}"`); + } + } catch (error) { + reject(error); + } + }; + + setTimeout(timeoutCallback); + }); + } + + function predictAnnotations(taskId, frame) { + return new Promise((resolve, reject) => { + const { backendAPI } = config; + + async function request() { + try { + const response = await Axios.get( + `${backendAPI}/predict/frame?task=${taskId}&frame=${frame}`, + ); + return response.data; + } catch (errorData) { + throw generateError(errorData); + } + } + + const timeoutCallback = async () => { + let data = null; + try { + data = await request(); + if (data.status === 'queued') { + setTimeout(timeoutCallback, 1000); + } else if (data.status === 'done') { + predictAnnotations.latestRequest.fetching = false; + resolve(data.annotation); + } else { + throw new Error(`Unknown status was received "${data.status}"`); + } + } catch (error) { + predictAnnotations.latestRequest.fetching = false; + reject(error); + } + }; + + const closureId = Date.now(); + predictAnnotations.latestRequest.id = closureId; + const predicate = () => !predictAnnotations.latestRequest.fetching || predictAnnotations.latestRequest.id !== closureId; + if (predictAnnotations.latestRequest.fetching) { + waitFor(5, predicate).then(() => { + if (predictAnnotations.latestRequest.id !== closureId) { + resolve(null); + } else { + predictAnnotations.latestRequest.fetching = true; + setTimeout(timeoutCallback); + } + }); + } else { + predictAnnotations.latestRequest.fetching = true; + setTimeout(timeoutCallback); + } + }); + } + + predictAnnotations.latestRequest = { + fetching: false, + id: null, + }; + async function installedApps() { const { backendAPI } = config; try { @@ -1123,6 +1238,14 @@ }), writable: false, }, + + predictor: { + value: Object.freeze({ + status: predictorStatus, + predict: predictAnnotations, + }), + writable: false, + }, }), ); } diff --git a/cvat-core/src/session.js b/cvat-core/src/session.js index 105dfc9b..daaee04a 100644 --- a/cvat-core/src/session.js +++ b/cvat-core/src/session.js @@ -10,7 +10,7 @@ const { getFrame, getRanges, getPreview, clear: clearFrames, getContextImage, } = require('./frames'); - const { ArgumentError } = require('./exceptions'); + const { ArgumentError, DataError } = require('./exceptions'); const { TaskStatus } = require('./enums'); const { Label } = require('./labels'); const User = require('./user'); @@ -258,6 +258,19 @@ }, writable: true, }), + predictor: Object.freeze({ + value: { + async status() { + const result = await PluginRegistry.apiWrapper.call(this, prototype.predictor.status); + return result; + }, + async predict(frame) { + const result = await PluginRegistry.apiWrapper.call(this, prototype.predictor.predict, frame); + return result; + }, + }, + writable: true, + }), }); } @@ -665,6 +678,40 @@ * @instance * @async */ + /** + * @typedef {Object} PredictorStatus + * @property {string} message - message for a user to be displayed somewhere + * @property {number} projectScore - model accuracy + * @global + */ + /** + * Namespace is used for an interaction with events + * @namespace predictor + * @memberof Session + */ + /** + * Subscribe to updates of a ML model binded to the project + * @method status + * @memberof Session.predictor + * @throws {module:API.cvat.exceptions.PluginError} + * @throws {module:API.cvat.exceptions.ServerError} + * @returns {PredictorStatus} + * @instance + * @async + */ + /** + * Get predictions from a ML model binded to the project + * @method predict + * @memberof Session.predictor + * @param {number} frame - number of frame to inference + * @throws {module:API.cvat.exceptions.PluginError} + * @throws {module:API.cvat.exceptions.ArgumentError} + * @throws {module:API.cvat.exceptions.ServerError} + * @throws {module:API.cvat.exceptions.DataError} + * @returns {object[] | null} annotations + * @instance + * @async + */ } } @@ -865,6 +912,11 @@ this.logger = { log: Object.getPrototypeOf(this).logger.log.bind(this), }; + + this.predictor = { + status: Object.getPrototypeOf(this).predictor.status.bind(this), + predict: Object.getPrototypeOf(this).predictor.predict.bind(this), + }; } /** @@ -1554,6 +1606,11 @@ this.logger = { log: Object.getPrototypeOf(this).logger.log.bind(this), }; + + this.predictor = { + status: Object.getPrototypeOf(this).predictor.status.bind(this), + predict: Object.getPrototypeOf(this).predictor.predict.bind(this), + }; } /** @@ -1741,6 +1798,11 @@ return rangesData; }; + Job.prototype.frames.preview.implementation = async function () { + const frameData = await getPreview(this.task.id); + return frameData; + }; + // TODO: Check filter for annotations Job.prototype.annotations.get.implementation = async function (frame, allTracks, filters) { if (!Array.isArray(filters)) { @@ -1897,6 +1959,16 @@ return result; }; + Job.prototype.predictor.status.implementation = async function () { + const result = await this.task.predictor.status(); + return result; + }; + + Job.prototype.predictor.predict.implementation = async function (frame) { + const result = await this.task.predictor.predict(frame); + return result; + }; + Task.prototype.close.implementation = function closeTask() { clearFrames(this.id); for (const job of this.jobs) { @@ -2028,11 +2100,6 @@ return result; }; - Job.prototype.frames.preview.implementation = async function () { - const frameData = await getPreview(this.task.id); - return frameData; - }; - Task.prototype.frames.ranges.implementation = async function () { const rangesData = await getRanges(this.id); return rangesData; @@ -2199,6 +2266,39 @@ return result; }; + Task.prototype.predictor.status.implementation = async function () { + if (!Number.isInteger(this.projectId)) { + throw new DataError('The task must belong to a project to use the feature'); + } + + const result = await serverProxy.predictor.status(this.projectId); + return { + message: result.message, + progress: result.progress, + projectScore: result.score, + timeRemaining: result.time_remaining, + mediaAmount: result.media_amount, + annotationAmount: result.annotation_amount, + }; + }; + + Task.prototype.predictor.predict.implementation = async function (frame) { + if (!Number.isInteger(frame) || frame < 0) { + throw new ArgumentError(`Frame must be a positive integer. Got: "${frame}"`); + } + + if (frame >= this.size) { + throw new ArgumentError(`The frame with number ${frame} is out of the task`); + } + + if (!Number.isInteger(this.projectId)) { + throw new DataError('The task must belong to a project to use the feature'); + } + + const result = await serverProxy.predictor.predict(this.id, frame); + return result; + }; + Job.prototype.frames.contextImage.implementation = async function (taskId, frameId) { const result = await getContextImage(taskId, frameId); return result; diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index c23090f3..27c93845 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -28953,6 +28953,11 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz", "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==" }, + "react-moment": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/react-moment/-/react-moment-1.1.1.tgz", + "integrity": "sha512-WjwvxBSnmLMRcU33do0KixDB+9vP3e84eCse+rd+HNklAMNWyRgZTDEQlay/qK6lcXFPRuEIASJTpEt6pyK7Ww==" + }, "react-redux": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.2.tgz", diff --git a/cvat-ui/package.json b/cvat-ui/package.json index d6bbde46..caf6ba25 100644 --- a/cvat-ui/package.json +++ b/cvat-ui/package.json @@ -77,6 +77,7 @@ "react-color": "^2.19.3", "react-cookie": "^4.0.3", "react-dom": "^16.14.0", + "react-moment": "^1.1.1", "react-redux": "^7.2.2", "react-resizable": "^1.11.1", "@types/react-resizable": "^1.7.2", diff --git a/cvat-ui/src/actions/annotation-actions.ts b/cvat-ui/src/actions/annotation-actions.ts index c44b5bb3..8e5fd184 100644 --- a/cvat-ui/src/actions/annotation-actions.ts +++ b/cvat-ui/src/actions/annotation-actions.ts @@ -1,4 +1,4 @@ -// Copyright (C) 2021 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -190,6 +190,10 @@ export enum AnnotationActionTypes { SWITCH_REQUEST_REVIEW_DIALOG = 'SWITCH_REQUEST_REVIEW_DIALOG', SWITCH_SUBMIT_REVIEW_DIALOG = 'SWITCH_SUBMIT_REVIEW_DIALOG', SET_FORCE_EXIT_ANNOTATION_PAGE_FLAG = 'SET_FORCE_EXIT_ANNOTATION_PAGE_FLAG', + UPDATE_PREDICTOR_STATE = 'UPDATE_PREDICTOR_STATE', + GET_PREDICTIONS = 'GET_PREDICTIONS', + GET_PREDICTIONS_FAILED = 'GET_PREDICTIONS_FAILED', + GET_PREDICTIONS_SUCCESS = 'GET_PREDICTIONS_SUCCESS', HIDE_SHOW_CONTEXT_IMAGE = 'HIDE_SHOW_CONTEXT_IMAGE', GET_CONTEXT_IMAGE = 'GET_CONTEXT_IMAGE', } @@ -612,6 +616,87 @@ export function switchPlay(playing: boolean): AnyAction { }; } +export function getPredictionsAsync(): ThunkAction { + return async (dispatch: ActionCreator): Promise => { + const { + annotations: { + states: currentStates, + zLayer: { cur: curZOrder }, + }, + predictor: { enabled, annotatedFrames }, + } = getStore().getState().annotation; + + const { + filters, frame, showAllInterpolationTracks, jobInstance: job, + } = receiveAnnotationsParameters(); + if (!enabled || currentStates.length || annotatedFrames.includes(frame)) return; + + dispatch({ + type: AnnotationActionTypes.GET_PREDICTIONS, + payload: {}, + }); + + let annotations = []; + try { + annotations = await job.predictor.predict(frame); + // current frame could be changed during a request above, need to fetch it from store again + const { number: currentFrame } = getStore().getState().annotation.player.frame; + if (frame !== currentFrame || annotations === null) { + // another request has already been sent or user went to another frame + // we do not need dispatch predictions success action + return; + } + annotations = annotations.map( + (data: any): any => + new cvat.classes.ObjectState({ + shapeType: data.type, + label: job.task.labels.filter((label: any): boolean => label.id === data.label)[0], + points: data.points, + objectType: ObjectType.SHAPE, + frame, + occluded: false, + source: 'auto', + attributes: {}, + zOrder: curZOrder, + }), + ); + + dispatch({ + type: AnnotationActionTypes.GET_PREDICTIONS_SUCCESS, + payload: { frame }, + }); + } catch (error) { + dispatch({ + type: AnnotationActionTypes.GET_PREDICTIONS_FAILED, + payload: { + error, + }, + }); + } + + try { + await job.annotations.put(annotations); + const states = await job.annotations.get(frame, showAllInterpolationTracks, filters); + const history = await job.actions.get(); + + dispatch({ + type: AnnotationActionTypes.CREATE_ANNOTATIONS_SUCCESS, + payload: { + states, + history, + }, + }); + } catch (error) { + dispatch({ + type: AnnotationActionTypes.CREATE_ANNOTATIONS_FAILED, + payload: { + error, + }, + }); + } + }; +} + export function changeFrameAsync(toFrame: number, fillBuffer?: boolean, frameStep?: number): ThunkAction { return async (dispatch: ActionCreator): Promise => { const state: CombinedState = getStore().getState(); @@ -689,6 +774,7 @@ export function changeFrameAsync(toFrame: number, fillBuffer?: boolean, frameSte delay, }, }); + dispatch(getPredictionsAsync()); } catch (error) { if (error !== 'not needed') { dispatch({ @@ -934,9 +1020,11 @@ export function getJobAsync(tid: number, jid: number, initialFrame: number, init loadJobEvent.close(await jobInfoGenerator(job)); + const openTime = Date.now(); dispatch({ type: AnnotationActionTypes.GET_JOB_SUCCESS, payload: { + openTime, job, issues, reviews, @@ -950,10 +1038,38 @@ export function getJobAsync(tid: number, jid: number, initialFrame: number, init maxZ, }, }); + if (job.task.dimension === DimensionType.DIM_3D) { const workspace = Workspace.STANDARD3D; dispatch(changeWorkspace(workspace)); } + + const updatePredictorStatus = async (): Promise => { + // get current job + const currentState: CombinedState = getStore().getState(); + const { openTime: currentOpenTime, instance: currentJob } = currentState.annotation.job; + if (currentJob === null || currentJob.id !== job.id || currentOpenTime !== openTime) { + // the job was closed, changed or reopened + return; + } + + try { + const status = await job.predictor.status(); + dispatch({ + type: AnnotationActionTypes.UPDATE_PREDICTOR_STATE, + payload: status, + }); + setTimeout(updatePredictorStatus, 60 * 1000); + } catch (error) { + dispatch({ + type: AnnotationActionTypes.UPDATE_PREDICTOR_STATE, + payload: { error }, + }); + setTimeout(updatePredictorStatus, 20 * 1000); + } + }; + updatePredictorStatus(); + dispatch(changeFrameAsync(frameNumber, false)); } catch (error) { dispatch({ @@ -1516,6 +1632,14 @@ export function setForceExitAnnotationFlag(forceExit: boolean): AnyAction { }; } +export function switchPredictor(predictorEnabled: boolean): AnyAction { + return { + type: AnnotationActionTypes.UPDATE_PREDICTOR_STATE, + payload: { + enabled: predictorEnabled, + }, + }; +} export function hideShowContextImage(hidden: boolean): AnyAction { return { type: AnnotationActionTypes.HIDE_SHOW_CONTEXT_IMAGE, diff --git a/cvat-ui/src/actions/boundaries-actions.ts b/cvat-ui/src/actions/boundaries-actions.ts index 0e22f609..5da395d8 100644 --- a/cvat-ui/src/actions/boundaries-actions.ts +++ b/cvat-ui/src/actions/boundaries-actions.ts @@ -1,8 +1,10 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT -import { ActionUnion, createAction, ThunkAction, ThunkDispatch } from 'utils/redux'; +import { + ActionUnion, createAction, ThunkAction, ThunkDispatch, +} from 'utils/redux'; import getCore from 'cvat-core-wrapper'; import { LogType } from 'cvat-logger'; import { computeZRange } from './annotation-actions'; diff --git a/cvat-ui/src/assets/brain.svg b/cvat-ui/src/assets/brain.svg new file mode 100644 index 00000000..4aebe407 --- /dev/null +++ b/cvat-ui/src/assets/brain.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + diff --git a/cvat-ui/src/components/annotation-page/appearance-block.tsx b/cvat-ui/src/components/annotation-page/appearance-block.tsx index 8ea48cf3..a00a4937 100644 --- a/cvat-ui/src/components/annotation-page/appearance-block.tsx +++ b/cvat-ui/src/components/annotation-page/appearance-block.tsx @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -10,6 +10,7 @@ import Radio, { RadioChangeEvent } from 'antd/lib/radio'; import Slider from 'antd/lib/slider'; import Checkbox, { CheckboxChangeEvent } from 'antd/lib/checkbox'; import Collapse from 'antd/lib/collapse'; +import Button from 'antd/lib/button'; import ColorPicker from 'components/annotation-page/standard-workspace/objects-side-bar/color-picker'; import { ColorizeIcon } from 'icons'; @@ -26,7 +27,6 @@ import { changeShowBitmap as changeShowBitmapAction, changeShowProjections as changeShowProjectionsAction, } from 'actions/settings-actions'; -import Button from 'antd/lib/button'; interface StateToProps { appearanceCollapsed: boolean; @@ -152,7 +152,14 @@ function AppearanceBlock(props: Props): JSX.Element { activeKey={appearanceCollapsed ? [] : ['appearance']} className='cvat-objects-appearance-collapse' > - Appearance} key='appearance'> + + Appearance + + )} + key='appearance' + >
Color by span { + > svg { + fill: $inprogress-progress-color; + } + } + } + + &.cvat-predictor-fetching { + > span { + > svg { + animation-duration: 500ms; + animation-name: predictorBlinking; + animation-iteration-count: infinite; + + @keyframes predictorBlinking { + 0% { + fill: $inprogress-progress-color; + } + + 50% { + fill: $completed-progress-color; + } + + 100% { + fill: $inprogress-progress-color; + } + } + } + } + } + + &.cvat-predictor-disabled { + opacity: 0.5; + + &:active { + pointer-events: none; + } + + > span[role='img'] { + transform: scale(0.8) !important; + } + } +} + .cvat-annotation-disabled-header-button { @extend .cvat-annotation-header-button; diff --git a/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/shortcuts-select.tsx b/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/shortcuts-select.tsx index 1ec42848..1c495a15 100644 --- a/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/shortcuts-select.tsx +++ b/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/shortcuts-select.tsx @@ -4,12 +4,12 @@ import React, { useState, useEffect } from 'react'; import { useSelector } from 'react-redux'; -import GlobalHotKeys, { KeyMap } from 'utils/mousetrap-react'; import { Row, Col } from 'antd/lib/grid'; import Text from 'antd/lib/typography/Text'; import Select from 'antd/lib/select'; import { CombinedState } from 'reducers/interfaces'; +import GlobalHotKeys, { KeyMap } from 'utils/mousetrap-react'; import { shift } from 'utils/math'; interface ShortcutLabelMap { diff --git a/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/tag-annotation-sidebar.tsx b/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/tag-annotation-sidebar.tsx index f54b405e..7b5e4456 100644 --- a/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/tag-annotation-sidebar.tsx +++ b/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/tag-annotation-sidebar.tsx @@ -20,11 +20,11 @@ import { changeFrameAsync, rememberObject, } from 'actions/annotation-actions'; -import GlobalHotKeys, { KeyMap } from 'utils/mousetrap-react'; import { Canvas } from 'cvat-canvas-wrapper'; import { CombinedState, ObjectType } from 'reducers/interfaces'; import LabelSelector from 'components/label-selector/label-selector'; import getCore from 'cvat-core-wrapper'; +import GlobalHotKeys, { KeyMap } from 'utils/mousetrap-react'; import ShortcutsSelect from './shortcuts-select'; const cvat = getCore(); diff --git a/cvat-ui/src/components/annotation-page/top-bar/left-group.tsx b/cvat-ui/src/components/annotation-page/top-bar/left-group.tsx index 49d9e1ff..dbbad65f 100644 --- a/cvat-ui/src/components/annotation-page/top-bar/left-group.tsx +++ b/cvat-ui/src/components/annotation-page/top-bar/left-group.tsx @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -11,7 +11,9 @@ import Timeline from 'antd/lib/timeline'; import Dropdown from 'antd/lib/dropdown'; import AnnotationMenuContainer from 'containers/annotation-page/top-bar/annotation-menu'; -import { MainMenuIcon, SaveIcon, UndoIcon, RedoIcon } from 'icons'; +import { + MainMenuIcon, SaveIcon, UndoIcon, RedoIcon, +} from 'icons'; interface Props { saving: boolean; diff --git a/cvat-ui/src/components/annotation-page/top-bar/right-group.tsx b/cvat-ui/src/components/annotation-page/top-bar/right-group.tsx index 9d863f8c..b91e575f 100644 --- a/cvat-ui/src/components/annotation-page/top-bar/right-group.tsx +++ b/cvat-ui/src/components/annotation-page/top-bar/right-group.tsx @@ -7,28 +7,141 @@ import { Col } from 'antd/lib/grid'; import Icon from '@ant-design/icons'; import Select from 'antd/lib/select'; import Button from 'antd/lib/button'; +import Text from 'antd/lib/typography/Text'; +import Tooltip from 'antd/lib/tooltip'; +import Moment from 'react-moment'; + +import moment from 'moment'; import { useSelector } from 'react-redux'; -import { FilterIcon, FullscreenIcon, InfoIcon } from 'icons'; -import { CombinedState, DimensionType, Workspace } from 'reducers/interfaces'; +import { + FilterIcon, FullscreenIcon, InfoIcon, BrainIcon, +} from 'icons'; +import { + CombinedState, DimensionType, Workspace, PredictorState, +} from 'reducers/interfaces'; interface Props { workspace: Workspace; + predictor: PredictorState; + isTrainingActive: boolean; + showStatistics(): void; + + switchPredictor(predictorEnabled: boolean): void; + showFilters(): void; changeWorkspace(workspace: Workspace): void; + jobInstance: any; } function RightGroup(props: Props): JSX.Element { const { - showFilters, showStatistics, changeWorkspace, workspace, jobInstance, + showStatistics, + changeWorkspace, + switchPredictor, + workspace, + predictor, + jobInstance, + isTrainingActive, + showFilters, } = props; + predictor.annotationAmount = predictor.annotationAmount ? predictor.annotationAmount : 0; + predictor.mediaAmount = predictor.mediaAmount ? predictor.mediaAmount : 0; + const formattedScore = `${(predictor.projectScore * 100).toFixed(0)}%`; + const predictorTooltip = ( +
+ Adaptive auto annotation is + {predictor.enabled ? ( + + {' active'} + + ) : ( + + {' inactive'} + + )} +
+ + Annotations amount: + {predictor.annotationAmount} + +
+ + Media amount: + {predictor.mediaAmount} + +
+ {predictor.annotationAmount > 0 ? ( + + Model mAP is + {' '} + {formattedScore} +
+
+ ) : null} + {predictor.error ? ( + + {predictor.error.toString()} +
+
+ ) : null} + {predictor.message ? ( + + Status: + {' '} + {predictor.message} +
+
+ ) : null} + {predictor.timeRemaining > 0 ? ( + + Time Remaining: + {' '} + +
+
+ ) : null} + {predictor.progress > 0 ? ( + + Progress: + {predictor.progress.toFixed(1)} + {' '} + % + + ) : null} +
+ ); + + let predictorClassName = 'cvat-annotation-header-button cvat-predictor-button'; + if (!!predictor.error || !predictor.projectScore) { + predictorClassName += ' cvat-predictor-disabled'; + } else if (predictor.enabled) { + if (predictor.fetching) { + predictorClassName += ' cvat-predictor-fetching'; + } + predictorClassName += ' cvat-predictor-inprogress'; + } const filters = useSelector((state: CombinedState) => state.annotation.annotations.filters); return (
+ {isTrainingActive && ( + + )} + + + + + + + + + + + + ); +} + function AdvanvedConfigurationForm({ formRef }: { formRef: RefObject }): JSX.Element { return (
@@ -69,12 +126,15 @@ export default function CreateProjectContent(): JSX.Element { const [projectLabels, setProjectLabels] = useState([]); const shouldShowNotification = useRef(false); const nameFormRef = useRef(null); + const adaptiveAutoAnnotationFormRef = useRef(null); const advancedFormRef = useRef(null); const dispatch = useDispatch(); const history = useHistory(); const newProjectId = useSelector((state: CombinedState) => state.projects.activities.creates.id); + const { isTrainingActive } = useContext(CreateProjectContext); + useEffect(() => { if (Number.isInteger(newProjectId) && shouldShowNotification.current) { const btn = ; @@ -102,7 +162,16 @@ export default function CreateProjectContent(): JSX.Element { if (nameFormRef.current && advancedFormRef.current) { const basicValues = await nameFormRef.current.validateFields(); const advancedValues = await advancedFormRef.current.validateFields(); + const adaptiveAutoAnnotationValues = await adaptiveAutoAnnotationFormRef.current?.validateFields(); projectData.name = basicValues.name; + projectData.training_project = null; + if (adaptiveAutoAnnotationValues) { + projectData.training_project = {}; + for (const [field, value] of Object.entries(adaptiveAutoAnnotationValues)) { + projectData.training_project[field] = value; + } + } + for (const [field, value] of Object.entries(advancedValues)) { projectData[field] = value; } @@ -120,6 +189,11 @@ export default function CreateProjectContent(): JSX.Element {
+ {isTrainingActive.value && ( + + + + )} Labels: - - Create a new project - - - + + + + Create a new project + + + + ); } + +interface StateToProps { + isTrainingActive: boolean; +} + +function mapStateToProps(state: CombinedState): StateToProps { + return { + isTrainingActive: state.plugins.list.PREDICT, + }; +} + +export default connect(mapStateToProps)(CreateProjectPageComponent); diff --git a/cvat-ui/src/components/create-project-page/create-project.context.ts b/cvat-ui/src/components/create-project-page/create-project.context.ts new file mode 100644 index 00000000..d283658a --- /dev/null +++ b/cvat-ui/src/components/create-project-page/create-project.context.ts @@ -0,0 +1,31 @@ +// Copyright (C) 2020-2021 Intel Corporation +// +// SPDX-License-Identifier: MIT +import { createContext, Dispatch, SetStateAction } from 'react'; + +export interface IState { + value: T; + set?: Dispatch>; +} + +export function getDefaultState(v: T): IState { + return { + value: v, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + set: (value: SetStateAction): void => {}, + }; +} + +export interface ICreateProjectContext { + projectClass: IState; + trainingEnabled: IState; + isTrainingActive: IState; +} + +export const defaultState: ICreateProjectContext = { + projectClass: getDefaultState(''), + trainingEnabled: getDefaultState(false), + isTrainingActive: getDefaultState(false), +}; + +export default createContext(defaultState); diff --git a/cvat-ui/src/containers/annotation-page/canvas/canvas-context-menu.tsx b/cvat-ui/src/containers/annotation-page/canvas/canvas-context-menu.tsx index b25b297c..b46020e1 100644 --- a/cvat-ui/src/containers/annotation-page/canvas/canvas-context-menu.tsx +++ b/cvat-ui/src/containers/annotation-page/canvas/canvas-context-menu.tsx @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT diff --git a/cvat-ui/src/containers/annotation-page/canvas/canvas-wrapper.tsx b/cvat-ui/src/containers/annotation-page/canvas/canvas-wrapper.tsx index 4581c436..70e94de3 100644 --- a/cvat-ui/src/containers/annotation-page/canvas/canvas-wrapper.tsx +++ b/cvat-ui/src/containers/annotation-page/canvas/canvas-wrapper.tsx @@ -3,8 +3,8 @@ // SPDX-License-Identifier: MIT import { connect } from 'react-redux'; - import { KeyMap } from 'utils/mousetrap-react'; + import CanvasWrapperComponent from 'components/annotation-page/canvas/canvas-wrapper'; import { confirmCanvasReady, diff --git a/cvat-ui/src/containers/annotation-page/review-workspace/controls-side-bar/controls-side-bar.tsx b/cvat-ui/src/containers/annotation-page/review-workspace/controls-side-bar/controls-side-bar.tsx index 2125213a..44f98442 100644 --- a/cvat-ui/src/containers/annotation-page/review-workspace/controls-side-bar/controls-side-bar.tsx +++ b/cvat-ui/src/containers/annotation-page/review-workspace/controls-side-bar/controls-side-bar.tsx @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: MIT -import { KeyMap } from 'utils/mousetrap-react'; import { connect } from 'react-redux'; import { Canvas } from 'cvat-canvas-wrapper'; @@ -19,6 +18,7 @@ import { } from 'actions/annotation-actions'; import ControlsSideBarComponent from 'components/annotation-page/review-workspace/controls-side-bar/controls-side-bar'; import { ActiveControl, CombinedState, Rotation } from 'reducers/interfaces'; +import { KeyMap } from 'utils/mousetrap-react'; interface StateToProps { canvasInstance: Canvas; diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/propagate-confirm.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/propagate-confirm.tsx index 7573855e..891dc305 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/propagate-confirm.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/propagate-confirm.tsx @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -68,7 +68,9 @@ function mapDispatchToProps(dispatch: any): DispatchToProps { type Props = StateToProps & DispatchToProps; class PropagateConfirmContainer extends React.PureComponent { private propagateObject = (): void => { - const { propagateObject, objectState, propagateFrames, frameNumber, stopFrame, jobInstance } = this.props; + const { + propagateObject, objectState, propagateFrames, frameNumber, stopFrame, jobInstance, + } = this.props; const propagateUpToFrame = Math.min(frameNumber + propagateFrames, stopFrame); propagateObject(jobInstance, objectState, frameNumber + 1, propagateUpToFrame); @@ -87,7 +89,9 @@ class PropagateConfirmContainer extends React.PureComponent { }; public render(): JSX.Element { - const { frameNumber, stopFrame, propagateFrames, cancel, objectState } = this.props; + const { + frameNumber, stopFrame, propagateFrames, cancel, objectState, + } = this.props; const propagateUpToFrame = Math.min(frameNumber + propagateFrames, stopFrame); diff --git a/cvat-ui/src/containers/annotation-page/top-bar/top-bar.tsx b/cvat-ui/src/containers/annotation-page/top-bar/top-bar.tsx index ceae69c3..d2fcc380 100644 --- a/cvat-ui/src/containers/annotation-page/top-bar/top-bar.tsx +++ b/cvat-ui/src/containers/annotation-page/top-bar/top-bar.tsx @@ -18,6 +18,8 @@ import { searchAnnotationsAsync, searchEmptyFrameAsync, setForceExitAnnotationFlag as setForceExitAnnotationFlagAction, + switchPredictor as switchPredictorAction, + getPredictionsAsync, showFilters as showFiltersAction, showStatistics as showStatisticsAction, switchPlay, @@ -25,7 +27,9 @@ import { } from 'actions/annotation-actions'; import AnnotationTopBarComponent from 'components/annotation-page/top-bar/top-bar'; import { Canvas } from 'cvat-canvas-wrapper'; -import { CombinedState, FrameSpeed, Workspace } from 'reducers/interfaces'; +import { + CombinedState, FrameSpeed, Workspace, PredictorState, +} from 'reducers/interfaces'; import GlobalHotKeys, { KeyMap } from 'utils/mousetrap-react'; interface StateToProps { @@ -48,6 +52,8 @@ interface StateToProps { normalizedKeyMap: Record; canvasInstance: Canvas; forceExit: boolean; + predictor: PredictorState; + isTrainingActive: boolean; } interface DispatchToProps { @@ -62,6 +68,7 @@ interface DispatchToProps { searchEmptyFrame(sessionInstance: any, frameFrom: number, frameTo: number): void; setForceExitAnnotationFlag(forceExit: boolean): void; changeWorkspace(workspace: Workspace): void; + switchPredictor(predictorEnabled: boolean): void; } function mapStateToProps(state: CombinedState): StateToProps { @@ -78,12 +85,14 @@ function mapStateToProps(state: CombinedState): StateToProps { job: { instance: jobInstance }, canvas: { ready: canvasIsReady, instance: canvasInstance }, workspace, + predictor, }, settings: { player: { frameSpeed, frameStep }, workspace: { autoSave, autoSaveInterval }, }, shortcuts: { keyMap, normalizedKeyMap }, + plugins: { list }, } = state; return { @@ -106,6 +115,8 @@ function mapStateToProps(state: CombinedState): StateToProps { normalizedKeyMap, canvasInstance, forceExit, + predictor, + isTrainingActive: list.PREDICT, }; } @@ -146,6 +157,12 @@ function mapDispatchToProps(dispatch: any): DispatchToProps { setForceExitAnnotationFlag(forceExit: boolean): void { dispatch(setForceExitAnnotationFlagAction(forceExit)); }, + switchPredictor(predictorEnabled: boolean): void { + dispatch(switchPredictorAction(predictorEnabled)); + if (predictorEnabled) { + dispatch(getPredictionsAsync()); + } + }, }; } @@ -497,11 +514,14 @@ class AnnotationTopBarContainer extends React.PureComponent { redoAction, workspace, canvasIsReady, - searchAnnotations, - changeWorkspace, keyMap, normalizedKeyMap, canvasInstance, + predictor, + searchAnnotations, + changeWorkspace, + switchPredictor, + isTrainingActive, } = this.props; const preventDefault = (event: KeyboardEvent | undefined): void => { @@ -611,6 +631,8 @@ class AnnotationTopBarContainer extends React.PureComponent { onInputChange={this.onChangePlayerInputValue} onURLIconClick={this.onURLIconClick} changeWorkspace={changeWorkspace} + switchPredictor={switchPredictor} + predictor={predictor} workspace={workspace} playing={playing} saving={saving} @@ -636,6 +658,7 @@ class AnnotationTopBarContainer extends React.PureComponent { onUndoClick={this.undo} onRedoClick={this.redo} jobInstance={jobInstance} + isTrainingActive={isTrainingActive} /> ); diff --git a/cvat-ui/src/containers/file-manager/file-manager.tsx b/cvat-ui/src/containers/file-manager/file-manager.tsx index 3db64770..7d08a3bd 100644 --- a/cvat-ui/src/containers/file-manager/file-manager.tsx +++ b/cvat-ui/src/containers/file-manager/file-manager.tsx @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -69,7 +69,9 @@ export class FileManagerContainer extends React.PureComponent { } public render(): JSX.Element { - const { treeData, getTreeData, withRemote, onChangeActiveKey } = this.props; + const { + treeData, getTreeData, withRemote, onChangeActiveKey, + } = this.props; return ( !task.instance.jobs.length).length - : 0, + numberOfHiddenTasks: tasks.hideEmpty ? + tasks.current.filter((task: Task): boolean => !task.instance.jobs.length).length : + 0, }; } diff --git a/cvat-ui/src/icons.tsx b/cvat-ui/src/icons.tsx index fc7d8e5e..9c0c1488 100644 --- a/cvat-ui/src/icons.tsx +++ b/cvat-ui/src/icons.tsx @@ -47,6 +47,7 @@ import SVGCubeIcon from './assets/cube-icon.svg'; import SVGResetPerspectiveIcon from './assets/reset-perspective.svg'; import SVGColorizeIcon from './assets/colorize-icon.svg'; import SVGAITools from './assets/ai-tools-icon.svg'; +import SVGBrain from './assets/brain.svg'; import SVGOpenCV from './assets/opencv.svg'; import SVGFilterIcon from './assets/object-filter-icon.svg'; @@ -93,5 +94,6 @@ export const CubeIcon = React.memo((): JSX.Element => ); export const ResetPerspectiveIcon = React.memo((): JSX.Element => ); export const AIToolsIcon = React.memo((): JSX.Element => ); export const ColorizeIcon = React.memo((): JSX.Element => ); +export const BrainIcon = React.memo((): JSX.Element => ); export const OpenCVIcon = React.memo((): JSX.Element => ); export const FilterIcon = React.memo((): JSX.Element => ); diff --git a/cvat-ui/src/reducers/annotation-reducer.ts b/cvat-ui/src/reducers/annotation-reducer.ts index 8314c287..84682fb2 100644 --- a/cvat-ui/src/reducers/annotation-reducer.ts +++ b/cvat-ui/src/reducers/annotation-reducer.ts @@ -1,4 +1,4 @@ -// Copyright (C) 2021 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -38,6 +38,7 @@ const defaultState: AnnotationState = { activeControl: ActiveControl.CURSOR, }, job: { + openTime: null, labels: [], requestedId: null, instance: null, @@ -108,6 +109,14 @@ const defaultState: AnnotationState = { requestReviewDialogVisible: false, submitReviewDialogVisible: false, tabContentHeight: 0, + predictor: { + enabled: false, + error: null, + message: '', + projectScore: 0, + fetching: false, + annotatedFrames: [], + }, workspace: Workspace.STANDARD, }; @@ -129,6 +138,7 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { const { job, states, + openTime, frameNumber: number, frameFilename: filename, colors, @@ -148,6 +158,7 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { ...state, job: { ...state.job, + openTime, fetching: false, instance: job, labels: job.task.labels, @@ -1093,6 +1104,47 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { workspace, }; } + case AnnotationActionTypes.UPDATE_PREDICTOR_STATE: { + const { payload } = action; + return { + ...state, + predictor: { + ...state.predictor, + ...payload, + }, + }; + } + case AnnotationActionTypes.GET_PREDICTIONS: { + return { + ...state, + predictor: { + ...state.predictor, + fetching: true, + }, + }; + } + case AnnotationActionTypes.GET_PREDICTIONS_SUCCESS: { + const { frame } = action.payload; + const annotatedFrames = [...state.predictor.annotatedFrames, frame]; + + return { + ...state, + predictor: { + ...state.predictor, + fetching: false, + annotatedFrames, + }, + }; + } + case AnnotationActionTypes.GET_PREDICTIONS_FAILED: { + return { + ...state, + predictor: { + ...state.predictor, + fetching: false, + }, + }; + } case AnnotationActionTypes.RESET_CANVAS: { return { ...state, diff --git a/cvat-ui/src/reducers/interfaces.ts b/cvat-ui/src/reducers/interfaces.ts index 45af4585..4defc780 100644 --- a/cvat-ui/src/reducers/interfaces.ts +++ b/cvat-ui/src/reducers/interfaces.ts @@ -111,6 +111,7 @@ export enum SupportedPlugins { GIT_INTEGRATION = 'GIT_INTEGRATION', ANALYTICS = 'ANALYTICS', MODELS = 'MODELS', + PREDICT = 'PREDICT', } export type PluginsList = { @@ -301,6 +302,9 @@ export interface NotificationsState { commentingIssue: null | ErrorState; submittingReview: null | ErrorState; }; + predictor: { + prediction: null | ErrorState; + }; }; messages: { tasks: { @@ -367,6 +371,18 @@ export enum Rotation { CLOCKWISE90, } +export interface PredictorState { + timeRemaining: number; + progress: number; + projectScore: number; + message: string; + error: Error | null; + enabled: boolean; + fetching: boolean; + annotationAmount: number; + mediaAmount: number; +} + export interface AnnotationState { activities: { loads: { @@ -388,6 +404,7 @@ export interface AnnotationState { activeControl: ActiveControl; }; job: { + openTime: null | number; labels: any[]; requestedId: number | null; instance: any | null | undefined; @@ -462,6 +479,7 @@ export interface AnnotationState { appearanceCollapsed: boolean; tabContentHeight: number; workspace: Workspace; + predictor: PredictorState; aiToolsRef: MutableRefObject; } diff --git a/cvat-ui/src/reducers/notifications-reducer.ts b/cvat-ui/src/reducers/notifications-reducer.ts index 4df4f446..bc56f3ff 100644 --- a/cvat-ui/src/reducers/notifications-reducer.ts +++ b/cvat-ui/src/reducers/notifications-reducer.ts @@ -102,6 +102,9 @@ const defaultState: NotificationsState = { resolvingIssue: null, submittingReview: null, }, + predictor: { + prediction: null, + }, }, messages: { tasks: { @@ -1104,6 +1107,21 @@ export default function (state = defaultState, action: AnyAction): Notifications }, }; } + case AnnotationActionTypes.GET_PREDICTIONS_FAILED: { + return { + ...state, + errors: { + ...state.errors, + predictor: { + ...state.errors.predictor, + prediction: { + message: 'Could not fetch prediction data', + reason: action.payload.error, + }, + }, + }, + }; + } case BoundariesActionTypes.RESET_AFTER_ERROR: case AuthActionTypes.LOGOUT_SUCCESS: { return { ...defaultState }; diff --git a/cvat-ui/src/reducers/plugins-reducer.ts b/cvat-ui/src/reducers/plugins-reducer.ts index 85e6093c..ad424238 100644 --- a/cvat-ui/src/reducers/plugins-reducer.ts +++ b/cvat-ui/src/reducers/plugins-reducer.ts @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -13,6 +13,7 @@ const defaultState: PluginsState = { GIT_INTEGRATION: false, ANALYTICS: false, MODELS: false, + PREDICT: false, }, }; diff --git a/cvat/apps/engine/migrations/0039_auto_training.py b/cvat/apps/engine/migrations/0039_auto_training.py new file mode 100644 index 00000000..a9f22ea7 --- /dev/null +++ b/cvat/apps/engine/migrations/0039_auto_training.py @@ -0,0 +1,48 @@ +# Generated by Django 3.1.7 on 2021-04-02 13:17 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('engine', '0038_manifest'), + ] + + operations = [ + migrations.CreateModel( + name='TrainingProject', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('host', models.CharField(max_length=256)), + ('username', models.CharField(max_length=256)), + ('password', models.CharField(max_length=256)), + ('training_id', models.CharField(max_length=64)), + ('enabled', models.BooleanField(null=True)), + ('project_class', models.CharField(blank=True, choices=[('OD', 'Object Detection')], max_length=2, null=True)), + ], + ), + migrations.CreateModel( + name='TrainingProjectLabel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('training_label_id', models.CharField(max_length=64)), + ('cvat_label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='training_project_label', to='engine.label')), + ], + ), + migrations.CreateModel( + name='TrainingProjectImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('idx', models.PositiveIntegerField()), + ('training_image_id', models.CharField(max_length=64)), + ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='engine.task')), + ], + ), + migrations.AddField( + model_name='project', + name='training_project', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='engine.trainingproject'), + ), + ] diff --git a/cvat/apps/engine/models.py b/cvat/apps/engine/models.py index d9fcda77..bcc46738 100644 --- a/cvat/apps/engine/models.py +++ b/cvat/apps/engine/models.py @@ -2,15 +2,16 @@ # # SPDX-License-Identifier: MIT -from enum import Enum -import re import os +import re +from enum import Enum -from django.db import models from django.conf import settings - from django.contrib.auth.models import User from django.core.files.storage import FileSystemStorage +from django.db import models +from django.utils.translation import gettext_lazy as _ + class SafeCharField(models.CharField): def get_prep_value(self, value): @@ -19,6 +20,7 @@ class SafeCharField(models.CharField): return value[:self.max_length] return value + class DimensionType(str, Enum): DIM_3D = '3d' DIM_2D = '2d' @@ -152,6 +154,7 @@ class Video(models.Model): class Meta: default_permissions = () + class Image(models.Model): data = models.ForeignKey(Data, on_delete=models.CASCADE, related_name="images", null=True) path = models.CharField(max_length=1024, default='') @@ -162,17 +165,32 @@ class Image(models.Model): class Meta: default_permissions = () + +class TrainingProject(models.Model): + class ProjectClass(models.TextChoices): + DETECTION = 'OD', _('Object Detection') + + host = models.CharField(max_length=256) + username = models.CharField(max_length=256) + password = models.CharField(max_length=256) + training_id = models.CharField(max_length=64) + enabled = models.BooleanField(null=True) + project_class = models.CharField(max_length=2, choices=ProjectClass.choices, null=True, blank=True) + + class Project(models.Model): + name = SafeCharField(max_length=256) owner = models.ForeignKey(User, null=True, blank=True, - on_delete=models.SET_NULL, related_name="+") - assignee = models.ForeignKey(User, null=True, blank=True, - on_delete=models.SET_NULL, related_name="+") + on_delete=models.SET_NULL, related_name="+") + assignee = models.ForeignKey(User, null=True, blank=True, + on_delete=models.SET_NULL, related_name="+") bug_tracker = models.CharField(max_length=2000, blank=True, default="") created_date = models.DateTimeField(auto_now_add=True) updated_date = models.DateTimeField(auto_now_add=True) status = models.CharField(max_length=32, choices=StatusChoice.choices(), - default=StatusChoice.ANNOTATION) + default=StatusChoice.ANNOTATION) + training_project = models.ForeignKey(TrainingProject, null=True, blank=True, on_delete=models.SET_NULL) def get_project_dirname(self): return os.path.join(settings.PROJECTS_ROOT, str(self.id)) @@ -210,7 +228,7 @@ class Task(models.Model): # Zero means that there are no limits (default) segment_size = models.PositiveIntegerField(default=0) status = models.CharField(max_length=32, choices=StatusChoice.choices(), - default=StatusChoice.ANNOTATION) + default=StatusChoice.ANNOTATION) data = models.ForeignKey(Data, on_delete=models.CASCADE, null=True, related_name="tasks") dimension = models.CharField(max_length=2, choices=DimensionType.choices(), default=DimensionType.DIM_2D) subset = models.CharField(max_length=64, blank=True, default="") @@ -237,6 +255,13 @@ class Task(models.Model): def __str__(self): return self.name + +class TrainingProjectImage(models.Model): + task = models.ForeignKey(Task, on_delete=models.CASCADE) + idx = models.PositiveIntegerField() + training_image_id = models.CharField(max_length=64) + + # Redefined a couple of operation for FileSystemStorage to avoid renaming # or other side effects. class MyFileSystemStorage(FileSystemStorage): @@ -319,6 +344,12 @@ class Label(models.Model): default_permissions = () unique_together = ('task', 'name') + +class TrainingProjectLabel(models.Model): + cvat_label = models.ForeignKey(Label, on_delete=models.CASCADE, related_name='training_project_label') + training_label_id = models.CharField(max_length=64) + + class AttributeType(str, Enum): CHECKBOX = 'checkbox' RADIO = 'radio' diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index f4c7b66a..dfbe4fa6 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -9,9 +9,11 @@ import shutil from rest_framework import serializers, exceptions from django.contrib.auth.models import User, Group + +from cvat.apps.dataset_manager.formats.utils import get_label_color from cvat.apps.engine import models from cvat.apps.engine.log import slogger -from cvat.apps.dataset_manager.formats.utils import get_label_color + class BasicUserSerializer(serializers.ModelSerializer): def validate(self, data): @@ -415,6 +417,7 @@ class TaskSerializer(WriteOnceMixin, serializers.ModelSerializer): raise serializers.ValidationError('All label names must be unique for the task') return value + class ProjectSearchSerializer(serializers.ModelSerializer): class Meta: model = models.Project @@ -423,17 +426,25 @@ class ProjectSearchSerializer(serializers.ModelSerializer): ordering = ['-id'] +class TrainingProjectSerializer(serializers.ModelSerializer): + class Meta: + model = models.TrainingProject + fields = ('host', 'username', 'password', 'enabled', 'project_class') + write_once_fields = ('host', 'username', 'password', 'project_class') + + class ProjectWithoutTaskSerializer(serializers.ModelSerializer): labels = LabelSerializer(many=True, source='label_set', partial=True, default=[]) owner = BasicUserSerializer(required=False) owner_id = serializers.IntegerField(write_only=True, allow_null=True, required=False) assignee = BasicUserSerializer(allow_null=True, required=False) assignee_id = serializers.IntegerField(write_only=True, allow_null=True, required=False) + training_project = TrainingProjectSerializer(required=False, allow_null=True) class Meta: model = models.Project - fields = ('url', 'id', 'name', 'labels', 'owner', 'assignee', 'owner_id', 'assignee_id', - 'bug_tracker', 'created_date', 'updated_date', 'status') + fields = ('url', 'id', 'name', 'labels', 'tasks', 'owner', 'assignee', 'owner_id', 'assignee_id', + 'bug_tracker', 'created_date', 'updated_date', 'status', 'training_project') read_only_fields = ('created_date', 'updated_date', 'status', 'owner', 'asignee') ordering = ['-id'] @@ -456,7 +467,17 @@ class ProjectSerializer(ProjectWithoutTaskSerializer): # pylint: disable=no-self-use def create(self, validated_data): labels = validated_data.pop('label_set') - db_project = models.Project.objects.create(**validated_data) + training_data = validated_data.pop('training_project', {}) + if training_data.get('enabled'): + host = training_data.pop('host').strip('/') + username = training_data.pop('username').strip() + password = training_data.pop('password').strip() + tr_p = models.TrainingProject.objects.create(**training_data, + host=host, username=username, password=password) + db_project = models.Project.objects.create(**validated_data, + training_project=tr_p) + else: + db_project = models.Project.objects.create(**validated_data) label_names = list() for label in labels: attributes = label.pop('attributespec_set') @@ -472,7 +493,6 @@ class ProjectSerializer(ProjectWithoutTaskSerializer): shutil.rmtree(project_path) os.makedirs(db_project.get_project_logs_dirname()) - db_project.save() return db_project # pylint: disable=no-self-use @@ -530,6 +550,7 @@ class PluginsSerializer(serializers.Serializer): GIT_INTEGRATION = serializers.BooleanField() ANALYTICS = serializers.BooleanField() MODELS = serializers.BooleanField() + PREDICT = serializers.BooleanField() class DataMetaSerializer(serializers.ModelSerializer): frames = FrameMetaSerializer(many=True, allow_null=True) diff --git a/cvat/apps/engine/urls.py b/cvat/apps/engine/urls.py index da0c1f2e..abc91108 100644 --- a/cvat/apps/engine/urls.py +++ b/cvat/apps/engine/urls.py @@ -13,6 +13,7 @@ from django.views.generic import RedirectView from django.conf import settings from cvat.apps.restrictions.views import RestrictionsViewSet from cvat.apps.authentication.decorators import login_required +from cvat.apps.training.views import PredictView schema_view = get_schema_view( openapi.Info( @@ -53,6 +54,7 @@ router.register('reviews', views.ReviewViewSet) router.register('issues', views.IssueViewSet) router.register('comments', views.CommentViewSet) router.register('restrictions', RestrictionsViewSet, basename='restrictions') +router.register('predict', PredictView, basename='predict') urlpatterns = [ # Entry point for a client diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index d15136b6..89751952 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -2,23 +2,23 @@ # # SPDX-License-Identifier: MIT +import io import os import os.path as osp -import io import shutil import traceback from datetime import datetime from distutils.util import strtobool from tempfile import mkstemp -import cv2 +import cv2 import django_rq -from django.shortcuts import get_object_or_404 from django.apps import apps from django.conf import settings from django.contrib.auth.models import User from django.db import IntegrityError from django.http import HttpResponse +from django.shortcuts import get_object_or_404 from django.utils import timezone from django.utils.decorators import method_decorator from django_filters import rest_framework as filters @@ -35,7 +35,7 @@ from rest_framework.response import Response from sendfile import sendfile import cvat.apps.dataset_manager as dm -import cvat.apps.dataset_manager.views # pylint: disable=unused-import +import cvat.apps.dataset_manager.views # pylint: disable=unused-import from cvat.apps.authentication import auth from cvat.apps.dataset_manager.bindings import CvatImportError from cvat.apps.dataset_manager.serializers import DatasetFormatsSerializer @@ -53,7 +53,6 @@ from cvat.apps.engine.serializers import ( CombinedReviewSerializer, IssueSerializer, CombinedIssueSerializer, CommentSerializer ) from cvat.apps.engine.utils import av_scan_paths - from . import models, task from .log import clogger, slogger @@ -188,6 +187,7 @@ class ServerViewSet(viewsets.ViewSet): 'GIT_INTEGRATION': apps.is_installed('cvat.apps.dataset_repo'), 'ANALYTICS': False, 'MODELS': False, + 'PREDICT': apps.is_installed('cvat.apps.training') } if strtobool(os.environ.get("CVAT_ANALYTICS", '0')): response['ANALYTICS'] = True @@ -290,6 +290,7 @@ class ProjectViewSet(auth.ProjectGetQuerySetMixin, viewsets.ModelViewSet): context={"request": request}) return Response(serializer.data) + class TaskFilter(filters.FilterSet): project = filters.CharFilter(field_name="project__name", lookup_expr="icontains") name = filters.CharFilter(field_name="name", lookup_expr="icontains") @@ -1109,3 +1110,5 @@ def _export_annotations(db_task, rq_id, request, format_name, action, callback, meta={ 'request_time': timezone.localtime() }, result_ttl=ttl, failure_ttl=ttl) return Response(status=status.HTTP_202_ACCEPTED) + + diff --git a/cvat/apps/training/__init__.py b/cvat/apps/training/__init__.py new file mode 100644 index 00000000..2bb1b0c8 --- /dev/null +++ b/cvat/apps/training/__init__.py @@ -0,0 +1 @@ +default_app_config = 'cvat.apps.training.apps.TrainingConfig' diff --git a/cvat/apps/training/apis.py b/cvat/apps/training/apis.py new file mode 100644 index 00000000..d280f34a --- /dev/null +++ b/cvat/apps/training/apis.py @@ -0,0 +1,362 @@ +import uuid +from abc import ABC, abstractmethod +from collections import OrderedDict +from functools import wraps +from typing import Callable, List, Union + +import requests + +from cacheops import cache, CacheMiss + +from cvat.apps.engine.models import TrainingProject, ShapeType + + +class TrainingServerAPIAbs(ABC): + + def __init__(self, host, username, password): + self.host = host + self.username = username + self.password = password + + @abstractmethod + def get_server_status(self): + pass + + @abstractmethod + def create_project(self, name: str, description: str = '', project_class: TrainingProject.ProjectClass = None, + labels: List[dict] = None): + pass + + @abstractmethod + def upload_annotations(self, project_id: str, frames_data: List[dict]): + pass + + @abstractmethod + def get_project_status(self, project_id: str) -> dict: + pass + + @abstractmethod + def get_annotation(self, project_id: str, image_id: str, width: int, height: int, frame: int, + labels_mapping: dict) -> dict: + pass + + +def retry(amount: int = 2) -> Callable: + def dec(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs): + __amount = amount + while __amount > 0: + __amount -= 1 + try: + result = func(*args, **kwargs) + return result + except Exception: + pass + + return wrapper + + return dec + + +class TrainingServerAPI(TrainingServerAPIAbs): + TRAINING_CLASS = { + TrainingProject.ProjectClass.DETECTION: "DETECTION" + } + + @staticmethod + def __convert_annotation_from_cvat(shapes): + data = [] + for shape in shapes: + x0, y0, x1, y1 = shape['points'] + x = x0 / shape['width'] + y = y0 / shape['height'] + width = (x1 - x0) / shape['width'] + height = (y1 - y0) / shape['height'] + data.append({ + "id": str(uuid.uuid4()), + "shapes": [ + { + "type": "rect", + "geometry": { + "x": x, + "y": y, + "width": width, + "height": height, + "points": None, + } + } + ], + "editor": None, + "labels": [ + { + "id": shape['third_party_label_id'], + "probability": 1.0, + }, + ], + }) + return data + + @staticmethod + def __convert_annotation_to_cvat(annotation: dict, image_width: int, image_height: int, frame: int, + labels_mapping: dict) -> List[OrderedDict]: + shapes = [] + for i, annotation in enumerate(annotation.get('data', [])): + label_id = annotation['labels'][0]['id'] + if not labels_mapping.get(label_id): + continue + shape = annotation['shapes'][0] + if shape['type'] != 'rect': + continue + x = shape['geometry']['x'] + y = shape['geometry']['y'] + w = shape['geometry']['width'] + h = shape['geometry']['height'] + x0 = x * image_width + y0 = y * image_height + x1 = image_width * w + x0 + y1 = image_height * h + y0 + shapes.append(OrderedDict([ + ('type', ShapeType.RECTANGLE), + ('occluded', False), + ('z_order', 0), + ('points', [x0, y0, x1, y1]), + ('id', i), + ('frame', int(frame)), + ('label', labels_mapping.get(label_id)), + ('group', 0), + ('source', 'auto'), + ('attributes', {}) + ])) + return shapes + + @retry() + def __create_project(self, name: str, description: str = None, + labels: List[dict] = None, tasks: List[dict] = None) -> dict: + url = f'{self.host}/v2/projects' + headers = { + 'Context-Type': 'application/json', + 'Authorization': f'bearer_token {self.token}', + } + tasks[1]['properties'] = [ + { + "id": "labels", + "user_value": labels + } + ] + data = { + 'name': name, + 'description': description, + "dimensions": [], + "group_type": "normal", + 'pipeline': { + 'connections': [{ + 'from': { + **tasks[0]['output_ports'][0], + 'task_id': tasks[0]['temp_id'], + }, + 'to': { + **tasks[1]['input_ports'][0], + 'task_id': tasks[1]['temp_id'], + } + }], + 'tasks': tasks, + }, + "pipeline_representation": 'Detection', + "type": "project", + } + response = self.request(method='POST', url=url, json=data, headers=headers) + return response + + @retry() + def __get_annotation(self, project_id: str, image_id: str) -> dict: + url = f'{self.host}/v2/projects/{project_id}/media/images/{image_id}/results/online' + headers = { + 'Authorization': f'bearer_token {self.token}', + } + response = self.request(method='GET', url=url, headers=headers) + return response + + @retry() + def __get_job_status(self, project_id: str) -> dict: + url = f'{self.host}/v2/projects/{project_id}/jobs' + headers = { + 'Authorization': f'bearer_token {self.token}', + } + response = self.request(method='GET', url=url, headers=headers) + return response + + @retry() + def __get_project_summary(self, project_id: str) -> dict: + url = f'{self.host}/v2/projects/{project_id}/statistics/summary' + headers = { + 'Authorization': f'bearer_token {self.token}', + } + response = self.request(method='GET', url=url, headers=headers) + return response + + @retry() + def __get_project(self, project_id: str) -> dict: + url = f'{self.host}/v2/projects/{project_id}' + headers = { + 'Authorization': f'bearer_token {self.token}', + } + response = self.request(method='GET', url=url, headers=headers) + return response + + @retry() + def __get_server_status(self) -> dict: + url = f'{self.host}/v2/status' + headers = { + 'Authorization': f'bearer_token {self.token}', + } + response = self.request(method='GET', url=url, headers=headers) + return response + + @retry() + def __get_tasks(self) -> List[dict]: + url = f'{self.host}/v2/tasks' + headers = { + 'Authorization': f'bearer_token {self.token}', + } + response = self.request(method='GET', url=url, headers=headers) + return response + + def __delete_token(self): + cache.delete(self.token_key) + + @retry() + def __upload_annotation(self, project_id: str, image_id: str, annotation: List[dict]): + url = f'{self.host}/v2/projects/{project_id}/media/images/{image_id}/annotations' + headers = { + 'Authorization': f'bearer_token {self.token}', + 'Content-Type': 'application/json' + } + data = { + 'image_id': image_id, + 'data': annotation + } + response = self.request(method='POST', url=url, headers=headers, json=data) + return response + + @retry() + def __upload_image(self, project_id: str, buffer) -> dict: + url = f'{self.host}/v2/projects/{project_id}/media/images' + files = {'file': buffer} + headers = { + 'Authorization': f'bearer_token {self.token}', + } + response = self.request(method='POST', url=url, headers=headers, files=files) + return response + + @property + def project_id_key(self): + return f'{self.host}_{self.username}_project_id' + + @property + def token(self) -> str: + def get_token(host: str, username: str, password: str) -> dict: + url = f'{host}/v2/authentication' + data = { + 'username': (None, username), + 'password': (None, password), + } + r = requests.post(url=url, files=data, verify=False) # nosec + return r.json() + + try: + token = cache.get(self.token_key) + except CacheMiss: + response = get_token(self.host, self.username, self.password) + token = response.get('secure_token', '') + expires_in = response.get('expires_in', 3600) + cache.set(cache_key=self.token_key, data=token, timeout=expires_in) + return token + + @property + def token_key(self): + return f'{self.host}_{self.username}_token' + + def request(self, method: str, url: str, **kwargs) -> Union[list, dict, str]: + response = requests.request(method=method, url=url, verify=False, **kwargs) + if response.status_code == 401: + self.__delete_token() + raise Exception("401") + result = response.json() + return result + + def create_project(self, name: str, description: str = '', project_class: TrainingProject.ProjectClass = None, + labels: List[dict] = None) -> dict: + all_tasks = self.__get_tasks() + task_type = self.TRAINING_CLASS.get(project_class) + task_algo = 'Retinanet - TF2' + tasks = [ + next(({'temp_id': '_1_', **task} + for task in all_tasks + if task['task_type'] == 'DATASET'), {}), + next(({'temp_id': '_2_', **task} + for task in all_tasks + if task['task_type'] == task_type and + task['algorithm_name'] == task_algo), {}), + ] + labels = [{ + 'name': label['name'], + 'temp_id': label['name'] + } for label in labels] + r = self.__create_project(name=name, description=description, tasks=tasks, labels=labels) + return r + + def get_server_status(self) -> dict: + return self.__get_server_status() + + def upload_annotations(self, project_id: str, frames_data: List[dict]): + for frame in frames_data: + annotation = self.__convert_annotation_from_cvat(frame['shapes']) + self.__upload_annotation(project_id=project_id, image_id=frame['third_party_id'], annotation=annotation) + + def upload_image(self, training_id: str, buffer): + response = self.__upload_image(project_id=training_id, buffer=buffer) + return response.get('id') + + def get_project_status(self, project_id) -> dict: + summary = self.__get_project_summary(project_id=project_id) + if not summary or not isinstance(summary, list): + return {'message': 'Not available'} + jobs = self.__get_job_status(project_id=project_id) + media_amount = next(item.get('value', 0) for item in summary if item.get('key') == 'Media') + annotation_amount = next(item.get('value', 0) for item in summary if item.get('key') == 'Annotation') + score = next(item.get('value', 0) for item in summary if item.get('key') == 'Score') + job_items = jobs.get('items', 0) + if len(job_items) == 0 and score == 0: + message = 'Not started' + elif len(job_items) == 0 and score > 0: + message = '' + else: + message = 'In progress' + progress = 0 if len(job_items) == 0 else job_items[0]["status"]["progress"] + time_remaining = 0 if len(job_items) == 0 else job_items[0]["status"]['time_remaining'] + result = { + 'media_amount': media_amount if media_amount else 0, + 'annotation_amount': annotation_amount, + 'score': score, + 'message': message, + 'progress': progress, + 'time_remaining': time_remaining, + } + return result + + def get_annotation(self, project_id: str, image_id: str, width: int, height: int, frame: int, + labels_mapping: dict) -> List[OrderedDict]: + annotation = self.__get_annotation(project_id=project_id, image_id=image_id) + cvat_annotation = self.__convert_annotation_to_cvat(annotation=annotation, image_width=width, + image_height=height, frame=frame, + labels_mapping=labels_mapping) + return cvat_annotation + + def get_labels(self, project_id: str) -> List[dict]: + project = self.__get_project(project_id=project_id) + labels = [{ + 'id': label['id'], + 'name': label['name'] + } for label in project.get('labels')] + return labels diff --git a/cvat/apps/training/apps.py b/cvat/apps/training/apps.py new file mode 100644 index 00000000..a9ea6f33 --- /dev/null +++ b/cvat/apps/training/apps.py @@ -0,0 +1,11 @@ +from django.apps import AppConfig + + +class TrainingConfig(AppConfig): + name = 'cvat.apps.training' + + def ready(self): + # Required to define signals in application + import cvat.apps.training.signals + # Required in order to silent "unused-import" in pyflake + assert cvat.apps.training.signals diff --git a/cvat/apps/training/jobs.py b/cvat/apps/training/jobs.py new file mode 100644 index 00000000..3cb50fb5 --- /dev/null +++ b/cvat/apps/training/jobs.py @@ -0,0 +1,186 @@ +from collections import OrderedDict +from typing import List + +from cacheops import cache +from django_rq import job + +from cvat.apps import dataset_manager as dm +from cvat.apps.engine.frame_provider import FrameProvider +from cvat.apps.engine.models import ( + Project, + Task, + TrainingProjectImage, + Label, + Image, + TrainingProjectLabel, + Data, + Job, + ShapeType, +) +from cvat.apps.training.apis import TrainingServerAPI + + +@job +def save_prediction_server_status_to_cache_job(cache_key, + cvat_project_id, + timeout=60): + cvat_project = Project.objects.get(pk=cvat_project_id) + api = TrainingServerAPI(host=cvat_project.training_project.host, username=cvat_project.training_project.username, + password=cvat_project.training_project.password) + status = api.get_project_status(project_id=cvat_project.training_project.training_id) + + resp = { + **status, + 'status': 'done' + } + cache.set(cache_key=cache_key, data=resp, timeout=timeout) + + +@job +def save_frame_prediction_to_cache_job(cache_key: str, + task_id: int, + frame: int, + timeout: int = 60): + task = Task.objects.get(pk=task_id) + training_project_image = TrainingProjectImage.objects.filter(idx=frame, task=task).first() + if not training_project_image: + cache.set(cache_key=cache_key, data={ + 'annotation': [], + 'status': 'done' + }, timeout=timeout) + return + + cvat_labels = Label.objects.filter(project__id=task.project_id).all() + training_project = Project.objects.get(pk=task.project_id).training_project + api = TrainingServerAPI(host=training_project.host, + username=training_project.username, + password=training_project.password) + image = Image.objects.get(frame=frame, data=task.data) + labels_mapping = { + TrainingProjectLabel.objects.get(cvat_label=cvat_label).training_label_id: cvat_label.id + for cvat_label in cvat_labels + } + annotation = api.get_annotation(project_id=training_project.training_id, + image_id=training_project_image.training_image_id, + width=image.width, + height=image.height, + labels_mapping=labels_mapping, + frame=frame) + resp = { + 'annotation': annotation, + 'status': 'done' + } + cache.set(cache_key=cache_key, data=resp, timeout=timeout) + + +@job +def upload_images_job(task_id: int): + if TrainingProjectImage.objects.filter(task_id=task_id).count() is 0: + task = Task.objects.get(pk=task_id) + frame_provider = FrameProvider(task.data) + frames = frame_provider.get_frames() + api = TrainingServerAPI( + host=task.project.training_project.host, + username=task.project.training_project.username, + password=task.project.training_project.password, + ) + + for i, (buffer, _) in enumerate(frames): + training_image_id = api.upload_image(training_id=task.project.training_project.training_id, buffer=buffer) + if training_image_id: + TrainingProjectImage.objects.create(task=task, idx=i, + training_image_id=training_image_id) + +def __add_fields_to_shape(shape: dict, frame: int, data: Data, labels_mapping: dict) -> dict: + image = Image.objects.get(frame=frame, data=data) + return { + **shape, + 'height': image.height, + 'width': image.width, + 'third_party_label_id': labels_mapping[shape['label_id']], + } + + +@job +def upload_annotation_to_training_project_job(job_id: int): + cvat_job = Job.objects.get(pk=job_id) + cvat_project = cvat_job.segment.task.project + training_project = cvat_project.training_project + start = cvat_job.segment.start_frame + stop = cvat_job.segment.stop_frame + data = dm.task.get_job_data(job_id) + shapes: List[OrderedDict] = data.get('shapes', []) + frames_data = [] + api = TrainingServerAPI( + host=cvat_project.training_project.host, + username=cvat_project.training_project.username, + password=cvat_project.training_project.password, + ) + cvat_labels = Label.objects.filter(project=cvat_project).all() + labels_mapping = { + cvat_label.id: TrainingProjectLabel.objects.get(cvat_label=cvat_label).training_label_id + for cvat_label in cvat_labels + } + + for frame in range(start, stop + 1): + frame_shapes = list( + map( + lambda x: __add_fields_to_shape(x, frame, cvat_job.segment.task.data, labels_mapping), + filter( + lambda x: x['frame'] == frame and x['type'] == ShapeType.RECTANGLE, + shapes, + ) + ) + ) + + if frame_shapes: + training_project_image = TrainingProjectImage.objects.get(task=cvat_job.segment.task, idx=frame) + frames_data.append({ + 'third_party_id': training_project_image.training_image_id, + 'shapes': frame_shapes + }) + + api.upload_annotations(project_id=training_project.training_id, frames_data=frames_data) + + +@job +def create_training_project_job(project_id: int): + cvat_project = Project.objects.get(pk=project_id) + training_project = cvat_project.training_project + api = TrainingServerAPI( + host=cvat_project.training_project.host, + username=cvat_project.training_project.username, + password=cvat_project.training_project.password, + ) + create_training_project(cvat_project=cvat_project, training_project=training_project, api=api) + + +def create_training_project(cvat_project, training_project, api): + labels = cvat_project.label_set.all() + training_project_resp = api.create_project( + name=f'{cvat_project.name}_cvat', + project_class=training_project.project_class, + labels=[{'name': label.name} for label in labels] + ) + if training_project_resp.get('id'): + training_project.training_id = training_project_resp['id'] + training_project.save() + + for cvat_label in labels: + training_label = list(filter(lambda x: x['name'] == cvat_label.name, training_project_resp.get('labels', []))) + if training_label: + TrainingProjectLabel.objects.create(cvat_label=cvat_label, training_label_id=training_label[0]['id']) + + +async def upload_images(cvat_project_id, training_id, api): + project = Project.objects.get(pk=cvat_project_id) + tasks: List[Task] = project.tasks.all() + for task in tasks: + frame_provider = FrameProvider(task) + frames = frame_provider.get_frames() + for i, (buffer, _) in enumerate(frames): + training_image_id = api.upload_image(training_id=training_id, buffer=buffer) + if training_image_id: + TrainingProjectImage.objects.create(project=project, task=task, idx=i, + training_image_id=training_image_id) + diff --git a/cvat/apps/training/signals.py b/cvat/apps/training/signals.py new file mode 100644 index 00000000..20ba8242 --- /dev/null +++ b/cvat/apps/training/signals.py @@ -0,0 +1,30 @@ +from django.db.models.signals import post_save +from django.dispatch import receiver + +from cvat.apps.engine.models import Job, StatusChoice, Project, Task +from cvat.apps.training.jobs import ( + create_training_project_job, + upload_images_job, + upload_annotation_to_training_project_job, +) + + +@receiver(post_save, sender=Project, dispatch_uid="create_training_project") +def create_training_project(instance: Project, **kwargs): + if instance.training_project: + create_training_project_job.delay(instance.id) + + +@receiver(post_save, sender=Task, dispatch_uid='upload_images_to_training_project') +def upload_images_to_training_project(instance: Task, **kwargs): + if (instance.status == StatusChoice.ANNOTATION and + instance.data and instance.data.size != 0 and \ + instance.project_id and instance.project.training_project): + + upload_images_job.delay(instance.id) + + +@receiver(post_save, sender=Job, dispatch_uid="upload_annotation_to_training_project") +def upload_annotation_to_training_project(instance: Job, **kwargs): + if instance.status == StatusChoice.COMPLETED: + upload_annotation_to_training_project_job.delay(instance.id) diff --git a/cvat/apps/training/urls.py b/cvat/apps/training/urls.py new file mode 100644 index 00000000..47ce86bf --- /dev/null +++ b/cvat/apps/training/urls.py @@ -0,0 +1,11 @@ +from django.urls import path, include +from rest_framework import routers + +from cvat.apps.training.views import PredictView + +router = routers.DefaultRouter(trailing_slash=False) +router.register('', PredictView, basename='predict') + +urlpatterns = [ + path('', include((router.urls, 'predict'), namespace='predict')) +] diff --git a/cvat/apps/training/views.py b/cvat/apps/training/views.py new file mode 100644 index 00000000..f6fe5dff --- /dev/null +++ b/cvat/apps/training/views.py @@ -0,0 +1,68 @@ +from cacheops import cache, CacheMiss +from drf_yasg.utils import swagger_auto_schema +from rest_framework import viewsets, status +from rest_framework.decorators import action +from rest_framework.permissions import IsAuthenticated, SAFE_METHODS +from rest_framework.response import Response + +from cvat.apps.authentication import auth +from cvat.apps.engine.models import Project +from cvat.apps.training.jobs import save_frame_prediction_to_cache_job, save_prediction_server_status_to_cache_job + + +class PredictView(viewsets.ViewSet): + def get_permissions(self): + http_method = self.request.method + permissions = [IsAuthenticated] + + if http_method in SAFE_METHODS: + permissions.append(auth.ProjectAccessPermission) + else: + permissions.append(auth.AdminRolePermission) + + return [perm() for perm in permissions] + + @swagger_auto_schema(method='get', operation_summary='Returns prediction for image') + @action(detail=False, methods=['GET'], url_path='frame') + def predict_image(self, request): + frame = self.request.query_params.get('frame') + task_id = self.request.query_params.get('task') + if not task_id: + return Response(data='query param "task" empty or not provided', status=status.HTTP_400_BAD_REQUEST) + if not frame: + return Response(data='query param "frame" empty or not provided', status=status.HTTP_400_BAD_REQUEST) + cache_key = f'predict_image_{task_id}_{frame}' + try: + resp = cache.get(cache_key) + except CacheMiss: + save_frame_prediction_to_cache_job.delay(cache_key, task_id=task_id, + frame=frame) + resp = { + 'status': 'queued', + } + cache.set(cache_key=cache_key, data=resp, timeout=60) + + return Response(resp) + + @swagger_auto_schema(method='get', + operation_summary='Returns information of the tasks of the project with the selected id') + @action(detail=False, methods=['GET'], url_path='status') + def predict_status(self, request): + project_id = self.request.query_params.get('project') + if not project_id: + return Response(data='query param "project" empty or not provided', status=status.HTTP_400_BAD_REQUEST) + project = Project.objects.get(pk=project_id) + if not project.training_project: + Response({'status': 'done'}) + + cache_key = f'predict_status_{project_id}' + try: + resp = cache.get(cache_key) + except CacheMiss: + save_prediction_server_status_to_cache_job.delay(cache_key, cvat_project_id=project_id) + resp = { + 'status': 'queued', + } + cache.set(cache_key=cache_key, data=resp, timeout=60) + + return Response(resp) diff --git a/cvat/settings/base.py b/cvat/settings/base.py index f7a69441..bfcd8d65 100644 --- a/cvat/settings/base.py +++ b/cvat/settings/base.py @@ -20,6 +20,8 @@ import fcntl import shutil import subprocess import mimetypes +from distutils.util import strtobool + mimetypes.add_type("application/wasm", ".wasm", True) from pathlib import Path @@ -129,6 +131,9 @@ INSTALLED_APPS = [ 'rest_auth.registration' ] +if strtobool(os.environ.get("ADAPTIVE_AUTO_ANNOTATION", 'false')): + INSTALLED_APPS.append('cvat.apps.training') + SITE_ID = 1 REST_FRAMEWORK = { diff --git a/cvat/settings/testing.py b/cvat/settings/testing.py index c55e6f42..e79b0f39 100644 --- a/cvat/settings/testing.py +++ b/cvat/settings/testing.py @@ -64,4 +64,4 @@ class PatchedDiscoverRunner(DiscoverRunner): for config in RQ_QUEUES.values(): config["ASYNC"] = False - super().__init__(*args, **kwargs) \ No newline at end of file + super().__init__(*args, **kwargs) diff --git a/cvat/urls.py b/cvat/urls.py index 0e25dca5..1fa4cb50 100644 --- a/cvat/urls.py +++ b/cvat/urls.py @@ -43,3 +43,6 @@ if apps.is_installed('cvat.apps.opencv'): if apps.is_installed('silk'): urlpatterns.append(path('profiler/', include('silk.urls'))) + +if apps.is_installed('cvat.apps.training'): + urlpatterns.append(path('api/v1/predict/', include('cvat.apps.training.urls'))) diff --git a/docker-compose.yml b/docker-compose.yml index 8eee1393..ce096044 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,6 +42,7 @@ services: ALLOWED_HOSTS: '*' CVAT_REDIS_HOST: 'cvat_redis' CVAT_POSTGRES_HOST: 'cvat_db' + ADAPTIVE_AUTO_ANNOTATION: 'false' volumes: - cvat_data:/home/django/data - cvat_keys:/home/django/keys From 7524202492129dd19591670929c04f8dadf67051 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Wed, 7 Apr 2021 11:50:24 +0300 Subject: [PATCH 16/81] Added hotkeys to change labels (#3070) * temp commit * Added ability to change default label and object label by using Ctrl+{number} * Removed extra changes * Minor refactoring * Added ability to change assigned keys * Redesigned popover * Added changelog record & updated version * Added memoization * Some minor changes * Applied comments Co-authored-by: Dmitry Kalinin --- CHANGELOG.md | 8 +- cvat-ui/package-lock.json | 2 +- cvat-ui/package.json | 2 +- cvat-ui/src/actions/annotation-actions.ts | 36 ++----- .../objects-side-bar/issues-list.tsx | 2 +- .../objects-side-bar/label-item.tsx | 51 +++++++-- .../label-key-selector-popover.tsx | 85 +++++++++++++++ .../objects-side-bar/labels-list.tsx | 100 ++++++++++++++++-- .../objects-side-bar/objects-side-bar.tsx | 8 +- .../objects-side-bar/styles.scss | 50 +++++++-- .../tag-annotation-sidebar.tsx | 2 +- .../controls-side-bar/draw-shape-popover.tsx | 10 +- .../controls-side-bar/setup-tag-popover.tsx | 4 +- .../objects-side-bar/label-item.tsx | 34 +++--- .../objects-side-bar/labels-list.tsx | 29 ----- cvat-ui/src/reducers/annotation-reducer.ts | 26 +++-- cvat-ui/src/reducers/interfaces.ts | 1 + cvat-ui/src/reducers/shortcuts-reducer.ts | 8 +- cvat-ui/src/utils/mousetrap-react.tsx | 2 +- 19 files changed, 341 insertions(+), 119 deletions(-) create mode 100644 cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/label-key-selector-popover.tsx delete mode 100644 cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 799d9fc2..217545cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,23 +8,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.4.0] - Unreleased ### Added + - Documentation on mask annotation () +- Hotkeys to switch a label of existing object or to change default label (for objects created with N) () ### Changed + - ### Deprecated + - ### Removed + - ### Fixed + - Export of instance masks with holes () ### Security -- +- ## [1.3.0] - 3/31/2021 diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index 27c93845..f4cc563d 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.18.1", + "version": "1.19.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-ui/package.json b/cvat-ui/package.json index caf6ba25..caae6812 100644 --- a/cvat-ui/package.json +++ b/cvat-ui/package.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.18.1", + "version": "1.19.0", "description": "CVAT single-page application", "main": "src/index.tsx", "scripts": { diff --git a/cvat-ui/src/actions/annotation-actions.ts b/cvat-ui/src/actions/annotation-actions.ts index 8e5fd184..a7afc3b1 100644 --- a/cvat-ui/src/actions/annotation-actions.ts +++ b/cvat-ui/src/actions/annotation-actions.ts @@ -1130,36 +1130,16 @@ export function saveAnnotationsAsync(sessionInstance: any, afterSave?: () => voi } // used to reproduce the latest drawing (in case of tags just creating) by using N -export function rememberObject( - objectType: ObjectType, - labelID: number, - shapeType?: ShapeType, - points?: number, - rectDrawingMethod?: RectDrawingMethod, -): AnyAction { - let activeControl = ActiveControl.CURSOR; - if (shapeType === ShapeType.RECTANGLE) { - activeControl = ActiveControl.DRAW_RECTANGLE; - } else if (shapeType === ShapeType.POLYGON) { - activeControl = ActiveControl.DRAW_POLYGON; - } else if (shapeType === ShapeType.POLYLINE) { - activeControl = ActiveControl.DRAW_POLYLINE; - } else if (shapeType === ShapeType.POINTS) { - activeControl = ActiveControl.DRAW_POINTS; - } else if (shapeType === ShapeType.CUBOID) { - activeControl = ActiveControl.DRAW_CUBOID; - } - +export function rememberObject(createParams: { + activeObjectType?: ObjectType; + activeLabelID?: number; + activeShapeType?: ShapeType; + activeNumOfPoints?: number; + activeRectDrawingMethod?: RectDrawingMethod; +}): AnyAction { return { type: AnnotationActionTypes.REMEMBER_CREATED_OBJECT, - payload: { - shapeType, - labelID, - objectType, - points, - activeControl, - rectDrawingMethod, - }, + payload: createParams, }; } diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/issues-list.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/issues-list.tsx index f9fb7070..ffd78023 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/issues-list.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/issues-list.tsx @@ -4,7 +4,6 @@ import React from 'react'; import { useSelector, useDispatch } from 'react-redux'; -import { CombinedState } from 'reducers/interfaces'; import { LeftOutlined, RightOutlined, EyeInvisibleFilled, EyeOutlined, } from '@ant-design/icons'; @@ -14,6 +13,7 @@ import { Row, Col } from 'antd/lib/grid'; import { changeFrameAsync } from 'actions/annotation-actions'; import { reviewActions } from 'actions/review-actions'; import CVATTooltip from 'components/common/cvat-tooltip'; +import { CombinedState } from 'reducers/interfaces'; export default function LabelsListComponent(): JSX.Element { const dispatch = useDispatch(); diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/label-item.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/label-item.tsx index fc038b39..45f47c71 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/label-item.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/label-item.tsx @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -10,22 +10,30 @@ import { LockFilled, UnlockOutlined, EyeInvisibleFilled, EyeOutlined, } from '@ant-design/icons'; +import CVATTooltip from 'components/common/cvat-tooltip'; +import LabelKeySelectorPopover from './label-key-selector-popover'; + interface Props { labelName: string; labelColor: string; + labelID: number; visible: boolean; statesHidden: boolean; statesLocked: boolean; + keyToLabelMapping: Record; hideStates(): void; showStates(): void; lockStates(): void; unlockStates(): void; + updateLabelShortcutKey(updatedKey: string, labelID: number): void; } function LabelItemComponent(props: Props): JSX.Element { const { labelName, labelColor, + labelID, + keyToLabelMapping, visible, statesHidden, statesLocked, @@ -33,8 +41,14 @@ function LabelItemComponent(props: Props): JSX.Element { showStates, lockStates, unlockStates, + updateLabelShortcutKey, } = props; + // create reversed mapping just to receive key easily + const labelToKeyMapping: Record = Object.fromEntries( + Object.entries(keyToLabelMapping).map(([key, _labelID]) => [_labelID, key]), + ); + const labelShortcutKey = labelToKeyMapping[labelID] || '?'; const classes = { lock: { enabled: { className: 'cvat-label-item-button-lock cvat-label-item-button-lock-enabled' }, @@ -48,22 +62,37 @@ function LabelItemComponent(props: Props): JSX.Element { return ( - - +
{' '} - +
- - - {labelName} - + + + + {labelName} + + + + + + + {statesLocked ? ( ) : ( diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/label-key-selector-popover.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/label-key-selector-popover.tsx new file mode 100644 index 00000000..bb92bf47 --- /dev/null +++ b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/label-key-selector-popover.tsx @@ -0,0 +1,85 @@ +// Copyright (C) 2021 Intel Corporation +// +// SPDX-License-Identifier: MIT + +import React from 'react'; +import { useSelector } from 'react-redux'; +import Popover from 'antd/lib/popover'; +import Button from 'antd/lib/button'; +import { Row, Col } from 'antd/lib/grid'; +import Text from 'antd/lib/typography/Text'; + +import { CombinedState } from 'reducers/interfaces'; +import CVATTooltip from 'components/common/cvat-tooltip'; + +interface LabelKeySelectorPopoverProps { + updateLabelShortcutKey(updatedKey: string, labelID: number): void; + keyToLabelMapping: Record; + labelID: number; + children: JSX.Element; +} + +interface LabelKeySelectorPopoverContentProps { + updateLabelShortcutKey(updatedKey: string, labelID: number): void; + labelID: number; + keyToLabelMapping: Record; +} + +function PopoverContent(props: LabelKeySelectorPopoverContentProps): JSX.Element { + const { keyToLabelMapping, labelID, updateLabelShortcutKey } = props; + const labels = useSelector((state: CombinedState) => state.annotation.job.labels); + + return ( +
+ {[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['0']].map((arr, i_) => ( + + {arr.map((i) => { + const previousLabelID = keyToLabelMapping[i]; + const labelName = Number.isInteger(previousLabelID) ? + labels.filter((label: any): boolean => label.id === previousLabelID)[0]?.name || + 'undefined' : + 'None'; + + return ( +
+ + + + + ); + })} + + ))} + + ); +} + +const MemoizedContent = React.memo(PopoverContent); + +function LabelKeySelectorPopover(props: LabelKeySelectorPopoverProps): JSX.Element { + const { + children, labelID, updateLabelShortcutKey, keyToLabelMapping, + } = props; + + return ( + + )} + placement='left' + > + {children} + + ); +} + +export default React.memo(LabelKeySelectorPopover); diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx index 827ff3e7..b0955de0 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx @@ -1,26 +1,108 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT -import React from 'react'; +import React, { useCallback, useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import message from 'antd/lib/message'; +import { CombinedState } from 'reducers/interfaces'; +import { rememberObject, updateAnnotationsAsync } from 'actions/annotation-actions'; import LabelItemContainer from 'containers/annotation-page/standard-workspace/objects-side-bar/label-item'; +import GlobalHotKeys from 'utils/mousetrap-react'; -interface Props { - labelIDs: number[]; - listHeight: number; -} +function LabelsListComponent(): JSX.Element { + const dispatch = useDispatch(); + const { + annotation: { + job: { labels }, + tabContentHeight: listHeight, + annotations: { activatedStateID, states }, + }, + shortcuts: { keyMap }, + } = useSelector((state: CombinedState) => state); + const labelIDs = labels.map((label: any): number => label.id); + + const [keyToLabelMapping, setKeyToLabelMapping] = useState>( + Object.fromEntries(labelIDs.slice(0, 10).map((labelID: number, idx: number) => [(idx + 1) % 10, labelID])), + ); + + const updateLabelShortcutKey = useCallback( + (key: string, labelID: number) => { + // unassign any keys assigned to the current labels + const keyToLabelMappingCopy = { ...keyToLabelMapping }; + for (const shortKey of Object.keys(keyToLabelMappingCopy)) { + if (keyToLabelMappingCopy[shortKey] === labelID) { + delete keyToLabelMappingCopy[shortKey]; + } + } + + if (key === '—') { + setKeyToLabelMapping(keyToLabelMappingCopy); + return; + } -export default function LabelsListComponent(props: Props): JSX.Element { - const { listHeight, labelIDs } = props; + // check if this key is assigned to another label + if (key in keyToLabelMappingCopy) { + // try to find a new key for the other label + for (let i = 0; i < 10; i++) { + const adjustedI = (i + 1) % 10; + if (!(adjustedI in keyToLabelMappingCopy)) { + keyToLabelMappingCopy[adjustedI] = keyToLabelMappingCopy[key]; + break; + } + } + // delete assigning to the other label + delete keyToLabelMappingCopy[key]; + } + + // assigning to the current label + keyToLabelMappingCopy[key] = labelID; + setKeyToLabelMapping(keyToLabelMappingCopy); + }, + [keyToLabelMapping], + ); + + const subKeyMap = { + SWITCH_LABEL: keyMap.SWITCH_LABEL, + }; + + const handlers = { + SWITCH_LABEL: (event: KeyboardEvent | undefined, shortcut: string) => { + if (event) event.preventDefault(); + const labelID = keyToLabelMapping[shortcut.split('+')[1].trim()]; + const label = labels.filter((_label: any) => _label.id === labelID)[0]; + if (Number.isInteger(labelID) && label) { + if (Number.isInteger(activatedStateID)) { + const activatedState = states.filter((state: any) => state.clientID === activatedStateID)[0]; + if (activatedState) { + activatedState.label = label; + dispatch(updateAnnotationsAsync([activatedState])); + } + } else { + dispatch(rememberObject({ activeLabelID: labelID })); + message.destroy(); + message.success(`Default label was changed to "${label.name}"`); + } + } + }, + }; return (
+ {labelIDs.map( (labelID: number): JSX.Element => ( - + ), )}
); } + +export default React.memo(LabelsListComponent); 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 c5288a9b..6d15c3ce 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 @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -13,7 +13,7 @@ import Layout from 'antd/lib/layout'; import { Canvas } from 'cvat-canvas-wrapper'; import { CombinedState } from 'reducers/interfaces'; -import LabelsListContainer from 'containers/annotation-page/standard-workspace/objects-side-bar/labels-list'; +import LabelsList from 'components/annotation-page/standard-workspace/objects-side-bar/labels-list'; import { collapseSidebar as collapseSidebarAction, updateTabContentHeight as updateTabContentHeightAction, @@ -123,8 +123,8 @@ function ObjectsSideBar(props: StateToProps & DispatchToProps & OwnProps): JSX.E Objects} key='objects'> {objectsList} - Labels} key='labels'> - + Labels} key='labels'> + Issues} key='issues'> diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/styles.scss b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/styles.scss index 8b7a7425..c6631603 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/styles.scss +++ b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/styles.scss @@ -167,7 +167,8 @@ padding: 3px 1px 1px 3px; } -.cvat-objects-sidebar-state-item-color { +.cvat-objects-sidebar-state-item-color, +.cvat-objects-sidebar-label-item-color { border: 1px solid $object-item-border-color; width: 7px; opacity: 1; @@ -288,12 +289,16 @@ .cvat-objects-sidebar-label-active-item { background: $active-label-background-color; + border-top: 2px solid $object-item-border-color; + border-right: 2px solid $object-item-border-color; + border-bottom: 2px solid $object-item-border-color; + padding: 3px 1px 1px 3px; } .cvat-objects-sidebar-label-item { height: 2.5em; border-bottom: 1px solid $border-color-1; - padding: 5px; + padding: 5px 3px 3px 3px; span { @extend .cvat-object-sidebar-icon; @@ -311,10 +316,39 @@ } } -.cvat-label-item-color-button { - width: 30px; - height: 20px; - border-radius: 5px; +.cvat-label-item-color { + background: rgb(25, 184, 14); + height: 80%; + width: 90%; + border-radius: $grid-unit-size / 2; +} + +.cvat-label-item-setup-shortcut-button { + border-color: $objects-bar-icons-color; +} + +.cvat-label-item-setup-shortcut-popover { + margin-top: -$grid-unit-size; + margin-bottom: -$grid-unit-size; + + > div { + padding-top: $grid-unit-size; + padding-bottom: $grid-unit-size; + + > div { + display: flex; + justify-content: center; + + > button { + width: $grid-unit-size * 15; + overflow-x: hidden; + + span:first-child { + margin-right: $grid-unit-size; + } + } + } + } } .cvat-objects-appearance-content { @@ -361,3 +395,7 @@ margin-right: $grid-unit-size; } } + +.cvat-objects-sidebar-label-item-disabled { + opacity: 0.5; +} diff --git a/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/tag-annotation-sidebar.tsx b/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/tag-annotation-sidebar.tsx index 7b5e4456..2292c48e 100644 --- a/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/tag-annotation-sidebar.tsx +++ b/cvat-ui/src/components/annotation-page/tag-annotation-workspace/tag-annotation-sidebar/tag-annotation-sidebar.tsx @@ -82,7 +82,7 @@ function mapDispatchToProps(dispatch: ThunkDispatch): dispatch(removeObjectAsync(jobInstance, objectState, true)); }, onRememberObject(labelID: number): void { - dispatch(rememberObject(ObjectType.TAG, labelID)); + dispatch(rememberObject({ activeObjectType: ObjectType.TAG, activeLabelID: labelID })); }, }; } diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover.tsx index f88c752d..9cd2669c 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover.tsx @@ -41,7 +41,15 @@ function mapDispatchToProps(dispatch: any): DispatchToProps { points?: number, rectDrawingMethod?: RectDrawingMethod, ): void { - dispatch(rememberObject(objectType, labelID, shapeType, points, rectDrawingMethod)); + dispatch( + rememberObject({ + activeObjectType: objectType, + activeShapeType: shapeType, + activeLabelID: labelID, + activeNumOfPoints: points, + activeRectDrawingMethod: rectDrawingMethod, + }), + ); }, }; } diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/setup-tag-popover.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/setup-tag-popover.tsx index 5c0c5b8b..7004505f 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/setup-tag-popover.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/controls-side-bar/setup-tag-popover.tsx @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -32,7 +32,7 @@ function mapDispatchToProps(dispatch: any): DispatchToProps { dispatch(createAnnotationsAsync(sessionInstance, frame, states)); }, onRememberObject(labelID: number): void { - dispatch(rememberObject(ObjectType.TAG, labelID)); + dispatch(rememberObject({ activeObjectType: ObjectType.TAG, activeLabelID: labelID })); }, }; } diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/label-item.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/label-item.tsx index 8e89e244..6353ab2f 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/label-item.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/label-item.tsx @@ -1,4 +1,4 @@ -// Copyright (C) 2020 Intel Corporation +// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -12,6 +12,8 @@ import { CombinedState, ObjectType } from 'reducers/interfaces'; interface OwnProps { labelID: number; + keyToLabelMapping: Record; + updateLabelShortcutKey(updatedKey: string, labelID: number): void; } interface StateToProps { @@ -20,7 +22,7 @@ interface StateToProps { labelColor: string; objectStates: any[]; jobInstance: any; - frameNumber: any; + frameNumber: number; } interface DispatchToProps { @@ -127,35 +129,38 @@ class LabelItemContainer extends React.PureComponent { private switchHidden(value: boolean): void { const { updateAnnotations } = this.props; - const { ownObjectStates } = this.state; - for (const state of ownObjectStates) { - state.hidden = value; - } - updateAnnotations(ownObjectStates); + if (ownObjectStates.length) { + // false alarm + // eslint-disable-next-line + updateAnnotations(ownObjectStates.map((state: any) => ((state.hidden = value), state))); + } } private switchLock(value: boolean): void { const { updateAnnotations } = this.props; - const { ownObjectStates } = this.state; - for (const state of ownObjectStates) { - state.lock = value; - } - updateAnnotations(ownObjectStates); + if (ownObjectStates.length) { + // false alarm + // eslint-disable-next-line + updateAnnotations(ownObjectStates.map((state: any) => ((state.lock = value), state))); + } } public render(): JSX.Element { + const { + labelName, labelColor, keyToLabelMapping, labelID, updateLabelShortcutKey, + } = this.props; const { visible, statesHidden, statesLocked } = this.state; - const { labelName, labelColor } = this.props; - return ( { showStates={this.showStates} lockStates={this.lockStates} unlockStates={this.unlockStates} + updateLabelShortcutKey={updateLabelShortcutKey} /> ); } diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx deleted file mode 100644 index 16cd9767..00000000 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2020 Intel Corporation -// -// SPDX-License-Identifier: MIT - -import { connect } from 'react-redux'; - -import LabelsListComponent from 'components/annotation-page/standard-workspace/objects-side-bar/labels-list'; -import { CombinedState } from 'reducers/interfaces'; - -interface StateToProps { - labelIDs: number[]; - listHeight: number; -} - -function mapStateToProps(state: CombinedState): StateToProps { - const { - annotation: { - job: { labels }, - tabContentHeight: listHeight, - }, - } = state; - - return { - labelIDs: labels.map((label: any): number => label.id), - listHeight, - }; -} - -export default connect(mapStateToProps)(LabelsListComponent); diff --git a/cvat-ui/src/reducers/annotation-reducer.ts b/cvat-ui/src/reducers/annotation-reducer.ts index 84682fb2..cf8515cc 100644 --- a/cvat-ui/src/reducers/annotation-reducer.ts +++ b/cvat-ui/src/reducers/annotation-reducer.ts @@ -456,9 +456,22 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { }; } case AnnotationActionTypes.REMEMBER_CREATED_OBJECT: { - const { - shapeType, labelID, objectType, points, activeControl, rectDrawingMethod, - } = action.payload; + const { payload } = action; + + let { activeControl } = state.canvas; + if (payload.activeShapeType === ShapeType.RECTANGLE) { + activeControl = ActiveControl.DRAW_RECTANGLE; + } else if (payload.activeShapeType === ShapeType.POLYGON) { + activeControl = ActiveControl.DRAW_POLYGON; + } else if (payload.activeShapeType === ShapeType.POLYLINE) { + activeControl = ActiveControl.DRAW_POLYLINE; + } else if (payload.activeShapeType === ShapeType.POINTS) { + activeControl = ActiveControl.DRAW_POINTS; + } else if (payload.activeShapeType === ShapeType.CUBOID) { + activeControl = ActiveControl.DRAW_CUBOID; + } else if (payload.activeObjectType === ObjectType.TAG) { + activeControl = ActiveControl.CURSOR; + } return { ...state, @@ -471,12 +484,9 @@ export default (state = defaultState, action: AnyAction): AnnotationState => { activeControl, }, drawing: { + ...state.drawing, + ...payload, activeInteractor: undefined, - activeLabelID: labelID, - activeNumOfPoints: points, - activeObjectType: objectType, - activeShapeType: shapeType, - activeRectDrawingMethod: rectDrawingMethod, }, }; } diff --git a/cvat-ui/src/reducers/interfaces.ts b/cvat-ui/src/reducers/interfaces.ts index 4defc780..4ddeb301 100644 --- a/cvat-ui/src/reducers/interfaces.ts +++ b/cvat-ui/src/reducers/interfaces.ts @@ -381,6 +381,7 @@ export interface PredictorState { fetching: boolean; annotationAmount: number; mediaAmount: number; + annotatedFrames: number[]; } export interface AnnotationState { diff --git a/cvat-ui/src/reducers/shortcuts-reducer.ts b/cvat-ui/src/reducers/shortcuts-reducer.ts index 98baa9aa..3863f3b7 100644 --- a/cvat-ui/src/reducers/shortcuts-reducer.ts +++ b/cvat-ui/src/reducers/shortcuts-reducer.ts @@ -287,10 +287,16 @@ const defaultKeyMap = ({ }, TOGGLE_LAYOUT_GRID: { name: 'Toggle layout grid', - description: 'Is used in development', + description: 'The grid is used to UI development', sequences: ['ctrl+alt+enter'], action: 'keydown', }, + SWITCH_LABEL: { + name: 'Switch label', + description: 'Changes a label for an activated object or for the next drawn object if no objects are activated', + sequences: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'].map((val: string): string => `ctrl+${val}`), + action: 'keydown', + }, } as any) as KeyMap; const defaultState: ShortcutsState = { diff --git a/cvat-ui/src/utils/mousetrap-react.tsx b/cvat-ui/src/utils/mousetrap-react.tsx index c51fe5fc..e8452e3d 100644 --- a/cvat-ui/src/utils/mousetrap-react.tsx +++ b/cvat-ui/src/utils/mousetrap-react.tsx @@ -17,7 +17,7 @@ export interface KeyMap { } export interface Handlers { - [index: string]: (event: KeyboardEvent) => void; + [index: string]: (event: KeyboardEvent, shortcut: string) => void; } interface Props { From 553535e4e39e3c106425d783d5de2a0359dd97f6 Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Wed, 7 Apr 2021 14:25:48 +0300 Subject: [PATCH 17/81] fix: cvat/requirements/base.txt to reduce vulnerabilities (#3073) The following vulnerabilities are fixed by pinning transitive dependencies: - https://snyk.io/vuln/SNYK-PYTHON-DJANGO-1090612 --- cvat/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index 3d1668bc..b62a2f96 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -1,5 +1,5 @@ click==7.1.2 -Django==3.1.7 +Django==3.1.8 django-appconf==1.0.4 django-auth-ldap==2.2.0 django-cacheops==5.0.1 From fad8612405ed01a32a05c45e996dc872b5774246 Mon Sep 17 00:00:00 2001 From: Dmitry Kruchinin <33020454+dvkruchinin@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:47:38 +0300 Subject: [PATCH 18/81] CI: canceling previous workflow runs (#3078) --- .github/workflows/cancel.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/cancel.yml diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml new file mode 100644 index 00000000..c9ff4c0f --- /dev/null +++ b/.github/workflows/cancel.yml @@ -0,0 +1,17 @@ +name: Cancelling Duplicates +on: + workflow_run: + workflows: ['CI'] + types: ['requested'] + +jobs: + cancel-duplicate-workflow-runs: + name: "Cancel duplicate workflow runs" + runs-on: ubuntu-latest + steps: + - uses: potiuk/cancel-workflow-runs@master + name: "Cancel duplicate workflow runs" + with: + cancelMode: duplicates + token: ${{ secrets.GITHUB_TOKEN }} + sourceRunId: ${{ github.event.workflow_run.id }} From b0b36312e733ab8b402f0bf84b29421e4a900ced Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Thu, 8 Apr 2021 22:55:29 +0300 Subject: [PATCH 19/81] Some client code refactoring (#3077) * Some refactoring, fixed unnesasary rerenderss * Refactored filter * Refactored filter * Removed extra call of queryString() method --- cvat-core/src/project.js | 56 ++++++++++++------- cvat-ui/src/actions/annotation-actions.ts | 5 +- .../annotation-page/annotation-page.tsx | 4 +- .../objects-side-bar/labels-list.tsx | 14 ++--- .../annotation-page/top-bar/filters-modal.tsx | 39 +++++++------ .../annotation-page/top-bar/right-group.tsx | 12 ++-- .../create-project-content.tsx | 23 +++----- cvat-ui/src/components/cvat-app.tsx | 9 +-- .../components/layout-grid/layout-grid.tsx | 3 +- .../annotation-page/top-bar/filters-modal.tsx | 26 --------- cvat-ui/src/index.tsx | 9 +-- cvat-ui/src/reducers/annotation-reducer.ts | 4 ++ 12 files changed, 100 insertions(+), 104 deletions(-) delete mode 100644 cvat-ui/src/containers/annotation-page/top-bar/filters-modal.tsx diff --git a/cvat-core/src/project.js b/cvat-core/src/project.js index f4609d9d..0e2b5478 100644 --- a/cvat-core/src/project.js +++ b/cvat-core/src/project.js @@ -65,8 +65,8 @@ } data.task_subsets = Array.from(subsetsSet); } - if (initialData.training_project) { - data.training_project = JSON.parse(JSON.stringify(initialData.training_project)); + if (typeof initialData.training_project === 'object') { + data.training_project = { ...initialData.training_project }; } Object.defineProperties( @@ -222,21 +222,34 @@ subsets: { get: () => [...data.task_subsets], }, - - _internalData: { - get: () => data, - }, - - training_project: { - get: () => data.training_project, - set: (training) => { - if (training) { - data.training_project = JSON.parse(JSON.stringify(training)); + /** + * Training project associated with this annotation project + * This is a simple object which contains + * keys like host, username, password, enabled, project_class + * @name trainingProject + * @type {object} + * @memberof module:API.cvat.classes.Project + * @readonly + * @instance + */ + trainingProject: { + get: () => { + if (typeof data.training_project === 'object') { + return { ...data.training_project }; + } + return data.training_project; + }, + set: (updatedProject) => { + if (typeof training === 'object') { + data.training_project = { ...updatedProject }; } else { - data.training_project = training; + data.training_project = updatedProject; } }, }, + _internalData: { + get: () => data, + }, }), ); } @@ -278,33 +291,38 @@ }; Project.prototype.save.implementation = async function () { - let trainingProject; - if (this.training_project) { - trainingProject = JSON.parse(JSON.stringify(this.training_project)); - } + const trainingProjectCopy = this.trainingProject; if (typeof this.id !== 'undefined') { + // project has been already created, need to update some data const projectData = { name: this.name, assignee_id: this.assignee ? this.assignee.id : null, bug_tracker: this.bugTracker, labels: [...this._internalData.labels.map((el) => el.toJSON())], - training_project: trainingProject, }; + if (trainingProjectCopy) { + projectData.training_project = trainingProjectCopy; + } + await serverProxy.projects.save(this.id, projectData); return this; } + // initial creating const projectSpec = { name: this.name, labels: [...this.labels.map((el) => el.toJSON())], - training_project: trainingProject, }; if (this.bugTracker) { projectSpec.bug_tracker = this.bugTracker; } + if (trainingProjectCopy) { + projectSpec.training_project = trainingProjectCopy; + } + const project = await serverProxy.projects.create(projectSpec); return new Project(project); }; diff --git a/cvat-ui/src/actions/annotation-actions.ts b/cvat-ui/src/actions/annotation-actions.ts index a7afc3b1..898306a0 100644 --- a/cvat-ui/src/actions/annotation-actions.ts +++ b/cvat-ui/src/actions/annotation-actions.ts @@ -1068,7 +1068,10 @@ export function getJobAsync(tid: number, jid: number, initialFrame: number, init setTimeout(updatePredictorStatus, 20 * 1000); } }; - updatePredictorStatus(); + + if (state.plugins.list.PREDICT && job.task.projectId !== null) { + updatePredictorStatus(); + } dispatch(changeFrameAsync(frameNumber, false)); } catch (error) { diff --git a/cvat-ui/src/components/annotation-page/annotation-page.tsx b/cvat-ui/src/components/annotation-page/annotation-page.tsx index 3d1324a0..5bedffaa 100644 --- a/cvat-ui/src/components/annotation-page/annotation-page.tsx +++ b/cvat-ui/src/components/annotation-page/annotation-page.tsx @@ -16,7 +16,7 @@ import SubmitReviewModal from 'components/annotation-page/review/submit-review-m import StandardWorkspaceComponent from 'components/annotation-page/standard-workspace/standard-workspace'; import StandardWorkspace3DComponent from 'components/annotation-page/standard3D-workspace/standard3D-workspace'; import TagAnnotationWorkspace from 'components/annotation-page/tag-annotation-workspace/tag-annotation-workspace'; -import FiltersModalContainer from 'containers/annotation-page/top-bar/filters-modal'; +import FiltersModalComponent from 'components/annotation-page/top-bar/filters-modal'; import StatisticsModalContainer from 'containers/annotation-page/top-bar/statistics-modal'; import AnnotationTopBarContainer from 'containers/annotation-page/top-bar/top-bar'; import { Workspace } from 'reducers/interfaces'; @@ -131,7 +131,7 @@ export default function AnnotationPageComponent(props: Props): JSX.Element { )} - + diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx index b0955de0..99ee07ea 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/objects-side-bar/labels-list.tsx @@ -13,14 +13,12 @@ import GlobalHotKeys from 'utils/mousetrap-react'; function LabelsListComponent(): JSX.Element { const dispatch = useDispatch(); - const { - annotation: { - job: { labels }, - tabContentHeight: listHeight, - annotations: { activatedStateID, states }, - }, - shortcuts: { keyMap }, - } = useSelector((state: CombinedState) => state); + const labels = useSelector((state: CombinedState) => state.annotation.job.labels); + const listHeight = useSelector((state: CombinedState) => state.annotation.tabContentHeight); + const activatedStateID = useSelector((state: CombinedState) => state.annotation.annotations.activatedStateID); + const states = useSelector((state: CombinedState) => state.annotation.annotations.states); + const keyMap = useSelector((state: CombinedState) => state.shortcuts.keyMap); + const labelIDs = labels.map((label: any): number => label.id); const [keyToLabelMapping, setKeyToLabelMapping] = useState>( diff --git a/cvat-ui/src/components/annotation-page/top-bar/filters-modal.tsx b/cvat-ui/src/components/annotation-page/top-bar/filters-modal.tsx index dbc43d52..e1a76101 100644 --- a/cvat-ui/src/components/annotation-page/top-bar/filters-modal.tsx +++ b/cvat-ui/src/components/annotation-page/top-bar/filters-modal.tsx @@ -23,19 +23,15 @@ const { FieldDropdown } = AntdWidgets; const FILTERS_HISTORY = 'annotationFiltersHistory'; -interface Props { - visible: boolean; -} - interface StoredFilter { id: string; logic: JsonLogicTree; } -export default function FiltersModalComponent(props: Props): JSX.Element { - const { visible } = props; - const { labels } = useSelector((state: CombinedState) => state.annotation.job); - const { filters: activeFilters } = useSelector((state: CombinedState) => state.annotation.annotations); +function FiltersModalComponent(): JSX.Element { + const labels = useSelector((state: CombinedState) => state.annotation.job.labels); + const activeFilters = useSelector((state: CombinedState) => state.annotation.annotations.filters); + const visible = useSelector((state: CombinedState) => state.annotation.filtersPanelVisible); const getConvertedInputType = (inputType: string): string => { switch (inputType) { @@ -234,18 +230,23 @@ export default function FiltersModalComponent(props: Props): JSX.Element { const menu = ( {filters - .filter((filter: StoredFilter) => { - const tree = QbUtils.loadFromJsonLogic(filter.logic, config); - return !!QbUtils.queryString(tree, config); - }) .map((filter: StoredFilter) => { + // if a logic received from local storage does not correspond to current config + // which depends on label specification + // (it can be when history from another task with another specification or when label was removed) + // loadFromJsonLogic() prints a warning to console + // the are not ways to configure this behaviour + const tree = QbUtils.loadFromJsonLogic(filter.logic, config); - return ( - setState({ tree, config })}> - {QbUtils.queryString(tree, config)} - - ); - })} + const queryString = QbUtils.queryString(tree, config); + return { tree, queryString, filter }; + }) + .filter(({ queryString }) => !!queryString) + .map(({ filter, tree, queryString }) => ( + setState({ tree, config })}> + {queryString} + + ))} ); @@ -286,3 +287,5 @@ export default function FiltersModalComponent(props: Props): JSX.Element { ); } + +export default React.memo(FiltersModalComponent); diff --git a/cvat-ui/src/components/annotation-page/top-bar/right-group.tsx b/cvat-ui/src/components/annotation-page/top-bar/right-group.tsx index b91e575f..c4727e6a 100644 --- a/cvat-ui/src/components/annotation-page/top-bar/right-group.tsx +++ b/cvat-ui/src/components/annotation-page/top-bar/right-group.tsx @@ -47,8 +47,8 @@ function RightGroup(props: Props): JSX.Element { isTrainingActive, showFilters, } = props; - predictor.annotationAmount = predictor.annotationAmount ? predictor.annotationAmount : 0; - predictor.mediaAmount = predictor.mediaAmount ? predictor.mediaAmount : 0; + const annotationAmount = predictor.annotationAmount || 0; + const mediaAmount = predictor.mediaAmount || 0; const formattedScore = `${(predictor.projectScore * 100).toFixed(0)}%`; const predictorTooltip = (
@@ -65,15 +65,15 @@ function RightGroup(props: Props): JSX.Element {
Annotations amount: - {predictor.annotationAmount} + {annotationAmount}
Media amount: - {predictor.mediaAmount} + {mediaAmount}
- {predictor.annotationAmount > 0 ? ( + {annotationAmount > 0 ? ( Model mAP is {' '} @@ -139,7 +139,7 @@ function RightGroup(props: Props): JSX.Element { - {predictor.annotationAmount ? `mAP ${formattedScore}` : 'not trained'} + {annotationAmount ? `mAP ${formattedScore}` : 'not trained'} )}