Ejemplo n.º 1
0
  def test(self, name="test", options=None, fixed=False):
    if options == None:
      options = self.options

    t = strfnow()

    for option in options:
      if fixed == True:
        a, b, c, d = self.loader.tests[option]
      else:
        a, b, c, d = self.loader.next(set_option=option)

      feed = {self.a: a,
              self.b: b,
              self.c: c,
              self.d: d}

      fname = "%s/%s_option:%s_time:%s.png" % (self.sample_dir, name, option, t)
      g_img, g2_img, g3_img = self.sess.run([self.g1_img, self.g2_img, self.g3_img], feed_dict=feed)

      imsave(fname, merge(a, b, c, d, g_img, g2_img, g3_img))
Ejemplo n.º 2
0
if args.hist_match == 1:
    image_suffix = "_histogram_color.png"
    mode = "RGB"
else:
    image_suffix = "_original_color.png"
    mode = "YCbCr"

image_path = os.path.splitext(args.generated_image)[0] + image_suffix

generated_image = imread(args.generated_image, mode="RGB")
img_width, img_height, _ = generated_image.shape

content_image = imread(args.content_image, mode=mode)
content_image = imresize(content_image, (img_width, img_height),
                         interp='bicubic')

mask_transfer = args.mask is not None
if mask_transfer:
    mask_img = load_mask(args.mask, generated_image.shape)
else:
    mask_img = None

img = original_color_transform(content_image,
                               generated_image,
                               mask_img,
                               args.hist_match,
                               mode=mode)
imsave(image_path, img)

print("Image saved at path : %s" % image_path)
Ejemplo n.º 3
0
    def train(self, config):

        # NOTE : if train, the nx, ny are ingnored
        nx, ny = input_setup(config)

        data_dir = checkpoint_dir(config)

        input_, label_ = read_data(data_dir)

        # Stochastic gradient descent with tself.des_block_ALLhe standard backpropagation
        self.train_op = tf.train.AdamOptimizer(
            learning_rate=config.learning_rate).minimize(self.loss)
        tf.initialize_all_variables().run()

        counter = 0
        time_ = time.time()

        self.load(config.checkpoint_dir)
        # Train
        if config.is_train:
            print("Now Start Training...")
            for ep in range(config.epoch):
                # Run by batch images
                batch_idxs = len(input_) // config.batch_size
                for idx in range(0, batch_idxs):
                    batch_images = input_[idx * config.batch_size:(idx + 1) *
                                          config.batch_size]
                    batch_labels = label_[idx * config.batch_size:(idx + 1) *
                                          config.batch_size]
                    counter += 1
                    _, err = self.sess.run(
                        [self.train_op, self.loss],
                        feed_dict={
                            self.images:
                            batch_images,
                            self.labels:
                            batch_labels,
                            self.batch:
                            1,
                            self.deconv_output: [
                                self.batch_size, self.label_size,
                                self.label_size, 256
                            ]
                        })
                    if counter % 10 == 0:
                        print(
                            "Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]"
                            % ((ep + 1), counter, time.time() - time_, err))
                    if counter % 500 == 0:
                        self.save(config.checkpoint_dir, counter)
        # Test
        else:
            print("Now Start Testing...")
            res = list()
            for i in range(len(input_)):
                result = self.pred.eval({
                    self.images:
                    input_[i].reshape(1, input_[i].shape[0],
                                      input_[i].shape[1], 3),
                    self.deconv_output:
                    [1, self.label_size, self.label_size, 256]
                })
                # back to interval [0 , 1]
                x = np.squeeze(result)
                x = (x + 1) / 2
                res.append(x)
            res = np.asarray(res)
            res = merge(res, [nx, ny], self.c_dim)

            if self.test_img is "":
                imsave(res, config.result_dir + '/result.png', config)
            else:
                string = self.test_img.split(".")
                print(string)
                imsave(res, config.result_dir + '/' + string[0] + '.png',
                       config)
Ejemplo n.º 4
0
    if preserve_color and content is not None:
        img = original_color_transform(content, img, mask=color_mask)

    if not rescale_image:
        img_ht = int(img_width * aspect_ratio)
        print("Rescaling Image to (%d, %d)" % (img_width, img_ht))
        img = imresize(img, (img_width, img_ht), interp=args.rescale_method)

    if rescale_image:
        print("Rescaling Image to (%d, %d)" % (img_WIDTH, img_HEIGHT))
        img = imresize(img, (img_WIDTH, img_HEIGHT),
                       interp=args.rescale_method)

    fname = result_prefix + "_at_iteration_%d.png" % (i + 1)
    imsave(fname, img)
    end_time = time.time()
    print("Image saved as", fname)
    print("Iteration %d completed in %ds" % (i + 1, end_time - start_time))

    if improvement_threshold is not 0.0:
        if improvement < improvement_threshold and improvement is not 0.0:
            print(
                "Improvement (%f) is less than improvement threshold (%f). Early stopping script."
                % (improvement, improvement_threshold))
            exit()
"""
python inetwork_tf.py "C:\\Users\\somsh\\OneDrive\\Pictures\\Album Art\\Ryogi-Shiki-small2.jpg" "C:\\Users\\somsh\\OneDrive\\Pictures\\
Art\\Blue Butterfly.jpg" "C:\\Users\\somsh\\Desktop\\Neural Art\\Ryogi" --image_size 400 --content_weight 0.025 --style_weight 1.0 --total_variation_weight 8.5E-05 --style_scale 1 --num_iter
 10 --rescale_image "False" --rescale_method "bicubic" --maintain_aspect_ratio "True" --content_layer "conv5_2" --init_image "content" --pool_type "max" --preserve_color "False" --min_
improvement 0 --model "vgg16" --content_loss_type 0
Ejemplo n.º 5
0
def train(model,
          train_loader,
          test_loader,
          mode='EDSR_Baseline',
          save_image_every=50,
          save_model_every=10,
          test_model_every=1,
          num_epochs=1000,
          device=None,
          refresh=True):

    if device is None:
        device = 'cuda' if torch.cuda.is_available() else 'cpu'

    today = datetime.datetime.now().strftime('%Y.%m.%d')

    result_dir = f'./results/{today}/{mode}'
    weight_dir = f'./weights/{today}/{mode}'
    logger_dir = f'./logger/{today}_{mode}'
    csv = f'./hist_{today}_{mode}.csv'
    if refresh:
        try:
            shutil.rmtree(result_dir)
            shutil.rmtree(weight_dir)
            shutil.rmtree(logger_dir)
        except FileNotFoundError:
            pass
    os.makedirs(result_dir, exist_ok=True)
    os.makedirs(weight_dir, exist_ok=True)
    os.makedirs(logger_dir, exist_ok=True)
    logger = SummaryWriter(log_dir=logger_dir, flush_secs=2)
    model = model.to(device)

    params = list(model.parameters())
    optim = torch.optim.Adam(params, lr=1e-4)
    scheduler = torch.optim.lr_scheduler.StepLR(optim,
                                                step_size=1000,
                                                gamma=0.99)
    criterion = torch.nn.L1Loss()

    ######

    pool = torch.nn.MaxPool2d(3).to(device)
    pad1 = torch.nn.ZeroPad2d(1).to(device)
    pad2 = torch.nn.ZeroPad2d(2).to(device)

    ######

    start_time = time.time()
    print(f'Training Start || Mode: {mode}')

    step = 0
    pfix = OrderedDict()
    pfix_test = OrderedDict()

    hist = dict()
    hist['mode'] = f'{today}_{mode}'
    for key in ['epoch', 'psnr', 'ssim', 'ms-ssim']:
        hist[key] = []

    for epoch in range(num_epochs):

        if epoch == 0:
            torch.save(model.state_dict(),
                       f'{weight_dir}/epoch_{epoch+1:04d}.pth')

        if epoch == 0:
            with torch.no_grad():
                with tqdm(
                        test_loader,
                        desc=f'Warming Up || Test Epoch {epoch}/{num_epochs}',
                        position=0,
                        leave=True) as pbar_test:
                    psnrs = []
                    ssims = []
                    msssims = []
                    for lr, hr, fname in pbar_test:
                        lr = lr.to(device)
                        hr = hr.to(device)

                        sr, features = model(lr)
                        sr = quantize(sr)

                        psnr, ssim, msssim = evaluate(hr, sr)

                        psnrs.append(psnr)
                        ssims.append(ssim)
                        msssims.append(msssim)

                        psnr_mean = np.array(psnrs).mean()
                        ssim_mean = np.array(ssims).mean()
                        msssim_mean = np.array(msssims).mean()

                        pfix_test['psnr'] = f'{psnr:.4f}'
                        pfix_test['ssim'] = f'{ssim:.4f}'
                        pfix_test['msssim'] = f'{msssim:.4f}'
                        pfix_test['psnr_mean'] = f'{psnr_mean:.4f}'
                        pfix_test['ssim_mean'] = f'{ssim_mean:.4f}'
                        pfix_test['msssim_mean'] = f'{msssim_mean:.4f}'

                        pbar_test.set_postfix(pfix_test)
                        if len(psnrs) > 1: break

        with tqdm(train_loader,
                  desc=f'Epoch {epoch+1}/{num_epochs}',
                  position=0,
                  leave=True) as pbar:
            psnrs = []
            ssims = []
            msssims = []
            losses = []
            for lr, hr, _ in pbar:
                lr = lr.to(device)
                hr = hr.to(device)

                # prediction
                sr, features = model(lr)

                ####
                sr_pool, hr_pool = [], []

                sr_pool.append(pool(sr))
                hr_pool.append(pool(hr))

                sr_pool.append(-pool(-sr))
                hr_pool.append(-pool(-hr))

                sr_pool.append(pool(pad1(sr)))
                hr_pool.append(pool(pad1(hr)))

                sr_pool.append(-pool(pad1(-sr)))
                hr_pool.append(-pool(pad1(-hr)))

                sr_pool.append(pool(pad2(sr)))
                hr_pool.append(pool(pad2(hr)))

                sr_pool.append(-pool(pad2(-sr)))
                hr_pool.append(-pool(pad2(-hr)))

                loss_pool = 0
                for sr_, hr_ in zip(sr_pool, hr_pool):
                    loss_pool += criterion(sr_, hr_)
                #####

                # training
                loss = criterion(hr, sr)
                loss_tot = loss + loss_pool
                optim.zero_grad()
                loss_tot.backward()
                optim.step()
                scheduler.step()

                # training history
                elapsed_time = time.time() - start_time
                elapsed = sec2time(elapsed_time)
                pfix['Step'] = f'{step+1}'
                pfix['Loss'] = f'{loss.item():.4f}'
                pfix['Loss Pool'] = f'{loss_pool.item():.4f}'

                sr = quantize(sr)
                psnr, ssim, msssim = evaluate(hr, sr)

                psnrs.append(psnr)
                ssims.append(ssim)
                msssims.append(msssim)

                psnr_mean = np.array(psnrs).mean()
                ssim_mean = np.array(ssims).mean()
                msssim_mean = np.array(msssims).mean()

                pfix['PSNR'] = f'{psnr:.2f}'
                pfix['SSIM'] = f'{ssim:.4f}'
                # pfix['MSSSIM'] = f'{msssim:.4f}'
                pfix['PSNR_mean'] = f'{psnr_mean:.2f}'
                pfix['SSIM_mean'] = f'{ssim_mean:.4f}'
                # pfix['MSSSIM_mean'] = f'{msssim_mean:.4f}'

                free_gpu = get_gpu_memory()[0]

                pfix['free GPU'] = f'{free_gpu}MiB'
                pfix['Elapsed'] = f'{elapsed}'

                pbar.set_postfix(pfix)
                losses.append(loss.item())

                if step % save_image_every == 0:

                    z = torch.zeros_like(lr[0])
                    xz = torch.cat((lr[0], z), dim=-2)
                    imsave([xz, sr[0], hr[0]],
                           f'{result_dir}/epoch_{epoch+1}_iter_{step:05d}.jpg')

                step += 1

            logger.add_scalar("Loss/train", np.array(losses).mean(), epoch + 1)
            logger.add_scalar("PSNR/train", psnr_mean, epoch + 1)
            logger.add_scalar("SSIM/train", ssim_mean, epoch + 1)

            if (epoch + 1) % save_model_every == 0:
                torch.save(model.state_dict(),
                           f'{weight_dir}/epoch_{epoch+1:04d}.pth')

            if (epoch + 1) % test_model_every == 0:

                with torch.no_grad():
                    with tqdm(test_loader,
                              desc=f'Test Epoch {epoch+1}/{num_epochs}',
                              position=0,
                              leave=True) as pbar_test:
                        psnrs = []
                        ssims = []
                        msssims = []
                        for lr, hr, fname in pbar_test:

                            fname = fname[0].split('/')[-1].split('.pt')[0]

                            lr = lr.to(device)
                            hr = hr.to(device)

                            sr, features = model(lr)
                            sr = quantize(sr)

                            psnr, ssim, msssim = evaluate(hr, sr)

                            psnrs.append(psnr)
                            ssims.append(ssim)
                            msssims.append(msssim)

                            psnr_mean = np.array(psnrs).mean()
                            ssim_mean = np.array(ssims).mean()
                            msssim_mean = np.array(msssims).mean()

                            pfix_test['psnr'] = f'{psnr:.4f}'
                            pfix_test['ssim'] = f'{ssim:.4f}'
                            pfix_test['msssim'] = f'{msssim:.4f}'
                            pfix_test['psnr_mean'] = f'{psnr_mean:.4f}'
                            pfix_test['ssim_mean'] = f'{ssim_mean:.4f}'
                            pfix_test['msssim_mean'] = f'{msssim_mean:.4f}'

                            pbar_test.set_postfix(pfix_test)

                            z = torch.zeros_like(lr[0])
                            xz = torch.cat((lr[0], z), dim=-2)
                            imsave([xz, sr[0], hr[0]],
                                   f'{result_dir}/{fname}.jpg')

                        hist['epoch'].append(epoch + 1)
                        hist['psnr'].append(psnr_mean)
                        hist['ssim'].append(ssim_mean)
                        hist['ms-ssim'].append(msssim_mean)

                        logger.add_scalar("PSNR/test", psnr_mean, epoch + 1)
                        logger.add_scalar("SSIM/test", ssim_mean, epoch + 1)
                        logger.add_scalar("MS-SSIM/test", msssim_mean,
                                          epoch + 1)

                        df = pd.DataFrame(hist)
                        df.to_csv(csv)
Ejemplo n.º 6
0
def train(model, train_loader, test_loader, mode='EDSR_Baseline', save_image_every=50, save_model_every=10, test_model_every=1, epoch_start=0, num_epochs=1000, device=None, refresh=True, scale=2, today=None):

    if device is None:
        device = 'cuda' if torch.cuda.is_available() else 'cpu'
    if today is None:
        today = datetime.datetime.now().strftime('%Y.%m.%d')
    
    result_dir = f'./results/{today}/{mode}'
    weight_dir = f'./weights/{today}/{mode}'
    logger_dir = f'./logger/{today}_{mode}'
    csv = f'./hist_{today}_{mode}.csv'
    if refresh:
        try:
            shutil.rmtree(result_dir)
            shutil.rmtree(weight_dir)
            shutil.rmtree(logger_dir)
        except FileNotFoundError:
            pass
    os.makedirs(result_dir, exist_ok=True)
    os.makedirs(weight_dir, exist_ok=True)
    os.makedirs(logger_dir, exist_ok=True)
    logger = SummaryWriter(log_dir=logger_dir, flush_secs=2)
    model = model.to(device)
    model.load_state_dict(torch.load('./weights/2021.03.10/HMNET_no_fea_REDS_JPEG_size_0/epoch_0025.pth'))

    params = list(model.parameters())
    optim = torch.optim.Adam(params, lr=1e-4)
    scheduler = torch.optim.lr_scheduler.StepLR(optim, step_size=1000, gamma= 0.99)
    # criterion = torch.nn.L1Loss()
    criterion = torch.nn.MSELoss()
    GMSD = GMSD_quality().to(device)
    opening = Opening().to(device)
    blur = Blur().to(device)
    mshf = MSHF(3, 3).to(device)
    
    downx2_bicubic = nn.Upsample(scale_factor=1/2, mode='bicubic', align_corners=False)
    downx4_bicubic = nn.Upsample(scale_factor=1/4, mode='bicubic', align_corners=False)
        
    padl = nn.ReflectionPad2d(10)
    padh = nn.ReflectionPad2d(20)
        
    start_time = time.time()
    print(f'Training Start || Mode: {mode}')

    step = 0
    pfix = OrderedDict()
    pfix_test = OrderedDict()

    hist = dict()
    hist['mode'] = f'{today}_{mode}'
    for key in ['epoch', 'psnr', 'ssim', 'ms-ssim']:
        hist[key] = []

    soft_mask = False
    
    # hf_kernel = get_hf_kernel(mode='high')

    for epoch in range(epoch_start, epoch_start+num_epochs):
        sigma = 0.0004 * (epoch+1)
        if epoch == 0:
            torch.save(model.state_dict(), f'{weight_dir}/epoch_{epoch+1:04d}.pth')
            
        if epoch == 0:
            with torch.no_grad():
                with tqdm(test_loader, desc=f'{mode} || Warming Up || Test Epoch {epoch}/{num_epochs}', position=0, leave=True) as pbar_test:
                    psnrs = []
                    ssims = []
                    msssims = []
                    for lr, hr, fname in pbar_test:
                        lr = lr.to(device)
                        hr = hr.to(device)
                        
                        sr, srx2, srx1 = model(hr)
                        
                        sr = quantize(sr)
                        
                        psnr, ssim, msssim = evaluate(hr, sr)
                        
                        psnrs.append(psnr)
                        ssims.append(ssim)
                        msssims.append(msssim)
                        
                        psnr_mean = np.array(psnrs).mean()
                        ssim_mean = np.array(ssims).mean()
                        msssim_mean = np.array(msssims).mean()

                        pfix_test['psnr_mean'] = f'{psnr_mean:.4f}'
                        pfix_test['ssim_mean'] = f'{ssim_mean:.4f}'
                        pfix_test['msssim_mean'] = f'{msssim_mean:.4f}'

                        pbar_test.set_postfix(pfix_test)
                        if len(psnrs) > 1: break
                        

        with tqdm(train_loader, desc=f'{mode} || Epoch {epoch+1}/{num_epochs}', position=0, leave=True) as pbar:
            psnrs = []
            ssims = []
            msssims = []
            losses = []
            for lr, hr, _ in pbar:
                lr = lr.to(device)
                hr = hr.to(device)

                # prediction
                sr, srx2, srx4 = model(lr)
                
                gmsd = GMSD(hr, sr)
                
                sr_ = quantize(sr)      
                psnr, ssim, msssim = evaluate(hr, sr_)
                
                #hrx2 = downx2_bicubic(hr)
                #hrx4 = downx4_bicubic(hr)
                
                loss = criterion(sr, hr)
                #lossx2 = criterion(srx2, hrx2)
                #lossx4 = criterion(srx4, hrx4)
                
                # training
                loss_tot = loss# + 0.25 * lossx2 + 0.0625 * lossx4
                optim.zero_grad()
                loss_tot.backward()
                optim.step()
                scheduler.step()
                
                # training history 
                elapsed_time = time.time() - start_time
                elapsed = sec2time(elapsed_time)            
                pfix['Step'] = f'{step+1}'
                pfix['Loss'] = f'{loss.item():.4f}'
                
                pfix['Elapsed'] = f'{elapsed}'
                
                psnrs.append(psnr)
                ssims.append(ssim)
                msssims.append(msssim)

                psnr_mean = np.array(psnrs).mean()
                ssim_mean = np.array(ssims).mean()
                msssim_mean = np.array(msssims).mean()

                pfix['PSNR_mean'] = f'{psnr_mean:.2f}'
                pfix['SSIM_mean'] = f'{ssim_mean:.4f}'
                           
                free_gpu = get_gpu_memory()[0]
                
                pfix['free GPU'] = f'{free_gpu}MiB'
                
                pbar.set_postfix(pfix)
                losses.append(loss.item())
                
                if step % save_image_every == 0:
                
                    imsave([lr[0], sr[0], hr[0], gmsd[0]], f'{result_dir}/epoch_{epoch+1}_iter_{step:05d}.jpg')
                    
                step += 1
                
            logger.add_scalar("Loss/train", np.array(losses).mean(), epoch+1)
            logger.add_scalar("PSNR/train", psnr_mean, epoch+1)
            logger.add_scalar("SSIM/train", ssim_mean, epoch+1)
            
            if (epoch+1) % save_model_every == 0:
                torch.save(model.state_dict(), f'{weight_dir}/epoch_{epoch+1:04d}.pth')
                
            if (epoch+1) % test_model_every == 0:
                
                with torch.no_grad():
                    with tqdm(test_loader, desc=f'{mode} || Test Epoch {epoch+1}/{num_epochs}', position=0, leave=True) as pbar_test:
                        psnrs = []
                        ssims = []
                        msssims = []
                        for lr, hr, fname in pbar_test:
                            
                            fname = fname[0].split('/')[-1].split('.pt')[0]
                            
                            lr = lr.to(device)
                            hr = hr.to(device)
                            sr, _, _ = model(lr)
                            
                            mshf_hr = mshf(hr)
                            mshf_sr = mshf(sr)
                            
                            gmsd = GMSD(hr, sr)  
                            
                            sr = quantize(sr)

                            psnr, ssim, msssim = evaluate(hr, sr)

                            psnrs.append(psnr)
                            ssims.append(ssim)
                            msssims.append(msssim)

                            psnr_mean = np.array(psnrs).mean()
                            ssim_mean = np.array(ssims).mean()
                            msssim_mean = np.array(msssims).mean()

                            pfix_test['psnr_mean'] = f'{psnr_mean:.4f}'
                            pfix_test['ssim_mean'] = f'{ssim_mean:.4f}'
                            pfix_test['msssim_mean'] = f'{msssim_mean:.4f}'
                            
                            pbar_test.set_postfix(pfix_test)
                            
                            
                            imsave([lr[0], sr[0], hr[0], gmsd[0]], f'{result_dir}/{fname}.jpg')
                            
                            mshf_vis = torch.cat((torch.cat([mshf_sr[:,i,:,:] for i in range(mshf_sr.shape[1])], dim=-1),
                                                  torch.cat([mshf_hr[:,i,:,:] for i in range(mshf_hr.shape[1])], dim=-1)), dim=-2)
                            
                            imsave(mshf_vis, f'{result_dir}/MSHF_{fname}.jpg')
                            
                        hist['epoch'].append(epoch+1)
                        hist['psnr'].append(psnr_mean)
                        hist['ssim'].append(ssim_mean)
                        hist['ms-ssim'].append(msssim_mean)
                        
                        logger.add_scalar("PSNR/test", psnr_mean, epoch+1)
                        logger.add_scalar("SSIM/test", ssim_mean, epoch+1)
                        logger.add_scalar("MS-SSIM/test", msssim_mean, epoch+1)
                        
                        df = pd.DataFrame(hist)
                        df.to_csv(csv)
Ejemplo n.º 7
0
def train(
        date,
        dataset='DAGM_8',
        code_dim=100,
        epochs=25,
        use_cuda=True,
        batch_size=128,
        lr_g=.1,
        lr_z=.1,
        max_num_samples=100000,
        init='pca',
        n_pca=(64 * 64 * 3 * 2),
        loss='lap_l1',
):
    print(colors.BLUE+"====================start training===================="+colors.ENDL)
    save_dir = 'results/'+dataset+'/'+date
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    # load datasets for training and validation set
    if dataset == 'DAGM_10':
        train_loader = utils.load(data_dir='../data/DAGM_10/mix',
            batch_size=batch_size, img_size=128, convert='L')
        val_loader = utils.load(data_dir='../data/DAGM_10/mix',
            batch_size=8*8, img_size=128, convert='L')
    elif dataset == 'DAGM_8':
        train_loader = utils.load(data_dir='../data/DAGM_8/mix',
            batch_size=batch_size, img_size=128, convert='L')
        val_loader = utils.load(data_dir='../data/DAGM_8/mix',
            batch_size=8*8, img_size=128, convert='L')
    else:
        raise Exception("No such dataset!!")

    # we don't really have a validation set here, but for visualization let us 
    # just take the first couple images from the dataset

    
    
    # =================================================================================================
    # =========================================Train part==============================================
    # =================================================================================================
    # do droping in one-third of all epochs
    epochs_d = round(epochs/3)
    items_all = len(os.listdir('../data/'+dataset+'/mix'))
    per_drop_num = round(0.1*items_all)
    
    # do droping 3 times
    cycle_d = 3
    for cyc in range(cycle_d):
        
        
        # initialize representation space:
        train_loader = utils.load(data_dir='../data/DAGM_8/mix',
            batch_size=batch_size, img_size=128, convert='L')
        
        if init == 'pca':
            from sklearn.decomposition import PCA

            # first, take a subset of train set to fit the PCA
            X_pca = np.vstack([
                X.cpu().numpy().reshape(len(X), -1)
                for i, (X, _, _)
                 in zip(tqdm(range(n_pca // train_loader.batch_size), 'collect data for PCA'), 
                        train_loader)
            ])
            print("perform PCA...")
            pca = PCA(n_components=code_dim)
            pca.fit(X_pca)
            # then, initialize latent vectors to the pca projections of the complete dataset
            Z = np.empty((len(train_loader.dataset), code_dim))
            print(Z.shape)
            for X, _, idx in tqdm(train_loader, 'pca projection'):
                idx = idx.numpy()
                Z[idx] = pca.transform(X.cpu().numpy().reshape(len(X), -1))

        elif init == 'random':
            Z = np.random.randn(len(train_loader.dataset), code_dim)
        else:
            raise Exception("-i : choices=[pca random]")

        # project the latent vectors into a unit ball
        Z = utils.project_l2_ball(Z)

        # we use only 1 output channel
        g = maybe_cuda(Generator_128(code_dim, out_channels=1))
        
        loss_fn = LapLoss(max_levels=3)#if loss == 'lap_l1' else nn.MSELoss()
        zi = maybe_cuda(torch.zeros((batch_size, code_dim)))
        zi = Variable(zi, requires_grad=True)
        optimizer = SGD([
            {'params': g.parameters(), 'lr': lr_g}, 
            {'params': zi, 'lr': lr_z}
        ])
        val_loader = utils.load(data_dir='../data/'+dataset+'/mix', batch_size=8*8, img_size=128, convert='L')
        Xi_val, _, idx_val = next(iter(val_loader))

        
        
        
        
        save_drop_dir = save_dir+'/drop_%d'%(cyc+1)
        if not os.path.exists(save_drop_dir):
            os.makedirs(save_drop_dir)
        
        utils.imsave(save_dir+'/target_%d.png'%(cyc+1),make_grid(Xi_val.cpu(),nrow=8,normalize=True,range=(0,1)).numpy().transpose(1,2,0))
        overall_loss = []

        for epoch in range(epochs_d):
            losses= []
            progress = tqdm(total=len(train_loader)-1, desc='epoch % 3d' %(epoch+1))
            
            for i, (Xi, yi, idx) in enumerate(train_loader):
                if i == train_loader.dataset.__len__() // batch_size:
                    break
                Xi = Variable(maybe_cuda(Xi))
                zi.data = maybe_cuda(torch.FloatTensor(Z[idx.numpy()]))

                optimizer.zero_grad()
                rec = g(zi)
                loss = loss_fn(rec, Xi)
                loss.backward()
                optimizer.step()

                Z[idx.numpy()] = utils.project_l2_ball(zi.data.cpu().numpy())

                losses.append(loss.item())
                progress.set_postfix({'loss_%d'%(cyc+1): np.mean(losses[-100:])})
                progress.update()
        
            overall_loss.append(np.mean(losses[:]))
            progress.close()
            
            # visualize reconstructions
            rec = g(Variable(maybe_cuda(torch.FloatTensor(Z[idx_val.numpy()]))))
            if ((epoch+1) % 10)==0 :
                utils.imsave(save_dir+'/part%d_epoch_%03d.png' % (cyc+1, epoch+1), 
                       make_grid(rec.data.cpu(),nrow=8,normalize=True,range=(0,1)).numpy().transpose(1,2,0))
        
        utils.loss_plot(overall_loss, save_dir+'/train_loss.png')
        print("save loss plot")    
            
        # save generator model
        torch.save(g.state_dict(), os.path.join(save_dir,'model_epoch_'+str(epochs)+'.pth'))
        print("generator model saved")    
        
        print("saving optimized latent code")
        with open(save_dir+'/train_latent_code.csv', 'w') as f:
            np.savetxt(f, Z, delimiter=' ')
        
        print(colors.BLUE+"Part_%d training finished!"%(cyc+1)+colors.ENDL)
        
        # =================================================================================================
        # =====================================Test and Drop part==========================================
        # =================================================================================================

        # initialize representation space:
        if init == 'pca':
            from sklearn.decomposition import PCA

            # first, take a subset of train set to fit the PCA
            X_pca = np.vstack([X.cpu().numpy().reshape(len(X), -1)
                for i, (X, _, _)
                 in zip(tqdm(range(n_pca // train_loader.batch_size), 'collect data for PCA'),
                        train_loader)
            ])
            print("performing PCA...")
            pca = PCA(n_components=code_dim)
            pca.fit(X_pca)
            # then, initialize latent vectors to the pca projections of the complete dataset
            Z = np.empty((len(train_loader.dataset), code_dim))
            print(Z.shape)
            for X, _, idx in tqdm(train_loader, 'pca projection'):
                idx = idx.numpy()
                Z[idx] = pca.transform(X.cpu().numpy().reshape(len(X), -1))

        elif init == 'random':
            Z = np.random.randn(len(train_loader.dataset), code_dim)

        # because we want to see the difference, so we don't project to unit ball
        # but it will not show the convex property, so we still project it to unit ball
        Z = utils.project_l2_ball(Z)
        g = maybe_cuda(Generator_128(code_dim, out_channels=1))

        pretrained_file = glob.glob(save_dir+'/*.pth')  
        g.load_state_dict(torch.load(pretrained_file[0]))
        print("load pre-trained weights success!!")

        loss_fn = LapLoss(max_levels=3)
        #loss_fn = nn.MSELoss()
        zi = maybe_cuda(torch.zeros((batch_size, code_dim)))
        zi = Variable(zi, requires_grad=True)
        optimizer = Adam([{'params': zi, 'lr': lr_z}])    
        #optimizer = SGD([{'params': zi, 'lr': lr_z}])
        # fix the parameters of the generator
        for param in g.parameters():
            param.requires_grad = False

        for i, (Xi, yi, idx) in enumerate(train_loader):
            if i == (train_loader.dataset.__len__() // batch_size):
                print(len(idx))
                break
            losses = []
            progress = tqdm(total=epochs-1, desc='batch iter % 4d' % (i+1))
            Xi = Variable(maybe_cuda(Xi))
            zi.data = maybe_cuda(torch.FloatTensor(Z[idx.numpy()]))
            epoch_start_time = time.time()
        
            for epoch in range(epochs):
                optimizer.zero_grad()
                loss = loss_fn(g(zi), Xi)
                loss.backward()
                optimizer.step()
                # we don't project back to unit ball in test stage
                #Z[idx.numpy()] = zi.data.cpu().numpy()
                Z[idx.numpy()] = utils.project_l2_ball(zi.data.cpu().numpy())
                #print(Z[idx.numpy()])
                losses.append(loss.item())
                progress.set_postfix({'loss': np.mean(losses[-100:])})
                progress.update()
         
            progress.close()

        print("saving optimized latent code")
        with open(save_dir+'/test_latent_code.csv', 'w') as f:
            np.savetxt(f, Z, delimiter=' ')
        print(colors.BLUE+"Part_%d testing finished!"%(cyc+1)+colors.ENDL)
                
        # Calculate the variance and drop bigger ones
        # read latent codes from csv
        train_csv = glob.glob(save_dir+'/test_latent_code.csv')
        df_train = pd.read_csv(train_csv[0], header=None, delimiter=' ')
        train_latent = df_train.values
        # calculate variance and mean
        train_mu    = np.mean(train_latent, axis=1)
        train_sigma = np.var(train_latent, axis=1)
        mu          = np.mean(train_mu)
        
        ori_items = os.listdir('../data/'+dataset+'/mix')
        dir_num = len(ori_items)
        count_value_ok = 0
        value_fid = np.zeros(dir_num)
        print('total pictures in folder : %d' % dir_num)
        
        for i in range(dir_num):
            diff_fid = train_mu[i] - mu
            value_fid[i] = diff_fid**2 + train_sigma[i]
        
        # Find the first 10% large fid number
        tmp_list = sorted(value_fid)
        fid_threshold = tmp_list[(-1*per_drop_num)]
        print('first 10 percent large num is : %.4f' % fid_threshold)

        for j in range(dir_num):
            if value_fid[j] >= fid_threshold:
                shutil.move('../data/'+dataset+'/mix/'+ori_items[j], save_drop_dir+'/'+ori_items[j])

        print(colors.BLUE+"Part_%d droping finished!"%(cyc+1)+colors.ENDL)
    
    
    # Count
    c1_ok, c1_ng = utils.count_ok(dataset, date, '/drop_1')
    c2_ok, c2_ng = utils.count_ok(dataset, date, '/drop_2')
    c3_ok, c3_ng = utils.count_ok(dataset, date, '/drop_3')
    all_ok, all_ng = utils.count_ok_ori(dataset, 'mix')

    print("+-----------+-----------+-----------+")
    print("|First  Drop|OK: %6d |NG:  %6d|" %(c1_ok, c1_ng))
    print("|-----------+-----------+-----------|")
    print("|Second Drop|OK: %6d |NG:  %6d|" %(c2_ok, c2_ng))
    print("|-----------+-----------+-----------|")
    print("|Third  Drop|OK: %6d |NG:  %6d|" %(c3_ok, c3_ng))
    print("|-----------+-----------+-----------|")
    print("|The OK Part|OK: %6d |NG:  %6d|" %(all_ok, all_ng))
    print("+-----------+-----------+-----------+")
    
    
    print(colors.BLUE+"========================Droping Finish======================="+colors.ENDL)    
Ejemplo n.º 8
0
    def train(self, config):
        if config.is_train:
            input_setup(self.sess, config)
        else:
            nx, ny = input_setup(self.sess, config)

        if config.is_train:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "train.h5")
        else:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "test.h5")

        train_data, train_label = read_data(data_dir)

        # Stochastic gradient descent with the standard backpropagation
        self.train_op = tf.train.GradientDescentOptimizer(
            config.learning_rate).minimize(self.loss)

        tf.initialize_all_variables().run()

        counter = 0
        start_time = time.time()
        if load(self):
            print(" [*] Load SUCCESS")
        else:
            print(" [!] Load failed...")
        if config.is_train:
            print("Training...")

            for ep in xrange(config.epoch):
                # Run by batch images
                batch_idxs = len(train_data) // config.batch_size
                for idx in xrange(0, batch_idxs):
                    batch_images = train_data[idx *
                                              config.batch_size:(idx + 1) *
                                              config.batch_size]
                    batch_labels = train_label[idx *
                                               config.batch_size:(idx + 1) *
                                               config.batch_size]

                    counter += 1
                    _, err = self.sess.run([self.train_op, self.loss],
                                           feed_dict={
                                               self.images: batch_images,
                                               self.labels: batch_labels
                                           })

                    if counter % 10 == 0:
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]" \
                          % ((ep+1), counter, time.time()-start_time, err))

                    if counter % 500 == 0:
                        self.save(config.checkpoint_dir, counter)

        else:
            print("Testing...")

            result = self.pred.eval({
                self.images: train_data,
                self.labels: train_label
            })

            result = merge(result, [nx, ny])
            result = result.squeeze()
            image_path = os.path.join(os.getcwd(), config.sample_dir)
            image_path = os.path.join(image_path, "test_image.png")
            print(train_label.shape)
            self.imshow(result)
            imsave(result, image_path)
Ejemplo n.º 9
0
def main(_):
  pp.pprint(flags.FLAGS.__flags)

  if not os.path.exists(FLAGS.checkpoint_dir):
    os.makedirs(FLAGS.checkpoint_dir)
  if not os.path.exists(FLAGS.sample_dir):
    os.makedirs(FLAGS.sample_dir)
  if FLAGS.is_train:
    with tf.Session(config=config_sess) as sess:
      srcnn = SRCNN(sess, 
                  image_size=FLAGS.image_size, 
                  label_size=FLAGS.label_size, 
                  batch_size=FLAGS.batch_size,
                  h0=FLAGS.h0,
                  w0=FLAGS.w0,
                  c_dim=FLAGS.c_dim, 
                  checkpoint_dir=FLAGS.checkpoint_dir,
                  sample_dir=FLAGS.sample_dir)
      srcnn.train(FLAGS)
      #RMSE_tab.append(srcnn.train(FLAGS))
      #sio.savemat(os.path.join(results_path, 'RMSE_tab.mat'), {'RMSE_tab':RMSE_tab})
  else:
    sio.savemat(os.path.join(results_path, 'configuration.mat'),{"data_path":data_path, "is_train":is_train,"checkpoint_path":checkpoint_path, "config":config})

    data_dir = data_path      
    rgb_input_list =glob.glob(os.path.join(data_dir,'*_RGB.bmp'))
    image_test=[]
    RMSE_tab = []
    print(f'The number of input images is {len(rgb_input_list)}')
    
    for ide in range(0,len(rgb_input_list)):
      image_test.append(np.float32(imageio.imread(rgb_input_list[ide])) / 255)
    for idx in range(0,len(rgb_input_list)):
      depth_input_down_image   = glob.glob(os.path.join(data_dir,str(idx)+'_Df_down.mat'))
      depth_label_list_image   = glob.glob(os.path.join(data_dir,str(idx)+'_Df.mat'))
      rgb_input_list_image     = glob.glob(os.path.join(data_dir,str(idx)+'_RGB.bmp'))
      
      print('PATH INPUT IMAGES')
      print('index_image ='+str(idx))
      print(depth_input_down_image)
      print(depth_label_list_image)
      print(rgb_input_list_image)
      
      depth_up = sio.loadmat(depth_label_list_image[0])['I_up']
      #image_path = os.path.join(os.getcwd(), 'sample')
      image_path = results_path
      image_path = os.path.join(image_path, str(idx)+"_up.png" )
      imsave(depth_up, image_path)
      [IMAGE_HEIGHT,IMAGE_WIDTH] = image_test[idx].shape
      with tf.compat.v1.Session() as sess:
        srcnn = SRCNN(sess, 
                  image_size=FLAGS.image_size, 
                  label_size=FLAGS.label_size, 
                  batch_size=FLAGS.batch_size,
                  h0=IMAGE_HEIGHT,
                  w0=IMAGE_WIDTH,
                  c_dim=1, 
                  i=idx,
                  checkpoint_dir=FLAGS.checkpoint_dir,
                  sample_dir=FLAGS.sample_dir,
                  test_dir=rgb_input_list_image[0],
                  test_depth=depth_input_down_image[0],
                  test_label=depth_label_list_image[0])
        RMSE_tab.append(srcnn.train(FLAGS))
        sio.savemat(os.path.join(results_path, 'RMSE_tab.mat'), {'RMSE_tab':RMSE_tab})
Ejemplo n.º 10
0
def train_multiple(generator, discriminator, opt, dataloader, writer, scale):
    feature_extractor = FeatureExtractor(
        torchvision.models.vgg19(pretrained=True))

    content_criterion = nn.MSELoss()
    adversarial_criterion = nn.BCELoss()
    aesthetic_loss = AestheticLoss()

    ones_const = Variable(torch.ones(opt.batchSize, 1))

    if opt.cuda:
        generator.cuda()
        discriminator.cuda()
        feature_extractor.cuda()
        content_criterion.cuda()
        adversarial_criterion.cuda()
        ones_const = ones_const.cuda()

    optimizer = optim.Adam(generator.parameters(), lr=opt.generatorLR)
    optim_discriminator = optim.Adam(
        discriminator.parameters(), lr=opt.discriminatorLR)
    scheduler_gen = ReduceLROnPlateau(
        optimizer, 'min', factor=0.7, patience=10, verbose=True)
    scheduler_dis = ReduceLROnPlateau(
        optim_discriminator, 'min', factor=0.7, patience=10, verbose=True)
    curr_time = time.time()
    inputs = torch.FloatTensor(opt.batchSize, 3, opt.imageSize, opt.imageSize)

    # pretraining
    for epoch in range(2):
        mean_generator_content_loss = 0.0

        inputs = torch.FloatTensor(
            opt.batchSize, 3, opt.imageSize, opt.imageSize)

        for batch_no, data in enumerate(dataloader['train']):
            high_img, _ = data
            # save_image(high_img, "test.png")
            # time.sleep(10)

            for j in range(opt.batchSize):
                inputs[j] = scale(high_img[j])
                high_img[j] = normalize(high_img[j])

            # print(high_img[0].shape)
            # print(inputs[0].shape)
            # time.sleep(10)

            if opt.cuda:
                optimizer.zero_grad()
                high_res_real = Variable(high_img.cuda())
                high_res_fake = generator(Variable(inputs[0][np.newaxis, :]).cuda(), Variable(inputs[1][np.newaxis, :]).cuda(
                ), Variable(inputs[2][np.newaxis, :]).cuda(), Variable(inputs[3][np.newaxis, :]).cuda())

                generator_content_loss = content_criterion(
                    high_res_fake, high_res_real)

                mean_generator_content_loss += generator_content_loss.data.item()

                generator_content_loss.backward()
                optimizer.step()

                sys.stdout.write('\r[%d/%d][%d/%d] Generator_MSE_Loss: %.4f' % (
                    epoch, 2, batch_no, len(dataloader['train']), generator_content_loss.data.item()))

    # training
    for epoch in range(opt.nEpochs):
        for phase in ['train', 'test']:
            if phase == 'test':
                generator.train(False)
                discriminator.train(False)
            else:
                generator.train(True)
                discriminator.train(True)

            mean_generator_content_loss = 0.0
            mean_generator_adversarial_loss = 0.0
            mean_generator_total_loss = 0.0
            mean_discriminator_loss = 0.0
            # mean_psnr = 0.0
            # mean_msssim = 0.0
            high_img = torch.FloatTensor(
                opt.batchSize, 3, opt.imageSize, opt.imageSize)
            inputs = torch.FloatTensor(
                opt.batchSize, 3, opt.imageSize, opt.imageSize)

            for batch_no, data in enumerate(dataloader[phase]):
                high_img, _ = data

                for j in range(opt.batchSize):
                    inputs[j] = scale(high_img[j])
                    high_img[j] = normalize(high_img[j])

                if opt.cuda:
                    optimizer.zero_grad()
                    high_res_real = Variable(high_img.cuda())
                    high_res_fake = generator(Variable(inputs[0][np.newaxis, :]).cuda(), Variable(inputs[1][np.newaxis, :]).cuda(
                    ), Variable(inputs[2][np.newaxis, :]).cuda(), Variable(inputs[3][np.newaxis, :]).cuda())

                    # save_image(high_res_real, "REAL.png")
                    # save_image(high_res_fake, "FAKE.png")

                    target_real = Variable(torch.rand(
                        opt.batchSize, 1) * 0.5 + 0.7).cuda()
                    target_fake = Variable(torch.rand(
                        opt.batchSize, 1) * 0.3).cuda()

                    discriminator.zero_grad()

                    discriminator_loss = adversarial_criterion(
                        discriminator(Variable(inputs[0][np.newaxis, :]).cuda(), Variable(inputs[1][np.newaxis, :]).cuda(),
                                      Variable(inputs[2][np.newaxis, :]).cuda(), Variable(inputs[3][np.newaxis, :]).cuda()),
                        target_real) + \
                        adversarial_criterion(
                        discriminator(high_res_fake[0][np.newaxis, :], high_res_fake[1][np.newaxis, :], high_res_fake[2][np.newaxis, :],
                                      high_res_fake[3][np.newaxis, :]), target_fake)
                    mean_discriminator_loss += discriminator_loss.data.item()

                    if phase == 'train':
                        discriminator_loss.backward(retain_graph=True)
                        optim_discriminator.step()

                    #high_res_fake_cat = torch.cat([ image for image in high_res_fake ], 0)
                    fake_features = feature_extractor(high_res_fake)
                    real_features = Variable(
                        feature_extractor(high_res_real).data)

                    # generator_content_loss = content_criterion(high_res_fake, high_res_real) + 0.006*content_criterion(fake_features, real_features)
                    generator_content_loss = content_criterion(high_res_fake,
                                                               high_res_real) + content_criterion(fake_features,
                                                                                                  real_features)
                    mean_generator_content_loss += generator_content_loss.data.item()
                    generator_adversarial_loss = adversarial_criterion(discriminator(
                        high_res_fake[0][np.newaxis, :], high_res_fake[1][np.newaxis, :], high_res_fake[2][np.newaxis, :], high_res_fake[3][np.newaxis, :]), ones_const)
                    mean_generator_adversarial_loss += generator_adversarial_loss.data.item()

                    generator_total_loss = generator_content_loss + 1e-3 * generator_adversarial_loss
                    mean_generator_total_loss += generator_total_loss.data.item()

                    if phase == 'train':
                        generator_total_loss.backward()
                        optimizer.step()

                    if(batch_no % 10 == 0):
                        # print("phase {} batch no. {} generator_content_loss {} discriminator_loss {}".format(phase, batch_no, generator_content_loss, discriminator_loss))
                        sys.stdout.write('\rphase [%s] epoch [%d/%d] batch no. [%d/%d] Generator_content_Loss: %.4f discriminator_loss %.4f' % (
                            phase, epoch, opt.nEpochs, batch_no, len(dataloader[phase]), generator_content_loss, discriminator_loss))

            if phase == 'train':
                imsave(high_res_fake.cpu().data, train=True,
                       epoch=epoch, image_type='fake')
                imsave(high_img, train=True, epoch=epoch, image_type='real')
                imsave(inputs, train=True, epoch=epoch, image_type='low')
                writer.add_scalar(phase + " per epoch/generator lr",
                                  optimizer.param_groups[0]['lr'], epoch + 1)
                writer.add_scalar(phase + " per epoch/discriminator lr", optim_discriminator.param_groups[0]['lr'],
                                  epoch + 1)
                scheduler_gen.step(
                    mean_generator_total_loss / len(dataloader[phase]))
                scheduler_dis.step(mean_discriminator_loss /
                                   len(dataloader[phase]))
            else:
                imsave(high_res_fake.cpu().data, train=False,
                       epoch=epoch, image_type='fake')
                imsave(high_img, train=False, epoch=epoch, image_type='real')
                imsave(inputs, train=False, epoch=epoch, image_type='low')
            # import ipdb;
            # ipdb.set_trace()
            mssim = avg_msssim(high_res_real, high_res_fake)
            psnr_val = psnr(un_normalize(high_res_real),
                            un_normalize(high_res_fake))

            writer.add_scalar(phase + " per epoch/PSNR", psnr_val,
                              epoch + 1)
            writer.add_scalar(phase+" per epoch/discriminator loss",
                              mean_discriminator_loss/len(dataloader[phase]), epoch+1)
            writer.add_scalar(phase+" per epoch/generator loss",
                              mean_generator_total_loss/len(dataloader[phase]), epoch+1)
            writer.add_scalar("per epoch/total time taken",
                              time.time()-curr_time, epoch+1)
            writer.add_scalar(phase+" per epoch/avg_mssim", mssim, epoch+1)
        # Do checkpointing
        torch.save(generator.state_dict(), '%s/generator_final.pth' % opt.out)
        torch.save(discriminator.state_dict(),
                   '%s/discriminator_final.pth' % opt.out)
Ejemplo n.º 11
0
def train_angres(AngRes, lflists, opt, writer):
    content_criterion = nn.MSELoss()
    aesthetic_criterion = AestheticLoss()

    # fake_ang_res = torch.FloatTensor(
    #     4, 3, opt.upSampling*opt.imageSize, opt.upSampling*opt.imageSize)
    optimizer = optim.Adam(AngRes.parameters(), lr=opt.angResLR)
    scheduler_angres = ReduceLROnPlateau(
        optimizer, 'min', factor=0.1, patience=3, verbose=True)

    curr_time = time.time()

    if opt.cuda:
        AngRes.cuda()
        content_criterion.cuda()

    AngRes.train(True)

    for epoch in range(opt.continue_from, opt.nEpochs):
        mean_loss = 0.0
        count = 0
        for lf_image in lflists:
            i = j = -1
            new_img = torch.FloatTensor(
                4, 3, opt.upSampling*opt.imageSize, opt.upSampling*opt.imageSize)

            while i < 14:
                i += 1
                j = -1
                while j < 14:
                    j += 1
                    img1 = torch.Tensor(lf_image[i][j])
                    img2 = torch.Tensor(lf_image[i][j+2])
                    img3 = torch.Tensor(lf_image[i+2][j])
                    img4 = torch.Tensor(lf_image[i+2][j+2])
                    gt_center = torch.Tensor(lf_image[i+1][j+1])
                    gt_horizontaltop = torch.Tensor(lf_image[i][j + 1])
                    gt_verticalleft = torch.Tensor(lf_image[i + 1][j])
                    gt_horizontalbottom = torch.Tensor(lf_image[i + 2][j + 1])
                    gt_verticalright = torch.Tensor(lf_image[i + 1][j + 2])

                    img1 = torch.transpose(img1, 0, 2)
                    img2 = torch.transpose(img2, 0, 2)
                    img3 = torch.transpose(img3, 0, 2)
                    img4 = torch.transpose(img4, 0, 2)

                    gt_center = torch.transpose(gt_center, 0, 2)
                    gt_horizontaltop = torch.transpose(gt_horizontaltop, 0, 2)
                    gt_verticalleft = torch.transpose(gt_verticalleft, 0, 2)
                    gt_horizontalbottom = torch.transpose(
                        gt_horizontalbottom, 0, 2)
                    gt_verticalright = torch.transpose(gt_verticalright, 0, 2)

                    new_img[0] = torch.transpose(img1, 1, 2)
                    new_img[1] = torch.transpose(img2, 1, 2)
                    new_img[2] = torch.transpose(img3, 1, 2)
                    new_img[3] = torch.transpose(img4, 1, 2)

                    gt_center_img = torch.transpose(
                        gt_center, 1, 2).type(torch.FloatTensor)
                    gt_horizontaltop_img = torch.transpose(
                        gt_horizontaltop, 1, 2).type(torch.FloatTensor)
                    gt_verticalleft_img = torch.transpose(
                        gt_verticalleft, 1, 2).type(torch.FloatTensor)
                    gt_horizontalbottom_img = torch.transpose(
                        gt_horizontalbottom, 1, 2).type(torch.FloatTensor)
                    gt_verticalright_img = torch.transpose(
                        gt_verticalright, 1, 2).type(torch.FloatTensor)

                    if opt.cuda:
                        fake_img = AngRes(Variable(new_img[0][np.newaxis, :]).cuda(),
                                          Variable(new_img[1][np.newaxis, :]).cuda(),
                                          Variable(new_img[2][np.newaxis, :]).cuda(),
                                          Variable(new_img[3][np.newaxis, :]).cuda())
                      
                        out = [aesthetic_transform(fake_img[0].cpu().data.clone()).cuda(),
                               aesthetic_transform(fake_img[1].cpu().data.clone()).cuda(),
                               aesthetic_transform(fake_img[2].cpu().data.clone()).cuda(),
                               aesthetic_transform(fake_img[3].cpu().data.clone()).cuda(),
                               aesthetic_transform(fake_img[4].cpu().data.clone()).cuda()]

                        target = [aesthetic_transform(gt_center_img.clone()).cuda(),
                                  aesthetic_transform(gt_horizontaltop_img.clone()).cuda(),
                                  aesthetic_transform(gt_horizontalbottom_img.clone()).cuda(),
                                  aesthetic_transform(gt_verticalleft_img.clone()).cuda(),
                                  aesthetic_transform(gt_verticalright_img.clone()).cuda()]

                        aesthetic_loss = aesthetic_criterion(out, target)
                        
                        center_loss = content_criterion(
                            fake_img[0], gt_center_img.cuda())
                        horizontaltop_loss = content_criterion(
                            fake_img[1], gt_horizontaltop_img.cuda())
                        horizontalbottom_loss = content_criterion(
                            fake_img[2], gt_horizontalbottom_img.cuda())
                        verticalleft_loss = content_criterion(
                            fake_img[3], gt_verticalleft_img.cuda())
                        verticalright_loss = content_criterion(
                            fake_img[4], gt_verticalright_img.cuda())
                        
                        total_loss = center_loss + horizontaltop_loss + \
                            horizontalbottom_loss + verticalleft_loss + verticalright_loss + (aesthetic_loss * 1e5)
                        
                        # print()
                        # print(total_loss)
                        mean_loss += total_loss
                        AngRes.zero_grad()
                        total_loss.backward()
                        optimizer.step()

                        if (j == 14):
                            if(opt.progress_images):
                                images = []
                                for x in range(0, 5):
                                    images.append(display_transform(fake_img[x].cpu().data.clone().type(torch.ByteTensor)))

                                image = make_grid(images, padding=1)
                                save_image(image, "fake.png")

                                one = display_transform(
                                    gt_center_img.clone().type(torch.ByteTensor))
                                two = display_transform(
                                    gt_horizontaltop_img.clone().type(torch.ByteTensor))
                                three = display_transform(
                                    gt_horizontalbottom_img.clone().type(torch.ByteTensor))
                                four = display_transform(
                                    gt_verticalleft_img.clone().type(torch.ByteTensor))
                                five = display_transform(
                                    gt_verticalright_img.clone().type(torch.ByteTensor))

                                real_image = make_grid(
                                    [one, two, three, four, five], padding=1)
                                save_image(real_image, "real.png")

                            sys.stdout.write(
                                '\repoch [%d/%d][%.2f%%] content_Loss: %.4f' % (
                                    epoch, opt.nEpochs, ((count * 14) + i)/(14 * len(lflists)) * 100, total_loss))

            imsave(fake_img.cpu().data, train=True, epoch=count,
                   image_type='new', ang_res=True, row_ind=i, column_ind=j)
            imsave(gt_center_img, train=True, epoch=count,
                   image_type='real_center', ang_res=True)
            imsave(gt_horizontaltop_img, train=True, epoch=count,
                   image_type='real_horizontaltop', ang_res=True)
            imsave(gt_horizontalbottom_img, train=True, epoch=count,
                   image_type='real_horizontalbottom', ang_res=True)
            imsave(gt_verticalleft_img, train=True, epoch=count,
                   image_type='real_verticalleft', ang_res=True)
            imsave(gt_verticalright_img, train=True, epoch=count,
                   image_type='real_verticalright', ang_res=True)
            writer.add_scalar(" per epoch/angres lr",
                              optimizer.param_groups[0]['lr'], epoch + 1)
            count += 1
            # else:
            #     imsave(fake_img.cpu().data, train=False, epoch=epoch, image_type='new', ang_res=True)
            #     imsave(inputs, train=False, epoch=epoch, image_type='real', ang_res=True)
        scheduler_angres.step(total_loss / len(lflists))
        writer.add_scalar(" per epoch/angres loss", mean_loss / len(lflists),
                          epoch + 1)
        writer.add_scalar("per epoch/total time taken",
                          time.time() - curr_time, epoch + 1)

        # Do checkpointing
        torch.save(AngRes.state_dict(), '%s/AngRes_final.pth' % opt.out)
Ejemplo n.º 12
0
    def train(self, config):
        if config.is_train:
            input_setup(self.sess, config)
        else:
            nx, ny = input_setup(self.sess, config)

        if config.is_train:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "train.h5")
        else:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "test.h5")

        train_data, train_label = read_data(data_dir)

        # Stochastic gradient descent with the standard backpropagation
        self.train_op = tf.train.GradientDescentOptimizer(
            config.learning_rate).minimize(self.loss)

        tf.initialize_all_variables().run()

        counter = 0
        start_time = time.time()

        if self.load(self.checkpoint_dir):
            print(" [*] Load SUCCESS")
        else:
            print(" [!] Load failed...")

        if config.is_train:
            print("Training...")

            for ep in xrange(config.epoch):
                # Run by batch images
                batch_idxs = len(train_data) // config.batch_size
                for idx in xrange(0, batch_idxs):
                    batch_images = train_data[idx *
                                              config.batch_size:(idx + 1) *
                                              config.batch_size]
                    batch_labels = train_label[idx *
                                               config.batch_size:(idx + 1) *
                                               config.batch_size]

                    counter += 1
                    _, err = self.sess.run([self.train_op, self.loss],
                                           feed_dict={
                                               self.images: batch_images,
                                               self.labels: batch_labels
                                           })

                    if counter % 10 == 0:
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]" \
                          % ((ep+1), counter, time.time()-start_time, err))

                    if counter % 500 == 0:
                        self.save(config.checkpoint_dir, counter)

        else:
            print("Testing...")

            result = self.pred.eval({self.images: train_data})

            result = merge(result, [nx, ny])
            result = result.squeeze()
            image_path = os.path.join(os.getcwd(), config.sample_dir)
            image_path = os.path.join(image_path, "test_image.png")
            imsave(result, image_path)

            # Print PSNR
            labelimg = merge(train_label, [nx, ny])
            labelimg = labelimg.squeeze()
            print("HR image size: (%d, %d)" %
                  (labelimg.shape[0], labelimg.shape[1]))
            print("SR image size: (%d, %d)" %
                  (result.shape[0], result.shape[1]))

            bicubic = scipy.ndimage.interpolation.zoom(labelimg,
                                                       (1. / config.scale),
                                                       prefilter=False)
            bicubic = scipy.ndimage.interpolation.zoom(bicubic,
                                                       (config.scale / 1.),
                                                       prefilter=False)
            print("LR image size: (%d, %d)" %
                  (bicubic.shape[0], bicubic.shape[1]))

            psnr_sr = self.cal_psnr(result, labelimg)
            psnr_bicubic = self.cal_psnr(bicubic, labelimg)
            print("")
            print("SR PSNR = %.3f" % psnr_sr)
            print("Bicubic PSNR = %.3f" % psnr_bicubic)
Ejemplo n.º 13
0
def main(args):

    def maybe_cuda(tensor):
        return tensor.cuda() if args.gpu else tensor

    Img_dir = 'Figs/'
    if not os.path.exists(Img_dir):
        os.makedirs(Img_dir)

    Model_dir = 'Models/'

    if not os.path.exists(Model_dir):
        os.makedirs(Model_dir)

    Data_dir = 'Data/'

    if not os.path.exists(Data_dir):
        os.makedirs(Data_dir)

    train_set = utils.IndexedDataset(
        LSUN(args.dir, classes=[args.cl+'_train'],
             transform=transforms.Compose([
                 transforms.Resize(64),
                 transforms.CenterCrop(64),
                 transforms.ToTensor(),
                 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
             ]))
    )
    train_loader = torch.utils.data.DataLoader(
        train_set, batch_size=args.batch_size,
        shuffle=True, drop_last=True,
        num_workers=8, pin_memory=args.gpu,
    )
    
    val_loader = torch.utils.data.DataLoader(train_set, shuffle=False, batch_size=8*8)

    if args.n > 0:
        train_set.base.length = args.n
        train_set.base.indices = [args.n]

    # initialize representation space:
    if args.init == 'pca':
        print('Check if PCA is already calculated...')
        pca_path = 'Data/GLO_pca_init_{}_{}.pt'.format(
            args.cl, args.d)
        if os.path.isfile(pca_path):
            print(
                '[Latent Init] PCA already calculated before and saved at {}'.
                    format(pca_path))
            Z = torch.load(pca_path)
        else:
            from sklearn.decomposition import PCA

            # first, take a subset of train set to fit the PCA
            X_pca = np.vstack([
                X.cpu().numpy().reshape(len(X), -1)
                for i, (X, _, _)
                in zip(tqdm(range(args.n_pca // train_loader.batch_size), 'collect data for PCA'),
                       train_loader)
            ])
            print("perform PCA...")
            pca = PCA(n_components=args.d)
            pca.fit(X_pca)
            # then, initialize latent vectors to the pca projections of the complete dataset
            Z = np.empty((len(train_loader.dataset), args.d))
            for X, _, idx in tqdm(train_loader, 'pca projection'):
                Z[idx] = pca.transform(X.cpu().numpy().reshape(len(X), -1))


    elif args.init == 'random':
        Z = np.random.randn(len(train_set), args.d)

    Z = utils.project_l2_ball(Z)

    model_generator = maybe_cuda(models.Generator(args.d))
    loss_fn = utils.LapLoss(max_levels=3) if args.loss == 'lap_l1' else nn.MSELoss()
    zi = maybe_cuda(torch.zeros((args.batch_size, args.d)))
    zi = Variable(zi, requires_grad=True)
    optimizer = SGD([
        {'params': model_generator.parameters(), 'lr': args.lr_g},
        {'params': zi, 'lr': args.lr_z}
    ])

    Xi_val, _, idx_val = next(iter(val_loader))
    utils.imsave(Img_dir+'target_%s_%s.png' % (args.cl,args.prfx),
           make_grid(Xi_val.cpu() / 2. + 0.5, nrow=8).numpy().transpose(1, 2, 0))

    for epoch in range(args.e):
        losses = []
        progress = tqdm(total=len(train_loader), desc='epoch % 3d' % epoch)

        for i, (Xi, yi, idx) in enumerate(train_loader):
            Xi = Variable(maybe_cuda(Xi))
            zi.data = maybe_cuda(torch.FloatTensor(Z[idx.numpy()]))

            optimizer.zero_grad()
            rec = model_generator(zi)
            loss = loss_fn(rec, Xi)
            loss.backward()
            optimizer.step()

            Z[idx.numpy()] = utils.project_l2_ball(zi.data.cpu().numpy())

            losses.append(loss.data[0])
            progress.set_postfix({'loss': np.mean(losses[-100:])})
            progress.update()


        progress.close()

        # visualize reconstructions
        rec = model_generator(Variable(maybe_cuda(torch.FloatTensor(Z[idx_val.numpy()]))))
        utils.imsave(Img_dir+'%s_%s_rec_epoch_%03d_%s.png' % (args.cl,args.prfx,epoch, args.init),
               make_grid(rec.data.cpu() / 2. + 0.5, nrow=8).numpy().transpose(1, 2, 0))
    print('Saving the model : epoch % 3d'%epoch)
    utils.save_checkpoint({
        'epoch': epoch + 1,
        'state_dict': model_generator.state_dict(),
    },
        Model_dir + 'Glo_{}_z_{}_epch_{}_init_{}.pt'.format(args.cl,args.d, epoch, args.init))
Ejemplo n.º 14
0
    def train(self, config):
        if config.is_train:  #判断是否训练
            input_setup(config)
        else:
            input, label, _, _ = input_setup(config)

        if config.is_train:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "train.h5")
            train_data, train_label = read_data(data_dir)
            #print(train_data.shape, train_label.shape)

        # Stochastic gradient descent with the standard backpropagation
        #self.train_op = tf.train.AdamOptimizer(config.learning_rate).minimize(self.loss)
        var1 = tf.trainable_variables()[0:2]  #w1,w2
        var1 = var1 + tf.trainable_variables()[3:5]  #b1,b2
        var2 = tf.trainable_variables()[2]  #w3
        var2 = [var2, tf.trainable_variables()[5]]  #b3
        train_op1 = tf.train.AdamOptimizer(0.0001).minimize(self.loss,
                                                            var_list=var1)
        train_op2 = tf.train.AdamOptimizer(0.00001).minimize(self.loss,
                                                             var_list=var2)
        self.train_op = tf.group(train_op1, train_op2)

        tf.global_variables_initializer().run()
        counter = 0
        start_time = time.time()

        # if self.load(self.checkpoint_dir):
        #   print(" [*] Load SUCCESS")
        # else:
        #   print(" [!] Load failed...")
        if config.is_train:

            print("Training...")
            batch_idxs = len(train_data) // config.batch_size
            #print(train_data[0 * config.batch_size: (0 + 1) * config.batch_size])
            for ep in range(config.epoch):
                # Run by batch images
                #batch_idxs = len(train_data) // config.batch_size
                for idx in range(0, batch_idxs):
                    batch_images = train_data[idx *
                                              config.batch_size:(idx + 1) *
                                              config.batch_size]
                    batch_labels = train_label[idx *
                                               config.batch_size:(idx + 1) *
                                               config.batch_size]

                    counter += 1
                    _, err = self.sess.run([self.train_op, self.loss],
                                           feed_dict={
                                               self.images: batch_images,
                                               self.labels: batch_labels
                                           })

                    if counter % 10 == 0:
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]" \
                              % ((ep+1), counter, time.time()-start_time, err))

                    if counter % 400 == 0:
                        self.save(config.checkpoint_dir, counter)
        #add term

        else:
            print("Testing...")
            if self.load(self.checkpoint_dir):
                print(" [*] Load SUCCESS")
            else:
                print(" [!] Load failed...")

            result = self.pred.eval(feed_dict={
                self.images: input,
                self.labels: label
            })
            #print(result.shape)
            #result = merge(result*255, [nx, ny])
            result = result.squeeze()
            result = result * 255
            image_path = os.path.join(os.getcwd(), config.sample_dir)
            image_path = os.path.join(image_path, "test_image.png")
            imsave(result, image_path)
Ejemplo n.º 15
0
def train():
    data = load_data()
    model = CGAN()

    d_opt = tf.train.AdamOptimizer(learning_rate=conf.learning_rate).minimize(
        model.d_loss, var_list=model.d_vars)
    g_opt = tf.train.AdamOptimizer(learning_rate=conf.learning_rate).minimize(
        model.g_loss, var_list=model.g_vars)

    saver = tf.train.Saver()

    counter = 0
    start_time = time.time()
    if not os.path.exists(conf.data_path + "/checkpoint"):
        os.makedirs(conf.data_path + "/checkpoint")
    if not os.path.exists(conf.output_path):
        os.makedirs(conf.output_path)

    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    mpsnr_img = []
    mpsnr_cond = []
    with tf.Session(config=config) as sess:
        if conf.model_path == "":
            sess.run(tf.initialize_all_variables())
        else:
            saver.restore(sess, conf.model_path)
        print conf.max_epoch
        for epoch in xrange(conf.max_epoch):
            train_data = data["train"]()
            for img, cond, name in train_data:
                img, cond = prepocess_train(img, cond)
                _, m = sess.run([d_opt, model.d_loss],
                                feed_dict={
                                    model.image: img,
                                    model.cond: cond
                                })
                _, m = sess.run([d_opt, model.d_loss],
                                feed_dict={
                                    model.image: img,
                                    model.cond: cond
                                })
                _, M = sess.run([g_opt, model.g_loss],
                                feed_dict={
                                    model.image: img,
                                    model.cond: cond
                                })
                counter += 1
                print "Iterate [%d]: time: %4.4f, d_loss: %.8f, g_loss: %.8f" \
                      % (counter, time.time() - start_time, m, M)
            if (epoch + 1) % conf.save_per_epoch == 0:
                save_path = saver.save(
                    sess, conf.data_path + "/checkpoint/" + "model_%d.ckpt" %
                    (epoch + 1))
                print "Model saved in file: %s" % save_path
                mean_psnr_img = 0
                mean_psnr_cond = 0
                i = 0
                test_data = data["test"]()
                for img, cond, name in test_data:
                    pimg, pcond = prepocess_test(img, cond)
                    gen_img = sess.run(model.gen_img,
                                       feed_dict={
                                           model.image: pimg,
                                           model.cond: pcond
                                       })
                    gen_img = gen_img.reshape(gen_img.shape[1:])
                    gen_img = (gen_img + 1.) * 127.5
                    #print type(img), type(cond), type(gen_img), img.shape, cond.shape, gen_img.shape, img.dtype, cond.dtype, gen_img.dtype
                    mean_psnr_img = mean_psnr_img + skimage.measure.compare_psnr(
                        img, gen_img.astype(np.uint8))
                    mean_psnr_cond = mean_psnr_cond + skimage.measure.compare_psnr(
                        cond, gen_img.astype(np.uint8))
                    image = np.concatenate((gen_img, cond),
                                           axis=1).astype(np.int)
                    i = i + 1
                    imsave(image, conf.output_path + "/%s" % name)
                mean_psnr_img = mean_psnr_img / i
                mpsnr_img.append(mean_psnr_img)
                mean_psnr_cond = mean_psnr_cond / i
                mpsnr_cond.append(mean_psnr_cond)
        print mpsnr_cond
        print mpsnr_img
        plt.plot(mpsnr_cond)
        plt.show()
Ejemplo n.º 16
0
def process_video(background_alpha=0.1, motion_thresh=0.5, skip_frames=0, fps_period_length=100):
    
    utils.ensure_dir(config.experiment_data_frames)
    utils.ensure_dir(config.experiment_output_frames, True)

    
    mask = load_mask()

    frames_list = os.listdir(config.experiment_data_frames)
    frames_list.sort()
    frames_list_to_store = frames_list
    frames_list.reverse()
    for i in xrange(skip_frames):
        frames_list.pop()
    
    background = np.flipud(mpimg.imread(os.path.join(config.experiment_data_frames, frames_list.pop()))).astype('int16')*mask
    #background = np.mean(background,2)
    #mask = np.mean(mask,2)
    
    img_times = []
    train_spotted = []
    #prev = background
    #prevs = []
    fps_period_start = time.clock()
    change_vals = []
    count = 0
    change_val = 0
    while ( len(frames_list) > 0 ):# and count < 15400:
        if count % fps_period_length == 0:
            elapsed = (time.clock() - fps_period_start)
            if elapsed > 0:
                print('%d\t%.2f\t%.1f fps' % (count, change_val, fps_period_length/elapsed))
            else:
                print('Elapsed time should be positive but is %d' % (elapsed))
            fps_period_start = time.clock()
        
        img_filename = frames_list.pop()
        img = np.flipud(mpimg.imread(os.path.join(config.experiment_data_frames, img_filename)))
        img = img * mask
        
        img_times.append(get_datetime_from_filename(img_filename))

        
        #prevs.append(img)
        #if len(prevs) > 10:
            #prevs.pop()        

        #imshow(np.hstack((np.hstack((background, img)), img_without_background)))
        img_without_background = abs(img.astype('float32') - background.astype('float32')) * mask
        #diff = abs(img.astype('float32') - prev.astype('float32')) * mask
        change_val = np.mean(img_without_background)#np.percentile(img_without_background.flatten(), 90)
        change_vals.append(change_val)
        if change_val > motion_thresh:  
            stacked_image = np.hstack((np.hstack((img, background)), img_without_background))
            utils.imsave(os.path.join(config.experiment_output_frames, img_filename), stacked_image)
            train_spotted.append(True)
        else:
            train_spotted.append(False)
        
	# alternative update options in the following comments:    
        #if len(prevs) == 10: # update background
        #beta = 1
            #background_alpha_img = 1/(beta*(np.abs(background - img)**2) + 1/background_alpha) new
            #background_alpha_img = 1/((beta*((background - img)**2) + 1)/background_alpha) old
            #background_alpha_img = 1/((beta*((prevs[-1] - img)**2) + 1)/background_alpha)
            #background = background*(1-background_alpha_img) + img*(background_alpha_img)                
        background = background*(1-background_alpha) + img*(background_alpha)                
            
        #prev = img

        count += 1
        
        if len(frames_list) == 0:
            print('No more frames to process, unless we check and add some more')
        
    datafile = shelve.open(os.path.join(config.experiment_output, 'shelve.data'))
    datafile['img_times'] = img_times
    datafile['train_spotted'] = train_spotted
    datafile['change_vals'] = change_vals
    datafile['frame_filenames'] = frames_list_to_store
    datafile.close()

    return datafile
Ejemplo n.º 17
0
    def train(self, config):
        if config.is_train:
            input_setup(self.sess, config, "Train_ir")
            input_setup(self.sess, config, "Train_vi")
            # input_setup(self.sess, config,"Train_irtu")
            # input_setup(self.sess,config,"Train_vitu")
            input_setup(self.sess, config, "mask")
        else:
            nx_ir, ny_ir = input_setup(self.sess, config, "Test_ir")
            nx_vi, ny_vi = input_setup(self.sess, config, "Test_vi")
            nx_mask, ny_mask = input_setup(self.sess, config, "mask")

        if config.is_train:
            data_dir_ir = os.path.join('./{}'.format(config.checkpoint_dir),
                                       "Train_ir", "train.h5")
            data_dir_vi = os.path.join('./{}'.format(config.checkpoint_dir),
                                       "Train_vi", "train.h5")
            # data_dir_irtu = os.path.join('./{}'.format(config.checkpoint_dir), "Train_irtu","train.h5")
            # data_dir_vitu = os.path.join('./{}'.format(config.checkpoint_dir), "Train_vitu","train.h5")
            data_dir_mask = os.path.join('./{}'.format(config.checkpoint_dir),
                                         "mask", "train.h5")
        else:
            data_dir_ir = os.path.join('./{}'.format(config.checkpoint_dir),
                                       "Test_ir", "test.h5")
            data_dir_vi = os.path.join('./{}'.format(config.checkpoint_dir),
                                       "Test_vi", "test.h5")
            data_dir_mask = os.path.join('./{}'.format(config.checkpoint_dir),
                                         "mask", "test.h5")

        train_data_ir, train_label_ir = read_data(data_dir_ir)
        train_data_vi, train_label_vi = read_data(data_dir_vi)
        # train_data_irtu, train_label_irtu = read_data(data_dir_irtu)
        # train_data_vitu, train_label_vitu = read_data(data_dir_vitu)
        train_data_mask, train_label_mask = read_data(data_dir_mask)

        t_vars = tf.trainable_variables()
        # self.d_vars = [var for var in t_vars if 'discriminator' in var.name]
        # print(self.d_vars)
        self.g_vars = [var for var in t_vars if 'fusion_model' in var.name]
        print(self.g_vars)

        with tf.name_scope('train_step'):
            self.train_fusion_op = tf.train.AdamOptimizer(
                config.learning_rate).minimize(self.g_loss,
                                               var_list=self.g_vars)
            # self.train_discriminator_op=tf.train.AdamOptimizer(config.learning_rate).minimize(self.d_loss,var_list=self.d_vars)

        self.summary_op = tf.summary.merge_all()

        self.train_writer = tf.summary.FileWriter(config.summary_dir +
                                                  '/train',
                                                  self.sess.graph,
                                                  flush_secs=60)

        tf.initialize_all_variables().run()

        counter = 0
        start_time = time.time()

        if config.is_train:
            print("Training...")

            for ep in xrange(config.epoch):
                # Run by batch images
                batch_idxs = len(train_data_ir) // config.batch_size
                for idx in xrange(0, batch_idxs):
                    batch_images_ir = train_data_ir[idx *
                                                    config.batch_size:(idx +
                                                                       1) *
                                                    config.batch_size]
                    batch_labels_ir = train_label_ir[idx *
                                                     config.batch_size:(idx +
                                                                        1) *
                                                     config.batch_size]
                    batch_images_vi = train_data_vi[idx *
                                                    config.batch_size:(idx +
                                                                       1) *
                                                    config.batch_size]
                    batch_labels_vi = train_label_vi[idx *
                                                     config.batch_size:(idx +
                                                                        1) *
                                                     config.batch_size]
                    # batch_images_irtu = train_data_irtu[idx*config.batch_size : (idx+1)*config.batch_size]
                    # batch_labels_irtu = train_label_irtu[idx*config.batch_size : (idx+1)*config.batch_size]
                    # batch_images_vitu = train_data_vitu[idx*config.batch_size : (idx+1)*config.batch_size]
                    # batch_labels_vitu = train_label_vitu[idx*config.batch_size : (idx+1)*config.batch_size]
                    batch_images_mask = train_data_mask[idx *
                                                        config.batch_size:
                                                        (idx + 1) *
                                                        config.batch_size]
                    batch_labels_mask = train_label_mask[idx *
                                                         config.batch_size:
                                                         (idx + 1) *
                                                         config.batch_size]

                    counter += 1
                    # for i in range(2):
                    #   _, err_d= self.sess.run([self.train_discriminator_op, self.d_loss], feed_dict={self.images_ir: batch_images_ir, self.images_vi: batch_images_vi,self.images_mask: batch_images_mask, self.labels_vi: batch_labels_vi,self.labels_ir:batch_labels_ir,self.labels_mask:batch_labels_mask})

                    _, err_g, summary_str = self.sess.run(
                        [self.train_fusion_op, self.g_loss, self.summary_op],
                        feed_dict={
                            self.images_ir: batch_images_ir,
                            self.images_vi: batch_images_vi,
                            self.images_mask: batch_images_mask,
                            self.labels_ir: batch_labels_ir,
                            self.labels_vi: batch_labels_vi,
                            self.labels_mask: batch_labels_mask
                        })

                    self.train_writer.add_summary(summary_str, counter)

                    if counter % 10 == 0:
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss_g:[%.8f]" \
                          % ((ep+1), counter, time.time()-start_time, err_g))

                self.save(config.checkpoint_dir, ep)

        else:
            print("Testing...")

            result = self.fusion_mask.eval(
                feed_dict={
                    self.images_ir: train_data_ir,
                    self.labels_ir: train_label_ir,
                    self.images_vi: train_data_vi,
                    self.labels_vi: train_label_vi,
                    self.images_mask: train_data_mask,
                    self.labels_mask: train_label_mask
                })
            result = result * 127.5 + 127.5
            result = merge(result, [nx_ir, ny_ir])
            result = result.squeeze()
            image_path = os.path.join(os.getcwd(), config.sample_dir)
            image_path = os.path.join(image_path, "test_image.png")
            imsave(result, image_path)
Ejemplo n.º 18
0
    def train(self, config):
        if config.is_train:
            input_setup(self.sess, config)
        else:
            nx, ny = input_setup(self.sess, config)

        if config.is_train:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "train.h5")
        else:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "test.h5")

        train_data, train_label = read_data(data_dir)

        # Stochastic gradient descent with the standard backpropagation
        self.train_op = tf.train.AdamOptimizer().minimize(self.loss)
        tf.initialize_all_variables().run()

        counter = 0
        start_time = time.time()

        if self.load(self.checkpoint_dir):
            print(" [*] Load SUCCESS")
        else:
            print(" [!] Load failed...")

        if config.is_train:
            print("Training...")
            epoch_loss = 0
            average_loss = 0
            average_ssim = 0

            for ep in xrange(config.epoch):  #for each epoch
                # Run by batch images
                batch_idxs = len(
                    train_data
                ) // config.batch_size  #TODO: check data loader of tensorflow and shuffle training data in each epoch

                for idx in xrange(0, batch_idxs):

                    batch_images = train_data[idx *
                                              config.batch_size:(idx + 1) *
                                              config.batch_size]
                    batch_labels = train_label[idx *
                                               config.batch_size:(idx + 1) *
                                               config.batch_size]
                    counter += 1
                    _, err = self.sess.run([self.train_op, self.loss],
                                           feed_dict={
                                               self.images: batch_images,
                                               self.labels: batch_labels
                                           })  #update weights and biases

                    average_ssim += ssim(
                        self.pred.eval(feed_dict={
                            self.images: batch_images,
                            self.labels: batch_labels
                        })[:, 33:66, 33:66],
                        self.labels.eval(feed_dict={
                            self.images: batch_images,
                            self.labels: batch_labels
                        }),
                        multichannel=True) / batch_idxs

                    epoch_loss += err
                    average_loss = epoch_loss / float(batch_idxs)
                    PSNR = 10 * math.log10(1 / average_loss)

                    if counter % 10 == 0:  #display training loss for every 10 batches
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]" \
                          % ((ep+1), counter, time.time()-start_time, err))

                    if counter % (
                            batch_idxs * 10
                    ) == 0:  #save model for every 500 batches. Note: final model may not be saved!!!
                        self.save(config.checkpoint_dir, counter)
                    if counter % batch_idxs == 0:
                        with open('data.txt', 'a') as file:
                            file.write(
                                str(average_loss) + " , " + str(PSNR) + " , " +
                                str(average_ssim) + "\n")
                            #file.write(str(average_loss) + "\n")
                            epoch_loss = 0
                            average_loss = 0
                            average_ssim = 0
        else:
            print("Testing...")

            result = self.pred.eval({
                self.images: train_data,
                self.labels: train_label
            })
            print(nx, ny)
            result = merge(result, [nx, ny])
            result = result.squeeze()
            image_path = os.path.join(os.getcwd(), config.sample_dir)
            image_path = os.path.join(image_path, "test_image.png")
            imsave(result, image_path)
Ejemplo n.º 19
0
    def train(self, config):
        if config.is_train:
            input_setup(self.sess, config)
        else:
            nx, ny = input_setup(self.sess, config)

        if config.is_train:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "train.h5")
        else:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "test.h5")

        train_data, train_label = read_data(data_dir)

        # Stochastic gradient descent with the standard backpropagation
        self.train_op = tf.train.GradientDescentOptimizer(
            config.learning_rate).minimize(self.loss)

        tf.initialize_all_variables().run()
        #For tf 0.12.1
        #tf.global_variables_initializer()

        counter = 0
        start_time = time.time()

        if self.load(self.checkpoint_dir):
            print(" [*] Load SUCCESS")
        else:
            print(" [!] Load failed...")

        if config.is_train:
            print("Training...")

            for ep in xrange(config.epoch):
                # Run by batch images
                batch_idxs = len(train_data) // config.batch_size
                for idx in xrange(0, batch_idxs):
                    batch_images = train_data[idx *
                                              config.batch_size:(idx + 1) *
                                              config.batch_size]
                    batch_labels = train_label[idx *
                                               config.batch_size:(idx + 1) *
                                               config.batch_size]

                    counter += 1
                    _, err = self.sess.run([self.train_op, self.loss],
                                           feed_dict={
                                               self.images: batch_images,
                                               self.labels: batch_labels
                                           })

                    if counter % 10 == 0:
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]" \
                              % ((ep + 1), counter, time.time() - start_time, err))

                    if counter % 500 == 0:
                        self.save(config.checkpoint_dir, counter)

        else:
            print("Testing...")

            print "Train data shape", train_data.shape
            print "Train label shape", train_label.shape

            result = self.pred.eval({
                self.images: train_data,
                self.labels: train_label
            })

            print "Result shape", result.shape
            print "nx ny", nx, ny

            image = merge(result, [nx, ny])
            original_image = merge(train_label, [nx, ny])
            interpolation = down_upscale(modcrop(original_image, config.scale),
                                         scale=config.scale)

            imsave(
                original_image,
                os.path.join(os.getcwd(), config.sample_dir, "original.bmp"),
                config.is_RGB)
            imsave(
                interpolation,
                os.path.join(os.getcwd(), config.sample_dir,
                             "interpolation.bmp"), config.is_RGB)
            imsave(image,
                   os.path.join(os.getcwd(), config.sample_dir, "srcnn.bmp"),
                   config.is_RGB)
Ejemplo n.º 20
0
def train_network(args):
    device = torch.device('cuda' if args.gpu_no >= 0 else 'cpu')

    G_A2B = Generator().to(device).train()
    G_B2A = Generator().to(device).train()
    print("Load Generator", G_A2B)

    D_A = Discriminator().to(device).train()
    D_B = Discriminator().to(device).train()
    print("Load Discriminator", D_A)

    optimizer_G_A2B = torch.optim.Adam(G_A2B.parameters(),
                                       lr=args.lr,
                                       betas=(args.beta1, args.beta2))
    optimizer_G_B2A = torch.optim.Adam(G_B2A.parameters(),
                                       lr=args.lr,
                                       betas=(args.beta1, args.beta2))
    optimizer_D_A = torch.optim.Adam(D_A.parameters(),
                                     lr=args.lr,
                                     betas=(args.beta1, args.beta2))
    optimizer_D_B = torch.optim.Adam(D_B.parameters(),
                                     lr=args.lr,
                                     betas=(args.beta1, args.beta2))

    mse_criterion = nn.MSELoss()
    l1_criterion = nn.L1Loss()

    dataset = FacadeFolder(args.data_A, args.data_B, args.imsize,
                           args.cropsize, args.cencrop)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=args.batch_size,
                                             shuffle=True,
                                             num_workers=args.num_workers)

    loss_seq = {'G_A2B': [], 'G_B2A': [], 'D_A': [], 'D_B': [], 'Cycle': []}

    buffer_fake_A = BufferN(50)
    buffer_fake_B = BufferN(50)
    for epoch in range(args.epoch):
        """
            learning rate schedule
        """
        for iteration, (item_A, item_B) in enumerate(dataloader, 1):
            item_A, item_B = item_A.to(device), item_B.to(device)
            """
                train discriminators
            """
            with torch.no_grad():
                fake_B = G_A2B(item_A)
                fake_A = G_B2A(item_B)

            buffer_fake_B.push(fake_B.detach())
            N_fake_B_discrimination = D_B(
                torch.cat(buffer_fake_B.get_buffer(), dim=0))
            real_B_discrimination = D_B(item_B)

            buffer_fake_A.push(fake_A.detach())
            N_fake_A_discrimination = D_A(
                torch.cat(buffer_fake_A.get_buffer(), dim=0))
            real_A_discrimination = D_A(item_A)

            loss_D_B_fake = mse_criterion(
                N_fake_B_discrimination,
                torch.zeros_like(N_fake_B_discrimination).to(device))
            loss_D_B_real = mse_criterion(
                real_B_discrimination,
                torch.ones_like(real_B_discrimination).to(device))
            loss_D_B = (loss_D_B_fake +
                        loss_D_B_real) * args.discriminator_weight
            loss_seq['D_B'].append(loss_D_B.item())

            loss_D_A_fake = mse_criterion(
                N_fake_A_discrimination,
                torch.zeros_like(N_fake_A_discrimination).to(device))
            loss_D_A_real = mse_criterion(
                real_A_discrimination,
                torch.ones_like(real_A_discrimination).to(device))
            loss_D_A = (loss_D_A_fake +
                        loss_D_A_real) * args.discriminator_weight
            loss_seq['D_A'].append(loss_D_A.item())

            optimizer_D_B.zero_grad()
            loss_D_B.backward()
            optimizer_D_B.step()

            optimizer_D_A.zero_grad()
            loss_D_A.backward()
            optimizer_D_A.step()
            """
                train generators
            """
            fake_B = G_A2B(item_A)
            fake_A = G_B2A(item_B)
            fake_B_discrimination = D_B(fake_B)
            fake_A_discrimination = D_A(fake_A)
            B_from_fake_A = G_A2B(fake_A)
            A_from_fake_B = G_B2A(fake_B)

            loss_G_A2B_gan = mse_criterion(
                fake_B_discrimination,
                torch.ones_like(fake_B_discrimination).to(device))
            loss_G_B2A_gan = mse_criterion(
                fake_A_discrimination,
                torch.ones_like(fake_A_discrimination).to(device))
            loss_seq['G_A2B'].append(loss_G_A2B_gan.item())
            loss_seq['G_B2A'].append(loss_G_B2A_gan.item())

            loss_cyc = l1_criterion(B_from_fake_A, item_B) + l1_criterion(
                A_from_fake_B, item_A)
            loss_seq['Cycle'].append(loss_cyc.item())

            loss_G = loss_G_A2B_gan + loss_G_B2A_gan + args.cyc_weight * loss_cyc

            optimizer_G_A2B.zero_grad()
            optimizer_G_B2A.zero_grad()
            loss_G.backward()
            optimizer_G_A2B.step()
            optimizer_G_B2A.step()
            """
                check training loss
            """
            if iteration % args.check_iter == 0:
                check_str = "%s: epoch:[%d/%d]\titeration:[%d/%d]" % (
                    time.ctime(), epoch, args.epoch, iteration,
                    len(dataloader))
                for key, value in loss_seq.items():
                    check_str += "\t%s: %2.2f" % (
                        key, lastest_arverage_value(value))
                print(check_str)
                imsave(torch.cat([item_A, item_B, fake_B], dim=0),
                       args.save_path + 'training_image_A2B.jpg')
                imsave(torch.cat([item_B, item_A, fake_A], dim=0),
                       args.save_path + 'training_image_B2A.jpg')

        # save networks
        torch.save(
            {
                'iteration': iteration,
                'G_A2B_state_dict': G_A2B.state_dict(),
                'G_B2A_state_dict': G_B2A.state_dict(),
                'D_A_state_dict': D_A.state_dict(),
                'D_B_state_dict': D_B.state_dict(),
                'loss_seq': loss_seq
            }, args.save_path + 'check_point.pth')

    return None
Ejemplo n.º 21
0
    def train(self, config):

        # NOTE : if train, the nx, ny are ingnored
        nx, ny = input_setup(config)

        data_dir = checkpoint_dir(config)

        input_, label_ = read_data(data_dir)

        # Stochastic gradient descent with the standard backpropagation

        # NOTE: learning rate decay
        global_step = tf.Variable(0, trainable=False)
        #learning_rate = tf.train.exponential_decay(config.learning_rate, global_step * config.batch_size, len(input_)*100, 0.1, staircase=True)
        # NOTE: Clip gradient
        opt = tf.train.AdamOptimizer(learning_rate=config.learning_rate)
        grad_and_value = opt.compute_gradients(self.loss)

        clip = tf.Variable(config.clip_grad, name='clip')
        capped_gvs = [(tf.clip_by_value(grad, -(clip), clip), var)
                      for grad, var in grad_and_value]

        self.train_op = opt.apply_gradients(capped_gvs,
                                            global_step=global_step)
        #self.train_op = tf.train.AdamOptimizer(learning_rate=config.learning_rate).minimize(self.loss)

        tf.initialize_all_variables().run()

        counter = 0
        time_ = time.time()

        self.load(config.checkpoint_dir)
        # Train
        if config.is_train:
            print("Now Start Training...")
            for ep in range(config.epoch):
                # Run by batch images
                batch_idxs = len(input_) // config.batch_size
                for idx in range(0, batch_idxs):
                    batch_images = input_[idx * config.batch_size:(idx + 1) *
                                          config.batch_size]
                    batch_labels = label_[idx * config.batch_size:(idx + 1) *
                                          config.batch_size]
                    counter += 1
                    _, err = self.sess.run([self.train_op, self.loss],
                                           feed_dict={
                                               self.images: batch_images,
                                               self.labels: batch_labels
                                           })

                    if counter % 10 == 0:
                        print(
                            "Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]"
                            % ((ep + 1), counter, time.time() - time_, err))
                    if counter % 500 == 0:
                        self.save(config.checkpoint_dir, counter)
        # Test
        else:
            print("Now Start Testing...")

            result = self.pred.eval({self.images: input_}) + input_
            image = merge(result, [nx, ny], self.c_dim)
            checkimage(merge(result, [nx, ny], self.c_dim))
            #checkimage(image_LR)
            imsave(image, config.result_dir + '/result.png', config)
Ejemplo n.º 22
0
if args.gpu:
    DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
else:
    DEVICE = torch.device('cpu')
print('selected device: '+str(DEVICE))

# import image
img = utils.imread(args.image_path, device=DEVICE)

# store image name
path = os.path.basename(args.image_path)
img_name = os.path.splitext(path)[0]

# add gaussian white noise
img_noisy = img + torch.tensor(args.stdv)*torch.randn(img.shape, device=DEVICE)
utils.imsave(img_name+'_noisy.png', img_noisy)

# extract patches
patch_size = [args.patch_size, args.patch_size]
patches = utils.im2pat(img_noisy, patch_size)

# create HDMI model
model = HDMI(patches, args.n_groups, args.stdv**2, device=DEVICE)

# run the EM algorithm
t = time.time()
print('run EM algorithm...')
for it in range(args.n_iter):
    model.E_step()
    model.M_step()
    if args.verbose:
def train(model, train_loader, test_loader, mode='EDSR_Baseline', save_image_every=50, save_model_every=10, test_model_every=1, epoch_start=0, num_epochs=1000, device=None, refresh=True, scale=2):

    if device is None:
        device = 'cuda' if torch.cuda.is_available() else 'cpu'

    today = datetime.datetime.now().strftime('%Y.%m.%d')
    
    result_dir = f'./results/{today}/{mode}'
    weight_dir = f'./weights/{today}/{mode}'
    logger_dir = f'./logger/{today}_{mode}'
    csv = f'./hist_{today}_{mode}.csv'
    if refresh:
        try:
            shutil.rmtree(result_dir)
            shutil.rmtree(weight_dir)
            shutil.rmtree(logger_dir)
        except FileNotFoundError:
            pass
    os.makedirs(result_dir, exist_ok=True)
    os.makedirs(weight_dir, exist_ok=True)
    os.makedirs(logger_dir, exist_ok=True)
    logger = SummaryWriter(log_dir=logger_dir, flush_secs=2)
    model = model.to(device)

    params = list(model.parameters())
    optim = torch.optim.Adam(params, lr=1e-4)
    scheduler = torch.optim.lr_scheduler.StepLR(optim, step_size=1000, gamma= 0.99)
    criterion = torch.nn.L1Loss()
    GMSD = GMSD_quality().to(device)
    mshf = MSHF(3, 3).to(device)
    down = torch.nn.MaxPool2d(scale)
    upnn = torch.nn.UpsamplingNearest2d(scale_factor=scale)

    start_time = time.time()
    print(f'Training Start || Mode: {mode}')

    step = 0
    pfix = OrderedDict()
    pfix_test = OrderedDict()

    hist = dict()
    hist['mode'] = f'{today}_{mode}'
    for key in ['epoch', 'psnr', 'ssim', 'ms-ssim']:
        hist[key] = []

    blurs = {}
    ksizes = [3, 5, 7]
    sigmas = [0.1, 0.2, 0.4, 0.8, 1.0]
    for ksize in ksizes:
        blurs[ksize] = {}
        for sigma in sigmas:
            blurs[ksize][sigma] = Blur(ksize=ksize, sigma=sigma).to(device)
    noise_sigma = 0
    
    for epoch in range(epoch_start, epoch_start+num_epochs):
        
        if epoch == 0:
            torch.save(model.state_dict(), f'{weight_dir}/epoch_{epoch+1:04d}.pth')
            
        if epoch == 0:
            with torch.no_grad():
                with tqdm(test_loader, desc=f'{mode} || Warming Up || Test Epoch {epoch}/{num_epochs}', position=0, leave=True) as pbar_test:
                    psnrs = []
                    ssims = []
                    msssims = []
                    for lr, hr, fname in pbar_test:
                        # lr = lr.to(device)
                        hr = hr.to(device)
                        lr = upnn(down(hr))
                        
                        blur = blurs[max(ksizes)][max(sigmas)]                        
                        
                        lr_input = blur(lr)
                        lr_input = lr_input + torch.rand_like(lr, device=lr.device)*noise_sigma
                        
                        _, features = model(lr_input)
                        dr = features[0]
                        # sr = quantize(sr)
                        
                        
                        psnr, ssim, msssim = evaluate(hr, dr)
                        
                        psnrs.append(psnr)
                        ssims.append(ssim)
                        msssims.append(msssim)
                        
                        psnr_mean = np.array(psnrs).mean()
                        ssim_mean = np.array(ssims).mean()
                        msssim_mean = np.array(msssims).mean()

                        pfix_test['psnr'] = f'{psnr:.4f}'
                        pfix_test['ssim'] = f'{ssim:.4f}'
                        pfix_test['msssim'] = f'{msssim:.4f}'
                        pfix_test['psnr_mean'] = f'{psnr_mean:.4f}'
                        pfix_test['ssim_mean'] = f'{ssim_mean:.4f}'
                        pfix_test['msssim_mean'] = f'{msssim_mean:.4f}'

                        pbar_test.set_postfix(pfix_test)
                        if len(psnrs) > 1: break
                        

        with tqdm(train_loader, desc=f'{mode} || Epoch {epoch+1}/{num_epochs}', position=0, leave=True) as pbar:
            psnrs = []
            ssims = []
            msssims = []
            losses = []
            for lr, hr, _ in pbar:
                # lr = lr.to(device)
                _, _, w, h = lr.shape
                hr = hr[:,:,:w,:h].to(device)
                lr = upnn(down(hr))
                
                # prediction
                ksize_ = random.choice(ksizes)
                sigma_ = random.choice(sigmas)
                blur = blurs[ksize_][sigma_]
                
                # dnd = random.choice(['blur', 'noise', 'blur_and_noise'])
                dnd = 'blur'
                if dnd == 'blur':
                    lr_input = blur(lr)
                elif dnd == 'noise':
                    lr_input = hr_nn + torch.rand_like(lr, device=lr.device)*noise_sigma
                else:
                    lr_input = blur(lr)
                    lr_input = lr_input + torch.rand_like(lr, device=lr.device)*noise_sigma                        
                
                _, features = model(lr_input)
                dr = features[0]
                
                gmsd = GMSD(hr, dr)      
                
                # training
                loss = criterion(dr, hr)
                loss_tot = loss
                optim.zero_grad()
                loss_tot.backward()
                optim.step()
                scheduler.step()
                
                # training history 
                elapsed_time = time.time() - start_time
                elapsed = sec2time(elapsed_time)            
                pfix['Step'] = f'{step+1}'
                pfix['Loss'] = f'{loss.item():.4f}'
                
                psnr, ssim, msssim = evaluate(hr, dr)
                        
                psnrs.append(psnr)
                ssims.append(ssim)
                msssims.append(msssim)

                psnr_mean = np.array(psnrs).mean()
                ssim_mean = np.array(ssims).mean()
                msssim_mean = np.array(msssims).mean()

                pfix['PSNR'] = f'{psnr:.2f}'
                pfix['SSIM'] = f'{ssim:.4f}'
                # pfix['MSSSIM'] = f'{msssim:.4f}'
                pfix['PSNR_mean'] = f'{psnr_mean:.2f}'
                pfix['SSIM_mean'] = f'{ssim_mean:.4f}'
                # pfix['MSSSIM_mean'] = f'{msssim_mean:.4f}'
                           
                free_gpu = get_gpu_memory()[0]
                
                pfix['free GPU'] = f'{free_gpu}MiB'
                pfix['Elapsed'] = f'{elapsed}'
                
                pbar.set_postfix(pfix)
                losses.append(loss.item())
                
                if step % save_image_every == 0:
                
                    imsave([lr_input[0], dr[0], hr[0], gmsd[0]], f'{result_dir}/epoch_{epoch+1}_iter_{step:05d}.jpg')
                    
                step += 1
                
            logger.add_scalar("Loss/train", np.array(losses).mean(), epoch+1)
            logger.add_scalar("PSNR/train", psnr_mean, epoch+1)
            logger.add_scalar("SSIM/train", ssim_mean, epoch+1)
            
            if (epoch+1) % save_model_every == 0:
                torch.save(model.state_dict(), f'{weight_dir}/epoch_{epoch+1:04d}.pth')
                
            if (epoch+1) % test_model_every == 0:
                
                with torch.no_grad():
                    with tqdm(test_loader, desc=f'{mode} || Test Epoch {epoch+1}/{num_epochs}', position=0, leave=True) as pbar_test:
                        psnrs = []
                        ssims = []
                        msssims = []
                        for lr, hr, fname in pbar_test:
                            
                            fname = fname[0].split('/')[-1].split('.pt')[0]
                            
                            # lr = lr.to(device)
                            hr = hr.to(device)
                            lr = upnn(down(hr))
                            
                            blur = blurs[max(ksizes)][max(sigmas)]
                            lr_input = blur(lr)
                            lr_input = lr_input + torch.rand_like(lr, device=lr.device)*noise_sigma      
                            
                            _, features = model(lr_input)
                            dr = features[0]
                            
                            mshf_lr = mshf(hr)
                            mshf_dr = mshf(dr)
                            
                            gmsd = GMSD(hr, dr)  
                            
                            psnr, ssim, msssim = evaluate(hr, dr)

                            psnrs.append(psnr)
                            ssims.append(ssim)
                            msssims.append(msssim)

                            psnr_mean = np.array(psnrs).mean()
                            ssim_mean = np.array(ssims).mean()
                            msssim_mean = np.array(msssims).mean()

                            pfix_test['psnr'] = f'{psnr:.4f}'
                            pfix_test['ssim'] = f'{ssim:.4f}'
                            pfix_test['msssim'] = f'{msssim:.4f}'
                            pfix_test['psnr_mean'] = f'{psnr_mean:.4f}'
                            pfix_test['ssim_mean'] = f'{ssim_mean:.4f}'
                            pfix_test['msssim_mean'] = f'{msssim_mean:.4f}'
                            
                            pbar_test.set_postfix(pfix_test)
                            
                            imsave([lr_input[0], dr[0], hr[0], gmsd[0]], f'{result_dir}/{fname}.jpg')
                            
                            mshf_vis = torch.cat((torch.cat([mshf_dr[:,i,:,:] for i in range(mshf_dr.shape[1])], dim=-1),
                                                  torch.cat([mshf_lr[:,i,:,:] for i in range(mshf_lr.shape[1])], dim=-1)), dim=-2)
                            
                            imsave(mshf_vis, f'{result_dir}/MSHF_{fname}.jpg')
                            
                        hist['epoch'].append(epoch+1)
                        hist['psnr'].append(psnr_mean)
                        hist['ssim'].append(ssim_mean)
                        hist['ms-ssim'].append(msssim_mean)
                        
                        logger.add_scalar("PSNR/test", psnr_mean, epoch+1)
                        logger.add_scalar("SSIM/test", ssim_mean, epoch+1)
                        logger.add_scalar("MS-SSIM/test", msssim_mean, epoch+1)
                        
                        df = pd.DataFrame(hist)
                        df.to_csv(csv)
    def train(self, config):
        
        # NOTE : if train, the nx, ny are ingnored
        
        #print("config.is_train:", config.is_train)
        nx, ny, original_shape = input_setup(config)

        #print("nx, ny, original_shape:", nx, ny, original_shape)
        data_dir = checkpoint_dir(config)
        
        print("reading data..")
        input_, label_ = read_data(data_dir)
        
        print("input_", input_.shape)
        
        merged_summary_op = tf.summary.merge_all()
        summary_writer = tf.summary.FileWriter("./log/train_300") #, self.sess.graph)
        #self.summary_writer = tf.summary.FileWriter("./log/", tf.get_default_graph())

        
        # Stochastic gradient descent with the standard backpropagation
        #self.train_op = tf.train.GradientDescentOptimizer(config.learning_rate).minimize(self.loss)
        
        self.optimizer = tf.train.AdamOptimizer(learning_rate=config.learning_rate)
        self.train_op = self.optimizer.minimize(self.loss)
        #self.train_op = tf.train.AdamOptimizer(learning_rate=config.learning_rate).minimize(self.loss)
        tf.initialize_all_variables().run()

        counter = 0
        time_ = time.time()

        
        self.load(config.checkpoint_dir)
        # Train
        if config.is_train:
            print("Now Start Training...")
            #for ep in range(config.epoch):
                
            for ep in range(300, 1000+1, 1):   
                
                #print("ep:", ep)
                #sys.exit()
                
                loss_summary_per_batch = []
                
                
                
                # Run by batch images
                batch_idxs = len(input_) // config.batch_size
                for idx in range(0, batch_idxs):
                    batch_images = input_[idx * config.batch_size : (idx + 1) * config.batch_size]
                    batch_labels = label_[idx * config.batch_size : (idx + 1) * config.batch_size]
                    counter += 1
                    _, err, summary = self.sess.run([self.train_op, self.loss, merged_summary_op], feed_dict={self.images: batch_images, self.labels: batch_labels})

                    
                    summary_pb = tf.summary.Summary()
                    summary_pb.ParseFromString(summary)
                    
                    summaries = {}
                    for val in summary_pb.value:
                        summaries[val.tag] = val.simple_value

                    #print("summaries:", summaries)
                    
                    
                    loss_summary_per_batch.append(summaries['loss'])
                    
                    
                    summary_writer.add_summary(summary, (ep) * counter)

                    #self.summary_writer.add_summary(summary, (ep+1) * counter)
                    
                    if counter % 1000 == 0:
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]" % ((ep), counter, time.time()-time_, err))
                    #print(label_[1] - self.pred.eval({self.images: input_})[1],'loss:]',err)
                    
                    
                    #print("Epoch: [%2d], loss: [%.8f]", (ep+1), tf.reduce_mean(tf.square(label_ - self.pred.eval({self.images: input_}))))
                    
                    #if counter % 500 == 0:
                    #if counter % 20 == 0:
                    #    self.save(config.checkpoint_dir, counter)
                        
                if ep ==0 or ep % 10 == 0:
                    self.save(config.checkpoint_dir, ep)
                    
                    ###
                    '''
                    try:
                        config.is_train = False
                        nx_, ny_, original_shape_ = input_setup(config)
                        data_dir_ = checkpoint_dir(config)
                        input__, label__ = read_data(data_dir_)

                        

                        print("Now Start Testing...")

                        result_ = self.pred.eval({self.images: input__})                   
                        image_ = merge(result_, [nx_, ny_], self.c_dim)

                        print("image after merge:", image_.shape)
                        print("[nx_, ny_]:", [nx_, ny_])

                        print("original_shape:", original_shape_)

                        print(type(image__), type(original_shape_[0]), type(original_shape_[1]))
                        cropped_img_ = crop_center(image, original_shape_[0], original_shape_[1])

                        print("cropped_img_:", cropped_img_.shape)

                        imsave(image_, config.result_dir + '/result-' + ep + '.png', config)

                        imsave(cropped_img_, config.result_dir + '/result_crop-' + ep + '.png', config)
                    except:
                        print("Unexpected error while evaluating image:", sys.exc_info()[0])

                    config.is_train = True
                    '''

                    ###
                    
                print("loss per epoch[%d] loss: [%.8f]"  % ((ep), np.mean(loss_summary_per_batch)))
                summary_writer.add_summary(tf.Summary(value=[tf.Summary.Value(tag="loss per epoch", simple_value=np.mean(loss_summary_per_batch)),]), ((ep)))
                
                summary_writer.add_summary(tf.Summary(value=[tf.Summary.Value(tag="learning rate", simple_value=self.optimizer._lr),]), ((ep)))
                
                #print("learning rate:", self.optimizer._lr)
                
        # Test
        else:
            print("Now Start Testing...")
            #print("nx","ny",nx,ny)
            
            result = self.pred.eval({self.images: input_})
            
            print("result:", result.shape)
            
            
            #print(label_[1] - result[1])
            image = merge(result, [nx, ny], self.c_dim)
            
            print("image after merge:", image.shape)
            print("[nx, ny]:", [nx, ny])

            print("original_shape:", original_shape)
            
            print(type(image), type(original_shape[0]), type(original_shape[1]))
            cropped_img = crop_center(image, original_shape[0], original_shape[1])
            
            
            print("cropped_img:", cropped_img.shape)
            
            #image_LR = merge(input_, [nx, ny], self.c_dim)
            #checkimage(image_LR)
            imsave(image, config.result_dir+'/result.png', config)
            
            imsave(cropped_img, config.result_dir+'/result_crop.png', config)
Ejemplo n.º 25
0
def train():
    data = load_data()
    model = CGAN()

    d_opt = tf.train.AdamOptimizer(learning_rate=conf.learning_rate).minimize(
        model.d_loss, var_list=model.d_vars)
    g_opt = tf.train.AdamOptimizer(learning_rate=conf.learning_rate).minimize(
        model.g_loss, var_list=model.g_vars)

    saver = tf.train.Saver()

    start_time = time.time()
    if not os.path.exists(conf.data_path + "/checkpoint"):
        os.makedirs(conf.data_path + "/checkpoint")
    if not os.path.exists(conf.output_path):
        os.makedirs(conf.output_path)

    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    with tf.Session(config=config) as sess:
        if conf.model_path_train == "":
            sess.run(tf.global_variables_initializer())
        else:
            saver.restore(sess, conf.model_path_train)
        for epoch in xrange(conf.max_epoch):
            counter = 0
            train_data = data["train"]()
            for img, cond, name in train_data:
                img, cond = prepocess_train(img, cond)
                _, m = sess.run([d_opt, model.d_loss],
                                feed_dict={
                                    model.image: img,
                                    model.cond: cond
                                })
                _, m = sess.run([d_opt, model.d_loss],
                                feed_dict={
                                    model.image: img,
                                    model.cond: cond
                                })
                _, M = sess.run([g_opt, model.g_loss],
                                feed_dict={
                                    model.image: img,
                                    model.cond: cond
                                })
                counter += 1
                if counter % 50 == 0:
                    print "Epoch [%d], Iteration [%d]: time: %4.4f, d_loss: %.8f, g_loss: %.8f" \
                      % (epoch, counter, time.time() - start_time, m, M)
            if (epoch + 1) % conf.save_per_epoch == 0:
                save_path = saver.save(
                    sess, conf.data_path + "/checkpoint/" + "model_%d.ckpt" %
                    (epoch + 1))
                print "Model saved in file: %s" % save_path
                test_data = data["test"]()
                for img, cond, name in test_data:
                    pimg, pcond = prepocess_test(img, cond)
                    gen_img = sess.run(model.gen_img,
                                       feed_dict={
                                           model.image: pimg,
                                           model.cond: pcond
                                       })
                    gen_img = gen_img.reshape(gen_img.shape[1:])
                    gen_img = (gen_img + 1.) * 127.5
                    image = np.concatenate((gen_img, cond),
                                           axis=1).astype(np.int)
                    imsave(image, conf.output_path + "/%s" % name)
Ejemplo n.º 26
0
    def train(self, config):
        if config.is_train:
            input_setup(self.sess, config)
        else:
            nx, ny, img_name = input_setup(self.sess, config)

        if config.is_train:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "train.h5")
        else:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "test.h5")

        train_data, train_label = read_data(data_dir)

        if self.load(self.checkpoint_dir):
            print(" [*] Load SUCCESS")
        else:
            print(" [!] Load failed...")

        if config.is_train:
            print("Training...")

            # Stochastic gradient descent with the standard backpropagation
            self.train_op = tf.train.GradientDescentOptimizer(
                config.learning_rate).minimize(self.loss)

            tf.initialize_all_variables().run()

            counter = 0
            start_time = time.time()

            for ep in xrange(config.epoch):
                # Run by batch images
                batch_idxs = len(train_data) // config.batch_size
                for idx in xrange(0, batch_idxs):
                    batch_images = train_data[idx *
                                              config.batch_size:(idx + 1) *
                                              config.batch_size]
                    batch_labels = train_label[idx *
                                               config.batch_size:(idx + 1) *
                                               config.batch_size]

                    counter += 1
                    _, err = self.sess.run([self.train_op, self.loss],
                                           feed_dict={
                                               self.images: batch_images,
                                               self.labels: batch_labels
                                           })

                    if counter % 10 == 0:
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]" \
                          % ((ep+1), counter, time.time()-start_time, err))

                    if counter % 500 == 0:
                        self.save(config.checkpoint_dir, counter)

        else:
            print("Testing...")
            print("shape:", train_data.shape)
            result = self.pred.eval({
                self.images: train_data,
                self.labels: train_label
            })
            #print("res shape:", result.shape)

            result = merge(result, [nx, ny])
            result = result.squeeze()
            result = (result * 65535.).astype(
                np.uint16
            )  #added for writing tiff image and restore back the original color range

            #print("res is:", result[0:5,0:5])
            output_path = os.path.join(os.getcwd(), config.sample_dir)
            image_path = os.path.join(output_path, "test_srcnn_" + img_name +
                                      ".tiff")  #changed from png
            imsave(result, image_path)

            # this part added for directly comparing the PSNR
            label_path = os.path.join(output_path,
                                      "test_ori_" + img_name + ".tiff")
            bicubic_path = os.path.join(output_path,
                                        "test_bicubic_" + img_name + ".tiff")

            bicubic_img = imread(bicubic_path, is_grayscale=True)
            label_img = imread(label_path, is_grayscale=True)
            output_img = imread(image_path, is_grayscale=True)

            #compute psnr
            bicubic_psnr = psnr(label_img, bicubic_img)
            srcnn_psnr = psnr(label_img, output_img)

            #bicubic_img = bicubic_img.astype(np.float)
            #output_img = output_img.astype(np.float)
            #label_img = label_img.astype(np.float)
            #compute ssim
            bicubic_ssim = ssim(label_img, bicubic_img)
            srcnn_ssim = ssim(label_img, output_img)

            print("bicubic PSNR for " + img_name +
                  ": [{}]".format(bicubic_psnr))
            print("SRCNN PSNR for " + img_name + ": [{}]".format(srcnn_psnr))

            print("bicubic SSIM for " + img_name +
                  ": [{}]".format(bicubic_ssim))
            print("SRCNN SSIM for" + img_name + ": [{}]".format(srcnn_ssim))
Ejemplo n.º 27
0
    def train(self, config):
        if config.is_train:
            input_setup(self.sess, config, "Train_ir")
            input_setup(self.sess, config, "Train_vi")
        else:
            nx_ir, ny_ir = input_setup(self.sess, config, "Test_ir")
            nx_vi, ny_vi = input_setup(self.sess, config, "Test_vi")

        if config.is_train:
            data_dir_ir = os.path.join('./{}'.format(config.checkpoint_dir),
                                       "Train_ir", "train.h5")
            data_dir_vi = os.path.join('./{}'.format(config.checkpoint_dir),
                                       "Train_vi", "train.h5")
        else:
            data_dir_ir = os.path.join('./{}'.format(config.checkpoint_dir),
                                       "Test_ir", "test.h5")
            data_dir_vi = os.path.join('./{}'.format(config.checkpoint_dir),
                                       "Test_vi", "test.h5")

        train_data_ir, train_label_ir = read_data(data_dir_ir)
        train_data_vi, train_label_vi = read_data(data_dir_vi)
        #找训练时更新的变量组(判决器和生成器是分开训练的,所以要找到对应的变量)
        t_vars = tf.trainable_variables()
        self.d_vars = [var for var in t_vars if 'discriminator' in var.name]
        print(self.d_vars)
        self.g_vars = [var for var in t_vars if 'fusion_model' in var.name]
        print(self.g_vars)
        # clip_ops = []
        # for var in self.d_vars:
        # clip_bounds = [-.01, .01]
        # clip_ops.append(
        # tf.assign(
        # var,
        # tf.clip_by_value(var, clip_bounds[0], clip_bounds[1])
        # )
        # )
        # self.clip_disc_weights = tf.group(*clip_ops)
        # Stochastic gradient descent with the standard backpropagation
        with tf.name_scope('train_step'):
            self.train_fusion_op = tf.train.AdamOptimizer(
                config.learning_rate).minimize(self.g_loss_total,
                                               var_list=self.g_vars)
            #self.train_discriminator_op=tf.train.AdamOptimizer(config.learning_rate).minimize(self.d_loss,var_list=self.d_vars)
        #将所有统计的量合起来
        self.summary_op = tf.summary.merge_all()
        #生成日志文件
        self.train_writer = tf.summary.FileWriter(config.summary_dir +
                                                  '/train',
                                                  self.sess.graph,
                                                  flush_secs=60)

        tf.initialize_all_variables().run()

        counter = 0
        start_time = time.time()

        # if self.load(self.checkpoint_dir):
        # print(" [*] Load SUCCESS")
        # else:
        # print(" [!] Load failed...")

        if config.is_train:
            print("Training...")

            for ep in xrange(config.epoch):
                # Run by batch images
                batch_idxs = len(train_data_ir) // config.batch_size
                for idx in xrange(0, batch_idxs):
                    batch_images_ir = train_data_ir[idx *
                                                    config.batch_size:(idx +
                                                                       1) *
                                                    config.batch_size]
                    batch_labels_ir = train_label_ir[idx *
                                                     config.batch_size:(idx +
                                                                        1) *
                                                     config.batch_size]
                    batch_images_vi = train_data_vi[idx *
                                                    config.batch_size:(idx +
                                                                       1) *
                                                    config.batch_size]
                    batch_labels_vi = train_label_vi[idx *
                                                     config.batch_size:(idx +
                                                                        1) *
                                                     config.batch_size]

                    counter += 1
                    #for i in range(2):
                    # _, err_d= self.sess.run([self.train_discriminator_op, self.d_loss], feed_dict={self.images_ir: batch_images_ir, self.images_vi: batch_images_vi, self.labels_vi: batch_labels_vi,self.labels_ir:batch_labels_ir})
                    # self.sess.run(self.clip_disc_weights)
                    _, err_g, summary_str = self.sess.run(
                        [
                            self.train_fusion_op, self.g_loss_total,
                            self.summary_op
                        ],
                        feed_dict={
                            self.images_ir: batch_images_ir,
                            self.images_vi: batch_images_vi,
                            self.labels_ir: batch_labels_ir,
                            self.labels_vi: batch_labels_vi
                        })
                    #将统计的量写到日志文件里
                    self.train_writer.add_summary(summary_str, counter)

                    if counter % 10 == 0:
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss_g:[%.8f]" \
                          % ((ep+1), counter, time.time()-start_time, err_g))
                        #print(a)

                self.save(config.checkpoint_dir, ep)

        else:
            print("Testing...")

            result = self.fusion_image.eval(
                feed_dict={
                    self.images_ir: train_data_ir,
                    self.labels_ir: train_label_ir,
                    self.images_vi: train_data_vi,
                    self.labels_vi: train_label_vi
                })
            result = result * 127.5 + 127.5
            result = merge(result, [nx_ir, ny_ir])
            result = result.squeeze()
            image_path = os.path.join(os.getcwd(), config.sample_dir)
            image_path = os.path.join(image_path, "test_image.png")
            imsave(result, image_path)
Ejemplo n.º 28
0
    def train(self, config):
        if config.is_train:
            input_setup(self.sess, config)  #读取图像并制作训练对,存储为.h5文件
        else:
            nx, ny = input_setup(self.sess, config)  #读取图像,放大并减去多余边

        if config.is_train:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "train.h5")  #读取训练数据文件路径
        else:
            data_dir = os.path.join('./{}'.format(config.checkpoint_dir),
                                    "test.h5")

        train_data, train_label = read_data(data_dir)  #读取训练数据

        # Stochastic gradient descent with the standard backpropagation
        self.train_op = tf.train.GradientDescentOptimizer(
            config.learning_rate).minimize(self.loss)

        tf.initialize_all_variables().run()

        counter = 0
        start_time = time.time()

        if self.load(self.checkpoint_dir):
            print(" [*] Load SUCCESS")
        else:
            print(" [!] Load failed...")

        if config.is_train:
            print("Training...")

            for ep in xrange(config.epoch):
                # Run by batch images
                batch_idxs = len(train_data) // config.batch_size
                for idx in xrange(0, batch_idxs):
                    batch_images = train_data[idx *
                                              config.batch_size:(idx + 1) *
                                              config.batch_size]
                    batch_labels = train_label[idx *
                                               config.batch_size:(idx + 1) *
                                               config.batch_size]

                    counter += 1
                    _, err = self.sess.run([self.train_op, self.loss],
                                           feed_dict={
                                               self.images: batch_images,
                                               self.labels: batch_labels
                                           })

                    if counter % 10 == 0:
                        print("Epoch: [%2d], step: [%2d], time: [%4.4f], loss: [%.8f]" \
                          % ((ep+1), counter, time.time()-start_time, err))

                    if counter % 500 == 0:
                        self.save(config.checkpoint_dir, counter)

        #注意这个是测试过程,如果真实使用,应该用label(原图)进行计算(已更正)
        else:
            print("Testing...")

            # result = self.pred.eval({self.images: train_data, self.labels: train_label})#源代码
            result = self.pred.eval({self.images: train_data})

            result = merge(result, [nx, ny])
            result = result.squeeze()
            # result = scipy.ndimage.interpolation.zoom(result, (2/1.), prefilter=False)
            image_path = os.path.join(os.getcwd(),
                                      config.sample_dir)  #以下为存储结果图片
            image_path = os.path.join(
                image_path, "output" + str(config.image_index) + ".png")
            imsave(result, image_path)
Ejemplo n.º 29
0
G.load_state_dict(
    torch.load("Checkpoints/G_22.pt", map_location=torch.device('cpu')))
GR.load_state_dict(
    torch.load("Checkpoints/GR_7.pt", map_location=torch.device('cpu')))

img = plt.imread(path_i)
faces = detect_face(img)

if len(faces) == 0:
    print("No faces detected")
    exit()

resz = cv2.resize(faces[0], (100, 100))
plt.imsave("out_ld.png", resz)

resz = resz.reshape(1, 100, 100, 3)
resz = np.transpose(resz, (0, 3, 1, 2))
resz = torch.from_numpy(resz)
resz = resz.float()
inp = scale(resz)
out1 = infer(G, inp)
out2 = infer(GR, inp)

inp = rescale(inp)
out1 = rescale(out1)
out2 = rescale(out2)

w = 0.5
out = out1 * w + out2 * (1 - w)
imsave(out[0], "out_hd.png")
Ejemplo n.º 30
0
def main():
    parser = build_parser()
    options = parser.parse_args()

    # Check VGG path
    if not os.path.isfile(options.network):
        parser.error(
            "Network %s does not exist. (Did you forget to download it?)" %
            options.network)

    # Load Content and styles images
    #  And resize the style to the content size
    content = utils.imread(options.content)
    if options.semantic_transfer:
        masks = utils.maskread(options.masks)
        sem_styles = [utils.imread(s) for s in options.semantic_styles]
        for idx, img in enumerate(sem_styles):
            sem_styles[idx] = scipy.misc.imresize(img, content.shape)
        style = None
    else:
        style = utils.imread(options.style)
        style = scipy.misc.imresize(style, content.shape)
        masks = None
        sem_styles = None

    # Image initialisation: noise or content image?
    initial = options.initial
    if initial is not None:
        initial = scipy.misc.imresize(utils.imread(initial), content.shape,
                                      'bilinear')
    else:
        initial = None

    # Checkpoint format
    if options.checkpoint_output and "%s" not in options.checkpoint_output:
        parser.error("To save intermediate images, the checkpoint output "
                     "parameter must contain `%s` (e.g. `foo%s.jpg`)")

    # Begin optimization
    for iteration, image in stylize(
            network=options.network,
            semantic_transfer=options.semantic_transfer,
            initial=initial,
            content=content,
            style=style,
            mask=masks,
            sem_style_images=sem_styles,
            gradient_capping=options.gradient_capping,
            capped_objs=options.capped_objs,
            auto_tuning=options.auto_tuning,
            erosion=options.erosion,
            preserve_colors=options.preserve_colors,
            iterations=options.iterations,
            content_weight=options.content_weight,
            style_weight=options.style_weight,
            tv_weight=options.tv_weight,
            learning_rate=options.learning_rate,
            print_iterations=options.print_iterations,
            checkpoint_iterations=options.checkpoint_iterations):
        output_file = None
        combined_rgb = image

        if iteration is not None:
            if options.checkpoint_output:
                output_file = options.checkpoint_output % iteration
        else:
            output_file = options.output
        if output_file:
            utils.imsave(output_file, combined_rgb)
Ejemplo n.º 31
0
def train(model,
          train_loader,
          test_loader,
          mode='EDSR_Baseline',
          save_image_every=50,
          save_model_every=10,
          test_model_every=1,
          epoch_start=0,
          num_epochs=1000,
          device=None,
          refresh=True,
          scale=2):

    if device is None:
        device = 'cuda' if torch.cuda.is_available() else 'cpu'

    today = datetime.datetime.now().strftime('%Y.%m.%d')

    result_dir = f'./results/{today}/{mode}'
    weight_dir = f'./weights/{today}/{mode}'
    logger_dir = f'./logger/{today}_{mode}'
    csv = f'./hist_{today}_{mode}.csv'
    if refresh:
        try:
            shutil.rmtree(result_dir)
            shutil.rmtree(weight_dir)
            shutil.rmtree(logger_dir)
        except FileNotFoundError:
            pass
    os.makedirs(result_dir, exist_ok=True)
    os.makedirs(weight_dir, exist_ok=True)
    os.makedirs(logger_dir, exist_ok=True)
    logger = SummaryWriter(log_dir=logger_dir, flush_secs=2)
    model = model.to(device)

    params = list(model.parameters())
    optim = torch.optim.Adam(params, lr=1e-4)
    scheduler = torch.optim.lr_scheduler.StepLR(optim,
                                                step_size=1000,
                                                gamma=0.99)
    criterion = torch.nn.L1Loss()
    GMSD = GMSD_quality().to(device)
    opening = Opening().to(device)
    blur = Blur().to(device)
    mshf = MSHF(3, 3).to(device)

    start_time = time.time()
    print(f'Training Start || Mode: {mode}')

    step = 0
    pfix = OrderedDict()
    pfix_test = OrderedDict()

    hist = dict()
    hist['mode'] = f'{today}_{mode}'
    for key in ['epoch', 'psnr', 'ssim', 'ms-ssim']:
        hist[key] = []

    soft_mask = False

    # hf_kernel = get_hf_kernel(mode='high')

    for epoch in range(epoch_start, epoch_start + num_epochs):

        if epoch == 0:
            torch.save(model.state_dict(),
                       f'{weight_dir}/epoch_{epoch+1:04d}.pth')

        if epoch == 0:
            with torch.no_grad():
                with tqdm(
                        test_loader,
                        desc=
                        f'{mode} || Warming Up || Test Epoch {epoch}/{num_epochs}',
                        position=0,
                        leave=True) as pbar_test:
                    psnrs = []
                    ssims = []
                    msssims = []
                    for lr, lr_hf, hr, fname in pbar_test:
                        lr = lr.to(device)
                        hr = hr.to(device)
                        lr_hf = lr_hf.to(device)

                        sr, deep = model(lr, lr_hf)

                        sr = quantize(sr)

                        psnr, ssim, msssim = evaluate(hr, sr)

                        psnrs.append(psnr)
                        ssims.append(ssim)
                        msssims.append(msssim)

                        psnr_mean = np.array(psnrs).mean()
                        ssim_mean = np.array(ssims).mean()
                        msssim_mean = np.array(msssims).mean()

                        pfix_test['psnr'] = f'{psnr:.4f}'
                        pfix_test['ssim'] = f'{ssim:.4f}'
                        pfix_test['msssim'] = f'{msssim:.4f}'
                        pfix_test['psnr_mean'] = f'{psnr_mean:.4f}'
                        pfix_test['ssim_mean'] = f'{ssim_mean:.4f}'
                        pfix_test['msssim_mean'] = f'{msssim_mean:.4f}'

                        pbar_test.set_postfix(pfix_test)
                        if len(psnrs) > 1: break

        with tqdm(train_loader,
                  desc=f'{mode} || Epoch {epoch+1}/{num_epochs}',
                  position=0,
                  leave=True) as pbar:
            psnrs = []
            ssims = []
            msssims = []
            losses = []
            for lr, lr_hf, hr, _ in pbar:
                lr = lr.to(device)
                hr = hr.to(device)
                lr_hf = lr_hf.to(device)

                # prediction
                sr, deep = model(lr, lr_hf)

                gmsd = GMSD(hr, sr)

                sr_ = quantize(sr)
                psnr, ssim, msssim = evaluate(hr, sr_)

                if psnr >= 40 - 2 * scale:
                    soft_mask = True
                else:
                    soft_mask = False

                if soft_mask:
                    with torch.no_grad():
                        for _ in range(10):
                            gmsd = opening(gmsd)
                    gmask = gmsd / gmsd.max()
                    gmask = (gmask > 0.2) * 1.0
                    gmask = blur(gmask)
                    gmask = (gmask - gmask.min()) / (gmask.max() -
                                                     gmask.min() + 1e-7)
                    gmask = (gmask + 0.25) / 1.25
                    gmask = gmask.detach()

                    # training
                    loss = criterion(sr * gmask, hr * gmask)
                else:
                    loss = criterion(sr, hr)

                # training
                loss = criterion(sr, hr)
                loss_tot = loss
                optim.zero_grad()
                loss_tot.backward()
                optim.step()
                scheduler.step()

                # training history
                elapsed_time = time.time() - start_time
                elapsed = sec2time(elapsed_time)
                pfix['Step'] = f'{step+1}'
                pfix['Loss'] = f'{loss.item():.4f}'

                psnrs.append(psnr)
                ssims.append(ssim)
                msssims.append(msssim)

                psnr_mean = np.array(psnrs).mean()
                ssim_mean = np.array(ssims).mean()
                msssim_mean = np.array(msssims).mean()

                pfix['PSNR'] = f'{psnr:.2f}'
                pfix['SSIM'] = f'{ssim:.4f}'
                # pfix['MSSSIM'] = f'{msssim:.4f}'
                pfix['PSNR_mean'] = f'{psnr_mean:.2f}'
                pfix['SSIM_mean'] = f'{ssim_mean:.4f}'
                # pfix['MSSSIM_mean'] = f'{msssim_mean:.4f}'

                free_gpu = get_gpu_memory()[0]

                pfix['free GPU'] = f'{free_gpu}MiB'
                pfix['Elapsed'] = f'{elapsed}'

                pbar.set_postfix(pfix)
                losses.append(loss.item())

                if step % save_image_every == 0:

                    z = torch.zeros_like(lr[0])
                    _, _, llr, _ = lr.shape
                    _, _, hlr, _ = hr.shape
                    if hlr // 2 == llr:
                        xz = torch.cat((lr[0], z), dim=-2)
                    elif hlr // 4 == llr:
                        xz = torch.cat((lr[0], z, z, z), dim=-2)
                    imsave([xz, sr[0], hr[0], gmsd[0]],
                           f'{result_dir}/epoch_{epoch+1}_iter_{step:05d}.jpg')

                step += 1

            logger.add_scalar("Loss/train", np.array(losses).mean(), epoch + 1)
            logger.add_scalar("PSNR/train", psnr_mean, epoch + 1)
            logger.add_scalar("SSIM/train", ssim_mean, epoch + 1)

            if (epoch + 1) % save_model_every == 0:
                torch.save(model.state_dict(),
                           f'{weight_dir}/epoch_{epoch+1:04d}.pth')

            if (epoch + 1) % test_model_every == 0:

                with torch.no_grad():
                    with tqdm(
                            test_loader,
                            desc=f'{mode} || Test Epoch {epoch+1}/{num_epochs}',
                            position=0,
                            leave=True) as pbar_test:
                        psnrs = []
                        ssims = []
                        msssims = []
                        for lr, lr_hf, hr, fname in pbar_test:

                            fname = fname[0].split('/')[-1].split('.pt')[0]

                            lr = lr.to(device)
                            hr = hr.to(device)
                            lr_hf = lr_hf.to(device)

                            sr, deep = model(lr, lr_hf)

                            mshf_hr = mshf(hr)
                            mshf_sr = mshf(sr)

                            gmsd = GMSD(hr, sr)

                            sr = quantize(sr)

                            psnr, ssim, msssim = evaluate(hr, sr)

                            psnrs.append(psnr)
                            ssims.append(ssim)
                            msssims.append(msssim)

                            psnr_mean = np.array(psnrs).mean()
                            ssim_mean = np.array(ssims).mean()
                            msssim_mean = np.array(msssims).mean()

                            pfix_test['psnr'] = f'{psnr:.4f}'
                            pfix_test['ssim'] = f'{ssim:.4f}'
                            pfix_test['msssim'] = f'{msssim:.4f}'
                            pfix_test['psnr_mean'] = f'{psnr_mean:.4f}'
                            pfix_test['ssim_mean'] = f'{ssim_mean:.4f}'
                            pfix_test['msssim_mean'] = f'{msssim_mean:.4f}'

                            pbar_test.set_postfix(pfix_test)

                            z = torch.zeros_like(lr[0])
                            _, _, llr, _ = lr.shape
                            _, _, hlr, _ = hr.shape
                            if hlr // 2 == llr:
                                xz = torch.cat((lr[0], z), dim=-2)
                            elif hlr // 4 == llr:
                                xz = torch.cat((lr[0], z, z, z), dim=-2)
                            imsave([xz, sr[0], hr[0], gmsd[0]],
                                   f'{result_dir}/{fname}.jpg')

                            mshf_vis = torch.cat(
                                (torch.cat([
                                    mshf_sr[:, i, :, :]
                                    for i in range(mshf_sr.shape[1])
                                ],
                                           dim=-1),
                                 torch.cat([
                                     mshf_hr[:, i, :, :]
                                     for i in range(mshf_hr.shape[1])
                                 ],
                                           dim=-1)),
                                dim=-2)

                            imsave(mshf_vis, f'{result_dir}/MSHF_{fname}.jpg')

                        hist['epoch'].append(epoch + 1)
                        hist['psnr'].append(psnr_mean)
                        hist['ssim'].append(ssim_mean)
                        hist['ms-ssim'].append(msssim_mean)

                        logger.add_scalar("PSNR/test", psnr_mean, epoch + 1)
                        logger.add_scalar("SSIM/test", ssim_mean, epoch + 1)
                        logger.add_scalar("MS-SSIM/test", msssim_mean,
                                          epoch + 1)

                        df = pd.DataFrame(hist)
                        df.to_csv(csv)
Ejemplo n.º 32
0
                    #     generated_img, feed_dict={
                    #         content_input: content_batch,
                    #         style_input: style_batch
                    #     }
                    # )
                    test_inputs_gen = utils.single_inputs_generator(list(zip(test_content_filenames, test_style_filenames)),
                                                                    CONTENT_DATA_PATH, STYLE_DATA_PATH, TEST_INPUT_CONSTRAINTED_SIZE)
                    for i, (test_contents, test_styles) in enumerate(test_inputs_gen):
                        # shape=[1, w, h, c] for contents and styles, so as to feed arbitrary sized test samples
                        paired_name = f"{osp.splitext(test_style_filenames[i])[0]}" \
                                      f"+{osp.splitext(test_content_filenames[i])[0]}"
                        try:
                            # IMPROVE: tune alpha. a value smaller than 1.0 will keep more content and convert less style
                            result_images = style_transfer_model([test_contents, test_styles], is_train=False, alpha=1)
                            print(f"generated_img for test ({paired_name}): {result_images[0].shape}")
                            utils.imsave(osp.join(TEMP_IMAGE_PATH, f"{paired_name}_{step}.jpg"), result_images[0].numpy())
                        except Exception as e:
                            tl.logging.error(f"failed to encode or save test image, bypassed: {paired_name}")

                if not is_last_step:
                    step += 1

            print(f'One Epoch finished! ({step}steps)\n' if not is_last_step else f'All Epochs finished! ({step}steps)\n')

        # """Done Training & Save the model"""
        # TL1to2: weights save/lod -> use save_weights/load_weights
        # tl.files.save_npz(stylized_dec_net.all_params, name=MODEL_SAVE_PATH + str(step) + '_model.npz')
        # ... move into the loop, ref: is_last_step
    except KeyboardInterrupt:
        print('Interrupted by keyboard.')
        try: