Automatic Portrait Segmentation for Image Stylization
论文及数据下载地址:
http://xiaoyongshen.me/webpage_portrait/index.html
Github项目地址:
https://github.com/PetroWu/AutoPortraitMatting
开门见山,文章先给我们看了本文的PortraitFCN+方法的matting效果和几个应用场景
2.Related work不再赘述了,列出了一些基于CNN的分割方法,最好的精度大约是70%,尽管已经很出色但是对于人像的matting还差一些。
3. Our Motivation and Approach
为了大家理解,文章先介绍了在分割大有作为的FCN网络:FCN uses a spatial loss function and is formulated as a pixel regression problem against the ground-truth labeled mask. The objective function can be written as,
其中p是图像的像素索引。 Xθ( p)是参数θ下p位置像素的FCN回归函数。 损失函数e(…)测量回归输出和真值ℓ( p)之间的误差。 FCN通常由以下类型的层组成:
Convolution Layers 卷基层
ReLU Layers relu激活函数层
Pooling Layers pooling层(文章用的maxpooling)
Deconvolution Layers 反卷积层
Loss Layer 损失函数层
FCN: FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。
最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。
在这篇博客中看到一幅很棒的图:
https://blog.youkuaiyun.com/qq_36269513/article/details/80420363
下面结合本论文开源的Github项目代码,来简单的看一下FCN在本论文中如何被应用的:
代码文件:./AutoPortraitMatting/FCN_plus.py
"""
finetune on vgg-19
"""
def vgg_net(weights, image):
layers = (
'conv1_1', 'relu1_1', 'conv1_2', 'relu1_2', 'pool1',
'conv2_1', 'relu2_1', 'conv2_2', 'relu2_2', 'pool2',
'conv3_1', 'relu3_1', 'conv3_2', 'relu3_2', 'conv3_3',
'relu3_3', 'conv3_4', 'relu3_4', 'pool3',
'conv4_1', 'relu4_1', 'conv4_2', 'relu4_2', 'conv4_3',
'relu4_3', 'conv4_4', 'relu4_4', 'pool4',
'conv5_1', 'relu5_1', 'conv5_2', 'relu5_2', 'conv5_3',
'relu5_3', 'conv5_4', 'relu5_4'
)
net = {
}
current = image
for i, name in enumerate(layers):
if name in ['conv3_4', 'relu3_4', 'conv4_4', 'relu4_4', 'conv5_4', 'relu5_4']:
continue
kind = name[:4]
if kind == 'conv':
kernels, bias = weights[i][0][0][0][0]
# matconvnet: weights are [width, height, in_channels, out_channels]
# tensorflow: weights are [height, width, in_channels, out_channels]
kernels = utils.get_variable(np.transpose(kernels, (1, 0, 2, 3)), name=name + "_w")
bias = utils.get_variabl