【深度学习风格化/生成艺术】图像融合--毫无违和

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

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\n', in_fn); 
        continue
    end 
    if exist(out_fn, 'file') == 2 
        fprintf('result already exists: %s\n', 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

posted @ 2018-12-31 19:52  hitrjj  Views(2169)  Comments(0Edit  收藏  举报