Esempio n. 1
0

warnings.filterwarnings('ignore')
if __name__ == '__main__':
    utils.set_random_seed(args.seed, args.gpu)
    if args.color == 'y':
        ch = 1
        weight = (1.0,)
    elif args.color == 'rgb':
        ch = 3
        weight = (0.29891 * 3, 0.58661 * 3, 0.11448 * 3)
    weight = np.array(weight, dtype=np.float32)
    weight = weight[:, np.newaxis, np.newaxis]

    print('* loading filelist...', end=' ')
    filelist = utils.load_filelist(args.dataset_dir, shuffle=True)
    valid_num = int(np.ceil(args.validation_rate * len(filelist)))
    valid_list, train_list = filelist[:valid_num], filelist[valid_num:]
    print('done')

    print('* setup model...', end=' ')
    if args.model_name is None:
        if args.method == 'noise':
            model_name = 'anime_style_noise{}'.format(args.noise_level)
        elif args.method == 'scale':
            model_name = 'anime_style_scale'
        elif args.method == 'noise_scale':
            model_name = 'anime_style_noise{}_scale'.format(args.noise_level)
        model_path = '{}_{}.npz'.format(model_name, args.color)
    else:
        model_name = args.model_name.rstrip('.npz')
Esempio n. 2
0
def main():
    p = argparse.ArgumentParser(description='Chainer implementation of waifu2x')
    p.add_argument('--gpu', '-g', type=int, default=-1)
    p.add_argument('--seed', '-s', type=int, default=11)
    p.add_argument('--dataset_dir', '-d', required=True)
    p.add_argument('--validation_rate', type=float, default=0.05)
    p.add_argument('--nr_rate', type=float, default=0.65)
    p.add_argument('--chroma_subsampling_rate', type=float, default=0.5)
    p.add_argument('--reduce_memory_usage', action='store_true')
    p.add_argument('--out_size', type=int, default=64)
    p.add_argument('--max_size', type=int, default=256)
    p.add_argument('--active_cropping_rate', type=float, default=0.5)
    p.add_argument('--active_cropping_tries', type=int, default=10)
    p.add_argument('--random_half_rate', type=float, default=0.0)
    p.add_argument('--random_color_noise_rate', type=float, default=0.0)
    p.add_argument('--random_unsharp_mask_rate', type=float, default=0.0)
    p.add_argument('--learning_rate', type=float, default=0.00025)
    p.add_argument('--lr_min', type=float, default=0.00001)
    p.add_argument('--lr_decay', type=float, default=0.9)
    p.add_argument('--lr_decay_interval', type=int, default=5)
    p.add_argument('--batch_size', '-b', type=int, default=16)
    p.add_argument('--patches', '-p', type=int, default=64)
    p.add_argument('--validation_crop_rate', type=float, default=0.5)
    p.add_argument('--downsampling_filters', nargs='+', default=['box'])
    p.add_argument('--resize_blur_min', type=float, default=0.95)
    p.add_argument('--resize_blur_max', type=float, default=1.05)
    p.add_argument('--epoch', '-e', type=int, default=50)
    p.add_argument('--inner_epoch', type=int, default=4)
    p.add_argument('--finetune', '-f', default=None)
    p.add_argument('--model_name', default=None)
    p.add_argument('--color', '-c', default='rgb',
                   choices=['y', 'rgb'])
    p.add_argument('--arch', '-a', default='VGG7',
                   choices=['VGG7', '0', 'UpConv7', '1', 'ResNet10', '2', 'UpResNet10', '3'])
    p.add_argument('--method', '-m', default='scale',
                   choices=['noise', 'scale', 'noise_scale'],)
    p.add_argument('--noise_level', '-n', type=int, default=1,
                   choices=[0, 1, 2, 3])

    args = p.parse_args()
    if args.arch in srcnn.table:
        args.arch = srcnn.table[args.arch]

    utils.set_random_seed(args.seed, args.gpu)
    if args.color == 'y':
        ch = 1
        weight = (1.0,)
    elif args.color == 'rgb':
        ch = 3
        weight = (0.29891 * 3, 0.58661 * 3, 0.11448 * 3)
    weight = np.array(weight, dtype=np.float32)
    weight = weight[:, np.newaxis, np.newaxis]

    print('* loading filelist...', end=' ')
    filelist = utils.load_filelist(args.dataset_dir, shuffle=True)
    valid_num = int(np.ceil(args.validation_rate * len(filelist)))
    valid_list, train_list = filelist[:valid_num], filelist[valid_num:]
    print('done')

    print('* setup model...', end=' ')
    if args.model_name is None:
        if args.method == 'noise':
            model_name = 'anime_style_noise{}'.format(args.noise_level)
        elif args.method == 'scale':
            model_name = 'anime_style_scale'
        elif args.method == 'noise_scale':
            model_name = 'anime_style_noise{}_scale'.format(args.noise_level)
        model_path = '{}_{}.npz'.format(model_name, args.color)
    else:
        model_name = args.model_name.rstrip('.npz')
        model_path = model_name + '.npz'
    if not os.path.exists('epoch'):
        os.makedirs('epoch')

    model = srcnn.archs[args.arch](ch)
    if model.offset % model.inner_scale != 0:
        raise ValueError('offset %% inner_scale must be 0.')
    elif model.inner_scale != 1 and model.inner_scale % 2 != 0:
        raise ValueError('inner_scale must be 1 or an even number.')
    if args.finetune is not None:
        chainer.serializers.load_npz(args.finetune, model)

    if args.gpu >= 0:
        chainer.backends.cuda.check_cuda_available()
        chainer.backends.cuda.get_device(args.gpu).use()
        weight = chainer.backends.cuda.to_gpu(weight)
        model.to_gpu()

    optimizer = optimizers.Adam(alpha=args.learning_rate)
    optimizer.setup(model)
    print('done')

    valid_config = utils.get_config(args, model, train=False)
    train_config = utils.get_config(args, model, train=True)

    print('* check forward path...', end=' ')
    di = train_config.in_size
    do = train_config.out_size
    dx = model.xp.zeros((args.batch_size, ch, di, di), dtype=np.float32)
    dy = model(dx)
    if dy.shape[2:] != (do, do):
        raise ValueError('Invlid output size\n'
                         'Expect: {}\n'
                         'Actual: ({}, {})'.format(dy.shape[2:], do, do))
    print('done')

    print('* starting processes of dataset sampler...', end=' ')
    valid_queue = DatasetSampler(valid_list, valid_config)
    train_queue = DatasetSampler(train_list, train_config)
    print('done')

    best_count = 0
    best_score = 0
    best_loss = np.inf
    for epoch in range(0, args.epoch):
        print('### epoch: {} ###'.format(epoch))
        train_queue.reload_switch(init=(epoch < args.epoch - 1))
        for inner_epoch in range(0, args.inner_epoch):
            best_count += 1
            print('  # inner epoch: {}'.format(inner_epoch))
            start = time.time()
            train_loss = train_inner_epoch(
                model, weight, optimizer, train_queue, args.batch_size)
            if args.reduce_memory_usage:
                train_queue.wait()
            if train_loss < best_loss:
                best_loss = train_loss
                print('    * best loss on training dataset: {:.6f}'.format(
                    train_loss))
            valid_score = valid_inner_epoch(
                model, valid_queue, args.batch_size)
            if valid_score > best_score:
                best_count = 0
                best_score = valid_score
                print('    * best score on validation dataset: PSNR {:.6f} dB'
                      .format(valid_score))
                best_model = model.copy().to_cpu()
                epoch_path = 'epoch/{}_epoch{}.npz'.format(model_name, epoch)
                chainer.serializers.save_npz(model_path, best_model)
                shutil.copy(model_path, epoch_path)
            if best_count >= args.lr_decay_interval:
                best_count = 0
                optimizer.alpha *= args.lr_decay
                if optimizer.alpha < args.lr_min:
                    optimizer.alpha = args.lr_min
                else:
                    print('    * learning rate decay: {:.6f}'.format(
                        optimizer.alpha))
            print('    * elapsed time: {:.6f} sec'.format(time.time() - start))
Esempio n. 3
0
args = p.parse_args()
if args.arch in srcnn.table:
    args.arch = srcnn.table[args.arch]

if __name__ == '__main__':
    models = load_models(args)

    input_exts = ['.png', '.jpg', '.jpeg', '.bmp', '.tif', '.tiff', '.webp']
    output_exts = ['.png', '.webp']
    outext = '.' + args.extension

    outname = None
    outdir = args.output
    if os.path.isdir(args.input):
        filelist = utils.load_filelist(args.input)
    else:
        tmpname, tmpext = os.path.splitext(os.path.basename(args.output))
        if tmpext in output_exts:
            outext = tmpext
            outname = tmpname
            outdir = os.path.dirname(args.output)
            outdir = './' if outdir == '' else outdir
        elif not tmpext == '':
            raise ValueError('Format {} is not supported'.format(tmpext))
        filelist = [args.input]

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

    for path in filelist:
Esempio n. 4
0
def main():
    p = argparse.ArgumentParser(description='Chainer implementation of waifu2x')
    p.add_argument('--gpu', '-g', type=int, default=-1)
    p.add_argument('--input', '-i', default='images/small.png')
    p.add_argument('--output', '-o', default='./')
    p.add_argument('--quality', '-q', type=int, default=None)
    p.add_argument('--model_dir', '-d', default=None)
    p.add_argument('--scale_ratio', '-s', type=float, default=2.0)
    p.add_argument('--tta', '-t', action='store_true')
    p.add_argument('--batch_size', '-b', type=int, default=16)
    p.add_argument('--block_size', '-l', type=int, default=128)
    p.add_argument('--extension', '-e', default='png',
                   choices=['png', 'webp'])
    p.add_argument('--arch', '-a', default='VGG7',
                   choices=['VGG7', '0', 'UpConv7', '1', 'ResNet10', '2', 'UpResNet10', '3'])
    p.add_argument('--method', '-m', default='scale',
                   choices=['noise', 'scale', 'noise_scale'])
    p.add_argument('--noise_level', '-n', type=int, default=1,
                   choices=[0, 1, 2, 3])
    p.add_argument('--color', '-c', default='rgb',
                   choices=['y', 'rgb'])
    p.add_argument('--tta_level', '-T', type=int, default=8,
                   choices=[2, 4, 8])
    g = p.add_mutually_exclusive_group()
    g.add_argument('--width', '-W', type=int, default=0)
    g.add_argument('--height', '-H', type=int, default=0)
    g.add_argument('--shorter_side', '-S', type=int, default=0)
    g.add_argument('--longer_side', '-L', type=int, default=0)

    args = p.parse_args()
    if args.arch in srcnn.table:
        args.arch = srcnn.table[args.arch]

    models = load_models(args)

    input_exts = ['.png', '.jpg', '.jpeg', '.bmp', '.tif', '.tiff', '.webp']
    output_exts = ['.png', '.webp']
    outext = '.' + args.extension

    outname = None
    outdir = args.output
    if os.path.isdir(args.input):
        filelist = utils.load_filelist(args.input)
    else:
        tmpname, tmpext = os.path.splitext(os.path.basename(args.output))
        if tmpext in output_exts:
            outext = tmpext
            outname = tmpname
            outdir = os.path.dirname(args.output)
            outdir = './' if outdir == '' else outdir
        elif tmpext != '':
            raise ValueError('Format {} is not supported'.format(tmpext))
        filelist = [args.input]

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

    for path in filelist:
        tmpname, tmpext = os.path.splitext(os.path.basename(path))
        if outname is None or len(filelist) > 1:
            outname = tmpname
        outpath = os.path.join(outdir, '{}{}'.format(outname, outext))
        if tmpext.lower() in input_exts:
            src = Image.open(path)
            w, h = src.size[:2]
            if args.width != 0:
                args.scale_ratio = args.width / w
            elif args.height != 0:
                args.scale_ratio = args.height / h
            elif args.shorter_side != 0:
                if w < h:
                    args.scale_ratio = args.shorter_side / w
                else:
                    args.scale_ratio = args.shorter_side / h
            elif args.longer_side != 0:
                if w > h:
                    args.scale_ratio = args.longer_side / w
                else:
                    args.scale_ratio = args.longer_side / h

            dst = src.copy()
            start = time.time()
            outname += '_(tta{})'.format(args.tta_level) if args.tta else '_'
            if 'noise_scale' in models:
                outname += '(noise{}_scale{:.1f}x)'.format(
                    args.noise_level, args.scale_ratio)
                dst = upscale_image(
                    args, dst, models['noise_scale'], models['alpha'])
            else:
                if 'noise' in models:
                    outname += '(noise{})'.format(args.noise_level)
                    dst = denoise_image(args, dst, models['noise'])
                if 'scale' in models:
                    outname += '(scale{:.1f}x)'.format(args.scale_ratio)
                    dst = upscale_image(args, dst, models['scale'])
            print('Elapsed time: {:.6f} sec'.format(time.time() - start))

            outname += '({}_{}){}'.format(args.arch, args.color, outext)
            if os.path.exists(outpath):
                outpath = os.path.join(outdir, outname)

            lossless = args.quality is None
            quality = 100 if lossless else args.quality
            icc_profile = src.info.get('icc_profile')
            icc_profile = "" if icc_profile is None else icc_profile
            dst.convert(src.mode).save(
                outpath, quality=quality, lossless=lossless,
                icc_profile=icc_profile)
            six.print_('Saved as \'{}\''.format(outpath))
Esempio n. 5
0
def train():
    if args.color == 'y':
        ch = 1
        weight = (1.0, )
    elif args.color == 'rgb':
        ch = 3
        weight = (0.29891 * 3, 0.58661 * 3, 0.11448 * 3)
    weight = np.array(weight, dtype=np.float32)
    weight = weight[:, np.newaxis, np.newaxis]

    print('* loading filelist...', end=' ')
    filelist = utils.load_filelist(args.dataset_dir, shuffle=True)
    valid_num = int(np.ceil(args.validation_rate * len(filelist)))
    valid_list, train_list = filelist[:valid_num], filelist[valid_num:]
    print('done')

    print('* loading model...', end=' ')
    if args.model_name is None:
        if args.method == 'noise':
            model_name = ('anime_style_noise%d_%s' %
                          (args.noise_level, args.color))
        elif args.method == 'scale':
            model_name = 'anime_style_scale_%s' % args.color
        elif args.method == 'noise_scale':
            model_name = ('anime_style_noise%d_scale_%s' %
                          (args.noise_level, args.color))
    else:
        model_name = args.model_name.rstrip('.npz')
    model_path = model_name + '.npz'
    if not os.path.exists('epoch'):
        os.makedirs('epoch')

    model = srcnn.archs[args.arch](ch)
    if args.finetune is not None:
        chainer.serializers.load_npz(args.finetune, model)

    if args.gpu >= 0:
        cuda.check_cuda_available()
        cuda.get_device(args.gpu).use()
        weight = cuda.cupy.array(weight)
        model.to_gpu()

    optimizer = optimizers.Adam(alpha=args.learning_rate)
    optimizer.setup(model)
    print('done')

    valid_config = get_config(args, model, train=False)
    train_config = get_config(args, model, train=True)

    print('* starting processes of dataset sampler...', end=' ')
    valid_queue = DatasetSampler(valid_list, valid_config)
    train_queue = DatasetSampler(train_list, train_config)
    print('done')

    best_count = 0
    best_score = 0
    best_loss = np.inf
    for epoch in range(0, args.epoch):
        print('### epoch: %d ###' % epoch)
        train_queue.reload_switch(init=(epoch < args.epoch - 1))
        for inner_epoch in range(0, args.inner_epoch):
            best_count += 1
            print('  # inner epoch: %d' % inner_epoch)
            start = time.time()
            train_loss = train_inner_epoch(model, weight, optimizer,
                                           train_queue, args.batch_size)
            train_queue.wait()
            if train_loss < best_loss:
                best_loss = train_loss
                print('    * best loss on train dataset: %f' % train_loss)
            valid_score = valid_inner_epoch(model, valid_queue,
                                            args.batch_size)
            if valid_score > best_score:
                best_count = 0
                best_score = valid_score
                print('    * best score on validation dataset: PSNR %f dB' %
                      valid_score)
                best_model = model.copy().to_cpu()
                epoch_path = 'epoch/%s_epoch%d.npz' % (model_name, epoch)
                chainer.serializers.save_npz(model_path, best_model)
                shutil.copy(model_path, epoch_path)
            if best_count >= args.lr_decay_interval:
                best_count = 0
                optimizer.alpha *= args.lr_decay
                if optimizer.alpha < args.lr_min:
                    optimizer.alpha = args.lr_min
                else:
                    print('    * learning rate decay: %f' % optimizer.alpha)
            print('    * elapsed time: %f sec' % (time.time() - start))
Esempio n. 6
0
def main():
    p = argparse.ArgumentParser()
    p.add_argument('--gpu', '-g', type=int, default=-1)
    p.add_argument('--input', '-i', default='../images/original.png')
    p.add_argument('--arch', '-a', default='')
    p.add_argument('--tta', '-t', action='store_true')
    p.add_argument('--batch_size', '-b', type=int, default=16)
    p.add_argument('--block_size', '-l', type=int, default=128)
    p.add_argument('--chroma_subsampling', '-j', action='store_true')
    p.add_argument('--downsampling_filter', '-d', default='box')
    p.add_argument('--method',
                   '-m',
                   default='scale',
                   choices=['scale', 'noise_scale'])
    p.add_argument('--noise_level', '-n', type=int, default=1, choices=[0, 1])
    p.add_argument('--color', '-c', default='rgb', choices=['y', 'rgb'])
    p.add_argument('--tta_level', '-T', type=int, default=8, choices=[2, 4, 8])

    args = p.parse_args()
    if args.arch in srcnn.table:
        args.arch = srcnn.table[args.arch]

    utils.set_random_seed(0, args.gpu)

    if os.path.isdir(args.input):
        filelist = utils.load_filelist(args.input)
    else:
        filelist = [args.input]

    images = []
    for path in filelist:
        basename = os.path.basename(path)
        _, ext = os.path.splitext(basename)
        if ext.lower() in ['.png', '.bmp', '.tif', '.tiff']:
            img = Image.open(path).convert('RGB')
            w, h = img.size[:2]
            img = img.crop((0, 0, w - (w % 2), h - (h % 2)))
            images.append(img)

    qualities = [50, 60, 70, 80, 90, 100]
    sampling_factor = '1x1,1x1,1x1'
    if args.chroma_subsampling:
        sampling_factor = '2x2,1x1,1x1'

    arch_scores = {}
    for arch in srcnn.table.values():
        args.arch = arch
        models = load_models(args)
        scores = []
        sems = []
        for quality in qualities:
            print(arch, quality)
            start = time.time()
            score, sem = benchmark(args, models, images, sampling_factor,
                                   quality)
            scores.append(score)
            sems.append(sem)
            print('Elapsed time: {:.6f} sec'.format(time.time() - start))
        arch_scores[arch] = [scores, sems]

    plt.rcParams['xtick.direction'] = 'out'
    plt.rcParams['ytick.direction'] = 'out'
    plt.rcParams['font.size'] = 12
    plt.rcParams['legend.fontsize'] = 12

    title = 'scale ({}) '.format(args.downsampling_filter)
    title += 'noise{} ({}) '.format(
        args.noise_level, sampling_factor) if 'noise' in args.method else ''
    title += 'tta{}'.format(args.tta_level) if args.tta else ''
    plt.title(title)
    plt.xlabel('JPEG quality')
    plt.ylabel('PSNR [dB]')
    plt.ylim(27.5, 42)
    if args.method == 'scale':
        plt.xticks([50, 60, 70, 80, 90, 100], [50, 60, 70, 80, 90, 'lossless'])
    else:
        plt.xticks([50, 60, 70, 80, 90, 100])
    plt.yticks([30, 35, 40])
    plt.gca().yaxis.set_minor_locator(tick.MultipleLocator(2.5))
    if args.method == 'noise_scale':
        if args.noise_level == 0:
            plt.axvspan(85, 100, color='b', alpha=0.1, lw=0)
        elif args.noise_level == 1:
            plt.axvspan(65, 90, color='b', alpha=0.1, lw=0)
    plt.grid(which='both', color='gray', linestyle='--')
    plt.gca().spines['right'].set_visible(False)
    plt.gca().spines['top'].set_visible(False)
    plt.gca().yaxis.set_ticks_position('left')
    plt.gca().xaxis.set_ticks_position('bottom')
    for key, value in arch_scores.items():
        plt.errorbar(qualities,
                     value[0],
                     yerr=value[1],
                     fmt='o-',
                     capsize=3,
                     label=key)
    plt.legend(loc='upper left', edgecolor='white')
    plt.show()