Update Datumaro dependency to 0.2.0 (#3813)
parent
78158cbcf5
commit
b57467937a
@ -0,0 +1,67 @@
|
|||||||
|
# Copyright (C) 2019 Intel Corporation
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
from tempfile import TemporaryDirectory
|
||||||
|
|
||||||
|
from datumaro.components.dataset import Dataset
|
||||||
|
from datumaro.components.extractor import ItemTransform
|
||||||
|
from datumaro.util.image import Image
|
||||||
|
from pyunpack import Archive
|
||||||
|
|
||||||
|
from cvat.apps.dataset_manager.bindings import (GetCVATDataExtractor,
|
||||||
|
import_dm_annotations)
|
||||||
|
from cvat.apps.dataset_manager.util import make_zip_archive
|
||||||
|
from cvat.apps.engine.models import DimensionType
|
||||||
|
|
||||||
|
from .registry import dm_env, exporter, importer
|
||||||
|
|
||||||
|
class DeleteImagePath(ItemTransform):
|
||||||
|
def transform_item(self, item):
|
||||||
|
image = None
|
||||||
|
if item.has_image and item.image.has_data:
|
||||||
|
image = Image(data=item.image.data, size=item.image.size)
|
||||||
|
return item.wrap(image=image, point_cloud='', related_images=[])
|
||||||
|
|
||||||
|
|
||||||
|
@exporter(name="Datumaro", ext="ZIP", version="1.0")
|
||||||
|
def _export(dst_file, instance_data, save_images=False):
|
||||||
|
dataset = Dataset.from_extractors(GetCVATDataExtractor(
|
||||||
|
instance_data=instance_data, include_images=save_images), env=dm_env)
|
||||||
|
if not save_images:
|
||||||
|
dataset.transform(DeleteImagePath)
|
||||||
|
with TemporaryDirectory() as tmp_dir:
|
||||||
|
dataset.export(tmp_dir, 'datumaro', save_images=save_images)
|
||||||
|
|
||||||
|
make_zip_archive(tmp_dir, dst_file)
|
||||||
|
|
||||||
|
@importer(name="Datumaro", ext="ZIP", version="1.0")
|
||||||
|
def _import(src_file, instance_data):
|
||||||
|
with TemporaryDirectory() as tmp_dir:
|
||||||
|
Archive(src_file.name).extractall(tmp_dir)
|
||||||
|
|
||||||
|
dataset = Dataset.import_from(tmp_dir, 'datumaro', env=dm_env)
|
||||||
|
|
||||||
|
import_dm_annotations(dataset, instance_data)
|
||||||
|
|
||||||
|
@exporter(name="Datumaro 3D", ext="ZIP", version="1.0", dimension=DimensionType.DIM_3D)
|
||||||
|
def _export(dst_file, instance_data, save_images=False):
|
||||||
|
dataset = Dataset.from_extractors(GetCVATDataExtractor(
|
||||||
|
instance_data=instance_data, include_images=save_images,
|
||||||
|
dimension=DimensionType.DIM_3D), env=dm_env)
|
||||||
|
|
||||||
|
if not save_images:
|
||||||
|
dataset.transform(DeleteImagePath)
|
||||||
|
with TemporaryDirectory() as tmp_dir:
|
||||||
|
dataset.export(tmp_dir, 'datumaro', save_images=save_images)
|
||||||
|
|
||||||
|
make_zip_archive(tmp_dir, dst_file)
|
||||||
|
|
||||||
|
@importer(name="Datumaro 3D", ext="ZIP", version="1.0", dimension=DimensionType.DIM_3D)
|
||||||
|
def _import(src_file, instance_data):
|
||||||
|
with TemporaryDirectory() as tmp_dir:
|
||||||
|
Archive(src_file.name).extractall(tmp_dir)
|
||||||
|
|
||||||
|
dataset = Dataset.import_from(tmp_dir, 'datumaro', env=dm_env)
|
||||||
|
|
||||||
|
import_dm_annotations(dataset, instance_data)
|
||||||
@ -1,102 +0,0 @@
|
|||||||
# Copyright (C) 2019 Intel Corporation
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import os.path as osp
|
|
||||||
import shutil
|
|
||||||
from tempfile import TemporaryDirectory
|
|
||||||
|
|
||||||
from cvat.apps.dataset_manager.bindings import (GetCVATDataExtractor,
|
|
||||||
import_dm_annotations, ProjectData)
|
|
||||||
from cvat.apps.dataset_manager.util import make_zip_archive
|
|
||||||
from cvat.settings.base import BASE_DIR
|
|
||||||
from datumaro.components.project import Project
|
|
||||||
|
|
||||||
from ..registry import dm_env, exporter
|
|
||||||
|
|
||||||
|
|
||||||
@exporter(name="Datumaro", ext="ZIP", version="1.0")
|
|
||||||
class DatumaroProjectExporter:
|
|
||||||
_REMOTE_IMAGES_EXTRACTOR = 'cvat_rest_api_task_images'
|
|
||||||
_TEMPLATES_DIR = osp.join(osp.dirname(__file__), 'export_templates')
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _save_image_info(save_dir, instance_data):
|
|
||||||
os.makedirs(save_dir, exist_ok=True)
|
|
||||||
|
|
||||||
config = {
|
|
||||||
'server_url': instance_data._host or 'localhost'
|
|
||||||
}
|
|
||||||
if isinstance(instance_data, ProjectData):
|
|
||||||
config['project_id'] = instance_data.db_project.id
|
|
||||||
else:
|
|
||||||
config['task_id'] = instance_data.db_task.id
|
|
||||||
|
|
||||||
images = []
|
|
||||||
images_meta = { 'images': images, }
|
|
||||||
for frame_id, frame in enumerate(instance_data.frame_info.values()):
|
|
||||||
image_info = {
|
|
||||||
'id': frame_id,
|
|
||||||
'name': osp.basename(frame['path']),
|
|
||||||
'width': frame['width'],
|
|
||||||
'height': frame['height'],
|
|
||||||
}
|
|
||||||
if isinstance(instance_data, ProjectData):
|
|
||||||
image_info['subset'] = frame['subset']
|
|
||||||
|
|
||||||
with open(osp.join(save_dir, 'config.json'),
|
|
||||||
'w', encoding='utf-8') as config_file:
|
|
||||||
json.dump(config, config_file)
|
|
||||||
with open(osp.join(save_dir, 'images_meta.json'),
|
|
||||||
'w', encoding='utf-8') as images_file:
|
|
||||||
json.dump(images_meta, images_file)
|
|
||||||
|
|
||||||
def _export(self, instance_data, save_dir, save_images=False):
|
|
||||||
dataset = GetCVATDataExtractor(instance_data, include_images=save_images)
|
|
||||||
db_instance = instance_data.db_project if isinstance(instance_data, ProjectData) else instance_data.db_task
|
|
||||||
dm_env.converters.get('datumaro_project').convert(dataset,
|
|
||||||
save_dir=save_dir, save_images=save_images,
|
|
||||||
project_config={ 'project_name': db_instance.name, }
|
|
||||||
)
|
|
||||||
|
|
||||||
project = Project.load(save_dir)
|
|
||||||
target_dir = project.config.project_dir
|
|
||||||
os.makedirs(target_dir, exist_ok=True)
|
|
||||||
shutil.copyfile(
|
|
||||||
osp.join(self._TEMPLATES_DIR, 'README.md'),
|
|
||||||
osp.join(target_dir, 'README.md'))
|
|
||||||
|
|
||||||
if not save_images:
|
|
||||||
# add remote links to images
|
|
||||||
source_name = '{}_{}_images'.format(
|
|
||||||
'project' if isinstance(instance_data, ProjectData) else 'task',
|
|
||||||
db_instance.id,
|
|
||||||
)
|
|
||||||
project.add_source(source_name, {
|
|
||||||
'format': self._REMOTE_IMAGES_EXTRACTOR,
|
|
||||||
})
|
|
||||||
self._save_image_info(
|
|
||||||
osp.join(save_dir, project.local_source_dir(source_name)),
|
|
||||||
instance_data)
|
|
||||||
project.save()
|
|
||||||
|
|
||||||
templates_dir = osp.join(self._TEMPLATES_DIR, 'plugins')
|
|
||||||
target_dir = osp.join(project.config.project_dir,
|
|
||||||
project.config.env_dir, project.config.plugins_dir)
|
|
||||||
os.makedirs(target_dir, exist_ok=True)
|
|
||||||
shutil.copyfile(
|
|
||||||
osp.join(templates_dir, self._REMOTE_IMAGES_EXTRACTOR + '.py'),
|
|
||||||
osp.join(target_dir, self._REMOTE_IMAGES_EXTRACTOR + '.py'))
|
|
||||||
|
|
||||||
# Make CVAT CLI module available to the user
|
|
||||||
cvat_utils_dst_dir = osp.join(save_dir, 'cvat', 'utils')
|
|
||||||
os.makedirs(cvat_utils_dst_dir)
|
|
||||||
shutil.copytree(osp.join(BASE_DIR, 'utils', 'cli'),
|
|
||||||
osp.join(cvat_utils_dst_dir, 'cli'))
|
|
||||||
|
|
||||||
def __call__(self, dst_file, instance_data, save_images=False):
|
|
||||||
with TemporaryDirectory() as temp_dir:
|
|
||||||
self._export(instance_data, save_dir=temp_dir, save_images=save_images)
|
|
||||||
make_zip_archive(temp_dir, dst_file)
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
# Quick start
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
# optionally make a virtualenv
|
|
||||||
python -m virtualenv .venv
|
|
||||||
. .venv/bin/activate
|
|
||||||
|
|
||||||
# install dependencies
|
|
||||||
pip install 'git+https://github.com/openvinotoolkit/datumaro'
|
|
||||||
pip install -r cvat/utils/cli/requirements.txt
|
|
||||||
|
|
||||||
# set up environment
|
|
||||||
PYTHONPATH=':'
|
|
||||||
export PYTHONPATH
|
|
||||||
|
|
||||||
# use Datumaro
|
|
||||||
datum --help
|
|
||||||
```
|
|
||||||
|
|
||||||
Check [Datumaro docs](https://github.com/openvinotoolkit/datumaro/README.md) for more info.
|
|
||||||
@ -1,105 +0,0 @@
|
|||||||
# Copyright (C) 2020-2021 Intel Corporation
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
import getpass
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import os.path as osp
|
|
||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
import requests
|
|
||||||
|
|
||||||
from cvat.utils.cli.core import CLI as CVAT_CLI
|
|
||||||
from cvat.utils.cli.core import CVAT_API_V1
|
|
||||||
from datumaro.components.config import Config, SchemaBuilder
|
|
||||||
from datumaro.components.extractor import SourceExtractor, DatasetItem
|
|
||||||
from datumaro.util.image import Image, lazy_image, load_image
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = SchemaBuilder() \
|
|
||||||
.add('task_id', int) \
|
|
||||||
.add('server_url', str) \
|
|
||||||
.build()
|
|
||||||
|
|
||||||
class cvat_rest_api_task_images(SourceExtractor):
|
|
||||||
def _image_local_path(self, item_id):
|
|
||||||
task_id = self._config.task_id
|
|
||||||
return osp.join(self._cache_dir,
|
|
||||||
'task_{}_frame_{:06d}.jpg'.format(task_id, int(item_id)))
|
|
||||||
|
|
||||||
def _make_image_loader(self, item_id):
|
|
||||||
return lazy_image(item_id,
|
|
||||||
lambda item_id: self._image_loader(item_id, self))
|
|
||||||
|
|
||||||
def _is_image_cached(self, item_id):
|
|
||||||
return osp.isfile(self._image_local_path(item_id))
|
|
||||||
|
|
||||||
def _download_image(self, item_id):
|
|
||||||
self._connect()
|
|
||||||
os.makedirs(self._cache_dir, exist_ok=True)
|
|
||||||
self._cvat_cli.tasks_frame(task_id=self._config.task_id,
|
|
||||||
frame_ids=[item_id], outdir=self._cache_dir, quality='original')
|
|
||||||
|
|
||||||
def _connect(self):
|
|
||||||
if self._cvat_cli is not None:
|
|
||||||
return
|
|
||||||
|
|
||||||
print("Enter credentials for '%s' to read task data:" % \
|
|
||||||
(self._config.server_url))
|
|
||||||
username = input('User: ')
|
|
||||||
password = getpass.getpass()
|
|
||||||
|
|
||||||
session = requests.Session()
|
|
||||||
|
|
||||||
api = CVAT_API_V1(self._config.server_url)
|
|
||||||
cli = CVAT_CLI(session, api, credentials=(username, password))
|
|
||||||
self._cvat_cli = cli
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _image_loader(item_id, extractor):
|
|
||||||
if not extractor._is_image_cached(item_id):
|
|
||||||
extractor._download_image(item_id)
|
|
||||||
local_path = extractor._image_local_path(item_id)
|
|
||||||
return load_image(local_path)
|
|
||||||
|
|
||||||
def __init__(self, url):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
local_dir = url
|
|
||||||
self._local_dir = local_dir
|
|
||||||
self._cache_dir = osp.join(local_dir, 'images')
|
|
||||||
|
|
||||||
with open(osp.join(url, 'config.json'),
|
|
||||||
'r', encoding='utf-8') as config_file:
|
|
||||||
config = json.load(config_file)
|
|
||||||
config = Config(config, schema=CONFIG_SCHEMA)
|
|
||||||
self._config = config
|
|
||||||
|
|
||||||
with open(osp.join(url, 'images_meta.json'),
|
|
||||||
'r', encoding='utf-8') as images_file:
|
|
||||||
images_meta = json.load(images_file)
|
|
||||||
image_list = images_meta['images']
|
|
||||||
|
|
||||||
items = []
|
|
||||||
for entry in image_list:
|
|
||||||
item_id = entry['id']
|
|
||||||
item_filename = entry.get('name', str(item_id))
|
|
||||||
size = None
|
|
||||||
if entry.get('height') and entry.get('width'):
|
|
||||||
size = (entry['height'], entry['width'])
|
|
||||||
image = Image(data=self._make_image_loader(item_id),
|
|
||||||
path=self._image_local_path(item_id), size=size)
|
|
||||||
item = DatasetItem(id=osp.splitext(item_filename)[0], image=image)
|
|
||||||
items.append((item.id, item))
|
|
||||||
|
|
||||||
items = OrderedDict(items)
|
|
||||||
self._items = items
|
|
||||||
|
|
||||||
self._cvat_cli = None
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
for item in self._items.values():
|
|
||||||
yield item
|
|
||||||
|
|
||||||
def __len__(self):
|
|
||||||
return len(self._items)
|
|
||||||
Loading…
Reference in New Issue