def set_class_weights(self, labels, imagesMeta): if self.wp != -1: return print(' Using class-specific weights!') stats, counts = utils.getLabelStats(imagesMeta, labels) p = counts / sum(counts) p = np.array(p) # print(p) # self.wp = p wp = 1 / (p) self.wp = wp
def load_data(self): cfg = basic_config(self.newDir) if self.method == 'faster': cfg.faster_rcnn_config() elif self.method == 'fast': cfg.fast_rcnn_config() elif self.method == 'normal': cfg.rcnn_config() cfg = mcfg.rcnn_hoi_classes(cfg) cfg = set_config(cfg) cfg.get_args() cfg.dataset = 'HICO' cfg.update_paths() trainMeta = utils.load_dict(cfg.data_path + 'train') testMeta = utils.load_dict(cfg.data_path + 'test') trainGTMeta = utils.load_dict(cfg.data_path + 'train_GT') testGTMeta = utils.load_dict(cfg.data_path + 'test_GT') labels = utils.load_dict(cfg.data_path + 'labels') class_mapping = utils.load_dict(cfg.data_path + 'class_mapping') if cfg.max_classes is not None: # Reduce data to include only max_classes number of different classes _, counts = utils.getLabelStats(trainGTMeta, labels) reduced_idxs = utils.getReducedIdxs(counts, cfg.max_classes, labels) trainGTMeta = utils.reduceData(trainGTMeta, reduced_idxs) testGTMeta = utils.reduceData(testGTMeta, reduced_idxs) trainMeta = utils.reduceData(trainMeta, reduced_idxs) testMeta = utils.reduceData(testMeta, reduced_idxs) labels = utils.idxs2labels(reduced_idxs, labels) cfg.nb_classes = len(labels) cfg.set_class_weights(labels, trainGTMeta) _, valMeta = utils.splitData(list(trainMeta.keys()), trainMeta) self.cfg = cfg if cfg.move: self.move_data() print('Data:', cfg.data_path) print('Path:', cfg.my_results_path) self.labels = labels self.class_mapping = class_mapping self.trainMeta = trainMeta self.valMeta = valMeta self.testMeta = testMeta self.trainGTMeta = trainGTMeta self.testGTMeta = testGTMeta
def __init__(self, imagesMeta, GTMeta, labels, cfg, data_type='train'): 'Initialization' self.data_type = data_type if data_type == 'train': g_cfg = cfg.train_cfg elif data_type == 'val': g_cfg = cfg.val_cfg else: g_cfg = cfg.test_cfg self.gen_type = g_cfg.type self.batch_size = g_cfg.batch_size self.nb_batches = g_cfg.nb_batches self.images_per_batch = g_cfg.images_per_batch self.nb_samples_per_image = int(self.batch_size / self.images_per_batch) self.shuffle = g_cfg.shuffle self.inputs = cfg.inputs cfg.img_out_reduction = (16, 16) self.data_path = cfg.data_path self.images_path = self.data_path + 'images/' self.images_path = self.images_path + 'test/' if self.data_type == 'test' else self.images_path + 'train/' self.nb_classes = cfg.nb_classes self.cfg = cfg self.dataID = list(imagesMeta.keys()) self.dataID.sort() if self.shuffle: r.shuffle(self.dataID) else: self.dataID.sort() self.imagesMeta = imagesMeta self.GTMeta = GTMeta # self.gt_label, _, _ = image.getYData(self.dataID, self.imagesMeta, self.GTMeta, self.cfg) self.nb_images = len(self.dataID) # self.nb_samples = len(self.gt_label) stats, _ = utils.getLabelStats(imagesMeta, labels) self.nb_samples = stats['totalx'] if self.nb_batches is None: self.nb_batches = self.nb_images
def load_data(self): cfg = basic_config(self.newDir) cfg = set_config(cfg) cfg.get_args() cfg.update_paths() trainMeta = utils.load_dict(cfg.data_path + 'train') testMeta = utils.load_dict(cfg.data_path + 'test') trainGTMeta = utils.load_dict(cfg.data_path + 'train_GT') testGTMeta = utils.load_dict(cfg.data_path + 'test_GT') labels = utils.load_dict(cfg.data_path + 'labels') if cfg.max_classes is not None: # Reduce data to include only max_classes number of different classes _, counts = utils.getLabelStats(trainGTMeta, labels) trainGTMeta, reduced_idxs = utils.reduceTrainData( trainGTMeta, counts, cfg.max_classes) testGTMeta = utils.reduceTestData(testGTMeta, reduced_idxs) trainMeta = utils.reduceTestData(trainMeta, reduced_idxs) testMeta = utils.reduceTestData(testMeta, reduced_idxs) labels = utils.idxs2labels(reduced_idxs, labels) cfg.nb_classes = len(labels) cfg.set_class_weights(labels, trainGTMeta) _, valMeta = utils.splitData(list(trainMeta.keys()), trainMeta) self.cfg = cfg if cfg.move: self.move_data() print('Path:', cfg.my_results_path) self.labels = labels self.trainMeta = trainMeta self.valMeta = valMeta self.testMeta = testMeta self.trainGTMeta = trainGTMeta self.testGTMeta = testGTMeta
# Create batch generators genTrain = DataGenerator(imagesMeta=data.trainMeta, GTMeta=data.trainGTMeta, cfg=cfg, data_type='train') genVal = DataGenerator(imagesMeta=data.valMeta, GTMeta=data.trainGTMeta, cfg=cfg, data_type='val') genTest = DataGenerator(imagesMeta=data.testMeta, GTMeta=data.testGTMeta, cfg=cfg, data_type='test') stats, count = utils.getLabelStats(data.trainMeta, data.labels) if True: # Save config utils.saveConfig(cfg) utils.saveSplit(cfg, list(data.trainMeta.keys()), list(data.valMeta.keys())) # Create model print('Creating model...') model = HO_RCNN(cfg) trainer = model_trainer(model=model, genTrain=genTrain, genVal=genVal, genTest=genTest,
if False: # Save labels in file annotations = hico.getUniqueLabels(cfg) labels = [] for annot in annotations: obj = annot.nname pred = annot.vname pred_ing = annot.vname_ing label = {'obj': obj, 'pred': pred, 'pred_ing': pred_ing} labels.append(label) utils.save_dict(labels, cfg.part_data_path + 'HICO_labels') labels = utils.load_dict(cfg.part_data_path + 'HICO_labels') stats, counts = utils.getLabelStats(trainMeta, labels) reduced_trainMeta, reduced_idxs = utils.reduceTrainData( trainMeta, counts, 25) reduced_testMeta = utils.reduceTestData(testMeta, reduced_idxs) reduced_labels = utils.idxs2labels(reduced_idxs, labels) reduced_stats, reduced_counts = utils.getLabelStats( reduced_trainMeta, reduced_labels) if False: # Test if all images can be loaded and cropped successfully i = 0 c = 0.0 end = len(testMeta) for imageID, metaData in testMeta.items(): oldPath = cfg.part_data_path + 'HICO_images/test/' + metaData['imageID'] image = cv.imread(oldPath)
# Create batch generators genTrain = DataGenerator(imagesMeta=data.trainMeta, GTMeta = data.trainGTMeta, cfg=cfg, data_type='train', labels=data.labels) genVal = DataGenerator(imagesMeta=data.valMeta, GTMeta = data.trainGTMeta, cfg=cfg, data_type='val', labels=data.labels) genTest = DataGenerator(imagesMeta=data.testMeta, GTMeta = data.testGTMeta, cfg=cfg, data_type='test', labels=data.labels) y_hat = utils.load_obj(cfg.part_results_path + 'y_hat_test') Y = genTest.getYData() Y = utils.load_obj(cfg.part_results_path + 'y_test') res = metrics.computeMultiLabelLoss(Y, y_hat) print(res[1:4]) cm = metrics.computeConfusionMatrixLabels(Y, y_hat) _, counts = utils.getLabelStats(data.trainGTMeta, data.labels) idxs = np.concatenate([np.array([0]), np.argsort(counts, axis=0)+1], axis=0) _, test_counts = utils.getLabelStats(data.testGTMeta, data.labels) test_idxs = np.concatenate([np.array([0]), np.argsort(test_counts, axis=0)+ 1], axis=0) cm_sorted = cm[idxs,:] # cm_reduced = cm_sorted[-100:-1,0:] plt.figure(1) draw.plot_confusion_matrix(cm, data.labels, normalize=True) plt.figure(2) plt.plot([x for x in range(cm.shape[0])], cm[:,0] / np.sum(cm, axis=1)) plt.ylabel('ratio of no label instances') plt.xlabel('classes')