Пример #1
0
    def __init__(self, opt):
        BaseDataset.__init(self, opt)
        opt.downsample = 1
        opt.pack_n = 10000
        opt.excl_subclass = None

        classes = opt.class_3d
        assert classes is not None, 'dataset argument [classes] has to be set'

        self.res = opt.voxel_res

        dataset_paths = paths['canon']

        # parse classes
        classlist = _parse_class(classes)
        self._class_str = '+'.join(classlist)

        assert (opt.excl_subclass is None) or (classlist == [
            '03001627'
        ]), 'subclass exclusion only supported for chair'

        class_size = dict()
        class_to_ind = dict()
        filelist = list()
        labellist = list()

        self._matname = dataset_paths['matname']
        dataset_merged_csv = dataset_paths['filelist']
        dataset_path_format = dataset_paths['filepath']
        for i, c in enumerate(classlist):
            merged_csvfile = dataset_merged_csv.format(classid=c, res=self.res)
            if os.path.isfile(merged_csvfile):
                with open(merged_csvfile, 'r') as fin:
                    class_filelist = list(map(str.strip, fin.readlines()))
            else:
                class_filelist = sorted(
                    glob.glob(dataset_path_format.format(classid=c,
                                                         res=self.res),
                              recursive=False))
            if len(class_filelist) == 0:
                raise ValueError('No .mat files found for class: ' + c)
            class_size[c] = len(class_filelist)
            class_to_ind[c] = i
            filelist += sorted(class_filelist)
            labellist += [class_to_label[c]] * len(class_filelist)

            # filter out specific subclasses
            subclasses_excl = opt.excl_subclass
            if subclasses_excl is not None:
                assert (classlist == ['03001627']), \
                    "Excluding subclasses only supported for chairs"
                if subclasses_excl in chair_subclass_aliases:
                    subclasses_excl = chair_subclass_aliases[subclasses_excl]
                subclasses_excl = (set(subclasses_excl.split('+')))
                with open(chair_subclass_file, 'r') as f:
                    lines = f.readlines()
                list_obj_ids = [l.split(' ')[0] for l in lines]
                list_subclasses = [
                    set(l.split(' ')[1].replace('\n', '').split(','))
                    for l in lines
                ]
                subclass_dict = dict(zip(list_obj_ids, list_subclasses))
                idlist = [
                    basename(dirname(dirname(filename)))
                    for filename in filelist
                ]
                intersection_list = [
                    (len(subclasses_excl.intersection(subclass_dict[id_]))
                     if id_ in subclass_dict else -1) for id_ in idlist
                ]
                print(str_verbose, 'subclass exclusion: ')
                print(
                    str_verbose, '\tvoxels kept: %d' %
                    (np.array(intersection_list) == 0).sum())
                print(
                    str_verbose, '\tvoxels excluded: %d' %
                    (np.array(intersection_list) > 0).sum())
                print(
                    str_verbose, '\tvoxels missing subclass: %d' %
                    (np.array(intersection_list) < 0).sum())

                # update filelist and labellist
                filelist = [
                    filelist[i] for i in range(len(filelist))
                    if intersection_list[i] == 0
                ]
                labellist = [
                    labellist[i] for i in range(len(labellist))
                    if intersection_list[i] == 0
                ]

        self._classes = classlist
        self._class_to_ind = class_to_ind
        self._filelist = filelist
        self._labellist = labellist

        self._transform = self.get_transform(opt, opt.downsample)
        self.size = len(self._filelist)