Image Matting: 图像抠图技术是指从静态图像或者视频序列中抽取感兴趣目标的过程,在ps和视频编辑中有重要的应用。
1.Image Matting
Matting 技术可以表示为下面的图,与语义分割不同,它可以针对感兴趣前景物体进行细节处理、包括细微的毛发和透明的物体等。
其公式可以表示为前景、掩膜与背景三者间的关系(如果 α p \alpha_p αp在0~1范围内,公式表示matting/composition问题,需要考虑透明度;如果 α p \alpha_p αp为二值化的0/1,则称为了分割问题。):
matting技术主要包括了交互式抠图、幕布抠图和基于学习的抠图(参考:What’s the Role of Image Matting in Image Segmentation?):
2.Deep Image Matting
而随着深度学习技术的发展研究人员也提出了基于深度学习方法解决图像抠图问题的方案,英伟达的Deep Image Matting就是其中的代表(下图中skip层没有画出来*):
研究人员利用低层级和高层级的信息,利用原图和trimap作为输入得到粗糙的alpha通道map,随后利用一个小的卷积来优化得到更精细的matting结果,同时得到mask的alpha损失。其中还用前景瑜背景进行合成与原图进行比较得到图像组合损失。损失函数的定义如下:
一个是预测蒙版alpha与基准的损失:
L α i = ( a p i − a g i ) + ϵ 2 L_\alpha^i = \sqrt{(a_p^i-a_g^i)+\epsilon^2} Lαi=(api−agi)+ϵ2
另一个是预测出matting 与基准前景、基准背景合成的图像与输入之间的损失:
L α i = ( c p i − c g i ) + ϵ 2 L_\alpha^i = \sqrt{(c_p^i-c_g^i)+\epsilon^2} Lαi=(cpi−cgi)+ϵ2
训练中的数据集来自于http://alphamatting.com/和研究人员自己提出的Composition-1k数据集。
这种方法的结果与其他相比如下:
2.2 代码实现
对于DeepImageMatting中,这里有一份基于Keras的实现:
首先构建了编码器和解码器架构,以及对应的优化模块。可以参照前文的图像理解,编解码部分各包含了五组操作模块。。
# copy from:https://github.com/foamliu/Deep-Image-Matting/blob/master/model.py
def build_encoder_decoder():
# Encoder
#--------------------编码器部分----------------------------##
# 根据架构图,编码与解码器各有五个操作组,编码器包括卷积和最大池化,解码器包括卷积和解卷积上采样
input_tensor = Input(shape=(320, 320, 4))
x = ZeroPadding2D((1, 1))(input_tensor)
x = Conv2D(64, (3, 3), activation='relu', name='conv1_1')(x)
x = ZeroPadding2D((1, 1))(x)
x = Conv2D(64, (3, 3), activation='relu', name='conv1_2')(x)
orig_1 = x # 用于做skip-layer
x = MaxPooling2D((2, 2), strides=(2, 2))(x)
# >>首先两层卷积加一个池化层
x = ZeroPadding2D((1, 1))(x)
x = Conv2D(128, (3, 3), activation='relu', name='conv2_1')(x)
x = ZeroPadding2D((1, 1))(x)
x = Conv2D(128, (3, 3), activation='relu', name