玩转图像,可以玩一整天的图像生成
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