예제 #1
0
    def custom_setup(self):
        self.ovr_model = OneVsRestClassifier(LinearSVC(random_state = 0), n_jobs=16)

        # basic meter
        self.loss_meter_ABC = AverageMeter(name='loss_ABC')

        self.ovr_model_path = os.path.join(self.config.TRAIN.model_output, f'ocae_cfg@{self.config_name}#{self.verbose}.npy')
        self.cluster_dataset_keys = self.train_dataloaders_dict['cluster_dataset_dict'].keys()
예제 #2
0
    def custom_setup(self):
        # create loss meters
        self.loss_meter_G = AverageMeter(name='Loss_G')
        self.loss_meter_D = AverageMeter(name='Loss_D')

        self.optical = ParamSet(
            name='optical',
            size=self.config.DATASET.optical_size,
            output_format=self.config.DATASET.optical_format)
예제 #3
0
class ANOPREDTrainer(BaseTrainer):
    NAME = ["ANOPRED.TRAIN"]

    def custom_setup(self):
        # basic meter
        self.loss_meter_G = AverageMeter(name='Loss_G')
        self.loss_meter_D = AverageMeter(name='Loss_D')

        # others
        self.optical = ParamSet(
            name='optical',
            size=self.config.DATASET.optical_size,
            output_format=self.config.DATASET.optical_format)

    def train(self, current_step):
        # Pytorch [N, C, D, H, W]
        # initialize
        start = time.time()
        self.set_requires_grad(self.F, False)
        self.set_requires_grad(self.G, True)
        self.set_requires_grad(self.D, True)
        self.G.train()
        self.D.train()
        self.F.eval()
        writer = self.kwargs['writer_dict']['writer']
        global_steps = self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])]

        # get the data
        data, anno, meta = next(self._train_loader_iter)
        self.data_time.update(time.time() - start)

        # base on the D to get each frame
        target = data[:, :, -1, :, :].cuda()  # t+1 frame
        input_data = data[:, :, :-1, :, :]  # 0 ~ t frame
        input_last = input_data[:, :, -1, :, :].cuda()  # t frame

        # squeeze the D dimension to C dimension, shape comes to [N, C, H, W]
        input_data = input_data.reshape(input_data.shape[0], -1,
                                        input_data.shape[-2],
                                        input_data.shape[-1]).cuda()

        # True Process =================Start===================
        #---------update optim_G ---------
        self.set_requires_grad(self.D, False)
        output_pred_G = self.G(input_data)
        # import ipdb; ipdb.set_trace()
        predFlowEstim = torch.cat([input_last, output_pred_G], 1)
        gtFlowEstim = torch.cat([input_last, target], 1)
        gtFlow_vis, gtFlow = flow_batch_estimate(
            self.F,
            gtFlowEstim,
            self.normalize.param['train'],
            output_format=self.config.DATASET.optical_format,
            optical_size=self.config.DATASET.optical_size)
        predFlow_vis, predFlow = flow_batch_estimate(
            self.F,
            predFlowEstim,
            self.normalize.param['train'],
            output_format=self.config.DATASET.optical_format,
            optical_size=self.config.DATASET.optical_size)

        loss_g_adv = self.GANLoss(self.D(output_pred_G), True)
        loss_op = self.OpticalflowLoss(predFlow, gtFlow)
        loss_int = self.IntentsityLoss(output_pred_G, target)
        loss_gd = self.GradientLoss(output_pred_G, target)
        loss_g_all = self.loss_lamada[
            'IntentsityLoss'] * loss_int + self.loss_lamada[
                'GradientLoss'] * loss_gd + self.loss_lamada[
                    'OpticalflowLoss'] * loss_op + self.loss_lamada[
                        'GANLoss'] * loss_g_adv
        self.optimizer_G.zero_grad()
        loss_g_all.backward()
        self.optimizer_G.step()

        # record
        self.loss_meter_G.update(loss_g_all.detach())

        if self.config.TRAIN.adversarial.scheduler.use:
            self.optimizer_G_scheduler.step()
        #---------update optim_D ---------------
        self.set_requires_grad(self.D, True)
        self.optimizer_D.zero_grad()
        # G_output = self.G(input)
        temp_t = self.D(target)
        temp_g = self.D(output_pred_G.detach())
        loss_d_1 = self.GANLoss(temp_t, True)
        loss_d_2 = self.GANLoss(temp_g, False)
        loss_d = (loss_d_1 + loss_d_2) * 0.5
        # loss_d.sum().backward()
        loss_d.backward()

        self.optimizer_D.step()
        if self.config.TRAIN.adversarial.scheduler.use:
            self.optimizer_D_scheduler.step()
        self.loss_meter_D.update(loss_d.detach())
        # ======================End==================

        self.batch_time.update(time.time() - start)

        if (current_step % self.steps.param['log'] == 0):
            msg = make_info_message(current_step, self.steps.param['max'],
                                    self.kwargs['model_type'], self.batch_time,
                                    self.config.TRAIN.batch_size,
                                    self.data_time,
                                    [self.loss_meter_G, self.loss_meter_D])
            self.logger.info(msg)

        writer.add_scalar('Train_loss_G', self.loss_meter_G.val, global_steps)
        writer.add_scalar('Train_loss_D', self.loss_meter_D.val, global_steps)

        if (current_step % self.steps.param['vis'] == 0):
            vis_objects = OrderedDict({
                'train_target':
                target.detach(),
                'train_output_pred_G':
                output_pred_G.detach(),
                'train_gtFlow':
                gtFlow_vis.detach(),
                'train_predFlow':
                predFlow_vis.detach()
            })
            tensorboard_vis_images(vis_objects, writer, global_steps,
                                   self.normalize.param['train'])

        global_steps += 1
        # reset start
        start = time.time()

        # self.saved_model = {'G':self.G, 'D':self.D}
        self.saved_model['G'] = self.G
        self.saved_model['D'] = self.D
        # self.saved_optimizer = {'optim_G': self.optimizer_G, 'optim_D': self.optimizer_D}
        self.saved_optimizer['optimizer_G'] = self.optimizer_G
        self.saved_optimizer['optimizer_D'] = self.optimizer_D
        # self.saved_loss = {'loss_G':self.loss_meter_G.val, 'loss_D':self.loss_meter_D.val}
        self.saved_loss['loss_G'] = self.loss_meter_G.val
        self.saved_loss['loss_D'] = self.loss_meter_D.val
        self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])] = global_steps
예제 #4
0
class OCAETrainer(BaseTrainer):
    NAME = ["OCAE.TRAIN"]
    def custom_setup(self):
        self.ovr_model = OneVsRestClassifier(LinearSVC(random_state = 0), n_jobs=16)

        # basic meter
        self.loss_meter_ABC = AverageMeter(name='loss_ABC')

        self.ovr_model_path = os.path.join(self.config.TRAIN.model_output, f'ocae_cfg@{self.config_name}#{self.verbose}.npy')
        self.cluster_dataset_keys = self.train_dataloaders_dict['cluster_dataset_dict'].keys()
        # import ipdb; ipdb.set_trace()

    def train(self,current_step):
        # Pytorch [N, C, D, H, W]
        # initialize
        start = time.time()
        self.set_requires_grad(self.A, True)
        self.set_requires_grad(self.B, True)
        self.set_requires_grad(self.C, True)
        self.set_requires_grad(self.Detector, False)
        self.A.train()
        self.B.train()
        self.C.train()
        self.Detector.eval()
        writer = self.kwargs['writer_dict']['writer']
        global_steps = self.kwargs['writer_dict']['global_steps_{}'.format(self.kwargs['model_type'])]

        # get the data
        data, anno, meta = next(self._train_loader_iter)  # the core for dataloader
        self.data_time.update(time.time() - start)
        
        # base on the D to get each frame
        # in this method, D = 3 and not change
        future = data[:, :, -1, :, :].cuda() # t+1 frame 
        current = data[:, :, 1, :, :].cuda() # t frame
        past = data[:, :, 0, :, :].cuda() # t-1 frame

        bboxs = get_batch_dets(self.Detector, current)
        # this method is based on the objects to train the model insted of frames
        for index, bbox in enumerate(bboxs):
            if bbox.numel() == 0:
                bbox = bbox.new_zeros([1, 4])
            # get the crop objects
            input_currentObject_B, _ = multi_obj_grid_crop(current[index], bbox)
            future_object, _ = multi_obj_grid_crop(future[index], bbox)
            # future2current = torch.stack([future_object, input_currentObject_B], dim=1)
            current2future = torch.stack([input_currentObject_B, future_object], dim=1)
            past_object, _ = multi_obj_grid_crop(past[index], bbox)
            # current2past = torch.stack([input_currentObject_B, past_object], dim=1)
            past2current = torch.stack([past_object, input_currentObject_B], dim=1)

            _, _, input_objectGradient_A = frame_gradient(current2future)
            input_objectGradient_A = input_objectGradient_A.sum(1)
            _, _, input_objectGradient_C = frame_gradient(past2current)
            input_objectGradient_C = input_objectGradient_C.sum(1)
            # import ipdb; ipdb.set_trace()
            # True Process =================Start===================
            # original_A = (0.3 * input_objectGradient_A[:,0] + 0.59 * input_objectGradient_A[:,1] + 0.11 * input_objectGradient_A[:,2]).unsqueeze(1)
            # original_B = (0.3 * input_currentObject_B[:,0] + 0.59 * input_currentObject_B[:,1] + 0.11 * input_currentObject_B[:,2]).unsqueeze(1)
            # original_C = (0.3 * input_objectGradient_C[:,0] + 0.59 * input_objectGradient_C[:,1] + 0.11 * input_objectGradient_C[:,2]).unsqueeze(1)
            _, output_recGradient_A, original_A = self.A(input_objectGradient_A)
            _, output_recObject_B, original_B = self.B(input_currentObject_B)
            _, output_recGradient_C, original_C = self.C(input_objectGradient_C)
            # import ipdb; ipdb.set_trace()
            # loss_A = self.a_loss(output_recGradient_A, input_objectGradient_A)
            # loss_B = self.b_loss(output_recObject_B, input_currentObject_B)
            # loss_C = self.c_loss(output_recGradient_C, input_objectGradient_C)
            loss_A = self.ALoss(output_recGradient_A, original_A)
            loss_B = self.BLoss(output_recObject_B, original_B)
            loss_C = self.CLoss(output_recGradient_C, original_C)

            loss_all = self.loss_lamada['ALoss'] * loss_A + self.loss_lamada['BLoss'] * loss_B + self.loss_lamada['CLoss'] * loss_C
            self.optimizer_ABC.zero_grad()
            loss_all.backward()
            self.optimizer_ABC.step()
            # record
            self.loss_meter_ABC.update(loss_all.detach())
            if self.config.TRAIN.general.scheduler.use:
                self.optimizer_ABC_scheduler.step()
            
            # ======================End==================

        self.batch_time.update(time.time() - start)

        if (current_step % self.steps.param['log'] == 0):
            msg = make_info_message(current_step, self.steps.param['max'], self.kwargs['model_type'], self.batch_time, self.config.TRAIN.batch_size, self.data_time, [self.loss_meter_ABC])
            self.logger.info(msg)
        writer.add_scalar('Train_loss_ABC', self.loss_meter_ABC.val, global_steps)

        if (current_step % self.steps.param['vis'] == 0):
            vis_objects = OrderedDict({
                'train_input_objectGradient_A': input_objectGradient_A.detach(),
                'train_input_currentObject_B': input_currentObject_B.detach(),
                'train_input_objectGradient_C': input_objectGradient_C.detach(),
                'train_output_recGradient_A': output_recGradient_A.detach(),
                'train_output_recObject_B': output_recObject_B.detach(),
                'train_output_recGradient_C': output_recGradient_C.detach()
            })
            tensorboard_vis_images(vis_objects, writer, global_steps, self.normalize.param['train'])
        global_steps += 1 
        # reset start
        start = time.time()
        
        # self.saved_model = {'A':self.A, 'B':self.B, 'C':self.C}
        # self.saved_model['A'] = self.A
        # self.saved_model['B'] = self.B
        # self.saved_model['C'] = self.C
        # # self.saved_optimizer = {'optim_ABC': self.optim_ABC}
        # self.saved_optimizer['optimizer_ABC'] = self.optimizer_ABC
        # # self.saved_loss = {'loss_ABC':self.loss_meter_ABC.val}
        # self.saved_loss['loss_ABC'] = self.loss_meter_ABC.val

        self.saved_stuff['step'] = global_steps
        self.saved_stuff['loss'] = self.loss_meter_ABC.val
        self.saved_stuff['A'] = self.A
        self.saved_stuff['B'] = self.B
        self.saved_stuff['C'] = self.C
        self.saved_stuff['optimizer_ABC'] = self.optimizer_ABC

        self.kwargs['writer_dict']['global_steps_{}'.format(self.kwargs['model_type'])] = global_steps
예제 #5
0
 def custom_setup(self):
     # basic meter
     self.loss_predmeter_G = AverageMeter(name='loss_pred_G')
     self.loss_predmeter_D = AverageMeter(name='loss_pred_D')
     self.loss_refinemeter_G = AverageMeter(name='loss_refine_G')
     self.loss_refinemeter_D = AverageMeter(name='loss_refine_D')
예제 #6
0
class ANOPCNTrainer(BaseTrainer):
    NAME = ["ANOPCN.TRAIN"]

    def custom_setup(self):
        # basic meter
        self.loss_predmeter_G = AverageMeter(name='loss_pred_G')
        self.loss_predmeter_D = AverageMeter(name='loss_pred_D')
        self.loss_refinemeter_G = AverageMeter(name='loss_refine_G')
        self.loss_refinemeter_D = AverageMeter(name='loss_refine_D')

    def train(self, current_step):
        # Pytorch [N, C, D, H, W]
        # initialize
        self.set_requires_grad(self.F, False)
        self.set_requires_grad(self.G, True)
        self.set_requires_grad(self.D, True)
        self.D.train()
        self.G.train()
        self.F.eval()

        dynamic_steps = self.steps.param['dynamic_steps']
        temp_step = current_step % dynamic_steps[2]
        if temp_step in range(dynamic_steps[0], dynamic_steps[1]):
            self.train_pcm(current_step)
        elif temp_step in range(dynamic_steps[1], dynamic_steps[2]):
            self.train_erm(current_step)

    def train_pcm(self, current_step):
        # Pytorch [N, C, D, H, W]
        # initialize
        start = time.time()
        if self.kwargs['parallel']:
            self.set_requires_grad(self.G.module.pcm, True)
            self.set_requires_grad(self.G.module.erm, False)
        else:
            self.set_requires_grad(self.G.pcm, True)
            self.set_requires_grad(self.G.erm, False)
        writer = self.kwargs['writer_dict']['writer']
        global_steps = self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])]

        # get the data
        data, anno, meta = next(
            self._train_loader_iter)  # the core for dataloader
        self.data_time.update(time.time() - start)

        # base on the D to get each frame
        target = data[:, :, -1, :, :].cuda()  # t frame
        pred_last = data[:, :, -2, :, :].cuda()  # t-1 frame
        input_data = data[:, :, :-1, :, :].cuda()  # 0 ~ t-1 frame
        # input_data = data.cuda() # 0 ~ t frame

        # True Process =================Start===================
        #---------update optim_G ---------
        self.set_requires_grad(self.D, False)
        output_predframe_G, _ = self.G(input_data, target)

        predFlowEstim = torch.cat([pred_last, output_predframe_G], 1).cuda()
        gtFlowEstim = torch.cat([pred_last, target], 1).cuda()
        gtFlow_vis, gtFlow = flow_batch_estimate(
            self.F,
            gtFlowEstim,
            self.normalize.param['train'],
            output_format=self.config.DATASET.optical_format,
            optical_size=self.config.DATASET.optical_size)
        predFlow_vis, predFlow = flow_batch_estimate(
            self.F,
            predFlowEstim,
            self.normalize.param['train'],
            output_format=self.config.DATASET.optical_format,
            optical_size=self.config.DATASET.optical_size)

        loss_g_adv = self.GANLoss(self.D(output_predframe_G), True)
        loss_op = self.OpticalflowSqrtLoss(predFlow, gtFlow)
        loss_int = self.IntentsityLoss(output_predframe_G, target)
        loss_gd = self.GradientLoss(output_predframe_G, target)

        loss_g_all = self.loss_lamada['IntentsityLoss'] * loss_int + self.loss_lamada['GradientLoss'] * loss_gd + \
                     self.loss_lamada['OpticalflowSqrtLoss'] * loss_op + self.loss_lamada['GANLoss'] * loss_g_adv
        self.optimizer_G.zero_grad()
        loss_g_all.backward()
        self.optimizer_G.step()
        # record
        self.loss_predmeter_G.update(loss_g_all.detach())
        if self.config.TRAIN.adversarial.scheduler.use:
            self.optimizer_G_scheduler.step()

        #---------update optim_D ---------------
        self.set_requires_grad(self.D, True)
        self.optimizer_D.zero_grad()
        temp_t = self.D(target)
        temp_g = self.D(output_predframe_G.detach())
        loss_d_1 = self.GANLoss(temp_t, True)
        loss_d_2 = self.GANLoss(temp_g, False)
        loss_d = (loss_d_1 + loss_d_2) * 0.5
        loss_d.backward()
        self.optimizer_D.step()
        if self.config.TRAIN.adversarial.scheduler.use:
            self.optimizer_D_scheduler.step()
        self.loss_predmeter_D.update(loss_d.detach())
        # ======================End==================

        self.batch_time.update(time.time() - start)

        if (current_step % self.steps.param['log'] == 0):
            msg = make_info_message(
                current_step, self.steps.param['max'],
                self.kwargs['model_type'], self.batch_time,
                self.config.TRAIN.batch_size, self.data_time,
                [self.loss_predmeter_G, self.loss_predmeter_D])
            self.logger.info(msg)

        writer.add_scalar('Train_loss_G', self.loss_predmeter_G.val,
                          global_steps)
        writer.add_scalar('Train_loss_D', self.loss_predmeter_D.val,
                          global_steps)

        if (current_step % self.steps.param['vis'] == 0):
            vis_objects = OrderedDict({
                'train_target_flow':
                gtFlow_vis.detach(),
                'train_pred_flow':
                predFlow_vis.detach(),
                'train_target_frame':
                target.detach(),
                'train_output_predframe_G':
                output_predframe_G.detach()
            })
            tensorboard_vis_images(vis_objects, writer, global_steps,
                                   self.normalize.param['train'])

        global_steps += 1
        # reset start
        start = time.time()

        self.saved_model = {'G': self.G, 'D': self.D}
        self.saved_optimizer = {
            'optim_G': self.optimizer_G,
            'optim_D': self.optimizer_D
        }
        self.saved_loss = {
            'loss_G': self.loss_predmeter_G.val,
            'loss_D': self.loss_predmeter_D.val
        }
        self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])] = global_steps

    def train_erm(self, current_step):
        # Pytorch [N, C, D, H, W]
        # initialize
        start = time.time()
        if self.kwargs['parallel']:
            self.set_requires_grad(self.G.module.erm, True)
            self.set_requires_grad(self.G.module.pcm, False)
        else:
            self.set_requires_grad(self.G.erm, True)
            self.set_requires_grad(self.G.pcm, False)
        writer = self.kwargs['writer_dict']['writer']
        global_steps = self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])]

        # get the data
        data, _ = next(self._train_loader_iter)  # the core for dataloader
        self.data_time.update(time.time() - start)

        # base on the D to get each frame
        target = data[:, :, -1, :, :].cuda()  # t frame
        pred_last = data[:, :, -2, :, :].cuda()  # t-1 frame
        input_data = data[:, :, :-1, :, :].cuda()  # 0 ~ t-1 frame
        # input_data = data.cuda() # 0 ~ t frame

        # True Process =================Start===================
        #---------update optim_G ---------
        self.set_requires_grad(self.D, False)
        _, output_refineframe_G = self.G(input_data, target)

        gtFlowEstim = torch.cat([pred_last, target], 1).cuda()
        predFlowEstim = torch.cat([pred_last, output_refineframe_G], 1).cuda()

        gtFlow_vis, gtFlow = flow_batch_estimate(
            self.F,
            gtFlowEstim,
            self.normalize.param['train'],
            output_format=self.config.DATASET.optical_format,
            optical_size=self.config.DATASET.optical_size)
        predFlow_vis, predFlow = flow_batch_estimate(
            self.F,
            predFlowEstim,
            self.normalize.param['train'],
            output_format=self.config.DATASET.optical_format,
            optical_size=self.config.DATASET.optical_size)

        loss_g_adv = self.GANLoss(self.D(output_refineframe_G), True)
        loss_op = self.OpticalflowSqrtLoss(predFlow, gtFlow)
        loss_int = self.IntentsityLoss(output_refineframe_G, target)
        loss_gd = self.GradientLoss(output_refineframe_G, target)

        loss_g_all = self.loss_lamada['IntentsityLoss'] * loss_int + self.loss_lamada['GradientLoss'] * loss_gd + \
                     self.loss_lamada['OpticalflowSqrtLoss'] * loss_op + self.loss_lamada['GANLoss'] * loss_g_adv
        self.optimizer_G.zero_grad()
        loss_g_all.backward()
        self.optimizer_G.step()
        # record
        self.loss_refinemeter_G.update(loss_g_all.detach())
        if self.config.TRAIN.adversarial.scheduler.use:
            self.optimizer_G_scheduler.step()

        #---------update optim_D ---------------
        self.set_requires_grad(self.D, True)
        self.optimizer_D.zero_grad()
        temp_t = self.D(target)
        temp_g = self.D(output_refineframe_G.detach())
        loss_d_1 = self.GANLoss(temp_t, True)
        loss_d_2 = self.GANLoss(temp_g, False)
        loss_d = (loss_d_1 + loss_d_2) * 0.5
        loss_d.backward()
        self.optim_D.step()

        if self.config.TRAIN.adversarial.scheduler.use:
            self.optimizer_D_scheduler.step()
        self.loss_refinemeter_D.update(loss_d.detach())
        # ======================End==================

        self.batch_time.update(time.time() - start)

        if (current_step % self.steps.param['log'] == 0):
            msg = make_info_message(
                current_step, self.steps.param['max'],
                self.kwargs['model_type'], self.batch_time,
                self.config.TRAIN.batch_size, self.data_time,
                [self.loss_refinemeter_G, self.loss_refinemeter_D])
            self.logger.info(msg)

        writer.add_scalar('Train_loss_G', self.loss_refinemeter_G.val,
                          global_steps)
        writer.add_scalar('Train_loss_D', self.loss_refinemeter_D.val,
                          global_steps)

        if (current_step % self.steps.param['vis'] == 0):
            vis_objects = OrderedDict({
                'train_target_flow':
                gtFlow_vis.detach(),
                'train_pred_flow':
                predFlow_vis.detach(),
                'train_target_frame':
                target.detach(),
                'train_output_refineframe_G':
                output_refineframe_G.detach()
            })
            tensorboard_vis_images(vis_objects, writer, global_steps,
                                   self.normalize.param['train'])

        global_steps += 1
        # reset start
        start = time.time()

        # self.saved_model = {'G':self.G, 'D':self.D}
        self.saved_model['G'] = self.G
        self.saved_model['D'] = self.D
        # self.saved_optimizer = {'optim_G': self.optimizer_G, 'optim_D': self.optimizer_D}
        self.saved_optimizer['optimizer_G'] = self.optimizer_G
        self.saved_optimizer['optimizer_D'] = self.optimizer_D
        # self.saved_loss = {'loss_G':self.loss_refinemeter_G.val, 'loss_D':self.loss_refinemeter_D.val}
        self.saved_loss['loss_G'] = self.loss_refinemeter_G.val
        self.saved_loss['loss_D'] = self.loss_refinemeter_D.val
        self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])] = global_steps
예제 #7
0
    def __init__(self, **kwargs):
        """Initialization Method.
        Args:
            kwargs(dict): the default will have:
                model_dict: The directionary of the moddel
                config: 
                parallel=parallel_flag, 
                pretrain=cfg.MODEL.PRETRAINED.USE
                verbose=args.verbose, 
                time_stamp=time_stamp, 
                model_type=cfg.MODEL.NAME, 
                config_name=cfg_name, 
                hooks=hooks, 
                evaluate_function=evaluate_function,
                final_output_dir=final_output_dir, 
                cpu=args.cpu
        """
        self._hooks = []
        self._register_hooks(kwargs['hooks'])
        self.config = kwargs['config']

        # devices
        self.engine_gpus = self.config.SYSTEM.gpus

        self.model = kwargs['model_dict']

        if self.config.VAL.model_file == '':
            raise Exception("Not have the Trained model file")
        else:
            self.model_path = self.config.VAL.model_file

        # # get the optimizer
        # self.optimizer = kwargs['optimizer_dict']

        # # get the loss_fucntion
        # self.loss_function = kwargs['loss_function_dict']

        # basic meter, will be deprecated in the future.
        self.batch_time = AverageMeter(name='batch_time')
        self.data_time = AverageMeter(name='data_time')

        # others
        self.verbose = kwargs['verbose']
        self.config_name = kwargs['config_name']
        self.kwargs = kwargs
        self.normalize = ParamSet(
            name='normalize',
            train={
                'use': self.config.ARGUMENT.train.normal.use,
                'mean': self.config.ARGUMENT.train.normal.mean,
                'std': self.config.ARGUMENT.train.normal.std
            },
            val={
                'use': self.config.ARGUMENT.val.normal.use,
                'mean': self.config.ARGUMENT.val.normal.mean,
                'std': self.config.ARGUMENT.val.normal.std
            })

        self.evaluate_function = kwargs['evaluate_function']

        # hypyer-parameters of loss
        # self.loss_lamada = kwargs['loss_lamada']

        # the lr scheduler
        # self.lr_scheduler_dict = kwargs['lr_scheduler_dict']

        # initialize the saved objects
        # None

        # Get the models
        for item_key in self.model.keys():
            attr_name = str(item_key)
            if self.kwargs['parallel']:
                temp_model = self.data_parallel(self.model[item_key])
            else:
                temp_model = self.model[item_key].cuda()
            self.__setattr__(attr_name, temp_model)

        # get the losses
        for item_key in self.loss_function.keys():
            attr_name = str(item_key)
            self.__setattr__(attr_name, self.loss_function[attr_name])

        self.custom_setup()
        self.load_model(self.model_path)
예제 #8
0
    def __init__(self, **kwargs):
        """Initialization Method.
        Args:
            defaults(tuple): the default will have:
                0 0->model:{'Generator':net_g, 'Driscriminator':net_d, 'FlowNet':net_flow}
                - 1->train_dataloader: the dataloader    # Will be deprecated in the future
                - 2->val_dataloader: the dataloader     # Will be deprecated in the future
                1 -->dataloader_dict: the dict of all the dataloader will be used in the process
                2 3->optimizer:{'optimizer_g':op_g, 'optimizer_d'}
                3 4->loss_function: {'g_adverserial_loss':.., 'd_adverserial_loss':..., 'gradient_loss':.., 'opticalflow_loss':.., 'intentsity_loss':.. }
                4 5->logger: the logger of the whole training process
                5 6->config: the config object of the whole process
            kwargs(dict): the default will have:
                model_dict: The directionary of the moddel
                dataloaders_dict: 
                optimizer_dict: 
                loss_function_dict:
                logger:
                cfg: 
                parallel=parallel_flag, 
                pretrain=cfg.MODEL.PRETRAINED.USE
                verbose=args.verbose, 
                time_stamp=time_stamp, 
                model_type=cfg.MODEL.NAME, 
                writer_dict=writer_dict, 
                config_name=cfg_name, 
                loss_lamada=loss_lamada,
                hooks=hooks, 
                evaluate_function=evaluate_function,
                lr_scheduler_dict=lr_scheduler_dict,
                final_output_dir=final_output_dir, 
                cpu=args.cpu
        """
        self._hooks = []
        # self._eval_hooks = []
        self._register_hooks(kwargs['hooks'])
        # logger & config
        # self.logger = defaults[4]
        self.config = kwargs['config']
        # devices
        self.engine_gpus = self.config.SYSTEM.gpus

        self.model = kwargs['model_dict']

        if kwargs['pretrain']:
            self.load_pretrain()

        dataloaders_dict = kwargs['dataloaders_dict']

        self.val_dataloaders_dict = dataloaders_dict['train']
        self.val_dataset_keys = list(
            dataloaders_dict['test']['general_dataset_dict'].keys())

        # get the optimizer
        self.optimizer = kwargs['optimizer_dict']

        # get the loss_fucntion
        self.loss_function = kwargs['loss_function_dict']

        # basic meter
        self.batch_time = AverageMeter(name='batch_time')
        self.data_time = AverageMeter(name='data_time')

        # others
        self.verbose = kwargs['verbose']
        self.accuarcy = 0.0  # to store the accuracy varies from epoch to epoch
        self.config_name = kwargs['config_name']
        self.result_path = ''
        self.kwargs = kwargs
        self.normalize = ParamSet(
            name='normalize',
            train={
                'use': self.config.ARGUMENT.train.normal.use,
                'mean': self.config.ARGUMENT.train.normal.mean,
                'std': self.config.ARGUMENT.train.normal.std
            },
            val={
                'use': self.config.ARGUMENT.val.normal.use,
                'mean': self.config.ARGUMENT.val.normal.mean,
                'std': self.config.ARGUMENT.val.normal.std
            })

        self.steps = ParamSet(name='steps',
                              log=self.config.VAL.log_step,
                              vis=self.config.VAL.vis_step,
                              eval=self.config.TRAIN.eval_step,
                              max=self.config.TRAIN.max_steps)

        self.evaluate_function = kwargs['evaluate_function']

        # hypyer-parameters of loss
        self.loss_lamada = kwargs['loss_lamada']

        # the lr scheduler
        self.lr_scheduler_dict = kwargs['lr_scheduler_dict']

        # initialize the saved objects
        # None

        # Get the models
        for item_key in self.model.keys():
            attr_name = str(item_key)
            if self.kwargs['parallel']:
                temp_model = self.data_parallel(self.model[item_key])
            else:
                temp_model = self.model[item_key].cuda()
            self.__setattr__(attr_name, temp_model)

        # get the optimizer
        # None

        # get the losses
        for item_key in self.loss_function.keys():
            attr_name = str(item_key)
            self.__setattr__(attr_name, self.loss_function[attr_name])

        self.custom_setup()
예제 #9
0
class MATrainer(BaseTrainer):
    """
    G
    D_frame
    D_pattern
    AE_act
    AE_obj
    PatternNet
    """
    NAME = ["MA.TRAIN"]

    def custom_setup(self):
        # create loss meters
        self.loss_meter_G = AverageMeter(name='Loss_G')
        self.loss_meter_D = AverageMeter(name='Loss_D')

        self.optical = ParamSet(
            name='optical',
            size=self.config.DATASET.optical_size,
            output_format=self.config.DATASET.optical_format)
        # import ipdb; ipdb.set_trace()

    def train(self, current_step):
        # Pytorch [N, C, D, H, W]
        # initialize
        start = time.time()
        self.set_requires_grad(self.F, False)
        self.set_requires_grad(self.D, True)
        self.set_requires_grad(self.G, True)
        self.G.train()
        self.D.train()
        self.F.eval()
        writer = self.kwargs['writer_dict']['writer']
        global_steps = self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])]

        # get the data
        data, anno, meta = next(self._train_loader_iter)
        self.data_time.update(time.time() - start)

        # base on the D to get each frame
        # in this method, D = 2 and not change
        input_data = data[:, :, 0, :, :].cuda()  # input(1-st) frame
        target = data[:, :, 1, :, :].cuda()  # target(2-nd) frame

        # True Process =================Start===================
        #---------update optim_G ---------
        self.set_requires_grad(self.D, False)
        output_flow_G, output_frame_G = self.G(input_data)
        gt_flow_esti_tensor = torch.cat([input_data, target], 1)
        flow_gt_vis, flow_gt = flow_batch_estimate(
            self.F,
            gt_flow_esti_tensor,
            self.normalize.param['train'],
            optical_size=self.config.DATASET.optical_size,
            output_format=self.config.DATASET.optical_format)
        fake_g = self.D(torch.cat([target, output_flow_G], dim=1))

        loss_g_adv = self.GANLoss(fake_g, True)
        loss_op = self.OpticalflowSqrtLoss(output_flow_G, flow_gt)
        loss_int = self.IntentsityLoss(output_frame_G, target)
        loss_gd = self.GradientLoss(output_frame_G, target)
        loss_g_all = self.loss_lamada[
            'IntentsityLoss'] * loss_int + self.loss_lamada[
                'GradientLoss'] * loss_gd + self.loss_lamada[
                    'OpticalflowSqrtLoss'] * loss_op + self.loss_lamada[
                        'GANLoss'] * loss_g_adv

        self.optimizer_G.zero_grad()
        loss_g_all.backward()
        self.optimizer_G.step()
        self.loss_meter_G.update(loss_g_all.detach())

        if self.config.TRAIN.adversarial.scheduler.use:
            self.optimizer_G_scheduler.step()

        #---------update optim_D ---------------
        self.set_requires_grad(self.D, True)
        self.optimizer_D.zero_grad()
        # import ipdb; ipdb.set_trace()
        real_d = self.D(torch.cat([target, flow_gt], dim=1))
        fake_d = self.D(torch.cat([target, output_flow_G.detach()], dim=1))
        loss_d_1 = self.GANLoss(real_d, True)
        loss_d_2 = self.GANLoss(fake_d, False)
        loss_d = (loss_d_1 + loss_d_2) * 0.5
        loss_d.backward()
        self.optimizer_D.step()
        if self.config.TRAIN.adversarial.scheduler.use:
            self.optimizer_D_scheduler.step()
        self.loss_meter_D.update(loss_d.detach())
        # ======================End==================

        self.batch_time.update(time.time() - start)

        if (current_step % self.steps.param['log'] == 0):
            msg = make_info_message(current_step, self.steps.param['max'],
                                    self.kwargs['model_type'], self.batch_time,
                                    self.config.TRAIN.batch_size,
                                    self.data_time,
                                    [self.loss_meter_G, self.loss_meter_D])
            logger.info(msg)

        writer.add_scalar('Train_loss_G', self.loss_meter_G.val, global_steps)
        writer.add_scalar('Train_loss_D', self.loss_meter_D.val, global_steps)

        if (current_step % self.steps.param['vis'] == 0):
            temp = vis_optical_flow(
                output_flow_G.detach(),
                output_format=self.config.DATASET.optical_format,
                output_size=(output_flow_G.shape[-2], output_flow_G.shape[-1]),
                normalize=self.normalize.param['train'])
            vis_objects = OrderedDict({
                'train_target_flow':
                flow_gt_vis.detach(),
                'train_output_flow_G':
                temp,
                'train_target_frame':
                target.detach(),
                'train_output_frame_G':
                output_frame_G.detach(),
            })
            tensorboard_vis_images(vis_objects, writer, global_steps,
                                   self.normalize.param['train'])
        global_steps += 1

        # reset start
        start = time.time()

        # self.saved_model = {'G':self.G, 'D':self.D}
        self.saved_model['G'] = self.G
        self.saved_model['D'] = self.D
        # self.saved_optimizer = {'optim_G': self.optimizer_G, 'optim_D': self.optimizer_D}
        self.saved_optimizer['optimizer_G'] = self.optimizer_G
        self.saved_optimizer['optimizer_D'] = self.optimizer_D
        # self.saved_loss = {'loss_G':self.loss_meter_G.val, 'loss_D':self.loss_meter_D.val}
        self.saved_loss['loss_G'] = self.loss_meter_G.val
        self.saved_loss['loss_D'] = self.loss_meter_D.val
        self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])] = global_steps
예제 #10
0
    def __init__(self, *defaults, **kwargs):
        """
        Args:
            defaults(tuple): the default will have:
                0 0->model:{'Generator':net_g, 'Driscriminator':net_d, 'FlowNet':net_flow}
                - 1->train_dataloader: the dataloader    # Will be deprecated in the future
                - 2->val_dataloader: the dataloader     # Will be deprecated in the future
                1 -->dataloader_dict: the dict of all the dataloader will be used in the process
                2 3->optimizer:{'optimizer_g':op_g, 'optimizer_d'}
                3 4->loss_function: {'g_adverserial_loss':.., 'd_adverserial_loss':..., 'gradient_loss':.., 'opticalflow_loss':.., 'intentsity_loss':.. }
                4 5->logger: the logger of the whole training process
                5 6->config: the config object of the whole process

            kwargs(dict): the default will have:
                verbose(str):
                parallel(bool): True-> data parallel
                pertrain(bool): True-> use the pretarin model
                dataloaders_dict: will to replace the train_dataloader and test_dataloader
                extra param:
                    test_dataset_keys: the dataset keys of each video
                    test_dataset_dict: the dataset dict of whole test videos
        """
        self._hooks = []
        # self._eval_hooks = []
        self._register_hooks(kwargs['hooks'])
        # logger & config
        self.logger = defaults[4]
        self.config = defaults[5]

        self.model = defaults[0]

        if kwargs['pretrain']:
            self.load_pretrain()

        dataloaders_dict = defaults[1]

        self.val_dataloaders_dict = dataloaders_dict['train']
        self.val_dataset_keys = list(
            dataloaders_dict['test']['general_dataset_dict'].keys())

        # get the optimizer
        self.optimizer = defaults[2]

        # get the loss_fucntion
        self.loss_function = defaults[3]

        # basic meter
        self.batch_time = AverageMeter(name='batch_time')
        self.data_time = AverageMeter(name='data_time')

        # others
        self.verbose = kwargs['verbose']
        self.accuarcy = 0.0  # to store the accuracy varies from epoch to epoch
        self.config_name = kwargs['config_name']
        self.result_path = ''
        self.kwargs = kwargs
        self.normalize = ParamSet(
            name='normalize',
            train={
                'use': self.config.ARGUMENT.train.normal.use,
                'mean': self.config.ARGUMENT.train.normal.mean,
                'std': self.config.ARGUMENT.train.normal.std
            },
            val={
                'use': self.config.ARGUMENT.val.normal.use,
                'mean': self.config.ARGUMENT.val.normal.mean,
                'std': self.config.ARGUMENT.val.normal.std
            })

        self.steps = ParamSet(name='steps',
                              log=self.config.VAL.log_step,
                              vis=self.config.VAL.vis_step,
                              eval=self.config.TRAIN.eval_step,
                              max=self.config.TRAIN.max_steps)

        self.evaluate_function = kwargs['evaluate_function']

        # hypyer-parameters of loss
        self.loss_lamada = kwargs['loss_lamada']

        # the lr scheduler
        self.lr_scheduler_dict = kwargs['lr_scheduler_dict']

        # initialize the saved objects
        # None

        # Get the models
        for item_key in self.model.keys():
            attr_name = str(item_key)
            if self.kwargs['parallel']:
                temp_model = self.data_parallel(self.model[item_key])
            else:
                temp_model = self.model[item_key].cuda()
            self.__setattr__(attr_name, temp_model)

        # get the optimizer
        # None

        # get the losses
        for item_key in self.loss_function.keys():
            attr_name = str(item_key)
            self.__setattr__(attr_name, self.loss_function[attr_name])

        self.custom_setup()
예제 #11
0
 def custom_setup(self):
     # basic meter
     self.loss_meter_STAE = AverageMeter(name='loss_STAE')
예제 #12
0
class STAETrainer(BaseTrainer):
    NAME = ["STAE.TRAIN"]

    def custom_setup(self):
        # basic meter
        self.loss_meter_STAE = AverageMeter(name='loss_STAE')

    def train(self, current_step):
        # Pytorch [N, C, D, H, W]
        # initialize
        start = time.time()
        self.set_requires_grad(self.STAE, True)
        self.STAE.train()
        writer = self.kwargs['writer_dict']['writer']
        global_steps = self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])]

        # get the data
        data, anno, meta = next(
            self._train_loader_iter)  # the core for dataloader
        self.data_time.update(time.time() - start)

        # get the reconstruction and prediction video clip
        time_len = data.shape[2]
        rec_time = time_len // 2
        input_rec = data[:, :, 0:rec_time, :, :].cuda()  # 0 ~ t//2 frame
        input_pred = data[:, :,
                          rec_time:time_len, :, :].cuda()  # t//2 ~ t frame

        # True Process =================Start===================
        output_rec, output_pred = self.STAE(input_rec)
        loss_rec = self.RecLoss(output_rec, input_rec)
        loss_pred = self.WeightedPredLoss(output_pred, input_pred)
        # print(f'loss_rec:{loss_rec}')
        # print(f'loss_pred:{loss_pred}')

        # loss_stae_all = self.loss_lamada['rec_loss'] * loss_rec + self.loss_lamada['weighted_pred_loss'] * loss_pred
        loss_stae_all = self.loss_lamada[
            'RecLoss'] * loss_rec + self.loss_lamada[
                'WeightedPredLoss'] * loss_pred
        # self.optim_STAE.zero_grad()
        self.optimizer_STAE.zero_grad()
        loss_stae_all.backward()
        # self.optim_STAE.step()
        self.optimizer_STAE.step()
        self.loss_meter_STAE.update(loss_stae_all.detach())

        if self.config.TRAIN.general.scheduler.use:
            # self.lr_stae.step()
            self.optimizer_STAE_scheduler.step()
        # ======================End==================

        self.batch_time.update(time.time() - start)

        if (current_step % self.steps.param['log'] == 0):
            msg = make_info_message(current_step, self.steps.param['max'],
                                    self.kwargs['model_type'], self.batch_time,
                                    self.config.TRAIN.batch_size,
                                    self.data_time, [self.loss_meter_STAE])
            self.logger.info(msg)

        writer.add_scalar('Train_loss_STAE', self.loss_meter_STAE.val,
                          global_steps)

        if (current_step % self.steps.param['vis'] == 0):
            vis_objects = OrderedDict({
                'train_output_rec': output_rec.detach(),
                'train_output_pred': output_pred.detach(),
                'train_input_rec': input_rec.detach(),
                'train_input_pred': input_pred.detach()
            })
            tensorboard_vis_images(vis_objects, writer, global_steps,
                                   self.normalize.param['train'])
        global_steps += 1

        # reset start
        start = time.time()

        # self.saved_model = {'STAE':self.STAE}
        self.saved_model['STAE'] = self.STAE
        # self.saved_optimizer = {'optim_STAE': self.optim_STAE}
        # self.saved_optimizer = {'optim_STAE': self.optimizer_STAE}
        self.saved_optimizer['optimizer_STAE'] = self.optimizer_STAE
        # self.saved_loss = {'loss_STAE':self.loss_meter_STAE}
        self.saved_loss['loss_STAE'] = self.loss_meter_STAE
        self.kwargs['writer_dict']['global_steps_{}'.format(
            self.kwargs['model_type'])] = global_steps