Ejemplo n.º 1
0
def generate_videos(args, eigenvectors):
    clips_dir = os.path.join(args.out, 'videos')
    if not os.path.isdir(clips_dir):
        os.mkdir(clips_dir)

    if args.samples_for_videos is None:
        dim_z = load_generator(args.__dict__, args.gan_weights).dim_z
        zs = torch.randn((4, dim_z)).cuda()
    else:
        zs = torch.load(args.samples_for_videos).cuda()

    print('Making videos...')
    for i, eigenvector in tqdm(enumerate(eigenvectors)):
        eigenvector = eigenvector.cuda()

        for amplitude in [10, 50, 100, 200, 500]:
            generator = load_generator(args.__dict__, args.gan_weights)

            wd = ConstantWeightDeformator(
                generator=generator,
                conv_layer_ix=args.gan_conv_layer_index,
                direction=eigenvector)

            clip_path = os.path.join(clips_dir,
                                     f'direction{i}_amplitude{amplitude}')

            make_video(generator=generator,
                       zs=zs,
                       wd=wd,
                       file_dest=clip_path,
                       shift_from=-amplitude,
                       shift_to=amplitude,
                       step=amplitude / 50.,
                       interpolate=args.video_interpolate)
Ejemplo n.º 2
0
    def objective(trial: optuna.trial.Trial):
        print(f"[Optuna]: Trial #{trial.number}")

        G = load_generator(args.__dict__, weights_path, args.w_shift)
        params = Params(**args.__dict__)

        params.batch_size = 128
        params.directions_count = 200
        params.deformator_lr = trial.suggest_float("deformator_lr", 1e-4, 1e-4, log=True)
        params.shift_predictor_lr = params.deformator_lr
        # params.torch_grad = True if trial.suggest_int("torch_grad", 0, 1) else False

        deformator = LatentDeformator(shift_dim=G.dim_shift,
                                      input_dim=params.directions_count,
                                      out_dim=params.max_latent_dim,
                                      type=DEFORMATOR_TYPE_DICT[args.deformator],
                                      random_init=args.deformator_random_init
                                      ).cuda()

        # deformator = MyDeformator(48*8*8, 48*8*8)

        if args.shift_predictor == 'ResNet':
            shift_predictor = LatentShiftPredictor(params.directions_count, args.shift_predictor_size).cuda()
        elif args.shift_predictor == 'LeNet':
            shift_predictor = LeNetShiftPredictor(
                params.directions_count, 1 if args.gan_type == 'SN_MNIST' else 3).cuda()

        # training
        args.shift_distribution = SHIFT_DISTRIDUTION_DICT[args.shift_distribution_key]

        # update dims with respect to the deformator if some of params are None
        params.directions_count = int(deformator.input_dim)
        params.max_latent_dim = int(deformator.out_dim)

        trainer = Trainer(params, out_dir=args.out, verbose=True)
        loss = trainer.train(G, deformator, shift_predictor, multi_gpu=args.multi_gpu, trial=trial)

        # my_save_results_charts(G, deformator, params, trainer.log_dir)
        compute_DVN(G, deformator, f'DVN_{args.gan_type}_{args.deformator}_{params.directions_count}.pt')

        return loss
Ejemplo n.º 3
0
    parser.add_argument('--epsilon', type=float, default=0.1)
    parser.add_argument('--lpips_net', type=str, default='vgg')
    parser.add_argument('--make_videos', type=bool, default=True)
    parser.add_argument('--samples_for_videos', type=str, default=None)
    parser.add_argument('--out', type=str, required=True)
    parser.add_argument('--lpips_interpolation_size', type=int, default=64)
    parser.add_argument('--video_interpolate', type=int, default=None)
    args = parser.parse_args()

    if not os.path.exists(args.out):
        print(f'Out: {args.out}')
        os.mkdir(args.out)

    lpips_model = lpips.LPIPS(net=args.lpips_net).cuda()

    generator = load_generator(args.__dict__, args.gan_weights)

    hvp = HVP_forward(generator=generator,
                      lpips_model=lpips_model,
                      conv_layer_ix=args.gan_conv_layer_index,
                      batch_size=args.batch_size,
                      cache_path=args.out,
                      lpips_interpolation_size=args.lpips_interpolation_size)

    eigenvectors = hvp.find_top_n_eigenvectors(n=args.num_eigenvectors,
                                               num_samples=args.num_samples,
                                               max_iter=args.max_iter,
                                               epsilon=args.epsilon)

    eigenvectors = torch.stack([
        F.normalize(eig.view(-1), p=2, dim=0).view(eig.shape)
Ejemplo n.º 4
0
def main():
    parser = argparse.ArgumentParser(description='Latent space rectification')
    for key, val in Params().__dict__.items():
        target_type = type(val) if val is not None else int
        parser.add_argument('--{}'.format(key), type=target_type, default=None)

    parser.add_argument('--out', type=str, required=True, help='results directory')
    parser.add_argument('--gan_type', type=str, choices=WEIGHTS.keys(), help='generator model type')
    parser.add_argument('--gan_weights', type=str, default=None, help='path to generator weights')
    parser.add_argument('--resolution', type=int, required=True)
    parser.add_argument('--target_class', nargs='+', type=int, default=[239],
                        help='classes to use for conditional GANs')

    parser.add_argument('--deformator', type=str, default='ortho',
                        choices=DEFORMATOR_TYPE_DICT.keys(), help='deformator type')
    parser.add_argument('--deformator_random_init', type=bool, default=True)
    parser.add_argument('--deformator_target', type=str, default='latent',
                        choices=DEFORMATOR_TARGET_DICT.keys())
    parser.add_argument('--deformator_conv_layer_index', type=int, default=3)
    parser.add_argument('--basis_vectors_path', type=str)

    parser.add_argument('--shift_predictor_size', type=int, help='reconstructor resolution')
    parser.add_argument('--shift_predictor', type=str,
                        choices=['ResNet', 'LeNet'], default='ResNet', help='reconstructor type')
    parser.add_argument('--shift_distribution_key', type=str,
                        choices=SHIFT_DISTRIDUTION_DICT.keys())

    parser.add_argument('--make_videos', type=bool, default=True)
    parser.add_argument('--samples_for_videos', type=str, default=None)
    parser.add_argument('--video_interpolate', type=int, default=None)

    parser.add_argument('--seed', type=int, default=2)
    parser.add_argument('--device', type=int, default=0)
    parser.add_argument('--multi_gpu', type=bool, default=False,
                        help='Run generator in parallel. Be aware of old pytorch versions:\
                              https://github.com/pytorch/pytorch/issues/17345')
    # model-specific
    parser.add_argument('--w_shift', type=bool, default=True,
                        help='latent directions search in w-space for StyleGAN')

    args = parser.parse_args()
    torch.cuda.set_device(args.device)
    random.seed(args.seed)
    torch.random.manual_seed(args.seed)

    save_command_run_params(args)

    # init models
    if args.gan_weights is not None:
        weights_path = args.gan_weights
    else:
        weights_path = WEIGHTS[args.gan_type]

    G = load_generator(args.__dict__, weights_path, args.w_shift)

    if args.deformator_target == 'latent':
        deformator = LatentDeformator(
            shift_dim=G.dim_shift,
            input_dim=args.directions_count,
            out_dim=args.max_latent_dim,
            type=DEFORMATOR_TYPE_DICT[args.deformator],
            random_init=args.deformator_random_init
        ).cuda()
    elif args.deformator_target == 'weight_svd':
        deformator = WeightDeformatorSVDBasis(
            generator=G,
            conv_layer_ix=args.deformator_conv_layer_index,
            directions_count=args.directions_count
        ).cuda()
        G = G.cuda()
        dim_shift = args.directions_count
    elif args.deformator_target == 'weight_fixedbasis':
        assert args.basis_vectors_path is not None
        deformator = WeightDeformatorFixedBasis(
            generator=G,
            conv_layer_ix=args.deformator_conv_layer_index,
            directions_count=args.directions_count,
            basis_vectors_path=args.basis_vectors_path
        ).cuda()
        G = G.cuda()
        dim_shift = args.directions_count
    else:
        raise ValueError("Unknown deformator_target")

    if args.shift_predictor == 'ResNet':
        shift_predictor = LatentShiftPredictor(
            dim_shift, args.shift_predictor_size).cuda()
    elif args.shift_predictor == 'LeNet':
        shift_predictor = LeNetShiftPredictor(
            dim_shift, 1 if args.gan_type == 'SN_MNIST' else 3).cuda()

    # training
    args.shift_distribution = SHIFT_DISTRIDUTION_DICT[args.shift_distribution_key]

    params = Params(**args.__dict__)
    # update dims with respect to the deformator if some of params are None
    if args.deformator_target == 'latent':
        params.directions_count = int(deformator.input_dim)
        params.max_latent_dim = int(deformator.out_dim)

    trainer = Trainer(params, out_dir=args.out)
    trainer.train(G, deformator, shift_predictor, multi_gpu=args.multi_gpu)

    if args.make_videos:
        if 'weight_' not in args.deformator_target:
            sys.stderr.write("Making video is available only for weight deformations.\n")
        else:
            generate_videos(args, G, deformator)

    if args.deformator_target == 'latent':
        save_results_charts(G, deformator, params, trainer.log_dir)
Ejemplo n.º 5
0
def main():
    parser = argparse.ArgumentParser(description='Latent space rectification')
    for key, val in Params().__dict__.items():
        target_type = type(val) if val is not None else int
        parser.add_argument('--{}'.format(key), type=target_type, default=None)

    parser.add_argument('--out',
                        type=str,
                        required=True,
                        help='results directory')
    parser.add_argument('--gan_type',
                        type=str,
                        choices=WEIGHTS.keys(),
                        help='generator model type')
    parser.add_argument('--gan_weights',
                        type=str,
                        default=None,
                        help='path to generator weights')
    parser.add_argument('--target_class',
                        nargs='+',
                        type=int,
                        default=[239],
                        help='classes to use for conditional GANs')

    parser.add_argument('--deformator',
                        type=str,
                        default='ortho',
                        choices=DEFORMATOR_TYPE_DICT.keys(),
                        help='deformator type')
    parser.add_argument('--deformator_random_init', type=bool, default=True)

    parser.add_argument('--shift_predictor_size',
                        type=int,
                        help='reconstructor resolution')
    parser.add_argument('--shift_predictor',
                        type=str,
                        choices=['ResNet', 'LeNet'],
                        default='ResNet',
                        help='reconstructor type')
    parser.add_argument('--shift_distribution_key',
                        type=str,
                        choices=SHIFT_DISTRIDUTION_DICT.keys())

    parser.add_argument('--seed', type=int, default=2)
    parser.add_argument('--device', type=int, default=0)
    parser.add_argument(
        '--multi_gpu',
        type=bool,
        default=False,
        help='Run generator in parallel. Be aware of old pytorch versions:\
                              https://github.com/pytorch/pytorch/issues/17345')
    # model-specific
    parser.add_argument(
        '--w_shift',
        type=bool,
        default=True,
        help='latent directions search in w-space for StyleGAN')

    args = parser.parse_args()
    torch.cuda.set_device(args.device)
    random.seed(args.seed)
    torch.random.manual_seed(args.seed)

    save_command_run_params(args)

    # init models
    if args.gan_weights is not None:
        weights_path = args.gan_weights
    else:
        weights_path = WEIGHTS[args.gan_type]

    G = load_generator(args.__dict__, weights_path, args.w_shift)

    deformator = LatentDeformator(
        shift_dim=G.dim_shift,
        input_dim=args.directions_count,
        out_dim=args.max_latent_dim,
        type=DEFORMATOR_TYPE_DICT[args.deformator],
        random_init=args.deformator_random_init).cuda()

    if args.shift_predictor == 'ResNet':
        shift_predictor = LatentShiftPredictor(
            G.dim_shift, args.shift_predictor_size).cuda()
    elif args.shift_predictor == 'LeNet':
        shift_predictor = LeNetShiftPredictor(
            G.dim_shift, 1 if args.gan_type == 'SN_MNIST' else 3).cuda()

    # training
    args.shift_distribution = SHIFT_DISTRIDUTION_DICT[
        args.shift_distribution_key]

    params = Params(**args.__dict__)
    # update dims with respect to the deformator if some of params are None
    params.directions_count = int(deformator.input_dim)
    params.max_latent_dim = int(deformator.out_dim)

    trainer = Trainer(params, out_dir=args.out)
    trainer.train(G, deformator, shift_predictor, multi_gpu=args.multi_gpu)

    save_results_charts(G, deformator, params, trainer.log_dir)