Release 0.2.0

main
Nikita Manovich 8 years ago committed by GitHub
commit 04e4b4aabe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

29
.gitattributes vendored

@ -0,0 +1,29 @@
* text=auto whitespace=trailing-space,space-before-tab,-indent-with-non-tab,tab-in-indent,tabwidth=4
.git* text export-ignore
*.txt text
*.htm text
*.html text
*.js text
*.py text
*.css text
*.md text
*.yml text
Dockerfile text
LICENSE text
*.conf text
*.mimetypes text
*.sh text eol=lf
*.avi binary
*.bmp binary
*.exr binary
*.ico binary
*.jpeg binary
*.jpg binary
*.png binary
*.gif binary
*.ttf binary
*.pdf binary

@ -0,0 +1,81 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.2.0] - 2018-09-28
### Added
- New annotation shapes: polygons, polylines, points
- Undo/redo feature
- Grid to estimate size of objects
- Context menu for shapes
- A converter to PASCAL VOC format
- A converter to MS COCO format
- A converter to mask format
- License header for most of all files
- .gitattribute to avoid problems with bash scripts inside a container
- CHANGELOG.md itself
- Drawing size of a bounding box during resize
- Color by instance, group, label
- Group objects
- Object propagation on next frames
- Full screen view
### Changed
- Documentation, screencasts, the primary screenshot
- Content-type for save_job request is application/json
### Fixed
- Player navigation if the browser's window is scrolled
- Filter doesn't support dash (-)
- Several memory leaks
- Inconsistent extensions between filenames in an annotation file and real filenames
## [0.1.2] - 2018-08-07
### Added
- 7z archive support when creating a task
- .vscode/launch.json file for developing with VS code
### Fixed
- #14: docker-compose down command as written in the readme does not remove volumes
- #15: all checkboxes in temporary attributes are checked when reopening job after saving the job
- #18: extend CONTRIBUTING.md
- #19: using the same attribute for label twice -> stuck
### Changed
- More strict verification for labels with attributes
## [0.1.1] - 2018-07-6
### Added
- Links on a screenshot, documentation, screencasts into README.md
- CONTRIBUTORS.md
### Fixed
- GitHub documentation
## 0.1.0 - 2018-06-29
### Added
- Initial version
## Template
```
## [Unreleased]
### Added
-
### Changed
-
### Deprecated
-
### Removed
-
### Fixed
-
### Security
-
```

@ -2,52 +2,3 @@
When contributing to this repository, please first discuss the change you wish to make via issue, When contributing to this repository, please first discuss the change you wish to make via issue,
email, or any other method with the owners of this repository before making a change. email, or any other method with the owners of this repository before making a change.
## Development environment
Next steps should work on clear Ubuntu 18.04.
- Install necessary dependencies:
```sh
$ sudo apt-get install -y curl redis-server python3-dev python3-pip python3-venv libldap2-dev libsasl2-dev
```
- Install [Visual Studio Code](https://code.visualstudio.com/docs/setup/linux#_debian-and-ubuntu-based-distributions) for development
- Install CVAT on your local host:
```sh
$ git clone https://github.com/opencv/cvat
$ cd cvat && mkdir logs keys
$ python3 -m venv .env
$ . .env/bin/activate
$ pip install -U pip wheel
$ pip install -r cvat/requirements/development.txt
$ python manage.py migrate
$ python manage.py collectstatic
```
- Create a super user for CVAT:
```sh
$ python manage.py createsuperuser
Username (leave blank to use 'django'): ***
Email address: ***
Password: ***
Password (again): ***
```
- Run Visual Studio Code from the virtual environment
```
$ code .
```
- Inside Visual Studio Code install [Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) and [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) extensions
- Reload Visual Studio Code
- Select `CVAT Debugging` configuration and start debugging (F5)
You have done! Now it is possible to insert breakpoints and debug server and client of the tool.

@ -10,7 +10,7 @@
* Primary developer * Primary developer
* Author and maintainer * Author and maintainer
- **[Andrey Zhavoronkov]()** - **[Andrey Zhavoronkov](https://github.com/azhavoro)**
* Developer * Developer
* Author and maintainer * Author and maintainer
@ -18,8 +18,13 @@
# Contributors # Contributors
- **[Victor Salimonov](https://github.com/VikTorSalimonov)** - **[Victor Salimonov](https://github.com/VikTorSalimonov)**
* Documentation, screencasts * Documentation, screencasts
- **[Dmitry Sidnev](https://github.com/DmitriySidnev)**
* [convert_to_coco.py](utils/coco) - an utility for converting annotation from CVAT to COCO data annotation format
- **[Sebastián Yonekura](https://github.com/syonekura)** - **[Sebastián Yonekura](https://github.com/syonekura)**
* [convert_to_voc.py](cvat/utils/convert_to_voc.py) - an utility for
converting CVAT XML to PASCAL VOC data annotation format. * [convert_to_voc.py](utils/voc) - an utility for converting CVAT XML to PASCAL VOC data annotation format.

@ -87,6 +87,7 @@ COPY supervisord.conf mod_wsgi.conf wait-for-it.sh manage.py ${HOME}/
RUN pip3 install --no-cache-dir -r /tmp/requirements/${DJANGO_CONFIGURATION}.txt RUN pip3 install --no-cache-dir -r /tmp/requirements/${DJANGO_CONFIGURATION}.txt
COPY cvat/ ${HOME}/cvat COPY cvat/ ${HOME}/cvat
COPY tests ${HOME}/tests COPY tests ${HOME}/tests
RUN patch -p1 < ${HOME}/cvat/apps/engine/static/engine/js/3rdparty.patch
RUN chown -R ${USER}:${USER} . RUN chown -R ${USER}:${USER} .
# RUN all commands below as 'django' user # RUN all commands below as 'django' user

@ -1,21 +1,21 @@
MIT License Copyright (C) 2018 Intel Corporation
 
Copyright (c) 2018 annotation
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"),
in the Software without restriction, including without limitation the rights to deal in the Software without restriction, including without limitation
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell the rights to use, copy, modify, merge, publish, distribute, sublicense,
copies of the Software, and to permit persons to whom the Software is and/or sell copies of the Software, and to permit persons to whom
furnished to do so, subject to the following conditions: the Software is furnished to do so, subject to the following conditions:
 
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included
copies or substantial portions of the Software. in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
SOFTWARE. OR OTHER DEALINGS IN THE SOFTWARE.
 
SPDX-License-Identifier: MIT

@ -2,7 +2,7 @@
CVAT is completely re-designed and re-implemented version of [Video Annotation Tool from Irvine, California](http://carlvondrick.com/vatic/) tool. It is free, online, interactive video and image annotation tool for computer vision. It is being used by our team to annotate million of objects with different properties. Many UI and UX decisions are based on feedbacks from professional data annotation team. CVAT is completely re-designed and re-implemented version of [Video Annotation Tool from Irvine, California](http://carlvondrick.com/vatic/) tool. It is free, online, interactive video and image annotation tool for computer vision. It is being used by our team to annotate million of objects with different properties. Many UI and UX decisions are based on feedbacks from professional data annotation team.
![CVAT screenshot](cvat/apps/documentation/static/documentation/images/gif003.gif) ![CVAT screenshot](cvat/apps/documentation/static/documentation/images/cvat.jpg)
## Documentation ## Documentation
@ -11,9 +11,10 @@ CVAT is completely re-designed and re-implemented version of [Video Annotation T
## Screencasts ## Screencasts
- [Annotation mode](https://www.youtube.com/watch?v=uSqaQENdyJE) - [Annotation mode](https://youtu.be/6h7HxGL6Ct4)
- [Interpolation mode](https://www.youtube.com/watch?v=sc5X5hvxNfA) - [Interpolation mode](https://youtu.be/U3MYDhESHo4)
- [Attribute mode](https://www.youtube.com/watch?v=5yXaG0V7X0Q) - [Attribute mode](https://youtu.be/UPNfWl8Egd8)
- [Segmentation mode](https://youtu.be/6IJ0QN7PBKo)
## LICENSE ## LICENSE
@ -82,7 +83,8 @@ Type your login/password for the superuser [on the login page](http://localhost:
### Stop all containers ### Stop all containers
The command below will stop and remove containers and networks created by `up`. See documentation for [docker-compose down](https://docs.docker.com/compose/reference/down/) for more details. The command below will stop and remove containers, networks, volumes, and images
created by `up`.
```bash ```bash
docker-compose down docker-compose down
@ -116,3 +118,26 @@ cvat:
environment: environment:
DJANGO_LOG_SERVER_URL: https://annotation.example.com:5000 DJANGO_LOG_SERVER_URL: https://annotation.example.com:5000
``` ```
### Share path
You can use a share storage for data uploading during you are creating a task. To do that you can mount it to CVAT docker container. Example of docker-compose.override.yml for this purpose:
```yml
version: "2.3"
services:
cvat:
environment:
CVAT_SHARE_URL: "Mounted from /mnt/share host directory"
volumes:
cvat_share:/home/django/share:ro
volumes:
cvat_share:
driver_opts:
type: none
device: /mnt/share
o: bind
```
You can change the share device path to your actual share. For user convenience we have defined the enviroment variable $CVAT_SHARE_URL. This variable contains a text (url for example) which will be being shown in the client-share browser.

@ -0,0 +1,5 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT

@ -1 +1,7 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
default_app_config = 'cvat.apps.authentication.apps.AuthenticationConfig' default_app_config = 'cvat.apps.authentication.apps.AuthenticationConfig'

@ -1,3 +1,9 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.contrib import admin from django.contrib import admin
# Register your models here. # Register your models here.

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.apps import AppConfig from django.apps import AppConfig
from django.db.models.signals import post_migrate, post_save from django.db.models.signals import post_migrate, post_save
from .settings.authentication import DJANGO_AUTH_TYPE from .settings.authentication import DJANGO_AUTH_TYPE

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.auth import REDIRECT_FIELD_NAME
from django.shortcuts import resolve_url, reverse from django.shortcuts import resolve_url, reverse
from django.http import JsonResponse from django.http import JsonResponse

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.contrib.auth.forms import ( from django.contrib.auth.forms import (
UsernameField, UsernameField,
AuthenticationForm, AuthenticationForm,

@ -0,0 +1,5 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT

@ -1,3 +1,9 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.db import models from django.db import models
# Create your models here. # Create your models here.

@ -0,0 +1,5 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.conf import settings from django.conf import settings
import ldap import ldap
from django_auth_ldap.config import LDAPSearch, NestedActiveDirectoryGroupType from django_auth_ldap.config import LDAPSearch, NestedActiveDirectoryGroupType

@ -1,2 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
# Specify groups that new users will have # Specify groups that new users will have
AUTH_SIMPLE_DEFAULT_GROUPS = [] AUTH_SIMPLE_DEFAULT_GROUPS = []

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.conf import settings from django.conf import settings
import os import os

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings

@ -1,3 +1,8 @@
<!--
Copyright (C) 2018 Intel Corporation
SPDX-License-Identifier: MIT
-->
{% extends "auth_base.html" %} {% extends "auth_base.html" %}
{% block title %}Forbidden{% endblock %} {% block title %}Forbidden{% endblock %}

@ -1,3 +1,8 @@
<!--
Copyright (C) 2018 Intel Corporation
SPDX-License-Identifier: MIT
-->
{% extends "auth_base.html" %} {% extends "auth_base.html" %}
{% block title %}Login{% endblock %} {% block title %}Login{% endblock %}

@ -1,3 +1,8 @@
<!--
Copyright (C) 2018 Intel Corporation
SPDX-License-Identifier: MIT
-->
{% extends "auth_base.html" %} {% extends "auth_base.html" %}
{% block title %}Login{% endblock %} {% block title %}Login{% endblock %}

@ -1,2 +1,7 @@
<!--
Copyright (C) 2018 Intel Corporation
SPDX-License-Identifier: MIT
-->
<p> <p>
</p> </p>

@ -1,3 +1,8 @@
<!--
Copyright (C) 2018 Intel Corporation
SPDX-License-Identifier: MIT
-->
{% extends "auth_base.html" %} {% extends "auth_base.html" %}
{% block title %}Create user{% endblock %} {% block title %}Create user{% endblock %}

@ -1,3 +1,8 @@
<!--
Copyright (C) 2018 Intel Corporation
SPDX-License-Identifier: MIT
-->
<div class='userProfile'> <div class='userProfile'>
{% if user.is_authenticated %} {% if user.is_authenticated %}
{% if user.ldap_user and 'thumbnailPhoto' in user.ldap_user.attrs %} {% if user.ldap_user and 'thumbnailPhoto' in user.ldap_user.attrs %}

@ -1,3 +1,9 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.test import TestCase from django.test import TestCase
# Create your tests here. # Create your tests here.

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.urls import path from django.urls import path
import os import os

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.shortcuts import render from django.shortcuts import render
from django.contrib.auth.views import LoginView from django.contrib.auth.views import LoginView
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect

@ -0,0 +1,5 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT

@ -1,3 +1,9 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.contrib import admin from django.contrib import admin
# Register your models here. # Register your models here.

@ -1,5 +1,11 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.apps import AppConfig from django.apps import AppConfig
class DashboardConfig(AppConfig): class DashboardConfig(AppConfig):
name = 'dashboard' name = 'dashboard'

@ -0,0 +1,5 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT

@ -1,3 +1,9 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.db import models from django.db import models
# Create your models here. # Create your models here.

@ -1,9 +1,16 @@
/*
* Copyright (C) 2018 Intel Corporation
*
* SPDX-License-Identifier: MIT
*/
"use strict"; "use strict";
/* Dashboard entrypoint */ /* Dashboard entrypoint */
window.cvat = window.cvat || {}; window.cvat = window.cvat || {};
window.cvat.dashboard = window.cvat.dashboard || {}; window.cvat.dashboard = window.cvat.dashboard || {};
window.cvat.dashboard.uiCallbacks = window.cvat.dashboard.uiCallbacks || []; window.cvat.dashboard.uiCallbacks = window.cvat.dashboard.uiCallbacks || [];
window.cvat.config = new Config();
window.cvat.dashboard.uiCallbacks.push(function(elements) { window.cvat.dashboard.uiCallbacks.push(function(elements) {
elements.each(function(idx) { elements.each(function(idx) {
@ -93,6 +100,7 @@ function setupTaskCreator() {
let cancelBrowseServer = $('#dashboardCancelBrowseServer'); let cancelBrowseServer = $('#dashboardCancelBrowseServer');
let submitBrowseServer = $('#dashboardSubmitBrowseServer'); let submitBrowseServer = $('#dashboardSubmitBrowseServer');
let flipImagesBox = $('#dashboardFlipImages'); let flipImagesBox = $('#dashboardFlipImages');
let zOrderBox = $('#dashboardZOrder');
let segmentSizeInput = $('#dashboardSegmentSize'); let segmentSizeInput = $('#dashboardSegmentSize');
let customSegmentSize = $('#dashboardCustomSegment'); let customSegmentSize = $('#dashboardCustomSegment');
let overlapSizeInput = $('#dashboardOverlap'); let overlapSizeInput = $('#dashboardOverlap');
@ -109,6 +117,7 @@ function setupTaskCreator() {
let bugTrackerLink = bugTrackerInput.prop('value'); let bugTrackerLink = bugTrackerInput.prop('value');
let source = 'local'; let source = 'local';
let flipImages = false; let flipImages = false;
let zOrder = false;
let segmentSize = 5000; let segmentSize = 5000;
let overlapSize = 0; let overlapSize = 0;
let compressQuality = 50; let compressQuality = 50;
@ -168,7 +177,13 @@ function setupTaskCreator() {
updateSelectedFiles(); updateSelectedFiles();
}); });
flipImagesBox.on('click', (e) => {flipImages = e.target.checked;}); flipImagesBox.on('click', (e) => {
flipImages = e.target.checked;
});
zOrderBox.on('click', (e) => {
zOrder = e.target.checked;
});
customSegmentSize.on('change', (e) => segmentSizeInput.prop('disabled', !e.target.checked)); customSegmentSize.on('change', (e) => segmentSizeInput.prop('disabled', !e.target.checked));
customOverlapSize.on('change', (e) => overlapSizeInput.prop('disabled', !e.target.checked)); customOverlapSize.on('change', (e) => overlapSizeInput.prop('disabled', !e.target.checked));
customCompressQuality.on('change', (e) => imageQualityInput.prop('disabled', !e.target.checked)); customCompressQuality.on('change', (e) => imageQualityInput.prop('disabled', !e.target.checked));
@ -258,6 +273,7 @@ function setupTaskCreator() {
taskData.append('bug_tracker_link', bugTrackerLink); taskData.append('bug_tracker_link', bugTrackerLink);
taskData.append('labels', labels); taskData.append('labels', labels);
taskData.append('flip_flag', flipImages); taskData.append('flip_flag', flipImages);
taskData.append('z_order', zOrder);
taskData.append('storage', source); taskData.append('storage', source);
if (customSegmentSize.prop('checked')) { if (customSegmentSize.prop('checked')) {
@ -285,7 +301,11 @@ function setupTaskCreator() {
taskMessage.css('color', 'red'); taskMessage.css('color', 'red');
taskMessage.text(response); taskMessage.text(response);
}, },
() => submitCreate.prop('disabled', false)); () => submitCreate.prop('disabled', false),
(status) => {
taskMessage.css('color', 'blue');
taskMessage.text(status);
});
}); });
function updateSelectedFiles() { function updateSelectedFiles() {
@ -385,7 +405,7 @@ function setupSearch() {
/* Server requests */ /* Server requests */
function createTaskRequest(oData, onSuccessRequest, onSuccessCreate, onError, onComplete) { function createTaskRequest(oData, onSuccessRequest, onSuccessCreate, onError, onComplete, onUpdateStatus) {
$.ajax({ $.ajax({
url: '/create/task', url: '/create/task',
type: 'POST', type: 'POST',
@ -433,6 +453,9 @@ function createTaskRequest(oData, onSuccessRequest, onSuccessCreate, onError, on
onComplete(); onComplete();
onError(data.stderr); onError(data.stderr);
} }
else if (data['state'] == 'started' && 'status' in data) {
onUpdateStatus(data['status']);
}
} }
} }
} }
@ -488,7 +511,7 @@ function uploadAnnotationRequest() {
function loadXML(e) { function loadXML(e) {
input.remove(); input.remove();
let overlay = showOverlay("File uploading.."); let overlay = showOverlay("File is being uploaded..");
let file = e.target.files[0]; let file = e.target.files[0];
let fileReader = new FileReader(); let fileReader = new FileReader();
fileReader.onload = (e) => parseFile(e, overlay); fileReader.onload = (e) => parseFile(e, overlay);
@ -501,24 +524,25 @@ function uploadAnnotationRequest() {
$.ajax({ $.ajax({
url: '/get/task/' + window.cvat.dashboard.taskID, url: '/get/task/' + window.cvat.dashboard.taskID,
success: function(data) { success: function(data) {
let labels = new LabelsInfo(data.spec); let annotationParser = new AnnotationParser({
let fakeJob = {
start: 0, start: 0,
stop: data.size stop: data.size,
}; image_meta_data: data.image_meta_data,
let annotationParser = new AnnotationParser(labels, fakeJob); flipped: data.flipped
}, new LabelsInfo(data.spec));
let asyncParse = function() {
let parsed = null; let parsed = null;
try { try {
parsed = annotationParser.parse(xmlText); parsed = annotationParser.parse(xmlText);
} }
catch(error) { catch(error) {
let message = "Parsing errors was occured. " + error;
showMessage(message);
overlay.remove(); overlay.remove();
showMessage("Parsing errors was occured. " + error);
return; return;
} }
overlay.setMessage('Annotation saving..');
let asyncSave = function() {
$.ajax({ $.ajax({
url: '/save/annotation/task/' + window.cvat.dashboard.taskID, url: '/save/annotation/task/' + window.cvat.dashboard.taskID,
type: 'POST', type: 'POST',
@ -534,6 +558,14 @@ function uploadAnnotationRequest() {
}, },
complete: () => overlay.remove() complete: () => overlay.remove()
}); });
};
overlay.setMessage('Annotation is being saved..');
setTimeout(asyncSave);
};
overlay.setMessage('File is being parsed..');
setTimeout(asyncParse);
}, },
error: function(response) { error: function(response) {
overlay.remove(); overlay.remove();

@ -1,3 +1,9 @@
/*
* Copyright (C) 2018 Intel Corporation
*
* SPDX-License-Identifier: MIT
*/
.dashboardTaskUI { .dashboardTaskUI {
margin: 5px auto; margin: 5px auto;
width: 1200px; width: 1200px;

@ -1,3 +1,8 @@
<!--
Copyright (C) 2018 Intel Corporation
SPDX-License-Identifier: MIT
-->
{% extends 'engine/base.html' %} {% extends 'engine/base.html' %}
{% load static %} {% load static %}
{% load pagination_tags %} {% load pagination_tags %}
@ -25,9 +30,8 @@
<script type="text/javascript" src="{% static 'dashboard/js/dashboard.js' %}"></script> <script type="text/javascript" src="{% static 'dashboard/js/dashboard.js' %}"></script>
<script type="text/javascript" src="{% static 'engine/js/listener.js' %}"></script> <script type="text/javascript" src="{% static 'engine/js/listener.js' %}"></script>
<script type="text/javascript" src="{% static 'engine/js/labelsInfo.js' %}"></script> <script type="text/javascript" src="{% static 'engine/js/labelsInfo.js' %}"></script>
<script type="text/javascript" src="{% static 'engine/js/shapes.js' %}"></script>
<script type="text/javascript" src="{% static 'engine/js/annotationParser.js' %}"></script> <script type="text/javascript" src="{% static 'engine/js/annotationParser.js' %}"></script>
<script type="text/javascript" src="{% static 'engine/js/trackModel.js' %}"></script>
<script type="text/javascript" src="{% static 'engine/js/collectionModel.js' %}"></script>
<script type="text/javascript" src="{% static 'engine/js/server.js' %}"></script> <script type="text/javascript" src="{% static 'engine/js/server.js' %}"></script>
<script> <script>
window.maxUploadSize = {{ max_upload_size }}; window.maxUploadSize = {{ max_upload_size }};
@ -102,8 +106,8 @@ Example: @select=race:__undefined__,skip,asian,black,caucasian,other'/>
<tr> <tr>
<td> <label class="regular h2"> Source: </label> </td> <td> <label class="regular h2"> Source: </label> </td>
<td> <td>
<input id="dashboardLocalSource" type="radio" name="sourceType" value="local" checked=true/> <label class="regular h2" for="localSource"> Local </label> <input id="dashboardLocalSource" type="radio" name="sourceType" value="local" checked=true/> <label for="dashboardLocalSource" class="regular h2" for="localSource"> Local </label>
<br> <input id="dashboardShareSource" type="radio" name="sourceType" value="share"/> <label class="regular h2" for="shareSource"> Share </label> <br> <input id="dashboardShareSource" type="radio" name="sourceType" value="share"/> <label for="dashboardShareSource" class="regular h2" for="shareSource"> Share </label>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -114,6 +118,14 @@ Example: @select=race:__undefined__,skip,asian,black,caucasian,other'/>
<input type="checkbox" id="dashboardFlipImages"/> <input type="checkbox" id="dashboardFlipImages"/>
</td> </td>
</tr> </tr>
<tr>
<td>
<label class="regular h2"> Z-Order </label>
</td>
<td>
<input type="checkbox" id="dashboardZOrder"/>
</td>
</tr>
<tr> <tr>
<td> <td>
<label class="regular h2"> Overlap Size </label> <label class="regular h2"> Overlap Size </label>
@ -165,7 +177,7 @@ Example: @select=race:__undefined__,skip,asian,black,caucasian,other'/>
<div id="dashboardShareBrowseModal" class="modal hidden"> <div id="dashboardShareBrowseModal" class="modal hidden">
<div style="width: 600px; height: 400px;" class="modal-content noSelect"> <div style="width: 600px; height: 400px;" class="modal-content noSelect">
<center> <label class="regular h1"> //icv-cifs/icv_projects/cvat/data </label> </center> <center> <label class="regular h1"> {{ share_path }} </label> </center>
<div id="dashboardShareBrowser"> </div> <div id="dashboardShareBrowser"> </div>
<center> <center>
<button id="dashboardCancelBrowseServer" class="regular h2" style="margin: 0px 10px"> Cancel </button> <button id="dashboardCancelBrowseServer" class="regular h2" style="margin: 0px 10px"> Cancel </button>

@ -1,3 +1,8 @@
<!--
Copyright (C) 2018 Intel Corporation
SPDX-License-Identifier: MIT
-->
<div class="dashboardTaskUI" id="dashboardTask_{{item.task_id}}"> <div class="dashboardTaskUI" id="dashboardTask_{{item.task_id}}">
<center class="dashboardTitleWrapper"> <center class="dashboardTitleWrapper">
<label class="semiBold h1 dashboardTaskNameLabel selectable"> {{ item.name }} </label> <label class="semiBold h1 dashboardTaskNameLabel selectable"> {{ item.name }} </label>

@ -1,3 +1,9 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.test import TestCase from django.test import TestCase
# Create your tests here. # Create your tests here.

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.urls import path from django.urls import path
from . import views from . import views
@ -5,3 +10,4 @@ urlpatterns = [
path('get_share_nodes', views.JsTreeView), path('get_share_nodes', views.JsTreeView),
path('', views.DashboardView), path('', views.DashboardView),
] ]

@ -1,3 +1,8 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.http import HttpResponse, JsonResponse, HttpResponseBadRequest from django.http import HttpResponse, JsonResponse, HttpResponseBadRequest
from django.shortcuts import redirect from django.shortcuts import redirect
from django.shortcuts import render from django.shortcuts import render
@ -108,5 +113,6 @@ def DashboardView(request):
'data': data, 'data': data,
'max_upload_size': settings.LOCAL_LOAD_MAX_FILES_SIZE, 'max_upload_size': settings.LOCAL_LOAD_MAX_FILES_SIZE,
'max_upload_count': settings.LOCAL_LOAD_MAX_FILES_COUNT, 'max_upload_count': settings.LOCAL_LOAD_MAX_FILES_COUNT,
'share_path': os.getenv('CVAT_SHARE_URL', default=r'${cvat_root}/share'),
'js_3rdparty': JS_3RDPARTY.get('dashboard', []) 'js_3rdparty': JS_3RDPARTY.get('dashboard', [])
}) })

@ -1,3 +1,9 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from cvat.settings.base import JS_3RDPARTY from cvat.settings.base import JS_3RDPARTY
JS_3RDPARTY['dashboard'] = JS_3RDPARTY.get('dashboard', []) + ['documentation/js/shortcuts.js'] JS_3RDPARTY['dashboard'] = JS_3RDPARTY.get('dashboard', []) + ['documentation/js/shortcuts.js']

@ -1,3 +1,9 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.contrib import admin from django.contrib import admin
# Register your models here. # Register your models here.

@ -1,5 +1,11 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.apps import AppConfig from django.apps import AppConfig
class DocumentationConfig(AppConfig): class DocumentationConfig(AppConfig):
name = 'cvat.apps.documentation' name = 'cvat.apps.documentation'

@ -0,0 +1,5 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT

@ -1,3 +1,9 @@
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
from django.db import models from django.db import models
# Create your models here. # Create your models here.

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save