论文解读--Automatic Portrait Segmentation for Image Stylization

本文探讨了一种名为PortraitFCN+的自动人像分割方法,基于FCN网络改进,通过六通道输入数据增强分割效果。论文指出,尽管现有CNN方法在人像分割上已取得70%左右的精度,但仍有提升空间。 PortraitFCN+通过添加位置和形状通道,利用面部特征检测器提高分割准确性。实验表明,这种方法在肖像数据集上表现良好,但仍存在背景和前景对比度低的挑战。未来工作将专注于提高模型准确性和扩展至视频分割。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值