zoukankan      html  css  js  c++  java
  • 【深度学习风格化/生成艺术】图像融合--毫无违和

    玩转图像,可以玩一整天的图像生成

    Deep Painterly Harmonization
    来自康奈尔大学的FujunLuan,在最近的文章中发表了一种可以再油画、名画和各种风格的原图中,嵌入自己个性化的部分,并毫无违和感的展示出来。研究表明局域统计特征对于图像的融入十分重要、生成高质量图像的关键在于保证多尺度统计特征和空间的连续性。

    在这里插入图片描述

    相关工作

    • 图像共融–Image Harmonization.
    • 风格迁移–Style Transfer using Neural Networks

    算法

    损失主要分为三部分:

    • 标准的风格和内容损失
      在这里插入图片描述
    • 直方图损失,增加上式稳定性:
      在这里插入图片描述
    • 全局方差损失,增加图像平滑过渡:
      在这里插入图片描述

    具体的步骤分为:

    • 鲁棒的粗融合:包括了映射和重建
    • 高质量的精融合:同业也是映射与重建
    • 后处理阶段包含了色度去噪、图像分片合成
    • 训练painting estimator 来获取优化参数

    一些结果:
    一些好看的图

    作者

    Fujun Luan是康奈尔大学博士,主要集中于图形学渲染方向和风格迁移领域的研究,去年一篇著名的图像风格迁移论文deep photo style transfer也出自他之手。
    在这里插入图片描述

    代码实现

    作者的代码主要包含torch、cudnn和matlab写的代码。其中cudnn用于加速、torch用于风格迁移生成、matlab用于后处理。

    python

    其python代码主要是调用了torch写的lua脚本

    import os
    import math
    
    numImgs = 35   #需要生成的图像数量
    # numGpus = 16 
    numGpus = 1   #使用的GPU数量
    
    if os.path.exists('results') == 0:
    	os.mkdir('results')   #图像在git文件夹下resulte下
    
    N = int(math.ceil(float(numImgs)/numGpus))   #分配
    
    for j in range(1, numGpus+1):
    	cmd = ''
    	for i in range(1, N+1):
    		idx = (i-1) * numGpus + (j-1)
    		if idx >= 0 and idx < numImgs:
    			print('Working on image idx = ', idx)
    			#https://github.com/luanfujun/deep-painterly-harmonization/blob/master/neural_gram.lua
    			part_cmd1 =' th neural_gram.lua '     #计算格拉姆矩阵,各种风格迁移、掩膜等等
    					   ' -content_image data/' + str(idx) + '_naive.jpg  '
    					   ' -style_image   data/' + str(idx) + '_target.jpg '
    					   ' -tmask_image   data/' + str(idx) + '_c_mask.jpg '
    					   ' -mask_image    data/' + str(idx) + '_c_mask_dilated.jpg '
    					   ' -gpu ' + str(j-1) + ' -original_colors 0 -image_size 700 '
    					   ' -output_image  results/' + str(idx) + '_inter_res.jpg'
    					   ' -print_iter 100 -save_iter 100 && '
    			#https://github.com/luanfujun/deep-painterly-harmonization/blob/master/neural_paint.lua
    			part_cmd2 =' th neural_paint.lua '     #生成painting,精细化的融合新加入的图像
    					   ' -content_image data/' + str(idx) + '_naive.jpg '
    					   ' -style_image   data/' + str(idx) + '_target.jpg '
    					   ' -tmask_image   data/' + str(idx) + '_c_mask.jpg '
    					   ' -mask_image    data/' + str(idx) + '_c_mask_dilated.jpg '
    					   ' -cnnmrf_image  results/' + str(idx) + '_inter_res.jpg  '
    					   ' -gpu ' + str(j-1) + ' -original_colors 0 -image_size 700 '
    					   ' -index ' + str(idx) + ' -wikiart_fn data/wikiart_output.txt '
    					   ' -output_image  results/' + str(idx) + '_final_res.jpg' 
    					   ' -print_iter 100 -save_iter 100 '
    					   ' -num_iterations 1000 &&' 
    			cmd = cmd + part_cmd1 + part_cmd2
    	cmd = cmd[1:len(cmd)-1]
    	print(cmd)
    	os.system(cmd)
    

    matlab

    作者同时还提供了matlab代码来进行后处理:

    for i = 0:34
        close all
    
        in_fn  = ['results/' int2str(i) '_final_res.png'];  %输入输入
        out_fn = ['results/' int2str(i) '_final_res2.png'];
        
        if exist(in_fn, 'file') ~= 2 
            fprintf('file doesn''t exist: %s
    ', in_fn); 
            continue
        end 
        if exist(out_fn, 'file') == 2 
            fprintf('result already exists: %s
    ', out_fn); 
            continue
        end 
    
        I = im2double(imread(in_fn));
    
        G = im2double(imread(['data/' int2str(i) '_naive.jpg']));    %原图
        M = im2double(imread(['data/' int2str(i) '_c_mask.jpg']));   %mask图像
        B = im2double(imread(['data/' int2str(i) '_target.jpg']));   %目标图
    
    
        tr= 3;
        h = fspecial('gaussian', [2*tr+1 2*tr+1], tr);
        sM = imfilter(M, h, 'same'); 
        sM(sM > 0.01) = 1; % dialte
        sM(sM < 0.01) = 0;
        sM = imfilter(sM, h, 'same'); 
    
        addpath 3rdparty/colorspace
        I_lab = colorspace('rgb->lab', I);   %颜色空间lab转换
    
        addpath 3rdparty/guided_filter    %引导滤波器
        addpath 3rdparty/patchmatch-2.0    %图像片元匹配
    
        r = 2; % try r=2, 4, or 8    %一些超参数
        eps = 0.1^2; % try eps=0.1^2, 0.2^2, 0.4^2
    
        O_lab = I_lab;
        O_lab(:,:,2) = guidedfilter_color(G, I_lab(:,:,2), r, eps);   %引导滤波器:ref:https://arxiv.org/abs/1505.00996
        O_lab(:,:,3) = guidedfilter_color(G, I_lab(:,:,3), r, eps);
    
        % runs here, deconvolution CNN artifact removed   %去除解卷积的人工痕迹
        O1 = colorspace('lab->rgb', O_lab);
        % one patchmatch pass to further remove color artifact
        cores = 4; 
        algo = 'cputiled';
        patch_w = 7;
        ann = nnmex(O1, B, algo, patch_w, [], [], [], [], [], cores);
        O2_base = im2double(votemex(B, ann));
    
        r = 3;
        h = fspecial('gaussian', [2*r+1 2*r+1], r/3);
        O1_base = imfilter(O1, h, 'same');
        O2 = O2_base + O1 - O1_base;
    
        O2 = O2.*sM + B.*(1-sM);
        figure; imshow(I)
        figure; imshow(O2)
    
        imwrite(O2, out_fn);
    end 
    

    TODO:代码run demo


    ref:
    https://arxiv.org/pdf/1804.03189.pdf
    https://www.cs.cornell.edu/~fujun/
    https://github.com/luanfujun/deep-painterly-harmonizatio
    results:https://github.com/luanfujun/deep-painterly-harmonization/blob/master/README2.md
    deep photo transfer:https://blog.csdn.net/cicibabe/article/details/70868746,https://arxiv.org/pdf/1703.07511.pdf

  • 相关阅读:
    trie树模型
    计算机网络概念
    [luogu]1042乒乓球 (模拟)
    [IPUOJ10705]最大连通块 (dfs)
    IPUOJ10701 有障碍的八皇后
    【紫书学习笔记】
    纪念正式写博客的第一天
    Bzoj 1997 [Hnoi2010]Planar题解
    Bzoj 1925 [Sdoi2010]地精部落 题解
    Bzoj 2839 集合计数 题解
  • 原文地址:https://www.cnblogs.com/Tom-Ren/p/10234964.html
Copyright © 2011-2022 走看看