mirror of
https://github.com/wassname/sloth.git
synced 2026-06-28 16:14:24 +08:00
112 lines
3.7 KiB
Python
112 lines
3.7 KiB
Python
import os
|
|
import glob
|
|
|
|
class AnnotationContainer:
|
|
def __init__(self):
|
|
self.clear()
|
|
|
|
def filename(self):
|
|
return self.filename_
|
|
|
|
def clear(self):
|
|
self.annotations_ = []
|
|
self.filename_ = None
|
|
|
|
def load(self, filename):
|
|
self.loadRectFormat(filename)
|
|
|
|
def loadRectFormat(self, filename):
|
|
self.annotations_ = []
|
|
self.filename_ = filename
|
|
filename_helper = {}
|
|
|
|
try:
|
|
f = open(filename)
|
|
basedir = ""
|
|
for line in f:
|
|
s = line.split()
|
|
image_fname = s[0]
|
|
if basedir == "":
|
|
basedir = os.path.dirname(image_fname)
|
|
else:
|
|
assert basedir == os.path.dirname(image_fname)
|
|
num_rects = int(s[1])
|
|
assert num_rects == 0 or num_rects == 1
|
|
if image_fname in filename_helper:
|
|
rects = filename_helper[image_fname]['annotations']
|
|
else:
|
|
rects = []
|
|
|
|
for i in range(0, 4*num_rects, 4):
|
|
rects.append({
|
|
'type': 'rect',
|
|
'x': s[i+2],
|
|
'y': s[i+3],
|
|
'width': s[i+4],
|
|
'height': s[i+5]
|
|
})
|
|
if len(s) > i+6:
|
|
rects[-1]['id'] = s[i+6]
|
|
|
|
if image_fname not in filename_helper:
|
|
annotation = {
|
|
'type': 'image',
|
|
'filename': image_fname,
|
|
'annotations': rects
|
|
}
|
|
self.annotations_.append(annotation)
|
|
filename_helper[image_fname] = annotation
|
|
except Exception as e:
|
|
self.annotations_ = []
|
|
raise e
|
|
|
|
basedir1 = basedir
|
|
basedir = os.path.join(os.path.dirname(filename), basedir)
|
|
images = glob.glob(os.path.join(basedir, "*.png"))
|
|
for fname in images:
|
|
fname = os.path.join(basedir1, os.path.basename(fname))
|
|
if fname not in filename_helper:
|
|
print fname, "not in filename_helper"
|
|
annotation = {
|
|
'type': 'image',
|
|
'filename': fname,
|
|
'annotations': []
|
|
}
|
|
self.annotations_.append(annotation)
|
|
|
|
def save(self, filename):
|
|
self.saveRectFormat(filename)
|
|
|
|
def saveRectFormat(self, filename):
|
|
f = open(filename, "w")
|
|
|
|
for file in self.annotations_:
|
|
if file['type'] == 'image':
|
|
rect_anns = [ann for ann in file['annotations'] if ann['type'] == 'rect']
|
|
#f.write("%s %d", file['filename'], len(rect_anns))
|
|
for ann in rect_anns:
|
|
f.write('%s 1 %s %s %s %s %s\n' % (file['filename'], str(ann['x']), str(ann['y']), str(ann['width']), str(ann['height']), str(ann.get('id', ""))))
|
|
if len(rect_anns) == 0:
|
|
f.write('%s 0\n' % (file['filename']))
|
|
|
|
self.filename_ = filename
|
|
|
|
def asDict(self):
|
|
return self.annotations_
|
|
|
|
def numFiles(self):
|
|
return len(self.annotations_)
|
|
|
|
def numAnnotations(self):
|
|
if self.annotations_ is None:
|
|
return 0
|
|
num = 0
|
|
for file in self.annotations_:
|
|
if file['type'] == 'image':
|
|
num += len(file['annotations'])
|
|
elif file['type'] == video:
|
|
for frame in file['frames']:
|
|
num += len(frame['annotations'])
|
|
return num
|
|
|