def __init__( self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, weight_r = 0.0001, scheduler=None, use_gpu=True, label_smooth=True ): super(ImageTripletAEEngine, self ).__init__(datamanager, model, optimizer, scheduler, use_gpu) self.weight_t = weight_t self.weight_x = weight_x self.weight_r = weight_r self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth ) self.criterion_mse = torch.nn.MSELoss() self.random = RandomErasing(probability=0.5) self.mgn_loss = Loss(num_classes=self.datamanager.num_train_pids,use_gpu=self.use_gpu,label_smooth=label_smooth) self.BCE_criterion = torch.nn.BCEWithLogitsLoss()
def __init__( self, datamanager, model, optimizer, scheduler=None, use_gpu=False, label_smooth=True, mc_iter=1, init_lmda=1., min_lmda=1., lmda_decay_step=20, lmda_decay_rate=0.5, fixed_lmda=False ): super(ImageSoftmaxNASEngine, self).__init__(datamanager, use_gpu) self.mc_iter = mc_iter self.init_lmda = init_lmda self.min_lmda = min_lmda self.lmda_decay_step = lmda_decay_step self.lmda_decay_rate = lmda_decay_rate self.fixed_lmda = fixed_lmda self.model = model self.optimizer = optimizer self.scheduler = scheduler self.register_model('model', model, optimizer, scheduler) self.criterion = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth )
def __init__(self, datamanager, model, optimizer, margin=0.3, weight_o=1, weight_x=1, scheduler=None, use_gpu=True, label_smooth=True, pooling_method='avg'): super(VideoOIMEngine, self).__init__(datamanager, use_gpu) self.model = model self.optimizer = optimizer self.scheduler = scheduler self.register_model('model', model, optimizer, scheduler) self.pooling_method = pooling_method assert weight_o >= 0 and weight_x >= 0 assert weight_o + weight_x > 0 self.weight_o = weight_o self.weight_x = weight_x self.criterion_o = OIMLoss(2048, 625, scalar=30, momentum=0.5).cuda() self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth)
def __init__(self, datamanager, model, optimizer, margin=0.3, weight_x=1, weight_t=1, weight_r=1, weight_a=1, scheduler=None, use_gpu=True, label_smooth=True, swap_size=(8, 4)): super(ImageSoftmaxDCLTripletEngine, self).__init__(datamanager, use_gpu) self.model = model self.optimizer = optimizer self.scheduler = scheduler self.register_model('model', model, optimizer, scheduler) self.weight_t = weight_t self.weight_x = weight_x self.weight_r = weight_r self.weight_a = weight_a self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth) self.criterion_trip = TripletLoss(margin=0.7) self.criterion_rec = ReconstructionLoss() self.criterion_adver = AdversarialLoss() self.swap_size = swap_size self.swap = transforms.Randomswap((2, 2))
def __init__(self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, scheduler=None, use_gpu=True, label_smooth=True): super(ImageTripletEngine, self).__init__(datamanager, use_gpu) self.model = model self.optimizer = optimizer self.scheduler = scheduler self.register_model('model', model, optimizer, scheduler) self.weight_t = weight_t self.weight_x = weight_x self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth)
def __init__( self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, weight_r=0.0001, scheduler=None, use_gpu=True, label_smooth=True ): super(ImageJointReconsVarEngine, self ).__init__(datamanager, model, optimizer, scheduler, use_gpu) self.weight_t = weight_t self.weight_x = weight_x self.weight_r = weight_r self.criterion_t = TripletLoss(margin=margin) self.local_triplet = TripletLoss_Local(margin=margin) self.done_once = True self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth ) self.criterion_mse = torch.nn.MSELoss() self.random = RandomErasing(probability=0.5,sl=0.02) self.criterion = torch.nn.CrossEntropyLoss()
def __init__( self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, scheduler=None, use_gpu=True, label_smooth=True, mmd_only=True, ): super(ImageMmdEngine, self).__init__(datamanager, model, optimizer, scheduler, use_gpu, mmd_only) self.optimizer.zero_grad() self.mmd_only = mmd_only ### self.weight_t = weight_t self.weight_x = weight_x self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth ) self.criterion_mmd = MaximumMeanDiscrepancy( instances=self.datamanager.train_loader.sampler.num_instances, batch_size=self.datamanager.train_loader.batch_size, global_only=False, distance_only=True, all=False )
def __init__(self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, scheduler=None, use_gpu=True, label_smooth=True, conf_penalty=0.0): super(ImageTripletEngine, self).__init__(datamanager, model, optimizer, scheduler, use_gpu) self.weight_t = weight_t self.weight_x = weight_x self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss(use_gpu=self.use_gpu, label_smooth=label_smooth, conf_penalty=conf_penalty) assert len(self.models) == 1 self.model = self.models['model'] self.optimizer = self.optims['model']
def main(): global args set_random_seed(1) os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu_devices log_name = 'test.log' if args.evaluate else 'train.log' log_name += time.strftime('-%Y-%m-%d-%H-%M-%S') sys.stdout = Logger(osp.join(args.save_dir, log_name)) print('** Arguments **') arg_keys = list(args.__dict__.keys()) arg_keys.sort() for key in arg_keys: print('{}: {}'.format(key, args.__dict__[key])) torch.backends.cudnn.benchmark = True datamanager = ImageDataManager(batch_size=args.batch_size) trainloader, queryloader, galleryloader = datamanager.return_dataloaders() print('Building model: {}'.format(args.arch)) model = build_model(args.arch, 4000, args.bias, args.bnneck, pretrained=(not args.no_pretrained)) if args.load_weights and check_isfile(args.load_weights): load_pretrained_weights(model, args.load_weights) model.cuda() if args.evaluate: evaluate(model, queryloader, galleryloader, args.dist_metric, args.normalize_feature) return criterion = CrossEntropyLoss(4000) optimizer = torch.optim.Adam(model.parameters(), lr=0.0003, weight_decay=5e-04, betas=(0.9, 0.999)) scheduler = build_lr_scheduler(optimizer, args.lr_scheduler, args.stepsize) time_start = time.time() print('=> Start training') for epoch in range(args.start_epoch, args.max_epoch): train(epoch, model, criterion, optimizer, trainloader) scheduler.step() if (epoch + 1) % 20 == 0: save_checkpoint( { 'state_dict': model.state_dict(), 'epoch': epoch + 1, 'optimizer': optimizer.state_dict(), }, args.save_dir) evaluate(model, queryloader, galleryloader, args.dist_metric, args.normalize_feature) elapsed = round(time.time() - time_start) elapsed = str(datetime.timedelta(seconds=elapsed)) print('Elapsed {}'.format(elapsed))
def __init__(self, datamanager, model, optimizer, scheduler=None, use_gpu=True, label_smooth=True): super(ImageSoftmaxEngine, self).__init__(datamanager, model, optimizer, scheduler, use_gpu) self.criterion = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth )
def __init__(self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, weight_db_t=1, weight_db_x=1, weight_b_db_t=1, weight_b_db_x=1, scheduler=None, use_gpu=True, label_smooth=True, top_drop_epoch=-1): super(ImageTripletDropBatchDropBotFeaturesEngine, self).__init__(datamanager, model, optimizer, scheduler, use_gpu) self.weight_t = weight_t self.weight_x = weight_x self.weight_db_t = weight_db_t self.weight_db_x = weight_db_x self.weight_b_db_t = weight_b_db_t self.weight_b_db_x = weight_b_db_x self.top_drop_epoch = top_drop_epoch self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth) self.criterion_db_t = TripletLoss(margin=margin) self.criterion_db_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth) self.criterion_b_db_t = TripletLoss(margin=margin) self.criterion_b_db_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth)
def __init__(self, datamanager, model, optimizer, reg_cfg, metric_cfg, scheduler=None, use_gpu=False, softmax_type='stock', label_smooth=True, conf_penalty=False, m=0.35, s=10, feature_dim=256): super(ImageSoftmaxEngine, self).__init__(datamanager, model, reg_cfg, optimizer, scheduler, use_gpu) if softmax_type == 'stock': self.criterion = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth, conf_penalty=conf_penalty) elif softmax_type == 'am': self.criterion = AMSoftmaxLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, conf_penalty=conf_penalty, m=m, s=s) elif softmax_type == 'ada': self.criterion = AdaCosLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, conf_penalty=conf_penalty) elif softmax_type == 'd_sm': self.criterion = DSoftmaxLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, conf_penalty=conf_penalty) if metric_cfg.enabled: self.metric_losses = MetricLosses(self.datamanager.num_train_pids, feature_dim, self.writer, metric_cfg.soft_margin, metric_cfg.balance_losses) self.metric_losses.center_coeff = metric_cfg.center_coeff self.metric_losses.glob_push_plus_loss_coeff = metric_cfg.glob_push_plus_loss_coeff self.metric_losses.push_loss_coeff = metric_cfg.push_loss_coeff self.metric_losses.push_plus_loss_coeff = metric_cfg.push_plus_loss_coeff self.metric_losses.min_margin_loss_coeff = metric_cfg.min_margin_loss_coeff else: self.metric_losses = None
def __init__(self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, scheduler=None, use_cpu=False, label_smooth=True, experiment=None, combine_method="mean", save_embed=None): super(ImageTripletEngine, self).__init__(datamanager, model, optimizer, scheduler, use_cpu, experiment, combine_method, save_embed) self.weight_t = weight_t self.weight_x = weight_x self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth )
def __init__(self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, scheduler=None, use_gpu=True, label_smooth=True): super(ImageTripletEngine, self).__init__(datamanager, model, optimizer, scheduler, use_gpu) self.weight_t = weight_t self.weight_x = weight_x self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth ) self.criterion_c = CenterLoss(num_classes=751, feat_dim=2048)
def __init__(self, datamanager, model, optimizer, scheduler=None, use_cpu=False, label_smooth=True): super(PoseSoftmaxEngine, self).__init__(datamanager, model, optimizer, scheduler, use_cpu) # TODO modify the criterion for pairwise comparison self.criterion = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth) self.att_criterion = Isolate_loss()
def __init__(self, datamanager, model, optimizer, scheduler=None, use_cpu=False, label_smooth=True, experiment=None, combine_method="mean", save_embed=None): super(ImageSoftmaxEngine, self).__init__(datamanager, model, optimizer, scheduler, use_cpu, experiment, combine_method, save_embed) self.criterion = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth)
def __init__(self, datamanager, model, optimizer, scheduler=None, use_gpu=True, label_smooth=True, conf_penalty=0.0): super(ImageSoftmaxEngine, self).__init__(datamanager, use_gpu) self.model = model self.optimizer = optimizer self.scheduler = scheduler self.register_model('model', model, optimizer, scheduler) self.main_real_loss = CrossEntropyLoss(use_gpu=self.use_gpu, label_smooth=label_smooth, conf_penalty=conf_penalty)
def __init__( self, datamanager, model, optimizer, margin=0.27, weight_t=1, weight_x=1, weight_r = 0.0000000001, #lambda scheduler=None, use_gpu=True, label_smooth=True, mmd_only=True, datamanager2=None, ): super(ImageMmdAEEngine, self).__init__(datamanager, model, optimizer, scheduler, use_gpu, mmd_only,datamanager2) self.optimizer.zero_grad() self.mmd_only = mmd_only ### self.weight_t = weight_t self.weight_x = weight_x self.weight_r = weight_r self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth ) self.criterion_mmd = MaximumMeanDiscrepancy( instances=self.datamanager.train_loader.sampler.num_instances, batch_size=self.datamanager.train_loader.batch_size, global_only=False, distance_only=True, all=False, ) self.criterion_mse = torch.nn.MSELoss() self.random = RandomErasing(probability=0.5,sl=0.07) self.randomt = RandomErasing(probability=0.5,sl=0.01) self.mgn_loss = Loss(num_classes=self.datamanager.num_train_pids,use_gpu=self.use_gpu,label_smooth=label_smooth) self.mgn_targetPredict =FC_Model().cuda() self.BCE_criterion = torch.nn.BCEWithLogitsLoss()
def __init__(self, datamanager, model, optimizer, weight_t=1, weight_x=1, scheduler=None, use_cpu=False, label_smooth=True): super(ImageCenterEngine, self).__init__(datamanager, model, optimizer, scheduler, use_cpu) self.weight_t = weight_t self.weight_x = weight_x # self.optimizer_cri = optimizer self.criterion_t = CenterLoss( num_classes=self.datamanager.num_train_pids, feat_dim=2048, use_gpu= self.use_gpu ) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth )
def __init__(self, datamanager, model, optimizer, scheduler=None, use_gpu=True, label_smooth=True): super(ImageSoftmaxEngine, self).__init__(datamanager, use_gpu) self.model = model self.optimizer = optimizer self.scheduler = scheduler self.register_model('model', model, optimizer, scheduler) self.scaler = torch.cuda.amp.GradScaler() self.criterion = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth)
def __init__( self, datamanager, model1, optimizer1, scheduler1, model2, optimizer2, scheduler2, margin=0.3, weight_t=0.5, weight_x=1., weight_ml=1., use_gpu=True, label_smooth=True, deploy='model1' ): super(ImageDMLEngine, self).__init__(datamanager, use_gpu) self.model1 = model1 self.optimizer1 = optimizer1 self.scheduler1 = scheduler1 self.register_model('model1', model1, optimizer1, scheduler1) self.model2 = model2 self.optimizer2 = optimizer2 self.scheduler2 = scheduler2 self.register_model('model2', model2, optimizer2, scheduler2) self.weight_t = weight_t self.weight_x = weight_x self.weight_ml = weight_ml assert deploy in ['model1', 'model2', 'both'] self.deploy = deploy self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth )
def __init__( self, datamanager, model, optimizer, scheduler=None, use_gpu=True, label_smooth=True, visdom=False ): super(ImageSoftmaxEngine, self).__init__(datamanager, model, optimizer, scheduler, use_gpu) #if self.visdom: self.vis = Visualizations(env_name="turing.livia.etsmtl.ca", port=4242) self.criterion = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth )
def __init__(self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, scheduler=None, use_cpu=False, label_smooth=True): super(PoseTripleEngine, self).__init__(datamanager, model, optimizer, scheduler, use_cpu) self.weight_t = weight_t self.weight_x = weight_x self.criterion_t = TripletLoss(margin=margin) # TODO modify the criterion for pairwise comparison self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth) self.att_criterion = Isolate_loss()
def __init__( self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, weight_r=0.0001, scheduler=None, use_gpu=True, label_smooth=True, only_recons=True, ): super(ImageReconsVarEngine, self).__init__(datamanager, model, optimizer, scheduler, use_gpu) self.optimizer.zero_grad() self.weight_t = weight_t self.weight_x = weight_x self.weight_r = weight_r self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth) self.criterion_mse = torch.nn.MSELoss() self.criterion_mmd = MaximumMeanDiscrepancy( instances=self.datamanager.train_loader.sampler.num_instances, batch_size=self.datamanager.train_loader.batch_size, global_only=False, distance_only=True, all=False) self.only_recons = only_recons self.random = RandomErasing(probability=0.5) self.random2 = RandomErasing(probability=0.65, sl=0.15)
def __init__(self, datamanager, model, optimizer, scheduler=None, use_cpu=False, label_smooth=True, use_att_loss=True, reg_matching_score_epoch=0, num_att=6): super(PoseSoftmaxEngine_wscorereg, self).__init__(datamanager, model, optimizer, scheduler, use_cpu) self.criterion = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth) self.part_c_criterion = Part_similarity_constrain( part_num=num_att).cuda() self.use_att_loss = use_att_loss if self.use_att_loss: self.att_criterion = Isolate_loss() self.reg_matching_score_epoch = reg_matching_score_epoch
def __init__(self, datamanager, model, optimizer, margin=0.3, weight_t=1, weight_x=1, weight_r=1, scheduler=None, use_gpu=True, label_smooth=True): super(ImageJointReconsEngine, self).__init__(datamanager, model, optimizer, scheduler, use_gpu) self.weight_t = weight_t self.weight_x = weight_x self.weight_r = weight_r self.criterion_t = TripletLoss(margin=margin) self.criterion_x = CrossEntropyLoss( num_classes=self.datamanager.num_train_pids, use_gpu=self.use_gpu, label_smooth=label_smooth) self.criterion_mse = torch.nn.MSELoss()
def main(): global args set_random_seed(args.seed) if not args.use_avai_gpus: os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu_devices use_gpu = torch.cuda.is_available() if args.use_cpu: use_gpu = False log_name = 'log_test.txt' if args.evaluate else 'log_train.txt' sys.stdout = Logger(osp.join(args.save_dir, log_name)) print('==========\nArgs:{}\n=========='.format(args)) if use_gpu: print('Currently using GPU {}'.format(args.gpu_devices)) cudnn.benchmark = True else: print('Currently using CPU, however, GPU is highly recommended') print('Initializing video data manager') dm = VideoDataManager(use_gpu, **video_dataset_kwargs(args)) trainloader, testloader_dict = dm.return_dataloaders() print('Initializing model: {}'.format(args.arch)) model = models.init_model(name=args.arch, num_classes=dm.num_train_pids, loss={'xent', 'htri'}, pretrained=not args.no_pretrained, use_gpu=use_gpu) print('Model size: {:.3f} M'.format(count_num_param(model))) if args.load_weights and check_isfile(args.load_weights): load_pretrained_weights(model, args.load_weights) if args.resume and check_isfile(args.resume): checkpoint = torch.load(args.resume) model.load_state_dict(checkpoint['state_dict']) args.start_epoch = checkpoint['epoch'] + 1 best_rank1 = checkpoint['rank1'] print('Loaded checkpoint from "{}"'.format(args.resume)) print('- start_epoch: {}\n- rank1: {}'.format(args.start_epoch, best_rank1)) model = nn.DataParallel(model).cuda() if use_gpu else model criterion = CrossEntropyLoss(num_classes=dm.num_train_pids, use_gpu=use_gpu, label_smooth=args.label_smooth) criterion_htri = TripletLoss(margin=args.margin) optimizer = init_optimizer(model, **optimizer_kwargs(args)) scheduler = init_lr_scheduler(optimizer, **lr_scheduler_kwargs(args)) if args.evaluate: print('Evaluate only') for name in args.target_names: print('Evaluating {} ...'.format(name)) queryloader = testloader_dict[name]['query'] galleryloader = testloader_dict[name]['gallery'] distmat = test(model, queryloader, galleryloader, args.pool_tracklet_features, use_gpu, return_distmat=True) if args.visualize_ranks: visualize_ranked_results(distmat, dm.return_testdataset_by_name(name), save_dir=osp.join( args.save_dir, 'ranked_results', name), topk=20) return start_time = time.time() ranklogger = RankLogger(args.source_names, args.target_names) train_time = 0 print('=> Start training') if args.fixbase_epoch > 0: print( 'Train {} for {} epochs while keeping other layers frozen'.format( args.open_layers, args.fixbase_epoch)) initial_optim_state = optimizer.state_dict() for epoch in range(args.fixbase_epoch): start_train_time = time.time() train(epoch, model, criterion_xent, criterion_htri, optimizer, trainloader, use_gpu, fixbase=True) train_time += round(time.time() - start_train_time) print('Done. All layers are open to train for {} epochs'.format( args.max_epoch)) optimizer.load_state_dict(initial_optim_state) for epoch in range(args.start_epoch, args.max_epoch): start_train_time = time.time() train(epoch, model, criterion_xent, criterion_htri, optimizer, trainloader, use_gpu) train_time += round(time.time() - start_train_time) scheduler.step() if (epoch + 1) > args.start_eval and args.eval_freq > 0 and ( epoch + 1) % args.eval_freq == 0 or (epoch + 1) == args.max_epoch: print('=> Test') for name in args.target_names: print('Evaluating {} ...'.format(name)) queryloader = testloader_dict[name]['query'] galleryloader = testloader_dict[name]['gallery'] rank1 = test(model, queryloader, galleryloader, args.pool_tracklet_features, use_gpu) ranklogger.write(name, epoch + 1, rank1) save_checkpoint( { 'state_dict': model.state_dict(), 'rank1': rank1, 'epoch': epoch, }, False, osp.join(args.save_dir, 'checkpoint_ep' + str(epoch + 1) + '.pth.tar')) elapsed = round(time.time() - start_time) elapsed = str(datetime.timedelta(seconds=elapsed)) train_time = str(datetime.timedelta(seconds=train_time)) print( 'Finished. Total elapsed time (h:m:s): {}. Training time (h:m:s): {}.'. format(elapsed, train_time)) ranklogger.show_summary()
def main(): parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--config-file', type=str, default='', help='path to config file') parser.add_argument( '--gpu-devices', type=str, default='', ) parser.add_argument('opts', default=None, nargs=argparse.REMAINDER, help='Modify config options using the command-line') args = parser.parse_args() cfg = get_default_config() if args.config_file: cfg.merge_from_file(args.config_file) cfg.merge_from_list(args.opts) set_random_seed(cfg.train.seed) os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu_devices log_name = 'test.log' if cfg.test.evaluate else 'train.log' log_name += time.strftime('-%Y-%m-%d-%H-%M-%S') sys.stdout = Logger(osp.join(cfg.data.save_dir, log_name)) print('Show configuration\n{}\n'.format(cfg)) torch.backends.cudnn.benchmark = True datamanager = ImageDataManager(**imagedata_kwargs(cfg)) trainloader, queryloader, galleryloader = datamanager.return_dataloaders() print('Building model: {}'.format(cfg.model.name)) model = build_model(cfg.model.name, datamanager.num_train_pids, 'softmax', pretrained=cfg.model.pretrained) if cfg.model.load_weights and check_isfile(cfg.model.load_weights): load_pretrained_weights(model, cfg.model.load_weights) model = nn.DataParallel(model).cuda() criterion = CrossEntropyLoss(datamanager.num_train_pids, label_smooth=cfg.loss.softmax.label_smooth) optimizer = build_optimizer(model, **optimizer_kwargs(cfg)) scheduler = build_lr_scheduler(optimizer, **lr_scheduler_kwargs(cfg)) if cfg.model.resume and check_isfile(cfg.model.resume): cfg.train.start_epoch = resume_from_checkpoint(cfg.model.resume, model, optimizer=optimizer) if cfg.test.evaluate: distmat = evaluate(model, queryloader, galleryloader, dist_metric=cfg.test.dist_metric, normalize_feature=cfg.test.normalize_feature, rerank=cfg.test.rerank, return_distmat=True) if cfg.test.visrank: visualize_ranked_results(distmat, datamanager.return_testdataset(), 'image', width=cfg.data.width, height=cfg.data.height, save_dir=osp.join(cfg.data.save_dir, 'visrank')) return time_start = time.time() print('=> Start training') for epoch in range(cfg.train.start_epoch, cfg.train.max_epoch): train(epoch, cfg.train.max_epoch, model, criterion, optimizer, trainloader, fixbase_epoch=cfg.train.fixbase_epoch, open_layers=cfg.train.open_layers) scheduler.step() if (epoch + 1) % cfg.test.eval_freq == 0 or (epoch + 1) == cfg.train.max_epoch: rank1 = evaluate(model, queryloader, galleryloader, dist_metric=cfg.test.dist_metric, normalize_feature=cfg.test.normalize_feature, rerank=cfg.test.rerank) save_checkpoint( { 'state_dict': model.state_dict(), 'epoch': epoch + 1, 'rank1': rank1, 'optimizer': optimizer.state_dict(), }, cfg.data.save_dir) elapsed = round(time.time() - time_start) elapsed = str(datetime.timedelta(seconds=elapsed)) print('Elapsed {}'.format(elapsed))
def main(): global args torch.manual_seed(args.seed) if not args.use_avai_gpus: os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu_devices use_gpu = torch.cuda.is_available() if args.use_cpu: use_gpu = False log_name = 'log_test.txt' if args.evaluate else 'log_train.txt' sys.stdout = Logger(osp.join(args.save_dir, log_name)) print("==========\nArgs:{}\n==========".format(args)) if use_gpu: print("Currently using GPU {}".format(args.gpu_devices)) cudnn.benchmark = True torch.cuda.manual_seed_all(args.seed) else: print("Currently using CPU, however, GPU is highly recommended") print("Initializing image data manager") dm = ImageDataManager(use_gpu, **image_dataset_kwargs(args)) trainloader, testloader_dict = dm.return_dataloaders() # ReID-Stream: print("Initializing ReID-Stream: {}".format(args.arch)) model = models.init_model(name=args.arch, num_classes=dm.num_train_pids, reid_dim=args.reid_dim, loss={'xent', 'htri'}) print("ReID Model size: {:.3f} M".format(count_num_param(model))) criterion_xent = CrossEntropyLoss(num_classes=dm.num_train_pids, use_gpu=use_gpu, label_smooth=args.label_smooth) criterion_htri = TripletLoss(margin=args.margin) # 2. Optimizer # Main ReID-Stream: optimizer = init_optimizer(model.parameters(), **optimizer_kwargs(args)) scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=args.stepsize, gamma=args.gamma) if use_gpu: model = nn.DataParallel(model).cuda() if args.evaluate: print("Evaluate only") for name in args.target_names: print("Evaluating {} ...".format(name)) queryloader = testloader_dict[name]['query'] galleryloader = testloader_dict[name]['gallery'] distmat = test(model, queryloader, galleryloader, use_gpu, return_distmat=True) if args.visualize_ranks: visualize_ranked_results(distmat, dm.return_testdataset_by_name(name), save_dir=osp.join( args.save_dir, 'ranked_results', name), topk=20) return start_time = time.time() ranklogger = RankLogger(args.source_names, args.target_names) train_time = 0 print("==> Start training") for epoch in range(args.start_epoch, args.max_epoch): start_train_time = time.time() train(epoch, model, criterion_xent, criterion_htri, \ optimizer, trainloader, use_gpu) train_time += round(time.time() - start_train_time) scheduler.step() if (epoch + 1) > args.start_eval and args.eval_freq > 0 and ( epoch + 1) % args.eval_freq == 0 or (epoch + 1) == args.max_epoch: print("==> Test") for name in args.target_names: print("Evaluating {} ...".format(name)) queryloader = testloader_dict[name]['query'] galleryloader = testloader_dict[name]['gallery'] rank1 = test(model, queryloader, galleryloader, use_gpu) ranklogger.write(name, epoch + 1, rank1) if use_gpu: state_dict = model.module.state_dict() else: state_dict = model.state_dict() save_checkpoint( { 'state_dict': state_dict, 'rank1': rank1, 'epoch': epoch, }, False, osp.join(args.save_dir, 'checkpoint_ep' + str(epoch + 1) + '.pth.tar')) elapsed = round(time.time() - start_time) elapsed = str(datetime.timedelta(seconds=elapsed)) train_time = str(datetime.timedelta(seconds=train_time)) print( "Finished. Total elapsed time (h:m:s): {}. Training time (h:m:s): {}.". format(elapsed, train_time)) ranklogger.show_summary()
def main(): global args torch.manual_seed(args.seed) if not args.use_avai_gpus: os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu_devices use_gpu = torch.cuda.is_available() if args.use_cpu: use_gpu = False log_name = 'log_test.txt' if args.evaluate else 'log_train.txt' sys.stdout = Logger(osp.join(args.save_dir, log_name)) print("==========\nArgs:{}\n==========".format(args)) if use_gpu: print("Currently using GPU {}".format(args.gpu_devices)) cudnn.benchmark = True torch.cuda.manual_seed_all(args.seed) else: print("Currently using CPU, however, GPU is highly recommended") print("Initializing image data manager") dm = ImageDataManager(use_gpu, **image_dataset_kwargs(args)) trainloader, testloader_dict = dm.return_dataloaders() print("Initializing model: {}".format(args.arch)) model = models.init_model(name=args.arch, num_classes=dm.num_train_pids, loss={'xent', 'htri'}) print("Model size: {:.3f} M".format(count_num_param(model))) criterion_xent = CrossEntropyLoss(num_classes=dm.num_train_pids, use_gpu=use_gpu, label_smooth=args.label_smooth) criterion_htri = TripletLoss(margin=args.margin) optimizer = init_optimizer(model.parameters(), **optimizer_kwargs(args)) scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=args.stepsize, gamma=args.gamma) if args.load_weights and check_isfile(args.load_weights): # load pretrained weights but ignore layers that don't match in size checkpoint = torch.load(args.load_weights) pretrain_dict = checkpoint['state_dict'] model_dict = model.state_dict() pretrain_dict = {k: v for k, v in pretrain_dict.items() if k in model_dict and model_dict[k].size() == v.size()} model_dict.update(pretrain_dict) model.load_state_dict(model_dict) print("Loaded pretrained weights from '{}'".format(args.load_weights)) if args.resume and check_isfile(args.resume): checkpoint = torch.load(args.resume) model.load_state_dict(checkpoint['state_dict']) args.start_epoch = checkpoint['epoch'] + 1 print("Loaded checkpoint from '{}'".format(args.resume)) print("- start_epoch: {}\n- rank1: {}".format(args.start_epoch, checkpoint['rank1'])) if use_gpu: model = nn.DataParallel(model).cuda() if args.evaluate: print("Evaluate only") for name in args.target_names: print("Evaluating {} ...".format(name)) queryloader = testloader_dict[name]['query'] galleryloader = testloader_dict[name]['gallery'] distmat = test(model, queryloader, galleryloader, use_gpu, return_distmat=True) if args.visualize_ranks: visualize_ranked_results( distmat, dm.return_testdataset_by_name(name), save_dir=osp.join(args.save_dir, 'ranked_results', name), topk=20 ) return start_time = time.time() ranklogger = RankLogger(args.source_names, args.target_names) train_time = 0 print("=> Start training") if args.fixbase_epoch > 0: print("Train {} for {} epochs while keeping other layers frozen".format(args.open_layers, args.fixbase_epoch)) initial_optim_state = optimizer.state_dict() for epoch in range(args.fixbase_epoch): start_train_time = time.time() train(epoch, model, criterion_xent, criterion_htri, optimizer, trainloader, use_gpu, fixbase=True) train_time += round(time.time() - start_train_time) print("Done. All layers are open to train for {} epochs".format(args.max_epoch)) optimizer.load_state_dict(initial_optim_state) for epoch in range(args.start_epoch, args.max_epoch): start_train_time = time.time() train(epoch, model, criterion_xent, criterion_htri, optimizer, trainloader, use_gpu) train_time += round(time.time() - start_train_time) scheduler.step() if (epoch + 1) > args.start_eval and args.eval_freq > 0 and (epoch + 1) % args.eval_freq == 0 or (epoch + 1) == args.max_epoch: print("=> Test") for name in args.target_names: print("Evaluating {} ...".format(name)) queryloader = testloader_dict[name]['query'] galleryloader = testloader_dict[name]['gallery'] rank1 = test(model, queryloader, galleryloader, use_gpu) ranklogger.write(name, epoch + 1, rank1) if use_gpu: state_dict = model.module.state_dict() else: state_dict = model.state_dict() save_checkpoint({ 'state_dict': state_dict, 'rank1': rank1, 'epoch': epoch, }, False, osp.join(args.save_dir, 'checkpoint_ep' + str(epoch + 1) + '.pth.tar')) elapsed = round(time.time() - start_time) elapsed = str(datetime.timedelta(seconds=elapsed)) train_time = str(datetime.timedelta(seconds=train_time)) print("Finished. Total elapsed time (h:m:s): {}. Training time (h:m:s): {}.".format(elapsed, train_time)) ranklogger.show_summary()