论文地址:https://arxiv.org/abs/1804.07723
论文小结
本文提出一种图像修复的方法,其使用Partial Convolution,可以实现当时最先进的图像修复效果(1804)。本文的模型可以稳健地处理任何形状、大小、位置和距离图像边界的Holes。而且本文的方法性能不会随着孔洞的增大而急剧恶化。
之前的方法,mask中的holes在图像中的表示是使用替代值,通常是使用均值。这对于卷积而言是无法区分是否是人工信息的,且以前的方法通常解决的对象都是mask为矩形的。本文使用的partial conv方式可以解决该问题,在使用mask的情况下,只以有效像素作为条件。
这篇文章在《Partial Convolution based Padding》之前,也介绍了前向传播时,自动更新mask的方式。
论文介绍
本文在非常规mask上优于其他方法。先前的方法都集中于图像的中心区域,且需昂贵的后处理。本文的工作是提出一个用于图像修复的模型,可在不规则孔洞的模式下稳健运行,并产生语义上有意义的预测。如下图所示。
此外,本文的方法结果可以平滑地与图像的其余部分结合在一起,而不需要任何外的后处理或混合操作。
最近的不适用深度学习的修复方法,使用的是剩余图像的统计信息来填补孔洞。PatchMatch是当时最先进的方法,通过迭代搜索最合适的不顶来填补孔洞。虽然这种方法通常会产生平滑的结果,但它受到可用图像统计数据的限制,并且没有视觉语义的概念,如图2(b)所示。
其他方法用固定值替代被移除的内容后,使用卷积。结果会受到孔洞的初始化值影响,通常表现为填补的孔洞区域缺乏纹理,有明显的颜色对比或孔洞周围存在明显的人工痕迹。图2(e)和图2(f)时候初始化不同造成影响的例子,其测试和训练都使用同一套初始化值。之前的方法都需要后处理操作,或者使用一个细化网络。但这些细化不能解决如图2©和图2(d)显示的所有人工痕迹。
本文的目标旨在于不依赖孔洞区域的初始值进行预测,并且不需要任何额外的后处理。当前的很多方法的另一个限制是对矩形孔洞的关注,且经常置于图像的中心区域,作者发现这种处理会使得图像修复过拟合与矩形。并且,在本文的分析中,不仅关注孔洞的大小,也关注孔洞是否与图像边界有接触。
本文的部分卷积操作如下:给定一个二元mask,卷积结果只依赖于每层的非孔洞区域。本文的主要扩展是自动mask更新的步骤。如果给定足够多的连续更新层,即使最大的mask,其孔洞最终也会缩小,直到在特征图上只留下有效的响应。部分卷积层使我们的模型不受占位符孔洞值的影响。
本文是第一个证明在不规则形状的孔洞上训练图像修复网络的有效性。同时,作者提出了一个大型的不规则mask数据集,将会在之后向公众发布。
方法介绍
部分卷积的定义如下:假设
W
W
W为卷积核的权重,
X
X
X是当前滑动窗口中的特征值,
M
M
M是对应的二元mask,运行的定义如下:
x
(
i
,
j
)
′
=
{
W
T
(
X
(
i
,
j
)
⊙
M
(
i
,
j
)
)
r
(
i
,
j
)
+
b
,
∥
M
(
i
,
j
)
∥
1
>
0
0
,
o
t
h
e
r
s
i
s
e
x'_{(i,j)}=\left\{ \begin{aligned} &W^T(X_{(i,j)}\odot M_{(i,j)})r(i,j)+b, & \|M_{(i,j)}\|_1 > 0 \\ &0, &othersise \end{aligned} \right.
x(i,j)′={WT(X(i,j)⊙M(i,j))r(i,j)+b,0,∥M(i,j)∥1>0othersise其中,
⊙
\odot
⊙是元素积,
1
(
i
,
j
)
1_{(i,j)}
1(i,j)是和输入一样大小的全1向量,而
r
(
i
,
j
)
r_{(i,j)}
r(i,j)的定义如下:
r
(
i
,
j
)
=
∥
1
(
i
,
j
)
∥
1
∥
M
(
i
,
j
)
∥
1
r_{(i,j)}=\frac{\|1_{(i,j)}\|_1}{\|M_{(i,j)}\|_1}
r(i,j)=∥M(i,j)∥1∥1(i,j)∥1
r
(
i
,
j
)
r(i,j)
r(i,j)用于调整仅用有效信息计算的代输出的权重。
mask在前向传播时也需要随着更新,如果这个滑动窗口中含有一个有效值,则这个位置的mask就是有效值。 m ( i , j ) ′ = { 1 , i f ∥ M ( i , j ) ∥ 1 > 0 0 , o t h e r w i s e m'_{(i,j)}=\left\{ \begin{aligned} &1,&if\ \ \|M_{(i,j)}\|_1>0 \\ &0,&otherwise \end{aligned} \right. m(i,j)′={1,0,if ∥M(i,j)∥1>0otherwise
定义二元mask的大小为 C ∗ H ∗ W C*H*W C∗H∗W,与输入图像的特征图大小一样。在V100的GPU上,整个网络在 512 ∗ 512 512*512 512∗512的图像输入运行 0.029 s 0.029s 0.029s。
网络的设计像UNet的网络架构,但用部分卷积层替代了所有的卷积层,并且在解码器阶段使用最近邻上采样。在使用skip connection分别结合两个feature map和两个masks,充当下一部分卷积层的输入特征的mask。最后一个的部分卷积层的输入应该包括结合的带孔洞的输入图像和原始的mask,以让模型有机会复制非孔洞像素的信息。网络细节在补充材料中可见。
同时,在处理Padding时,就将Padding视作孔洞处理,具体可见Partial Convolution based Padding。
损失函数
损失函数,既针对每个像素的重建精度,也关注合成。比如预测的孔洞值到其周围环境的平滑程度。
设定带孔洞的输入图片为
I
i
n
I_{in}
Iin,初始的二元mask为
M
M
M,其中
0
0
0为孔洞,网络预测的输出为
I
o
u
t
I_{out}
Iout,ground truth图像为
I
g
t
I_{gt}
Igt。定义像素损失为
L
h
o
l
e
=
∥
(
1
−
M
)
⊙
(
I
o
u
t
−
I
g
t
)
∥
1
L
v
a
l
i
d
=
∥
M
⊙
(
I
o
u
t
−
I
g
t
)
∥
1
\begin{aligned} \mathcal{L}_{hole}&=\|(1-M)\odot(I_{out}-I_{gt})\|_1 \\ \mathcal{L}_{valid}&=\|M\odot(I_{out}-I_{gt})\|_1 \end{aligned}
LholeLvalid=∥(1−M)⊙(Iout−Igt)∥1=∥M⊙(Iout−Igt)∥1
1
−
M
1-M
1−M表示只关心孔洞区域,
M
M
M表示只关心有效像素区域。采用的是
L
1
L1
L1损失。
定义感知损失为:
L
p
e
r
c
e
p
t
u
a
l
=
∑
n
=
0
N
−
1
∥
Ψ
n
(
I
o
u
t
)
−
Ψ
n
(
I
g
t
)
∥
1
+
∑
n
=
0
N
−
1
∥
Ψ
n
(
I
c
o
m
p
)
−
Ψ
n
(
I
g
t
)
∥
1
\mathcal{L}_{perceptual}=\sum_{n=0}^{N-1}\|\Psi_n(I_{out})-\Psi_n(I_{gt})\|_1+\sum_{n=0}^{N-1}\|\Psi_n(I_{comp})-\Psi_n(I_{gt})\|_1
Lperceptual=n=0∑N−1∥Ψn(Iout)−Ψn(Igt)∥1+n=0∑N−1∥Ψn(Icomp)−Ψn(Igt)∥1其中
I
c
o
m
p
I_{comp}
Icomp为
I
o
u
t
I_{out}
Iout的复制品,但其非孔洞像素直接来源于ground truth。
感知损失是
I
o
u
t
,
I
c
o
m
p
I_{out}, I_{comp}
Iout,Icomp与
I
g
t
I_{gt}
Igt的
L
1
L1
L1距离,但不是直接使用原始图片,而是使用ImageNet预训练的VGG16将
I
o
u
t
,
I
c
o
m
p
I_{out}, I_{comp}
Iout,Icomp和
I
g
t
I_{gt}
Igt映射到高级(high level)特征空间中。
Ψ
n
\Psi_n
Ψn是第
n
n
n个选择层的激活层。作者选择了pool1, pool2, pool3作为损失映射的特征输出。
定义风格损失为:在每个特征图上展现自相关后再应用
L
1
L1
L1距离。
L
s
t
y
l
e
o
u
t
=
∥
K
n
(
(
Ψ
n
(
I
o
u
t
)
)
T
(
Ψ
n
(
I
o
u
t
)
)
−
(
Ψ
n
(
I
g
t
)
)
T
(
Ψ
n
(
I
g
t
)
)
)
∥
1
L
s
t
y
l
e
c
o
m
p
=
∥
K
n
(
(
Ψ
n
(
I
c
o
m
p
)
)
T
(
Ψ
n
(
I
c
o
m
p
)
)
−
(
Ψ
n
(
I
g
t
)
)
T
(
Ψ
n
(
I
g
t
)
)
)
∥
1
\begin{aligned} \mathcal{L}_{style_{out}}&=\| K_n((\Psi_n(I_{out}))^T(\Psi_n(I_{out}))-(\Psi_n(I_{gt}))^T(\Psi_n(I_{gt}))) \|_1 \\ \mathcal{L}_{style_{comp}}&=\| K_n((\Psi_n(I_{comp}))^T(\Psi_n(I_{comp}))-(\Psi_n(I_{gt}))^T(\Psi_n(I_{gt}))) \|_1 \end{aligned}
LstyleoutLstylecomp=∥Kn((Ψn(Iout))T(Ψn(Iout))−(Ψn(Igt))T(Ψn(Igt)))∥1=∥Kn((Ψn(Icomp))T(Ψn(Icomp))−(Ψn(Igt))T(Ψn(Igt)))∥1
其中
Ψ
(
x
)
n
\Psi(x)_n
Ψ(x)n的大小为
(
H
n
W
n
)
∗
C
n
(H_nW_n)*C_n
(HnWn)∗Cn,自相关矩阵的结果大小为
C
n
∗
C
n
C_n*C_n
Cn∗Cn,
K
n
K_n
Kn是归一化因子,文中定义为
1
/
C
n
H
n
K
n
1/C_nH_nK_n
1/CnHnKn,文中应该写错了,这归一化的因子可能为
1
/
C
n
H
n
W
n
1/C_nH_nW_n
1/CnHnWn。
又引入平滑惩罚项,定义总变化损失为:
L
t
v
=
∑
(
i
,
j
)
∈
P
,
(
i
,
j
+
1
)
∈
P
∥
I
c
o
m
p
i
,
j
+
1
−
I
c
o
m
p
i
,
j
∥
1
+
∑
(
i
,
j
)
∈
P
,
(
i
+
1
,
j
)
∈
P
∥
I
c
o
m
p
i
+
1
,
j
−
I
c
o
m
p
i
,
j
∥
1
\mathcal{L}_{tv}=\sum_{(i,j)\in P,(i,j+1)\in P}\| I_{comp}^{i,j+1} - I_{comp}^{i,j} \|_1 + \sum_{(i,j)\in P,(i+1,j)\in P}\| I_{comp}^{i+1,j} - I_{comp}^{i,j} \|_1
Ltv=(i,j)∈P,(i,j+1)∈P∑∥Icompi,j+1−Icompi,j∥1+(i,j)∈P,(i+1,j)∈P∑∥Icompi+1,j−Icompi,j∥1
直观上来看,就是孔洞中每个像素和隔壁像素的像素值平滑。
总的损失定义:不同的损失项权重是通过对100张验证图像执行超参数进行搜索获得。
L
t
o
t
a
l
=
L
v
a
l
i
d
+
6
L
h
o
l
e
+
0.05
L
p
e
r
c
e
p
t
u
a
l
+
120
(
L
s
t
y
l
e
o
u
t
+
L
s
t
y
l
e
c
o
m
p
)
+
0.1
L
t
v
\mathcal{L}_{total}=\mathcal{L}_{valid}+6\mathcal{L}_{hole}+0.05\mathcal{L}_{perceptual}+120(\mathcal{L}_{style_{out}}+\mathcal{L}_{style_{comp}})+0.1\mathcal{L}_{tv}
Ltotal=Lvalid+6Lhole+0.05Lperceptual+120(Lstyleout+Lstylecomp)+0.1Ltv
不同损失项的消融学习
感知损失会产生棋盘假象,故[12]作者建议使用总变化(total variation, TV)损失来改善这个问题。但作者发现对于本文的模型,该措施无法进行泛化。如图3(b)所示,从
L
t
o
t
a
l
\mathcal{L}_{total}
Ltotal中移除了
L
s
t
y
l
e
\mathcal{L}_{style}
Lstyle后训练模型的结果。这证明了风格损失的重要性,但并不是所有的风格损失的损失加权方案都会产生可信的结果。如图3(f)所示,使用了小的分割损失权重训练模型的结果,与图3(g)的全损失项进行对比,可看出图3(f)有很多的鱼鳞伪影(fish scale artifacts)。但是,感知损失也很重要,如图3(k)和图3(j)的对比,没有感知损失的网络回产生更严重的网格状的伪影(grid-shaped artifacts)。
实验
之前的工作,随机移除图像中的矩形区域,在数据集中产生孔洞。作者认为这对于创造各种需要的不同形状和大小的孔洞是不够的,所以作者从收集随机条纹和任意形状的孔洞的mask开始。
作者发现[29]中描述的视频在连续两帧之间进行遮挡/解除遮挡的mask估计方法的结果是这种模式的良好来源。
作者为训练生成了55116个mask,为测试生成了24866个mask。在训练时,为mask进行数据增强。然后进行随机放大、旋转和裁剪。所有用于训练和测试的mask、图像大小都为 512 ∗ 512 512*512 512∗512。在测试集上,也进行随机的方法、旋转和裁剪。
之前很多方法在孔洞靠近边缘的时候,性能都有下降。所以作者将数据集分成两个部分:孔洞靠近边界的mask和孔洞没有靠近边界的mask,其临界点在于孔洞离图像边界距离是否在50个像素内。The split that
has holes distant from the border ensures a distance of at least 50 pixels from the border.
然后,作者对mask的孔洞大小进行了分类。具体而言,作者定义了6个比例范围:
(
0.01
,
0.1
]
,
(
0.1
,
0.2
]
,
(
0.2
,
0.3
]
,
(
0.3
,
0.4
]
,
(
0.4
,
0.5
]
,
(
0.5
,
0.6
]
(0.01,0.1],(0.1,0.2],(0.2,0.3],(0.3,0.4],(0.4,0.5],(0.5,0.6]
(0.01,0.1],(0.1,0.2],(0.2,0.3],(0.3,0.4],(0.4,0.5],(0.5,0.6]。每个种类有孔洞靠近边界的mask和孔洞不靠近边界的mask各
1000
1000
1000张。所以,一共有
6
∗
2
∗
1000
=
12000
6*2*1000=12000
6∗2∗1000=12000个mask。各种类的mask例子如下图所示,其中1,3,5是有边界约束的,2,4,6是没有边界约束的。
训练数据使用了3个独立的数据集用于训练和测试:ImageNet、Places2、CelebA-HQ。使用ImageNet和places2的原始训练、验证和测试划分。而CelebA-HQ则随机划分 27 K 27K 27K用于训练,划分 3 K 3K 3K用于测试。
训练时,使用[9]的权重初始化,使用Adam作为优化器。在单个16GB的V100 GPU上,使用batchSize为6。
但在训练的时候,孔洞(Holes)关于对于BN层(Batch Normalization)的使用造成问题。因为孔洞像素会被用于计算均值和方差,但在卷积的时候是用不上孔洞区域的像素的。但是,这个孔洞会逐渐在前向传播的时候被填满,通常会在解码器阶段完全消失。
为了在有孔洞时使用BN层,所以作者先使用初始学习率为
0.0002
0.0002
0.0002训练BN层。然后使用
0.00005
0.00005
0.00005的学习率进行finetune,但此时编码器中的BN层不再进行学习(freeze the Batch Normalization parameter),而解码器中的BN层继续学习。这不仅避免了不正确的均值和方差问题,还帮助我们实现更快的收敛。在ImageNet和Places2模型需要训练10天,而CelebA-HQ训练3天,所有的finetune都在一天内完成。
模型对比
与GL、GntIpt的公平比较需要重新在本文的数据集下进行重新训练。但这两个算法训练都是使用了局部鉴定器,其假设孔洞的局部边界框是可用的,这对本文的mask形状是没有意义的。所以比较的时候直接使用它们预训练的模型直接进行泛化。
定量分析
图5和图6展示了分别展示了ImageNet和Places2的比较结果。图9展示了在CelebA-HQ数据集上与GntIpt的比较结果。
下图7展示了Conv和Partial Conv的比较结果,可看出Conv有差距的人工痕迹。
定量分析
在图像修复领域,一直没有一个好的数值指标可以用来评价图像修复的结果。尽管如此,这里还是使用
L
1
L1
L1误差,PSNR,SSIM和inception score作为评价指标。其中
L
1
L1
L1误差,PSNR和SSIM用于Places2,而Inception score用于ImageNet上。下表展示了比较结果,可看出在不规则mask的情况下,本文的方法好于其他的所有方法。
人类主管评判
除了定性定量分析,本文还通过人类的主观研究来评估算法。下图8(a)展示了不同孔洞-图片的面积比的结果。第一行显示的是孔洞离边界至少50个像素的结果,而第二行没有限制。在两种情况下,本文的方法都优于其他所有的方法,而
50
%
50\%
50%指标的情况下是两种方法性能相同。
上图8(b)是在有限的时间前提下,人类对所有方法的结果与GT进行比较,看那张图片更加自然。这可以评估图像之间的差异有多快可以被感知到。在大多数时间段和孔洞-图像面积比的大多数情况下都优于其他方法。
分析
下图展示,在空洞越来越大的情况下,本文的方法也可以良好地适应。
下图展示,如果图像中结构是稀疏的,像大多数方法一样,本文的方法也无法进行修复。