2019-周报11

本周学习了VAE-GAN, B iGAN等理论知识,针对之前说的利用GAN做unpaired的网络,阅读了论文Unsupervised Image Super-Resolution using Cycle-in-Cycle Generative Adversarial Networks 并进行了实现,由于实验室显卡使用紧张,训练了10个epoch,得到了不错的效果。同时,在FlyAI上报名了比赛,在事情较少的时候开始做做比赛,检验水平。

1 CinCGAN

CinCGAN将去噪网络与超分网络结合,去噪部分使用cycleGAN的结构,将去噪后的结果输入训练之后的EDSR 超分网络得到超分图像,再通过一个生成网络生成低分辨带噪声图像与最初输入图像之间计算损失。整个网络结构相当于一个大的cycleGAN中再加入一个cycleGAN,所以起名为CinCGAN(cycle in cycle GAN),网络共有三个Generator,两个Discriminator,一个EDSR,整体网络结构如下。

图1.CinCGAN

网络使用NTIRE2018 Super-Resolution Challenge 比赛提供的高清数据集DIV2K进行训练,其中包含800张训练图片和100张测试图片。其中低清图片直接使用 bicubic 下采用得到,噪声图片在下采样基础上加噪得到。并通过旋转,裁剪来扩张数据。

1.1 网络结构

上面提到网络共有三个Generator,两个Discriminator,一个EDSR。其中生成器与判别器的网络结构各自相同,如下图所示。

图2.生成器&判别器结构

1.2 训练过程

网络的训练主要分为两个部分单独训练,也即是网络中的两个cycleGAN。首先训练网络中的LR -> clean LR 去噪网络,在去噪网络训练完成之后再训练整个大的超分网络。

  • STEP1 (内部去噪网络):
    1. 从bicubic下采样训练集中取样m个(一个batch)样本作为real样本
    2. 从加噪训练集中取样m个样本,输入G1得到输出作为fake样本
    3. 使用real样本,fake样本更新判别器D1
    4. G1网络输出张量输入判别器D1计算log损失函数 $LogLoss$
    5. G1网络输入加噪图片,计算去噪之后的 $TVLoss$
    6. G1网络输入bicubic下采样图片,计算输入前后的$L1loss$
    7. 计算G2网络的输出与G1网络输入之间的 $MSEloss$
    8. 总损失$ Loss = LogLoss + 0.5TVLoss + 5 L1loss + 10*MSEloss$
    9. 更新生成器 G1 G2
  • STEP2 (超分网络):
    1. STEP1更新
    2. 从训练集中采样高清图m个作为real样本
    3. EDSR输出作为fake样本
    4. 更新D2
    5. EDSR网络输出张量输入判别器D2计算log损失函数 $LogLoss$
    6. 对EDSR网络输出张量计算 $TVLoss$
    7. 计算EDSR网络的输出与高清图片之间的 $MSELoss1 $
    8. 计算G3网络输出与G1网络输入之间的 $MSELoss2 $
    9. 总损失 $ Loss = LogLoss + 2TVLoss + 5 L1loss + 10*MSEloss$
    10. 更新生成器 G1 G2 G3

1.3 参考资料

2 图像去锯齿

研究生阶段多数时间在学习深度学习的图像处理,传统的图像处理很少用过,看到这个小测试就很有兴趣。查阅书籍之后决定使用简单方法进行实现,实现步骤大概为以下三个步骤

  • 有锯齿区域提取 (ROI)
  • 对锯齿区域模糊处理
  • 对锯齿区域锐化
1. 锯齿区域提取

图2.区域提取

如上图所示,锯齿区域提取主要包括灰度提取,边缘提取,边缘筛选,膨胀扩大边缘区域四个部分。在测试过sobel 边缘提取,prewitt 边缘提取,Laplasian of Gaussian 边缘提取,canny 边缘提取之后,根据结果选择了canny 算子进行边缘提取。

2.滤波锐化

对上面提取的区域进行掩膜滤波,使用高斯模糊再进行sobel 锐化得到处理前后的对比图如下

图3.结果对比

附处理代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
I_ori = imread('4.png');     % 读取图片
I = I_ori(:,:,2);
imshow(I,[]);
%I = imbinarize(I);

cannyBW=edge(I,'canny'); % 边缘提取
figure;
imshow(cannyBW);
title('canny Edge');

% Test
p = regionprops(cannyBW, 'Perimeter', 'PixelIdxList');
%[test, longest] = max([p.Perimeter]);
[~,Index] = sort([p.Perimeter],'descend');
%[~, longest] = max([p.Perimeter]);
BW2 = zeros(size(cannyBW));
SortLongestG = SortLongest(1:20);
for i = 1:10
%j = int8(i);
j = Index(i);
PixelIdxList = p(j).PixelIdxList;
BW2(PixelIdxList) = 1;
end


figure;
imshow(BW2)

% logBW_dilate = imdilate(logBW, [1 1 1;1 1 1;1 1 1]); % 提取 ROI
logBW_dilate = imdilate(BW2, [0 0 1 0 0;0 1 1 1 0;1 1 1 1 1;0 1 1 1 0;0 0 1 0 0]);
% logBW_dilate = imdilate(logBW, [1 1 1 1 1;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1]);
% logBW_dilate = imdilate(logBW, [1 1 1 1 1;1 1 1 1 1;1 1 1 1 1]);
% logBW_dilate = imdilate(logBW, [1 1 1 1;1 1 1 1;1 1 1 1]);
% logBW_dilate = imdilate(logBW, [1 1;1 1;1 1;1 1;1 1;1 1]);
figure;
imshow(logBW_dilate);
title('dilate of Laplasian of canny Edge');

G = fspecial('gaussian', [5 5], 2); % ROI 区域进行高斯模糊
blurI = I_ori;
blurI(:,:,1) = roifilt2(G,I_ori(:,:,1),logBW_dilate);
blurI(:,:,2) = roifilt2(G,I_ori(:,:,2),logBW_dilate);
blurI(:,:,3) = roifilt2(G,I_ori(:,:,3),logBW_dilate);
figure;
imshow(blurI);
title('gaussian blur on roi');

imwrite(blurI, '5_out.png');

S = fspecial('sobel'); % ROI 区域进行 sobel 锐化
sobelI = blurI;
sobelI(:,:,1) = roifilt2(S, blurI(:,:,1), logBW_dilate);
sobelI(:,:,2) = roifilt2(S, blurI(:,:,2), logBW_dilate);
sobelI(:,:,3) = roifilt2(S, blurI(:,:,3), logBW_dilate);
sobelI = uint8(sobelI) + uint8(blurI);
title('sobel sharpen on roi of blurI');
Share Comments