-
Notifications
You must be signed in to change notification settings - Fork 607
/
Copy pathsbd.py
115 lines (84 loc) · 3.88 KB
/
sbd.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
from .base_image_dataset import BaseImageDataset
from ltr.data.image_loader import jpeg4py_loader_w_failsafe
import torch
from collections import OrderedDict
import os
from scipy.io import loadmat
from ltr.data.bounding_box_utils import masks_to_bboxes
from ltr.admin.environment import env_settings
class SBD(BaseImageDataset):
"""
Semantic Boundaries Dataset and Benchmark (SBD)
Publication:
Semantic contours from inverse detectors
Bharath Hariharan, Pablo Arbelaez, Lubomir Bourdev, Subhransu Maji and Jitendra Malik
ICCV, 2011
http://home.bharathh.info/pubs/pdfs/BharathICCV2011.pdf
Download dataset from: http://home.bharathh.info/pubs/codes/SBD/download.html
"""
def __init__(self, root=None, image_loader=jpeg4py_loader_w_failsafe, data_fraction=None, split="train"):
"""
args:
root - path to SBD root folder
image_loader - The function to read the images. jpeg4py (https://github.com/ajkxyz/jpeg4py)
is used by default.
data_fraction - Fraction of dataset to be used. The complete dataset is used by default
split - dataset split ("train", "train_noval", "val")
"""
root = env_settings().sbd_dir if root is None else root
super().__init__('SBD', root, image_loader)
assert split in ["train", "train_noval", "val"]
self.root = root
self.image_path_list, self.anno_file_list = self._load_dataset(split)
# Load mat fine
anno_list = [loadmat(a) for a in self.anno_file_list]
self.image_list = self._construct_image_list(anno_list)
if data_fraction is not None:
raise NotImplementedError
def _load_dataset(self, split):
split_f = os.path.join(self.root, split.rstrip('\n') + '.txt')
with open(os.path.join(split_f), "r") as f:
file_names = [x.strip() for x in f.readlines()]
image_list = [os.path.join(self.root, 'img', x + ".jpg") for x in file_names]
anno_list = [os.path.join(self.root, 'inst', x + ".mat") for x in file_names]
assert (len(image_list) == len(anno_list))
return image_list, anno_list
def _get_mask_from_mat(self, mat):
return torch.tensor(mat['GTinst'][0]['Segmentation'][0])
def _construct_image_list(self, anno_list):
image_list = []
for im_id, a in enumerate(anno_list):
mask = self._get_mask_from_mat(a)
for instance_id in range(1, mask.max().item() + 1):
image_list.append((im_id, instance_id))
return image_list
def get_name(self):
return 'sbd'
def has_segmentation_info(self):
return True
def get_image_info(self, im_id):
image_id, instance_id = self.image_list[im_id]
anno_mat = loadmat(self.anno_file_list[image_id])
mask = self._get_mask_from_mat(anno_mat)
mask = (mask == instance_id).float()
bbox = masks_to_bboxes(mask, fmt='t')
valid = (bbox[2] > 0) & (bbox[3] > 0)
visible = valid.clone().byte()
return {'bbox': bbox, 'mask': mask, 'valid': valid, 'visible': visible}
def _get_image(self, im_id):
image_id, _ = self.image_list[im_id]
img = self.image_loader(self.image_path_list[image_id])
return img
def get_meta_info(self, im_id):
object_meta = OrderedDict({'object_class_name': None,
'motion_class': None,
'major_class': None,
'root_class': None,
'motion_adverb': None})
return object_meta
def get_image(self, image_id, anno=None):
image = self._get_image(image_id)
if anno is None:
anno = self.get_image_info(image_id)
object_meta = self.get_meta_info(image_id)
return image, anno, object_meta