-
Notifications
You must be signed in to change notification settings - Fork 472
/
Copy pathdatasets.py
executable file
·157 lines (113 loc) · 4.21 KB
/
datasets.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
from flask_login import current_user
from mongoengine import *
from config import Config
from .tasks import TaskModel
import os
class DatasetModel(DynamicDocument):
id = SequenceField(primary_key=True)
name = StringField(required=True, unique=True)
directory = StringField()
thumbnails = StringField()
categories = ListField(default=[])
owner = StringField(required=True)
users = ListField(default=[])
annotate_url = StringField(default="")
default_annotation_metadata = DictField(default={})
deleted = BooleanField(default=False)
deleted_date = DateTimeField()
def save(self, *args, **kwargs):
directory = os.path.join(Config.DATASET_DIRECTORY, self.name + '/')
os.makedirs(directory, mode=0o777, exist_ok=True)
self.directory = directory
self.owner = current_user.username if current_user else 'system'
return super(DatasetModel, self).save(*args, **kwargs)
def get_users(self):
from .users import UserModel
members = self.users
members.append(self.owner)
return UserModel.objects(username__in=members)\
.exclude('password', 'id', 'preferences')
def import_coco(self, coco_json):
from workers.tasks import import_annotations
task = TaskModel(
name="Import COCO format into {}".format(self.name),
dataset_id=self.id,
group="Annotation Import"
)
task.save()
cel_task = import_annotations.delay(task.id, self.id, coco_json)
return {
"celery_id": cel_task.id,
"id": task.id,
"name": task.name
}
def export_coco(self, categories=None, style="COCO", with_empty_images=False):
from workers.tasks import export_annotations
if categories is None or len(categories) == 0:
categories = self.categories
task = TaskModel(
name=f"Exporting {self.name} into {style} format",
dataset_id=self.id,
group="Annotation Export"
)
task.save()
cel_task = export_annotations.delay(task.id, self.id, categories, with_empty_images)
return {
"celery_id": cel_task.id,
"id": task.id,
"name": task.name
}
def export_semantic_segmentation(self, categories=None) :
from workers.tasks import export_semantic_segmentation
if categories is None or len(categories) == 0:
categories = self.categories
task = TaskModel(
name=f"Exporting semantic segmentation of {self.name} ",
dataset_id=self.id,
group="Semantic Segmentation Export"
)
task.save()
cel_task = export_semantic_segmentation.delay(task.id, self.id, categories)
return {
"celery_id": cel_task.id,
"id": task.id,
"name": task.name
}
def scan(self):
from workers.tasks import scan_dataset
task = TaskModel(
name=f"Scanning {self.name} for new images",
dataset_id=self.id,
group="Directory Image Scan"
)
task.save()
cel_task = scan_dataset.delay(task.id, self.id)
return {
"celery_id": cel_task.id,
"id": task.id,
"name": task.name
}
def is_owner(self, user):
if user.is_admin:
return True
return user.username.lower() == self.owner.lower()
def can_download(self, user):
return self.is_owner(user)
def can_delete(self, user):
return self.is_owner(user)
def can_share(self, user):
return self.is_owner(user)
def can_generate(self, user):
return self.is_owner(user)
def can_edit(self, user):
return user.username in self.users or self.is_owner(user)
def permissions(self, user):
return {
'owner': self.is_owner(user),
'edit': self.can_edit(user),
'share': self.can_share(user),
'generate': self.can_generate(user),
'delete': self.can_delete(user),
'download': self.can_download(user)
}
__all__ = ["DatasetModel"]