基于上下文运动网络的视频人像自动抠图
本论文主要提出了一个上下文运动网络(the context motion network)来利用语义信息,时间信息和运动信息。为了捕捉运动信息,本文使用光流(optical flow),并设计了一个上下文运动更新算子,来反复整合帧之间的特征。
简介
本算法的创新点:
- 利用光流的运动信息,将运动信息引入人像视频矩阵。
- 使用语义信息辅助自动估计人物肖像的前景概率α。
- 设计了一个上下文运动更新算子来融合上下文和时间信息,并经常性地更新连续帧中的特征
好处:
- 不需要用户额外传入背景信息与需要抠出的前景的区域,去辅助算法从视频中抠出人像。
- 前景和背景的运动通常是不同的。它将更容易找到前景和背景之间的边缘。如果前景在背景上移动,背景的某些部分将被覆盖或露出。我们可以构建一个更完整的背景来进行抠图处理。
本算法网络使用一连串的帧作为输入,并估算每一帧的前景概率α和前景。网络包含四个部分:特征提取网络、光流估计器、上下文运动更新运算器和上采样器。
首先提取每一帧的上下文特征并估计连续帧之间的光流。光流和上下文特征被送入上下文运动更新算子。为了获得运动特征,上下文运动更新算子利用光流对相邻帧的特征进行后退,并计算当前特征与后退特征之间的相关性。
我们的算子也直接对光流进行编码。采用ConvGRU来反复整合连续帧的特征。然后,我们将得到的特征反馈给升压器,以预测阿尔法图和前景。
网络采用以端到端方式进行训练的。
相关工作
抠图算法:
已知输入图像
I
I
I,背景图像
B
B
B,求图像
I
I
I的前景
F
F
F,以及前景概率
α
α
α。(前景与背景相对,指我们所需的人像及人所持的物体)
I
=
α
F
+
(
1
−
α
)
B
(
1
)
I = αF+(1-α)B \quad (1)
I=αF+(1−α)B(1)
所以视频中的每一帧
I
I
I 可以被看作是前景
F
F
F 和背景
B
B
B 通过
α
α
α 系数的线性组合,通过提取
α
α
α 和
F
F
F,我们可以将前景物体合成到新的背景中,达到背景替换的效果。
语义分割:
图像是由许多像素(Pixel)组成,而语义分割顾名思义就是将像素按照图像中表达语义含义的不同进行分组/分割(Grouping)
光流(Optical Flow):
光流的概念是指在连续的两帧图像中由于图像中的物体移动或者摄像头的移动导致的图像中目标像素的移动,由观察者和场景之间的相对运动引起的视觉场景中物体表面和边缘的明显运动模式。
光流是二维矢量场,一般指的是视频中的像素(一般是跟踪的像素)在连续帧上形成的运动轨迹。
光流法的工作原理基于如下假设:
- 场景的像素强度在相邻帧之间基本不变
- 相邻像素具有相似的运动
由此得出,光流法实际是通过检测图像像素点的强度随时间的变化,进而推断出物体移动速度及方向的方法。
方法
- 网络整体介绍:
将一连串的肖像画 ( I t ) t = 1 N {({I}_t)}^N_{t=1} (It)t=1N作为输入,旨在估计它们相应的阿尔法图 ( α t ) t = 1 N {({α}_t)}^N_{t=1} (αt)t=1N以及它们的前景 ( F t ) t = 1 N {({F}_t)}^N_{t=1} (Ft)t=1N,其中N表示帧的数量。
网络四个组成部分都是可分的,我们以端到端的方式训练网络。
首先给定一个输入帧
I
t
I_t
It,我们的网络首先从一个经过图像分类预训练的编码器中提取上下文特征
F
e
a
t
Fea_t
Feat。
然后通过估计从当前帧
I
t
I_t
It到前一帧
I
t
−
1
I_{t-1}
It−1的后向光流
f
t
→
t
−
1
f_{t→t-1}
ft→t−1来获取运动信息。
为了融合情境信息和运动信息,还需要使用一个上下文-运动更新算子,它整合了情境特征、光流以及前一帧的特征。
最后,我们将产生的特征
H
t
Ht
Ht放大,并预测阿尔法地图
α
t
α_t
αt和前景
F
t
F_t
Ft。
- 网络构成
-
特征提取网络
特征提取。我们使用卷积网络从输入图像中提取特征。特征编码器网络被应用于所有的输入帧。它将输入图像映射为较低分辨率的特征图,如下所示 F e a t = g e n c o d e r , ( 2 ) Fea_t =g_{encoder},(2) Feat=gencoder,(2)其中 g e n c o d e r g_{encoder} gencoder表示编码器网络。
采用修改后的ResNet50在ImageNet数据集上进行预训练。编码器以源帧的1/16分辨率输出特征,因为根据经验发现,大的接受域对语义信息至关重要。
除了上下文特征,还需要从编码器中提取了多尺度的中间特征来捕捉精细结构,使用3×3卷积层将这些中间特征图映射到32个通道。特征提取网络的权重对所有输入帧都是共享的。 -
光流估计器
计算当前帧 I t I_t It和前一帧 I t − 1 I_{t-1} It−1之间的光流,这表明这两帧之间的每像素运动。
使用PWC-Net作为我们网络中的一个子网络来估计光流。它以两个连续的视频帧为输入,输出后向光流,如下所示 f t → t − 1 = g f l o w , ( 3 ) f_{t→t-1} = g_{flow},(3) ft→t−1=gflow,(3)其中 g f l o w g_{flow} gflow表示光流网络, f t → t − 1 ∈ R H × W × 2 f_{t→t-1}∈R ^{H×W×2} ft→t−1∈RH×W×2表示后向光流。我们使用在Sintel数据集上预训练的权重来初始化光流网络,并且以端到端的方式训练整个网络。 -
上下文运动更新运算器
上下文-运动更新运算器融合了语义信息和时间信息,是递归的。前一帧的特征被利用到上下文运动更新算子中,以提供时间信息。
考虑到帧特征 F e a t − 1 Fea_{t-1} Feat−1以及后向光流 f t → t − 1 f_{t→t-1} ft→t−1,我们的目标是捕捉运动信息。受PWCNet设计的启发,我们通过 B t − 1 = g b a c k w a r p ( F e a t − 1 , f t → t − 1 ) , ( 4 ) B_{t-1}=g_{backwarp}(Fea_{t-1},f_{t→t-1}),(4) Bt−1=gbackwarp(Feat−1,ft→t−1),(4)将 F e a t − 1 Fea_{t-1} Feat−1的特征从上一帧倒退到当前帧,其中 g b a c k w a r p ( ⋅ ) g_{backwarp}(·) gbackwarp(⋅)表示倒退的算子, B t − 1 B_{t-1} Bt−1表示倒退的特征。我们计算当前特征 F e a t Fea_t Feat和后退特征 B t − 1 B_{t-1} Bt−1之间的相关性 C t = g c o r r ( [ F e a t , B t − 1 ] ) , ( 5 ) C_t = g_{corr}([Fea_t, B_{t-1}]), (5) Ct=gcorr([Feat,Bt−1]),(5) 其中[·]表示浓缩运算符,gcorr表示计算相关性的算子。此时网络采用了两个3×3卷积层,有32个通道。
同时网络还对光流进行编码,以直接从光流中获取运动信息。首先对光流的大小进行双线性降采样,以达到Feat的大小。光流被编码为 F l o t = g f l o w − e n c o d e ( f t → t − 1 ) , ( 6 ) Flo_t = g_{flow-encode}(f_{t→t-1}), (6) Flot=gflow−encode(ft→t−1),(6)其中 g f l o w − e n c o d e g_{flow-encode} gflow−encode表示光流编码的运算符。此时网络采用了两个7×7的卷积层,有32个通道。
我们将相关性 C t C_t Ct和光流特征 F l o t Flo_t Flot融合起来,得到运动特征 M t = g m o t i o n ( [ C t , F l o t ] ) , ( 7 ) M_t = g_{motion}([C_t, Flo_t]), (7) Mt=gmotion([Ct,Flot]),(7)其中 g f l o w − e n c o d e ( ⋅ ) g_{flow-encode}(·) gflow−encode(⋅)表示运动编码的运算符。此时网络采用了3×3卷积层,有 62个通道。
通过连接语义特征
F
e
a
t
Fea_t
Feat、运动特征
M
t
M_t
Mt以及光流
f
t
→
t
−
1
f_{t→t-1}
ft→t−1,我们的方法得到融合特征
F
u
s
t
Fus_t
Fust,
F
u
s
t
=
[
F
e
a
t
,
M
t
,
f
t
→
t
−
1
]
,
(
8
)
Fus_t=[Fea_t,M_t,f_{t→t-1}],(8)
Fust=[Feat,Mt,ft→t−1],(8)
网络采用了可分离的ConvGRU来利用前一帧的特征。它用可分离的卷积取代了GRU中的全连接层,可以表示为
z
t
=
g
z
(
[
H
t
−
1
,
F
u
s
t
]
)
,
(
9
)
z_t = g_z([H_{t-1}, Fus_t]), (9)
zt=gz([Ht−1,Fust]),(9)
r
t
=
g
r
(
[
H
t
−
1
,
F
u
s
t
]
)
,
(
10
)
r_t = g_r([H_{t-1}, Fus_t]),(10)
rt=gr([Ht−1,Fust]),(10)
∗
H
t
=
g
h
(
[
r
t
⋅
H
t
−
1
,
F
u
s
t
]
)
,
(
11
)
*H_t = g_h([r_t·H_{t-1}, Fus_t]),(11)
∗Ht=gh([rt⋅Ht−1,Fust]),(11)
H
t
=
(
1
−
z
t
)
⋅
H
t
−
1
+
z
t
⋅
∗
H
t
,
(
12
)
H_t = (1 - z_t)·H_{t-1} + z_t · *H_t, (12)
Ht=(1−zt)⋅Ht−1+zt⋅∗Ht,(12)
其中gz(·)、gr(·)和gh(·)表示门控激活单元。具体来说,gz(·)和gr(·)采用sigmoid(·)作为其激活函数,gh(·)采用tanh(·)。我们的网络采用了两个ConvGRU。在第一个ConvGRU中,gz(·)、gr(·)和gh(·)是一个1×5卷积层。而在第二个ConvGRU中,它们是5×1的卷积层。它可以增加感受野,同时保持较小的模型大小。
- 上采样器
如上图所示,网络包含两个解码器:一个用于α图,另一个用于前景。它们具有相同的网络结构。
我们首先对特征进行双线性上采样,采样系数为2,网络将上采样的特征与编码器的中间特征连接起来,通过两个具有32个通道的3×3卷积层将它们融合起来。然后重复这一过程,直到上采样特征的分辨率与输入帧相同。
α解码器的最后一层有两个卷积层,对第二个卷积层使用激活函数 s i g m o i d ( ) sigmoid() sigmoid()。前景解码器的最后一层也有两个卷积层,其中第二个卷积层直接输出没有激活函数的前景图像。
- 损失函数
对于输入视频的每一帧,计算α图和前景图像的损失。对于α图,我们使用标准 ρ 1 ρ_1 ρ1来衡量预测的α图 α t α_t αt和真实背景 α t ∗ α^{*}_t αt∗之间的差异,如下所示
继Context Matting之后,我们也采用了拉普拉斯损失来处理阿尔法地图。它不是直接测量图像的差异,而是测量两个拉普拉斯金字塔的差异,如下所示。
其中 L i ( ⋅ ) L^i(·) Li(⋅)表示拉普拉斯金字塔的第i层。对于前景图像,也采用标准 ρ 1 ρ_1 ρ1来衡量预测的前景图像 F t F_t Ft和 F t ∗ F^*_t Ft∗之间的差异。这里只计算前景是可见的情况下的损失。
其中 I ( ⋅ ) I(·) I(⋅)表示一个二元函数,如果条件为真,其值为1,否则为0。
我们得到的总损失为
其中N表示输入视频的长度。
(csdn发文又改版了,这么小的图片上水印去不掉就很难受,尽力了)