diff --git a/ablation.sh b/ablation.sh index 972c58d..31dea48 100644 --- a/ablation.sh +++ b/ablation.sh @@ -5,9 +5,9 @@ python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52132' --conf python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52133' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.ITEMS_PER_CLASS 30 OUTPUT_DIR "./output/items_30" python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52134' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.ITEMS_PER_CLASS 50 OUTPUT_DIR "./output/items_50" python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52131' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.ITEMS_PER_CLASS 5 OUTPUT_DIR "./output/items_5" -python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52135' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.MARGIN 1.0 OUTPUT_DIR "./output/margin_1" python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52136' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.MARGIN 5.0 OUTPUT_DIR "./output/margin_5" python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52137' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.MARGIN 15.0 OUTPUT_DIR "./output/margin_15" +python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52135' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.MARGIN 1.0 OUTPUT_DIR "./output/margin_1" python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52138' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.MARGIN 20.0 OUTPUT_DIR "./output/margin_20" python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52128' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.MOMENTUM 0.7 OUTPUT_DIR "./output/momentum_0_7" python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52129' --config-file ./configs/OWOD/t1/t1_train.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 OWOD.CLUSTERING.MOMENTUM 0.8 OUTPUT_DIR "./output/momentum_0_8" \ No newline at end of file diff --git a/configs/OWOD/t1/t1_test.yaml b/configs/OWOD/t1/t1_test.yaml index ca67699..5b3867b 100644 --- a/configs/OWOD/t1/t1_test.yaml +++ b/configs/OWOD/t1/t1_test.yaml @@ -1,13 +1,13 @@ _BASE_: "../../Base-RCNN-C4-OWOD.yaml" MODEL: # WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" - WEIGHTS: "/home/fk1/workspace/OWOD/output/t1_std_faster_rcnn/model_final.pth" +# WEIGHTS: "/home/fk1/workspace/OWOD/output/margin_15/model_final.pth" # WEIGHTS: "/home/fk1/workspace/OWOD/output/t1_only_thresh/model_final.pth" -# WEIGHTS: "/home/fk1/workspace/OWOD/output/t1_clustering_with_save/model_final.pth" - ROI_HEADS: - POSITIVE_FRACTION: 0.25 - NMS_THRESH_TEST: 0.5 - SCORE_THRESH_TEST: 0.05 + WEIGHTS: "/home/joseph/workspace/OWOD/output/models_backup/t1_clustering_with_save/model_final.pth" +# ROI_HEADS: +# POSITIVE_FRACTION: 0.25 +# NMS_THRESH_TEST: 0.5 +# SCORE_THRESH_TEST: 0.05 TEST: DETECTIONS_PER_IMAGE: 50 DATASETS: @@ -17,7 +17,7 @@ SOLVER: STEPS: (12000, 16000) MAX_ITER: 18000 WARMUP_ITERS: 100 -OUTPUT_DIR: "./output/t1_test_rerun" +OUTPUT_DIR: "./output/temp_3" OWOD: PREV_INTRODUCED_CLS: 0 CUR_INTRODUCED_CLS: 20 diff --git a/configs/OWOD/t1/t1_val.yaml b/configs/OWOD/t1/t1_val.yaml index d08d922..b750c7a 100644 --- a/configs/OWOD/t1/t1_val.yaml +++ b/configs/OWOD/t1/t1_val.yaml @@ -1,6 +1,6 @@ _BASE_: "../../Base-RCNN-C4-OWOD.yaml" MODEL: - WEIGHTS: "/home/fk1/workspace/OWOD/output/t1_clustering_with_save/model_final.pth" + WEIGHTS: "/home/joseph/workspace/OWOD/output/models_backup/t1_clustering_with_save/model_final.pth" DATASETS: TRAIN: ('voc_coco_2007_val', ) # t1_voc_coco_2007_train, t1_voc_coco_2007_ft TEST: ('voc_coco_2007_val', ) # voc_coco_2007_test @@ -8,11 +8,12 @@ SOLVER: STEPS: (12000, 16000) MAX_ITER: 500 WARMUP_ITERS: 0 -OUTPUT_DIR: "./output/t1_clustering_val" +OUTPUT_DIR: "./output/temp_3" OWOD: PREV_INTRODUCED_CLS: 0 CUR_INTRODUCED_CLS: 20 COMPUTE_ENERGY: True ENERGY_SAVE_PATH: 'energy' SKIP_TRAINING_WHILE_EVAL: False - ENABLE_CLUSTERING: False \ No newline at end of file + ENABLE_CLUSTERING: False + TEMPERATURE: 1.5 \ No newline at end of file diff --git a/detectron2/config/defaults.py b/detectron2/config/defaults.py index 868a455..41035b7 100644 --- a/detectron2/config/defaults.py +++ b/detectron2/config/defaults.py @@ -618,6 +618,8 @@ _C.OWOD.COMPUTE_ENERGY = False _C.OWOD.ENERGY_SAVE_PATH = '' _C.OWOD.SKIP_TRAINING_WHILE_EVAL = False _C.OWOD.FEATURE_STORE_SAVE_PATH = '' +_C.OWOD.TEMPERATURE = 1.5 + # ---------------------------------------------------------------------------- # # Misc options diff --git a/detectron2/data/datasets/builtin.py b/detectron2/data/datasets/builtin.py index c2be253..a68ce17 100644 --- a/detectron2/data/datasets/builtin.py +++ b/detectron2/data/datasets/builtin.py @@ -287,8 +287,8 @@ if __name__.endswith(".builtin"): register_all_lvis(_root) register_all_cityscapes(_root) register_all_cityscapes_panoptic(_root) - # register_all_pascal_voc(_root) + register_all_pascal_voc(_root) + # register_all_pascal_voc('/home/joseph/workspace/OWOD/datasets') # register_all_pascal_voc('/home/joseph/workspace/OWOD/datasets') - register_all_pascal_voc('/home/fk1/workspace/OWOD/datasets') # register_all_voc_style_coco('/home/fk1/workspace/OWOD/datasets') register_all_ade20k(_root) diff --git a/detectron2/data/datasets/pascal_voc.py b/detectron2/data/datasets/pascal_voc.py index 028b990..65c9e74 100644 --- a/detectron2/data/datasets/pascal_voc.py +++ b/detectron2/data/datasets/pascal_voc.py @@ -45,7 +45,7 @@ VOC_CLASS_NAMES = [ ] T2_CLASS_NAMES = [ - "?", "traffic light", "fire hydrant", "stop sign", "parking meter", + "truck", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "microwave", "oven", "toaster", "sink", "refrigerator" diff --git a/detectron2/engine/train_loop.py b/detectron2/engine/train_loop.py index 58cb35c..291c776 100644 --- a/detectron2/engine/train_loop.py +++ b/detectron2/engine/train_loop.py @@ -178,11 +178,13 @@ class TrainerBase: for h in self._hooks: h.after_train() - def analyse_energy(self): + def analyse_energy(self, temp=1.5): files = os.listdir(os.path.join(self.cfg.OUTPUT_DIR, self.cfg.OWOD.ENERGY_SAVE_PATH)) + temp = self.cfg.OWOD.TEMPERATURE + logger = logging.getLogger(__name__) + logger.info('Temperature value: ' + str(temp)) unk = [] known = [] - logger = logging.getLogger(__name__) for id, file in enumerate(files): path = os.path.join(self.cfg.OUTPUT_DIR, self.cfg.OWOD.ENERGY_SAVE_PATH, file) @@ -192,7 +194,7 @@ class TrainerBase: logger.info('Not able to load ' + path + ". Continuing...") continue num_seen_classes = self.cfg.OWOD.PREV_INTRODUCED_CLS + self.cfg.OWOD.CUR_INTRODUCED_CLS - lse = torch.logsumexp(logits[:, :num_seen_classes], dim=1) + lse = temp * torch.logsumexp(logits[:, :num_seen_classes] / temp, dim=1) # lse = torch.logsumexp(logits[:, :-2], dim=1) for i, cls in enumerate(classes): @@ -213,10 +215,17 @@ class TrainerBase: logger.info('Fitting Weibull distribution...') wb_dist_param = [] + + start_time = time.time() wb_unk = Fit_Weibull_3P(failures=unk, show_probability_plot=False, print_results=False) + logger.info("--- %s seconds ---" % (time.time() - start_time)) + wb_dist_param.append({"scale_unk": wb_unk.alpha, "shape_unk": wb_unk.beta, "shift_unk": wb_unk.gamma}) + start_time = time.time() wb_known = Fit_Weibull_3P(failures=known, show_probability_plot=False, print_results=False) + logger.info("--- %s seconds ---" % (time.time() - start_time)) + wb_dist_param.append( {"scale_known": wb_known.alpha, "shape_known": wb_known.beta, "shift_known": wb_known.gamma}) diff --git a/detectron2/evaluation/pascal_voc_evaluation.py b/detectron2/evaluation/pascal_voc_evaluation.py index 49677aa..015ad7e 100644 --- a/detectron2/evaluation/pascal_voc_evaluation.py +++ b/detectron2/evaluation/pascal_voc_evaluation.py @@ -110,6 +110,16 @@ class PascalVOCDetectionEvaluator(DatasetEvaluator): cls[i] = self.unknown_class_index return cls + def update_labels_based_on_softmax(self, logits, classes, thresold=0.9): + cls = classes + if len(logits) <= 0: + return cls + scores = torch.max(torch.nn.functional.softmax(logits[:, :self.num_seen_classes], dim=1), dim=1)[0] + for i, s in enumerate(scores): + if s < thresold: + cls[i] = self.unknown_class_index + return cls + def process(self, inputs, outputs): for input, output in zip(inputs, outputs): image_id = input["image_id"] @@ -118,7 +128,8 @@ class PascalVOCDetectionEvaluator(DatasetEvaluator): scores = instances.scores.tolist() classes = instances.pred_classes.tolist() logits = instances.logits - classes = self.update_label_based_on_energy(logits, classes) + # classes = self.update_label_based_on_energy(logits, classes) + classes = self.update_labels_based_on_softmax(logits, classes) for box, score, cls in zip(boxes, scores, classes): if cls == -100: continue diff --git a/detectron2/utils/visualizer.py b/detectron2/utils/visualizer.py index 181aa50..e723e4a 100644 --- a/detectron2/utils/visualizer.py +++ b/detectron2/utils/visualizer.py @@ -842,7 +842,7 @@ class Visualizer: ) return self.output - def draw_box(self, box_coord, alpha=0.6, edge_color="g", line_style="-"): + def draw_box(self, box_coord, alpha=0.5, edge_color="g", line_style="-"): """ Args: box_coord (tuple): a tuple containing x0, y0, x1, y1 coordinates, where x0 and y0 @@ -869,7 +869,7 @@ class Visualizer: height, fill=False, edgecolor=edge_color, - linewidth=20, + linewidth=15, alpha=alpha, linestyle=line_style, ) diff --git a/run.sh b/run.sh index ec19d9f..3a3c64e 100644 --- a/run.sh +++ b/run.sh @@ -92,4 +92,15 @@ #python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52137' --resume --config-file ./configs/OWOD/t2/t2_ft_400.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 -python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52137' --resume --config-file ./configs/OWOD/t2/t2_ft_20.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 +#python tools/train_net.py --num-gpus 8 --dist-url='tcp://127.0.0.1:52137' --resume --config-file ./configs/OWOD/t2/t2_ft_20.yaml SOLVER.IMS_PER_BATCH 8 SOLVER.BASE_LR 0.01 + +# +#python tools/train_net.py --num-gpus 4 --dist-url='tcp://127.0.0.1:52133' --config-file ./configs/OWOD/t1/t1_val.yaml SOLVER.IMS_PER_BATCH 4 SOLVER.BASE_LR 0.01 OWOD.TEMPERATURE 2 OUTPUT_DIR "./output/temp_2" +# +#python tools/train_net.py --num-gpus 4 --eval-only --config-file ./configs/OWOD/t1/t1_test.yaml SOLVER.IMS_PER_BATCH 4 SOLVER.BASE_LR 0.005 OUTPUT_DIR "./output/temp_2" + + +python tools/train_net.py --num-gpus 4 --dist-url='tcp://127.0.0.1:52133' --config-file ./configs/OWOD/t1/t1_val.yaml SOLVER.IMS_PER_BATCH 4 SOLVER.BASE_LR 0.01 OWOD.TEMPERATURE 1.5 OUTPUT_DIR "./output/temp_1p5" + +python tools/train_net.py --num-gpus 4 --eval-only --config-file ./configs/OWOD/t1/t1_test.yaml SOLVER.IMS_PER_BATCH 4 SOLVER.BASE_LR 0.005 OUTPUT_DIR "./output/temp_1p5" +