-
Notifications
You must be signed in to change notification settings - Fork 0
/
extract_inform_annotation.py
65 lines (46 loc) · 2.05 KB
/
extract_inform_annotation.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
from lib import *
from make_datapath import make_datapath_list
class Anno_xml(object):
def __init__(self, classes):
self.classes = classes
def __call__(self, xml_path, width, height):
# include image annotation
ret = []
# read file xml
xml = ET.parse(xml_path).getroot()
for obj in xml.iter('object'):
difficult = int(obj.find("difficult").text)
if difficult == 1:
continue
# information for bounding box
bndbox = []
name = obj.find("name").text.lower().strip()
bbox = obj.find("bndbox")
pts = ["xmin", "ymin", "xmax", "ymax"]
for pt in pts:
pixel = int(bbox.find(pt).text) - 1
if pt == "xmin" or pt == "xmax":
pixel /= width # ratio of width
else:
pixel /= height # ratio of height
bndbox.append(pixel)
label_id = self.classes.index(name)
bndbox.append(label_id)
ret += [bndbox]
return np.array(ret) #[[xmin, ymin, xmax, ymax, label_id], ......]
if __name__ == "__main__":
classes = ["aeroplane", "bicycle", "bird", "boat", "bottle",
"bus", "car", "cat", "chair", "cow", "diningtable",
"dog", "horse", "motorbike", "person", "pottedplant",
"sheep", "sofa", "train", "tvmonitor"]
anno_xml = Anno_xml(classes)
root_path = "./data/VOCdevkit/VOC2012/"
train_img_list, train_annotation_list, val_img_list, val_annotation_list, trainval_img_list, trainval_annotation_list = make_datapath_list(root_path)
idx = 1
img_file_path = val_img_list[idx]
img = cv2.imread(img_file_path) # [height, width, 3 channels:BGR]
height, width, channels = img.shape # get size img
# print("Size img {}, {}, {}".format(height, width, channels))
# xml_path, width, height
annotation_infor = anno_xml(val_annotation_list[idx], width, height)
print(annotation_infor)