From 01538bec6402b6e4b15f8cb07e1b9c2a3d2ef7a7 Mon Sep 17 00:00:00 2001 From: "zuchen.wang" Date: Wed, 3 Nov 2021 20:11:44 +0800 Subject: [PATCH] fix logger and pretty dataset info --- fastreid/evaluation/pair_evaluator.py | 8 +-- projects/FastShoe/configs/online-pcb.yaml | 1 + .../FastShoe/fastshoe/data/excel_dataset.py | 26 ++------ .../FastShoe/fastshoe/data/pair_dataset.py | 65 +++++++++---------- projects/FastShoe/fastshoe/trainer.py | 16 ++--- projects/FastShoe/train_net.py | 24 ++----- 6 files changed, 57 insertions(+), 83 deletions(-) diff --git a/fastreid/evaluation/pair_evaluator.py b/fastreid/evaluation/pair_evaluator.py index 78791d9..94c17ee 100644 --- a/fastreid/evaluation/pair_evaluator.py +++ b/fastreid/evaluation/pair_evaluator.py @@ -70,30 +70,30 @@ class PairEvaluator(DatasetEvaluator): ap = skmetrics.average_precision_score(all_labels, all_distances) auc = skmetrics.roc_auc_score(all_labels, all_distances) # auc under roc - accs = [] precisions = [] recalls = [] f1s = [] + accs = [] for thresh in self._threshold_list: - acc = skmetrics.accuracy_score(all_labels, all_distances >= thresh) precision = skmetrics.precision_score(all_labels, all_distances >= thresh, zero_division=0) recall = skmetrics.recall_score(all_labels, all_distances >= thresh, zero_division=0) f1 = 2 * precision * recall / (precision + recall + 1e-12) + acc = skmetrics.accuracy_score(all_labels, all_distances >= thresh) - accs.append(acc) precisions.append(precision) recalls.append(recall) f1s.append(f1) + accs.append(acc) self._results = OrderedDict() self._results['Acc@0.5'] = acc self._results['Ap'] = ap self._results['Auc'] = auc self._results['Thresholds'] = self._threshold_list - self._results['Accs'] = accs self._results['Precisions'] = precisions self._results['Recalls'] = recalls self._results['F1_Scores'] = f1s + self._results['Accs'] = accs return copy.deepcopy(self._results) diff --git a/projects/FastShoe/configs/online-pcb.yaml b/projects/FastShoe/configs/online-pcb.yaml index 7cd3816..a6191a3 100644 --- a/projects/FastShoe/configs/online-pcb.yaml +++ b/projects/FastShoe/configs/online-pcb.yaml @@ -69,6 +69,7 @@ SOLVER: WARMUP_FACTOR: 0.1 WARMUP_ITERS: 1000 + MAX_EPOCH: 200 IMS_PER_BATCH: 150 TEST: diff --git a/projects/FastShoe/fastshoe/data/excel_dataset.py b/projects/FastShoe/fastshoe/data/excel_dataset.py index fd817ca..c4857ff 100644 --- a/projects/FastShoe/fastshoe/data/excel_dataset.py +++ b/projects/FastShoe/fastshoe/data/excel_dataset.py @@ -14,8 +14,10 @@ from fastreid.utils.env import seed_all_rng @DATASET_REGISTRY.register() class ExcelDataset(ImageDataset): + + _logger = logging.getLogger('fastreid.fastshoe') + def __init__(self, img_root, anno_path, transform=None, **kwargs): - self._logger = logging.getLogger(__name__) self._logger.info('set with {} random seed: 12345'.format(self.__class__.__name__)) seed_all_rng(12345) @@ -55,26 +57,12 @@ class ExcelDataset(ImageDataset): def num_classes(self): return 2 - def get_num_pids(self, data): - return len(data) - - def get_num_cams(self, data): - return 1 - - def parse_data(self, data): - pids = 0 - imgs = set() - for info in data: - pids += 1 - imgs.intersection_update(info) - - return pids, len(imgs) - def show_test(self): - num_query_pids, num_query_images = self.parse_data(self.df['内网crop图'].tolist()) + num_pairs = len(self) + num_images = num_pairs * 2 - headers = ['subset', '# ids', '# images', '# cameras'] - csv_results = [['query', num_query_pids, num_query_pids, num_query_images]] + headers = ['pairs', 'images'] + csv_results = [[num_pairs, num_images]] # tabulate it table = tabulate( diff --git a/projects/FastShoe/fastshoe/data/pair_dataset.py b/projects/FastShoe/fastshoe/data/pair_dataset.py index 7543e21..be5fc38 100644 --- a/projects/FastShoe/fastshoe/data/pair_dataset.py +++ b/projects/FastShoe/fastshoe/data/pair_dataset.py @@ -17,8 +17,10 @@ from fastreid.utils.env import seed_all_rng @DATASET_REGISTRY.register() class PairDataset(ImageDataset): + + _logger = logging.getLogger('fastreid.fastshoe') + def __init__(self, img_root: str, anno_path: str, transform=None, mode: str = 'train'): - self._logger = logging.getLogger(__name__) assert mode in ('train', 'val', 'test'), self._logger.info( '''mode should the one of ('train', 'val', 'test')''') @@ -51,7 +53,7 @@ class PairDataset(ImageDataset): def __getitem__(self, idx): if self.mode == 'test': idx = int(idx / 10) - + pf = self.pos_folders[idx] nf = self.neg_folders[idx] @@ -84,42 +86,35 @@ class PairDataset(ImageDataset): @property def num_classes(self): return 2 + + @property + def num_folders(self): + return len(self) + + @property + def num_pos_images(self): + return sum([len(x) for x in self.pos_folders]) - def get_num_pids(self, data): - return len(data) + @property + def num_neg_images(self): + return sum([len(x) for x in self.neg_folders]) - def get_num_cams(self, data): - return 1 + def describe(self): + headers = ['subset', 'folders', 'pos images', 'neg images'] + csv_results = [[self.mode, self.num_folders, self.num_pos_images, self.num_neg_images]] + + # tabulate it + table = tabulate( + csv_results, + tablefmt="pipe", + headers=headers, + numalign="left", + ) + + self._logger.info(f"=> Loaded {self.__class__.__name__} in csv format: \n" + colored(table, "cyan")) def show_train(self): - num_folders = len(self) - num_train_images = sum([len(x) for x in self.pos_folders]) + sum([len(x) for x in self.neg_folders]) - headers = ['subset', '# folders', '# images'] - csv_results = [[self.mode, num_folders, num_train_images]] - - # tabulate it - table = tabulate( - csv_results, - tablefmt="pipe", - headers=headers, - numalign="left", - ) - - self._logger.info(f"=> Loaded {self.__class__.__name__} in csv format: \n" + colored(table, "cyan")) + return self.describe() def show_test(self): - num_folders = len(self) - num_images = sum([len(x) for x in self.pos_folders]) + sum([len(x) for x in self.neg_folders]) - - headers = ['subset', '# folders', '# images'] - csv_results = [[self.mode, num_folders, num_images]] - - # tabulate it - table = tabulate( - csv_results, - tablefmt="pipe", - headers=headers, - numalign="left", - ) - self._logger.info(f"=> Loaded {self.__class__.__name__} in csv format: \n" + colored(table, "cyan")) - + return self.describe() diff --git a/projects/FastShoe/fastshoe/trainer.py b/projects/FastShoe/fastshoe/trainer.py index a837df5..2b2f466 100644 --- a/projects/FastShoe/fastshoe/trainer.py +++ b/projects/FastShoe/fastshoe/trainer.py @@ -7,7 +7,6 @@ import os import torch -from fastreid.utils.logger import setup_logger from fastreid.data.build import _root from fastreid.engine import DefaultTrainer from fastreid.data.datasets import DATASET_REGISTRY @@ -17,14 +16,15 @@ from fastreid.data.build import build_reid_train_loader, build_reid_test_loader from fastreid.evaluation.pair_score_evaluator import PairScoreEvaluator from projects.FastShoe.fastshoe.data import PairDataset -logger = logging.getLogger(__name__) class PairTrainer(DefaultTrainer): + _logger = logging.getLogger('fastreid.fastshoe') + @classmethod def build_train_loader(cls, cfg): - logger.info("Prepare training set") + cls._logger.info("Prepare training set") transforms = build_transforms(cfg, is_train=True) datasets = [] @@ -49,7 +49,7 @@ class PairTrainer(DefaultTrainer): test_json = os.path.join(_root, 'labels/1019/1019_clean_test.json') anno_path, mode = (test_json, 'test') if cfg.eval_only else (val_json, 'val') - logger.info('Loading {} with {} for {}.'.format(img_root, anno_path, mode)) + cls._logger.info('Loading {} with {} for {}.'.format(img_root, anno_path, mode)) test_set = DATASET_REGISTRY.get(dataset_name)(img_root=img_root, anno_path=anno_path, transform=transforms, mode=mode) test_set.show_test() @@ -61,21 +61,21 @@ class PairTrainer(DefaultTrainer): val_csv_0908 = os.path.join(_root, 'excel/0908/excel_pair_crop_val.csv') test_csv_0908 = os.path.join(_root, 'excel/0908/excel_pair_crop_test.csv') if cfg.eval_only: - logger.info('Loading {} with {} for test.'.format(img_root_0830, test_csv_0830)) + cls._logger.info('Loading {} with {} for test.'.format(img_root_0830, test_csv_0830)) test_set_0830 = DATASET_REGISTRY.get(dataset_name)(img_root=img_root_0830, anno_path=test_csv_0830, transform=transforms) test_set_0830.show_test() - logger.info('Loading {} with {} for test.'.format(img_root_0908, test_csv_0908)) + cls._logger.info('Loading {} with {} for test.'.format(img_root_0908, test_csv_0908)) test_set_0908 = DATASET_REGISTRY.get(dataset_name)(img_root=img_root_0908, anno_path=test_csv_0908, transform=transforms) test_set_0908.show_test() test_set = torch.utils.data.ConcatDataset((test_set_0830, test_set_0908)) else: - logger.info('Loading {} with {} for validation.'.format(img_root_0908, val_csv_0908)) + cls._logger.info('Loading {} with {} for validation.'.format(img_root_0908, val_csv_0908)) test_set = DATASET_REGISTRY.get(dataset_name)(img_root=img_root_0908, anno_path=val_csv_0908, transform=transforms) test_set.show_test() else: - logger.error("Undefined Dataset!!!") + cls._logger.error("Undefined Dataset!!!") exit(-1) data_loader, _ = build_reid_test_loader(cfg, test_set=test_set) diff --git a/projects/FastShoe/train_net.py b/projects/FastShoe/train_net.py index 7ba8935..cb21ee8 100644 --- a/projects/FastShoe/train_net.py +++ b/projects/FastShoe/train_net.py @@ -4,7 +4,6 @@ # @File : train_net.py.py import json -import logging import os import sys @@ -12,11 +11,10 @@ sys.path.append('.') from fastreid.config import get_cfg from fastreid.engine import default_argument_parser, default_setup, launch -from fastreid.utils.checkpoint import Checkpointer, PathManager +from fastreid.utils.checkpoint import Checkpointer from fastreid.utils import bughook from fastshoe import PairTrainer -logger = logging.getLogger(__name__) def setup(args): @@ -26,7 +24,7 @@ def setup(args): cfg = get_cfg() cfg.merge_from_file(args.config_file) cfg.merge_from_list(args.opts) - cfg.__setattr__('eval_only', args.eval_only) + setattr(cfg, 'eval_only', args.eval_only) cfg.freeze() default_setup(cfg, args) return cfg @@ -38,23 +36,15 @@ def main(args): if args.eval_only: cfg.defrost() cfg.MODEL.BACKBONE.PRETRAIN = False + model = PairTrainer.build_model(cfg) Checkpointer(model).load(cfg.MODEL.WEIGHTS) # load trained model - try: - output_dir = os.path.dirname(cfg.MODEL.WEIGHTS) - path = os.path.join(output_dir, "idx2class.json") - with PathManager.open(path, 'r') as f: - idx2class = json.load(f) - except: - logger.info(f"Cannot find idx2class dict in {os.path.dirname(cfg.MODEL.WEIGHTS)}") - res = PairTrainer.test(cfg, model) return res - - trainer = PairTrainer(cfg) - - trainer.resume_or_load(resume=args.resume) - return trainer.train() + else: + trainer = PairTrainer(cfg) + trainer.resume_or_load(resume=args.resume) + return trainer.train() if __name__ == "__main__":