forked from HumanSignal/labelImg
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreate_ml_io.py
135 lines (111 loc) · 3.88 KB
/
create_ml_io.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
#!/usr/bin/env python
# -*- coding: utf8 -*-
import json
from pathlib import Path
from libs.constants import DEFAULT_ENCODING
import os
JSON_EXT = '.json'
ENCODE_METHOD = DEFAULT_ENCODING
class CreateMLWriter:
def __init__(self, folder_name, filename, img_size, shapes, output_file, database_src='Unknown', local_img_path=None):
self.folder_name = folder_name
self.filename = filename
self.database_src = database_src
self.img_size = img_size
self.box_list = []
self.local_img_path = local_img_path
self.verified = False
self.shapes = shapes
self.output_file = output_file
def write(self):
if os.path.isfile(self.output_file):
with open(self.output_file, "r") as file:
input_data = file.read()
output_dict = json.loads(input_data)
else:
output_dict = []
output_image_dict = {
"image": self.filename,
"verified": self.verified,
"annotations": []
}
for shape in self.shapes:
points = shape["points"]
x1 = points[0][0]
y1 = points[0][1]
x2 = points[1][0]
y2 = points[2][1]
height, width, x, y = self.calculate_coordinates(x1, x2, y1, y2)
shape_dict = {
"label": shape["label"],
"coordinates": {
"x": x,
"y": y,
"width": width,
"height": height
}
}
output_image_dict["annotations"].append(shape_dict)
# check if image already in output
exists = False
for i in range(0, len(output_dict)):
if output_dict[i]["image"] == output_image_dict["image"]:
exists = True
output_dict[i] = output_image_dict
break
if not exists:
output_dict.append(output_image_dict)
Path(self.output_file).write_text(json.dumps(output_dict), ENCODE_METHOD)
def calculate_coordinates(self, x1, x2, y1, y2):
if x1 < x2:
x_min = x1
x_max = x2
else:
x_min = x2
x_max = x1
if y1 < y2:
y_min = y1
y_max = y2
else:
y_min = y2
y_max = y1
width = x_max - x_min
if width < 0:
width = width * -1
height = y_max - y_min
# x and y from center of rect
x = x_min + width / 2
y = y_min + height / 2
return height, width, x, y
class CreateMLReader:
def __init__(self, json_path, file_path):
self.json_path = json_path
self.shapes = []
self.verified = False
self.filename = os.path.basename(file_path)
try:
self.parse_json()
except ValueError:
print("JSON decoding failed")
def parse_json(self):
with open(self.json_path, "r") as file:
input_data = file.read()
# Returns a list
output_list = json.loads(input_data)
if output_list:
self.verified = output_list[0].get("verified", False)
if len(self.shapes) > 0:
self.shapes = []
for image in output_list:
if image["image"] == self.filename:
for shape in image["annotations"]:
self.add_shape(shape["label"], shape["coordinates"])
def add_shape(self, label, bnd_box):
x_min = bnd_box["x"] - (bnd_box["width"] / 2)
y_min = bnd_box["y"] - (bnd_box["height"] / 2)
x_max = bnd_box["x"] + (bnd_box["width"] / 2)
y_max = bnd_box["y"] + (bnd_box["height"] / 2)
points = [(x_min, y_min), (x_max, y_min), (x_max, y_max), (x_min, y_max)]
self.shapes.append((label, points, None, None, True))
def get_shapes(self):
return self.shapes