Esempio n. 1
0
    def __init__(self):
        self.batch_size = 16
        self.nb_classes = 20
        self.prop = 10

        class_info = load_ids()
        self.id2name = {int(info['id']): info['name'] for info in class_info.values()}

        # options = utils.parse_options_file('pv_baseline')
        # config_utils.update_config(options)

        self.data_dir = '/home/caleml/datasets/pascalvoc/VOCdevkit/VOC2007/'
        self.weights_path = '/home/caleml/partial_experiments/exp_20191028_1501_baseline_logits_pv_baseline/weights_100_001.h5'
        # self.weights_path = '/home/caleml/partial_experiments/exp_20190725_1516_baseline/weights_100_020.h5'
        self.gt_path = os.path.join(self.data_dir, 'Annotations', 'annotations_multilabel_trainval_partial_100_1.csv')
        self.test_path = os.path.join(self.data_dir, 'Annotations', 'annotations_multilabel_test.csv')

        # 1. load model
        self.model = BaselineLogits('%s/partial_experiments/' % os.environ['HOME'], self.nb_classes, self.prop)
        self.model.load_weights(self.weights_path)

        # load prior
        self.load_prior()

        # load GT
        self.gt = self.load_annotations(self.test_path)
Esempio n. 2
0
    def __init__(self, prior_path, weights_path, comb_method, prop, mode,
                 use_superclass, allow_marginalization):
        self.batch_size = 16
        self.nb_classes = 20
        self.prop = prop
        self.context_length = (self.prop * self.nb_classes / 100) - 1

        self.mode = mode

        class_info = load_ids()
        self.id2name = {
            int(info['id']): info['name']
            for info in class_info.values()
        }

        self.data_dir = '/home/caleml/datasets/pascalvoc/VOCdevkit/VOC2007/'
        self.weights_path = weights_path
        self.gt_path = os.path.join(
            self.data_dir, 'Annotations',
            'annotations_multilabel_trainval_partial_100_1.csv')

        # 1. load model
        self.model = BaselineLogits(
            '%s/partial_experiments/' % os.environ['HOME'], self.nb_classes,
            self.prop)
        self.model.load_weights(self.weights_path)

        self.prior = self.load_prior(prior_path, comb_method, use_superclass,
                                     allow_marginalization)

        # load GT
        self.gt = self.load_annotations(self.gt_path)
Esempio n. 3
0
    def __init__(self):
        self.class_info = load_ids()
        self.nb_classes = len(self.class_info)
        assert self.nb_classes == 20

        self.id2short = {
            data['id']: data['short']
            for data in self.class_info.values()
        }
Esempio n. 4
0
    def __init__(self,
                 matrix_path,
                 nb_classes,
                 context_length,
                 comb_method='simple',
                 use_superclass=False,
                 alpha=None,
                 mode='train',
                 allow_marginalization=True):
        '''
        context_length: the expected length of the context (nb of classes in the context)

        use_superclass means we use a prior computed on superclasses

        superclasses are:
            - animal
            - indoor
            - person
            - vehicle

        combination methods:
        - simple -> add the logits of y_v and y_p
        - alpha -> weight y_p with alpha first
        '''
        print(
            'loading conditional prior with method %s, superclasses %s, alpha %s, mode %s (context length %s)'
            % (comb_method, use_superclass, alpha, mode, context_length))
        self.use_superclass = use_superclass

        class_info = load_ids()
        self.id2superclass = {
            v['id']: v['superclass']
            for v in class_info.values()
        }
        self.id2short = {v['id']: v['short'] for v in class_info.values()}

        self.prior_matrix = self.load_matrix(matrix_path)
        self.nb_classes = nb_classes
        self.context_length = context_length

        self.threshold = 0.5
        self.combination_method = comb_method
        self.mode = mode
        assert self.mode in ['train', 'test']

        if comb_method == 'alpha':
            self.alpha = alpha

        self.allow_marginalization = allow_marginalization
Esempio n. 5
0
def create_prior(dataset_path):
    '''
    create the prior with superclass clustering

    order of the keys:

    matrix['a1']['i1_p0_v1'] gives the probability of the class animal given the presence of the classes indoor and vehicle and the absence of the classes person in the image
    matrix['a1']['i0'] gives the marginalization over all complete-context values with i=0
    '''
    classes_order = ['animal', 'indoor', 'person', 'vehicle']
    cooc_superclass = defaultdict(lambda: defaultdict(lambda: 0.0))

    class_info = load_ids()
    id2superclass = {
        info['id']: info['superclass']
        for info in class_info.values()
    }

    with open(dataset_path, 'r') as f_in:
        for line in f_in:
            parts = [int(x) for x in line.strip().split(',')]

            # ones
            ones_idx = [
                i - 1 for i in range(len(parts[1:]) + 1) if parts[i] == 1
            ]
            ones_superclasses = set([id2superclass[idx] for idx in ones_idx])

            for superclass in ones_superclasses:
                context = '_'.join([
                    '%s%s' % (sc[0], (1 if sc in ones_superclasses else 0))
                    for sc in classes_order if sc != superclass
                ])
                cooc_superclass['%s1' % superclass[0]][context] += 1

            # zeros
            zeros_idx = [
                i - 1 for i in range(len(parts[1:]) + 1) if parts[i] == -1
            ]
            zeros_superclasses = set([id2superclass[idx] for idx in zeros_idx])

            for superclass in zeros_superclasses:
                context = '_'.join([
                    '%s%s' % (sc[0], (1 if sc in ones_superclasses else 0))
                    for sc in classes_order if sc != superclass
                ])
                cooc_superclass['%s0' % superclass[0]][context] += 1

    pprint(cooc_superclass)

    # fill missing values, normalize and compute incomplete contexts
    for letter in ALL_LETTERS:

        full_contexts, partial_contexts = get_all_contexts(letter)
        print(full_contexts)
        print(partial_contexts)

        # normalization: sum over the same context for each version 0 and 1: matrix['a1']['i1_p0_v1'] = matrix['a1']['i1_p0_v1'] / matrix['a1']['i1_p0_v1'] + matrix['a0']['i1_p0_v1']
        for context in full_contexts:
            print('doing context %s' % context)
            one_context = cooc_superclass['%s1' % letter][context]
            zero_context = cooc_superclass['%s0' % letter][context]

            # both are None: 0.5 for each
            if (one_context == 0.0) and (zero_context == 0.0):
                cooc_superclass['%s1' % letter][context] = 0.5
                cooc_superclass['%s0' % letter][context] = 0.5

            # only one is None: epsilon
            elif one_context == 0.0:
                cooc_superclass['%s1' % letter][context] = cfg.EPSILON

            elif zero_context == 0.0:
                cooc_superclass['%s0' % letter][context] = cfg.EPSILON

            # updated values if needed
            one_context = cooc_superclass['%s1' % letter][context]
            zero_context = cooc_superclass['%s0' % letter][context]
            print('updated one context %s' % one_context)
            print('updated zero context %s' % zero_context)

            total = one_context + zero_context

            cooc_superclass['%s0' % letter][context] /= total
            cooc_superclass['%s1' % letter][context] /= total

        # precompute the incomplete part
        for partial in partial_contexts:
            partial_parts = partial.split('_')

            # we add all the values of the contexts that match the partial one
            sum_one = sum([
                val for ctxt, val in cooc_superclass['%s1' % letter].items()
                if any([part in ctxt for part in partial_parts])
            ])
            sum_zero = sum([
                val for ctxt, val in cooc_superclass['%s0' % letter].items()
                if any([part in ctxt for part in partial_parts])
            ])

            cooc_superclass['%s0' %
                            letter][partial] = sum_zero / (sum_zero + sum_one)
            cooc_superclass['%s1' %
                            letter][partial] = sum_one / (sum_zero + sum_one)

    print('\nFinal matrix')
    pprint(cooc_superclass)

    # saving
    save_file = filepath.replace('annotations_multilabel',
                                 'prior_matrix4').replace('.csv', '.json')
    with open(save_file, 'w+') as f_json:
        json.dump(cooc_superclass, f_json)
Esempio n. 6
0
def create_full_prior(dataset_path):
    '''
    create the full matrix (19 class context)
    '''

    cooc_matrix = defaultdict(lambda: defaultdict(lambda: 0.0))

    class_info = load_ids()
    id2letter = {info['id']: info['short'] for info in class_info.values()}
    all_letters = list(id2letter.values())

    # counting of the dataset
    with open(dataset_path, 'r') as f_in:
        for line in f_in:
            parts = [int(x) for x in line.strip().split(',')]
            ground_truths = parts[1:]

            for i, gt in enumerate(ground_truths):

                letter = id2letter[i]
                value = (1 if gt == 1 else 0)
                context = list()

                # '_'.join(['%s%s' % (id2letter[cid], (1 if cid in ones_idx else 0)) for cid in range(len(ground_truths)) if cid != class_id])
                for context_j, context_gt in enumerate(ground_truths):
                    if context_j == i:
                        continue

                    context_letter = id2letter[context_j]
                    context_value = (1 if context_gt == 1 else 0)
                    context.append('%s%s' % (context_letter, context_value))

                    full_context = '_'.join(context)
                    cooc_matrix['%s%s' % (letter, value)][full_context] += 1

    # normalization and filling missing full contexts
    for letter in all_letters:
        context_letters = copy.copy(all_letters)
        context_letters.remove(letter)

        full_contexts = get_full_contexts(context_letters)

        # normalization: sum over the same context for each version 0 and 1: matrix['ae1']['context1'] = matrix['ae1']['context1'] / matrix['a1']['context1'] + matrix['a0']['context1']
        for context in full_contexts:
            one_context = cooc_matrix['%s1' % letter][context]
            zero_context = cooc_matrix['%s0' % letter][context]

            # both are None: 0.5 for each
            if (one_context == 0.0) and (zero_context == 0.0):
                cooc_matrix['%s1' % letter][context] = 0.5
                cooc_matrix['%s0' % letter][context] = 0.5

            # missing one value: 0.4
            elif one_context == 0.0:
                cooc_matrix['%s1' % letter][context] = 0.4

            elif zero_context == 0.0:
                cooc_matrix['%s0' % letter][context] = 0.4

            # updated values if needed
            one_context = cooc_matrix['%s1' % letter][context]
            zero_context = cooc_matrix['%s0' % letter][context]

            # actual normalization
            total = one_context + zero_context

            cooc_matrix['%s0' % letter][context] /= total
            cooc_matrix['%s1' % letter][context] /= total

    # saving
    save_file = filepath.replace('annotations_multilabel',
                                 'prior_matrix_full0').replace(
                                     '.csv', '.json')
    with open(save_file, 'w+') as f_json:
        json.dump(cooc_matrix, f_json)

    print('saved matrix at %s' % save_file)