Skip to content

Commit c273826

Browse files
committed
docs updated
1 parent b6ee64b commit c273826

File tree

3 files changed

+42
-23
lines changed

3 files changed

+42
-23
lines changed

superannotate/input_converters/conversion.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ def import_annotation_format(
231231
Pixel panoptic_segmentation
232232
Pixel instance_segmentation
233233
Vector instance_segmentation
234+
Vector object_detection
234235
Vector keypoint_detection
235236
============== ======================
236237
@@ -239,9 +240,9 @@ def import_annotation_format(
239240
--------------------------------------
240241
project_type task
241242
============== ======================
243+
Pixel instance_segmentation
242244
Vector instance_segmentation
243245
Vector object_detection
244-
Pixel instance_segmentation
245246
============== ======================
246247
247248
============== ======================
@@ -269,7 +270,11 @@ def import_annotation_format(
269270
--------------------------------------
270271
project_type task
271272
============== ======================
273+
Vector object_detection
274+
Vector keypoint_detection
272275
Vector vector_annotation
276+
Vector instance_segmentation
277+
Pixel instance_segmentation
273278
============== ======================
274279
275280
============== ======================
@@ -331,11 +336,12 @@ def import_annotation_format(
331336
'Pixel' project creates <image_name>___pixel.jsons and <image_name>___save.png annotation mask for each image.
332337
:type project_type: str
333338
:param task: Task can be one of the following: ['panoptic_segmentation', 'instance_segmentation',
334-
'keypoint_detection', 'object_detection']. (Default: "object_detection").
339+
'keypoint_detection', 'object_detection', 'vector_annotation']. (Default: "object_detection").
335340
'keypoint_detection' can be used to converts keypoints from/to available annotation format.
336341
'panoptic_segmentation' will use panoptic mask for each image to generate bluemask for SuperAnnotate annotation format and use bluemask to generate panoptic mask for invert conversion. Panoptic masks should be in the input folder.
337342
'instance_segmentation' 'Pixel' project_type converts instance masks and 'Vector' project_type generates bounding boxes and polygons from instance masks. Masks should be in the input folder if it is 'Pixel' project_type.
338343
'object_detection' converts objects from/to available annotation format
344+
'vector_annotation' can be used to convert all annotations (point, ellipse, circule, cuboid and etc) to SuperAnnotate vector project.
339345
:param platform: SuperAnnotate has both 'Web' and 'Desktop' platforms. Choose to which platform you want convert. (Default: "Web")
340346
:type platform: str
341347
@@ -385,6 +391,11 @@ def convert_platform(input_dir, output_dir, input_platform):
385391
0, "Please enter valid platform: 'Desktop' or 'Web'"
386392
)
387393

394+
if isinstance(input_dir, str):
395+
input_dir = Path(input_dir)
396+
if isinstance(output_dir, str):
397+
output_dir = Path(output_dir)
398+
388399
sa_convert_platform(input_dir, output_dir, input_platform)
389400

390401

@@ -410,4 +421,9 @@ def convert_project_type(input_dir, output_dir):
410421
(type(output_dir))
411422
)
412423

424+
if isinstance(input_dir, str):
425+
input_dir = Path(input_dir)
426+
if isinstance(output_dir, str):
427+
output_dir = Path(output_dir)
428+
413429
sa_convert_project_type(input_dir, output_dir)

superannotate/input_converters/sa_conversion.py

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,15 @@
1818

1919
def _merge_jsons(input_dir, output_dir):
2020
cat_id_map = {}
21-
classes_json = json.load(
22-
open(os.path.join(input_dir, "classes", "classes.json"))
23-
)
21+
classes_json = json.load(open(input_dir / "classes" / "classes.json"))
2422

2523
new_classes = []
2624
for idx, class_ in enumerate(classes_json):
2725
cat_id_map[class_["id"]] = idx + 2
2826
class_["id"] = idx + 2
2927
new_classes.append(class_)
3028

31-
files = glob.glob(os.path.join(input_dir, "*.json"))
29+
files = glob.glob(str(input_dir / "*.json"))
3230
merged_json = {}
3331
os.makedirs(output_dir)
3432
for f in tqdm(files, "Merging files"):
@@ -44,29 +42,26 @@ def _merge_jsons(input_dir, output_dir):
4442
json_data.append(meta)
4543
file_name = os.path.split(f)[1].replace("___objects.json", "")
4644
merged_json[file_name] = json_data
47-
with open(
48-
os.path.join(output_dir, "annotations.json"), "w"
49-
) as final_json_file:
45+
with open(output_dir / "annotations.json", "w") as final_json_file:
5046
json.dump(merged_json, final_json_file, indent=2)
5147

52-
with open(os.path.join(output_dir, "classes.json"), "w") as fw:
48+
with open(output_dir / "classes.json", "w") as fw:
5349
json.dump(classes_json, fw, indent=2)
5450

5551

5652
def _split_json(input_dir, output_dir):
5753
os.makedirs(output_dir)
58-
json_data = json.load(open(os.path.join(input_dir, "annotations.json")))
59-
for img, annotations in tqdm(json_data.items()):
54+
json_data = json.load(open(input_dir / "annotations.json"))
55+
for img, annotations in tqdm(json_data.items(), 'Splitting files'):
6056
objects = []
6157
for annot in annotations:
62-
objects += annot
63-
64-
with open(os.path.join(output_dir, img + "___objects.json"), "w") as fw:
58+
if 'type' in annot.keys() and annot['type'] != 'meta':
59+
objects.append(annot)
60+
with open(output_dir / (img + "___objects.json"), "w") as fw:
6561
json.dump(objects, fw, indent=2)
66-
os.makedirs(os.path.join(output_dir, "classes"))
62+
os.makedirs(output_dir / "classes")
6763
shutil.copy(
68-
os.path.join(input_dir, "classes.json"),
69-
os.path.join(output_dir, "classes", "classes.json")
64+
input_dir / "classes.json", output_dir / "classes" / "classes.json"
7065
)
7166

7267

@@ -222,11 +217,6 @@ def from_vector_to_pixel(json_paths):
222217

223218

224219
def sa_convert_project_type(input_dir, output_dir):
225-
if type(input_dir) is str:
226-
input_dir = Path(input_dir)
227-
if type(output_dir) is str:
228-
output_dir = Path(output_dir)
229-
230220
json_generator = input_dir.glob('*.json')
231221
json_paths = [file for file in json_generator]
232222

tests/converter_test/test_platform_converter.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,16 @@ def test_conversion(tmpdir):
2727

2828
assert init_file_names == temp_file_names
2929
assert init_file_names == final_file_names
30+
31+
project_name = "platform_conversion"
32+
33+
projects = sa.search_projects(project_name, True)
34+
if projects:
35+
sa.delete_project(projects[0])
36+
project = sa.create_project(project_name, "converter vector", "Vector")
37+
38+
sa.create_annotation_classes_from_classes_json(
39+
project, final_dir / "classes" / "classes.json"
40+
)
41+
sa.upload_images_from_folder_to_project(project, input_dir)
42+
sa.upload_annotations_from_folder_to_project(project, final_dir)

0 commit comments

Comments
 (0)