语义分割
近年来,由深度学习所引领的人工智能技术浪潮,开始越来越广泛地应用到社会各个领域。这其中,人工智能与艺术的交叉碰撞,不仅在相关的技术领域和艺术领域引起了高度关注。以相关技术为基础而开发的各种图像处理软件和滤镜应用更是一推出就立刻吸引了海量用户,风头一时无两。在这各种神奇的背后,最核心的就是基于深度学习的图像风格迁移(style transfer)。
图像风格迁移算法可以解决如下问题:指定一幅输入图像作为基础图像,也被称做内容图像;同时指定另一幅或多幅图像作为希望得到的图像风格,算法在保证内容图像的结构的同时,将图像风格进行转换,使得最终输出的合成图像呈现出输入图像内容和风格的完美结合。其中,图像的风格可以是某一艺术家的作品、也可以是由个人拍摄的图像所呈现出来的风格。
我们的目的是输出图像可以分别结合输入图像的内容和风格,也就是我们希望结果图像可以在内容上与内容图像相似,在风格上与风格图像相似。为此,很自然的就有两个问题需要解决:
- 如何分别表示和提取图像的内容和风格;
- 如何刻画内容和风格上的相似性。前文已经提过,图像的内容和风格由于含义广泛并且没有严格统一的数学定义,并且有很大程度的主观性,因此很难表示。
众所周知,以 VGG为代表的深度卷积神经网络模型可以很好地层次化提取图像特征从而对图像进行有效的表征,在大规模图像分类、图像分割和图像目标检测等多个任务上取得了优异性能。以 VGG 模型为例,通过实验对比验证,能够得到以下两个结论:
- 网络 4_1 层的输出,即该层经过非线性响应而得到的 feature_map,可以作为图像内容比较好的表示;
- 在风格表示上,由每一层输出的 feature_map 所得到的 Gram 矩阵可以作为图像风格的良好表示。具体计算方法为:将某一层输出的 N 个 feature_map 分别拉成向量,Gram 矩阵的元素为 feature_map 向量之间的内积(即 correlation),具体计算公式如下:
G i j l = ∑ k F i k l F j k l G^{l}_{ij} = \sum_{k}F^l_{ik}F^l_{jk} Gijl=k∑FiklFjkl
其中 l 表示第 l 层,G 为 Gram 矩阵,Fi 和 Fj 为第 i 个和第 j 个 feature map 向量。
在解决了图像内容和风格的表示之后,接下来就是如何衡量内容和风格之间的相似性,并将这一问题转化为优化问题求解。假定我们希望得到的最终合成图像为 O,输入的内容图像为 I,风格图像为 S(假设只有一副风格图像)。为了使 O 与 I 的内容相似,我们有以下损失函数:
L
c
l
=
1
2
N
l
D
l
∑
i
j
(
F
l
[
O
]
−
F
l
[
I
]
)
i
j
2
L^l_c = \frac{1}{2N_lD_l}\sum_{ij}(F_l[O] - F_l[I])^2_{ij}
Lcl=2NlDl1ij∑(Fl[O]−Fl[I])ij2
为了使 O 与 S 的风格相似,我们有以下损失函数:
L
s
l
=
1
2
N
l
2
∑
i
j
(
G
l
[
O
]
−
G
l
[
S
]
)
i
j
2
L^l_s = \frac{1}{2N_l^2}\sum_{ij}(G_l[O] - G_l[S])_{ij}^2
Lsl=2Nl21ij∑(Gl[O]−Gl[S])ij2
其中,G 代表 Gram 矩阵,F 代表 feature map,l 表示第 l 个卷积层,Nl 代表 l 层中有 Nl 个 feature map,Dl 表示 feature map 的尺寸。
最终我们会得到以下总的损失函数:
L
t
o
t
a
l
=
∑
l
=
1
L
α
l
L
c
l
+
Γ
∑
l
=
1
L
β
l
L
s
l
L_{total} = \sum^L_{l = 1}\alpha_lL^l_c + \Gamma\sum^L_{l=1}\beta_lL^l_s
Ltotal=l=1∑LαlLcl+Γl=1∑LβlLsl
其中,L 为总的卷积层个数,αl 和 βl为内容损失函数和风格损失函数中每一层的权重。为了求解这个优化问题,我们利用梯度下降法来进行数值迭代求解。
反卷积与反池化
反卷积
对于如下所示的卷积操作:
写成矩阵相乘的形式:
得到一个
4
×
1
4\times 1
4×1矩阵,可将其排列为
2
×
2
2 \times 2
2×2的矩阵。
反卷积的操作就相当于对上述
y
y
y左乘
c
T
c^T
cT,维度如下:
c
T
c^T
cT的维度是
16
×
4
16 \times 4
16×4,
y
y
y的维度是
4
×
1
4 \times 1
4×1,故
c
T
y
c^Ty
cTy的维度是
16
×
1
16 \times 1
16×1,可以将其reshape成
4
×
4
4 \times 4
4×4便变回了原来的维度。
反池化
池化操作中最常见的最大池化和平均池化,因此最常见的反池化操作有反最大池化和反平均池化,其示意图如下:
反最大池化需要记录池化时最大值的位置,反平均池化不需要此过程。
FCN
全卷积网络(Fully Convolutional Networks,FCN)是Jonathan Long等人于2015年在Fully Convolutional Networks for Semantic Segmentation一文中提出的用于图像语义分割的一种框架,是深度学习用于语义分割领域的开山之作。FCN将传统CNN后面的全连接层换成了卷积层,这样网络的输出将是热力图而非类别;同时,为解决卷积和池化导致图像尺寸的变小,使用上采样方式对图像尺寸进行恢复。
其核心思想有以下三点:
- 不含全连接层的全卷积网络,可适应任意尺寸输入;
- 反卷积层增大图像尺寸,输出精细结果;
- 结合不同深度层结果的跳级结果,确保鲁棒性和精确性。
FCN网络结构主要分为两个部分:全卷积部分和反卷积部分。其中全卷积部分为一些经典的CNN网络(如VGG,ResNet等),用于提取特征;反卷积部分则是通过上采样得到原尺寸的语义分割图像。FCN的输入可以为任意尺寸的彩色图像,输出与输入尺寸相同,通道数为n(目标类别数)+1(背景)。FCN网络结构如下:
FCN评价指标
Pixel Accuracy
∑ i n i i ∑ i t i \frac{\sum_in_{ii}}{\sum_it_{i}} ∑iti∑inii
mean Accuracy
1 n c l s × ∑ i n i i t i \frac{1}{n_{cls}} \times \sum_i\frac{n_{ii}}{t_i} ncls1×i∑tinii
mean IoU
1
n
c
l
s
×
∑
i
n
i
i
t
i
+
∑
j
n
j
i
−
n
i
i
\frac{1}{n_{cls}} \times \sum_i\frac{n_{ii}}{t_i + \sum_jn_{ji} - n_{ii}}
ncls1×i∑ti+∑jnji−niinii
其中,
n
i
j
n_{ij}
nij表示类别
i
i
i被预测成类别的像素个数,
n
c
l
s
n_{cls}
ncls表示目标类别个数(包括背景),
t
i
=
∑
j
n
i
j
t_i = \sum_jn_{ij}
ti=∑jnij表示类别
i
i
i的总像素个数(真实标签)。