Exemplo n.º 1
0
 def convert_visuals_to_numpy(visuals):
     for key, t in visuals.items():
         tile = opt.batch_size > 8
         if key == 'labels':
             t = util.tensor2label(t, opt.input_nc + 2, tile=tile)
         else:
             t = util.tensor2im(t, tile=tile)
         visuals[key] = t
     return visuals
Exemplo n.º 2
0
    def evaluate_model(self, step):
        self.is_best = False
        save_dir = os.path.join(self.opt.log_dir, 'eval', str(step))
        os.makedirs(save_dir, exist_ok=True)
        self.modules_on_one_gpu.netG.eval()
        torch.cuda.empty_cache()
        fakes, names = [], []
        ret = {}
        cnt = 0
        for i, data_i in enumerate(tqdm(self.eval_dataloader, desc='Eval       ', position=2, leave=False)):
            self.set_input(data_i)
            self.test()
            fakes.append(self.fake_B.cpu())
            for j in range(len(self.image_paths)):
                short_path = ntpath.basename(self.image_paths[j])
                name = os.path.splitext(short_path)[0]
                names.append(name)
                if cnt < 10:
                    input_im = util.tensor2label(self.input_semantics[j], self.opt.input_nc + 2)
                    real_im = util.tensor2im(self.real_B[j])
                    fake_im = util.tensor2im(self.fake_B[j])
                    util.save_image(input_im, os.path.join(save_dir, 'input', '%s.png' % name), create_dir=True)
                    util.save_image(real_im, os.path.join(save_dir, 'real', '%s.png' % name), create_dir=True)
                    util.save_image(fake_im, os.path.join(save_dir, 'fake', '%s.png' % name), create_dir=True)
                cnt += 1
        if not self.opt.no_fid:
            fid = get_fid(fakes, self.inception_model, self.npz, device=self.device,
                          batch_size=self.opt.eval_batch_size, tqdm_position=2)
            if fid < self.best_fid:
                self.is_best = True
                self.best_fid = fid
            self.fids.append(fid)
            if len(self.fids) > 3:
                self.fids.pop(0)
            ret['metric/fid'] = fid
            ret['metric/fid-mean'] = sum(self.fids) / len(self.fids)
            ret['metric/fid-best'] = self.best_fid
        if 'cityscapes' in self.opt.dataroot and not self.opt.no_mIoU:
            mIoU = get_cityscapes_mIoU(fakes, names, self.drn_model, self.device,
                                       table_path=self.opt.table_path,
                                       data_dir=self.opt.cityscapes_path,
                                       batch_size=self.opt.eval_batch_size,
                                       num_workers=self.opt.num_threads, tqdm_position=2)
            if mIoU > self.best_mIoU:
                self.is_best = True
                self.best_mIoU = mIoU
            self.mIoUs.append(mIoU)
            if len(self.mIoUs) > 3:
                self.mIoUs = self.mIoUs[1:]
            ret['metric/mIoU'] = mIoU
            ret['metric/mIoU-mean'] = sum(self.mIoUs) / len(self.mIoUs)
            ret['metric/mIoU-best'] = self.best_mIoU

        self.modules_on_one_gpu.netG.train()
        torch.cuda.empty_cache()
        return ret
Exemplo n.º 3
0
    def evaluate_model(self, step):
        ret = {}
        self.is_best = False
        save_dir = os.path.join(self.opt.log_dir, 'eval', str(step))
        os.makedirs(save_dir, exist_ok=True)
        if self.opt.eval_mode == 'both':
            settings = ('largest', 'smallest')
        else:
            settings = (self.opt.eval_mode, )
        for config_name in settings:
            config = self.configs(config_name)
            fakes, names = [], []
            self.modules_on_one_gpu.netG_student.train()
            self.calibrate(config, 2)
            tqdm_position = 2 + int(not self.opt.no_calibration)
            self.modules_on_one_gpu.netG_student.eval()
            torch.cuda.empty_cache()

            cnt = 0
            for i, data_i in enumerate(
                    tqdm(self.eval_dataloader,
                         desc='Eval       ',
                         position=tqdm_position,
                         leave=False)):
                self.set_input(data_i)
                self.test(config=config)
                fakes.append(self.Sfake_B.cpu())
                for j in range(len(self.image_paths)):
                    short_path = ntpath.basename(self.image_paths[j])
                    name = os.path.splitext(short_path)[0]
                    names.append(name)
                    if cnt < 10:
                        input_im = util.tensor2label(self.input_semantics[j],
                                                     self.opt.input_nc + 2)
                        real_im = util.tensor2im(self.real_B[j])
                        Tfake_im = util.tensor2im(self.Tfake_B[j])
                        Sfake_im = util.tensor2im(self.Sfake_B[j])
                        util.save_image(input_im,
                                        os.path.join(save_dir, 'input',
                                                     '%s.png' % name),
                                        create_dir=True)
                        util.save_image(real_im,
                                        os.path.join(save_dir, 'real',
                                                     '%s.png' % name),
                                        create_dir=True)
                        util.save_image(Tfake_im,
                                        os.path.join(save_dir, 'Tfake',
                                                     '%s.png' % name),
                                        create_dir=True)
                        util.save_image(Sfake_im,
                                        os.path.join(save_dir, 'Sfake',
                                                     '%s.png' % name),
                                        create_dir=True)
                    cnt += 1

            if not self.opt.no_fid:
                fid = get_fid(fakes,
                              self.inception_model,
                              self.npz,
                              device=self.device,
                              batch_size=self.opt.eval_batch_size,
                              tqdm_position=2)
                if fid < getattr(self, 'best_fid_%s' % config_name):
                    self.is_best = True
                    setattr(self, 'best_fid_%s' % config_name, fid)
                fids = getattr(self, 'fids_%s' % config_name)
                fids.append(fid)
                if len(fids) > 3:
                    fids.pop(0)
                ret['metric/fid_%s' % config_name] = fid
                ret['metric/fid_%s-mean' % config_name] = sum(
                    getattr(self, 'fids_%s' % config_name)) / len(
                        getattr(self, 'fids_%s' % config_name))
                ret['metric/fid_%s-best' % config_name] = getattr(
                    self, 'best_fid_%s' % config_name)
            if 'cityscapes' in self.opt.dataroot and not self.opt.no_mIoU:
                mIoU = get_cityscapes_mIoU(fakes,
                                           names,
                                           self.drn_model,
                                           self.device,
                                           table_path=self.opt.table_path,
                                           data_dir=self.opt.cityscapes_path,
                                           batch_size=self.opt.eval_batch_size,
                                           num_workers=self.opt.num_threads,
                                           tqdm_position=2)
                if mIoU > getattr(self, 'best_mIoU_%s' % config_name):
                    self.is_best = True
                    setattr(self, 'best_mIoU_%s' % config_name, mIoU)
                mIoUs = getattr(self, 'mIoUs_%s' % config_name)
                mIoUs.append(mIoU)
                if len(mIoUs) > 3:
                    mIoUs.pop(0)
                ret['metric/mIoU_%s' % config_name] = mIoU
                ret['metric/mIoU_%s-mean' % config_name] = sum(
                    getattr(self, 'mIoUs_%s' % config_name)) / len(
                        getattr(self, 'mIoUs_%s' % config_name))
                ret['metric/mIoU_%s-best' % config_name] = getattr(
                    self, 'best_mIoU_%s' % config_name)
            self.modules_on_one_gpu.netG_student.train()

        torch.cuda.empty_cache()
        return ret