matting系列论文笔记(一):Deep Image Matting

matting系列论文笔记(一):Deep Image Matting

刚刚入了Image Matting的坑,后续会更新系列相关的文章。这个坑目前还没有人满为患,好的文章没有很多,综述文章也没有囊括比较新的方法。

论文链接: 2017 Deep Image Matting
pytorch代码: https://github.com/foamliu/Deep-Image-Matting-PyTorch

前言

这篇论文是Adobe出的,17年的论文,虽然时间比较久,但是目前很多的matting方法用的还是这篇文章的思路。先通过语义分割网络生成二分类的前景背景图,处理成trimap或者直接生成trimap,将trimap与原RGB图合并成4通道输入进行图像的精细分割。

Abstract

文章认为在这之前的算法在前景、背景颜色相近和文理复杂时,表现不好的原因主要有两点:

  • 只使用了低级特征
  • 缺少高级的上下文特征

这篇文章基于深度学习提出,主要为了解决如上两个问题。网络主要分为两部分:

  • 一个encoder-decoder网络:将原图和trimap合并为一个4通道的图像作为输入,并且预测出图像的alpha matte
  • 一个小的卷积网络:进行alpha prediction的精修,得到更加精确的alpha值和更加尖锐的边缘。

此外这篇文章还建立了一个大样本的数据集。

一、Introduction

解决matting的方法近似解一个超定方程:

I i = α i F i + ( 1 − α i ) B i , α ∈ [ 0 , 1 ] I_i = \alpha_i F_i + (1-\alpha_i)B_i, \alpha \in [0,1] Ii=αiFi+(1αi)Bi,α[0,1]
I i , F i , B i , α i I_i,F_i, B_i,\alpha_i Ii,Fi,Bi,αi分别代表像素i的原图RGB值,前景,背景,前景的不透明度。
如上方公式所示,难点在于每个像素有三个已知量和7个未知量。
目前的方法都有各自的限制,传统的方法较多采用的是将前景和背景进行线性组合,通过采样前景和背景颜色或者传播 α \alpha α值的方法。这些方法依赖于明显区分的颜色、位置和低级特征,对于前景和背景颜色重叠的图像容易产生重影。同时,传统数据集通常比较小,生成 α \alpha α的ground-truth比较困难。
另一个较大的限制是,能用的数据集太小,容易过拟合,泛化能力差。
在这里插入图片描述

二、Related Work

详见paper原文,在此不再赘述。

三、新的matting数据集

原有的数据集太小,如alphamatting.com上的数据集只包含有27张训练图8张测试图。本文自行创建了一个新的大数据集。其方法大致为人工抠出较为准确的object,制作相应的trimap,然后将这些图和一些背景图合成,得到大量的训练数据。这些背景图主要来自MS COCO和Pascal VOC。这么做的主要原因还是trimap图的人工标注成本太高昂。这种方法在matting领域还在被广泛使用。

当然,这数据集还存在着一些问题,如前景,背景图片分辨率低,清晰度低,多目标等问题。
在这里插入图片描述

四、method

在这里插入图片描述

模型结构如上图所示,主要分为两部分。第一阶段为一个深度卷积encoder-decoder网络:将原图和trimap合并为一个4通道的图像作为输入,然后输出预测蒙版的loss+联合loss。第二阶段一个小型卷积网络:进行alpha prediction的精修,得到更加精确的alpha值和更加尖锐的边缘。

4.1 Matting encoder-decoder stage

**网络结构:**编码-解码这部分是一个典型的基础的分割网络,类似FCN网络的改版。目前已经有很多更加强大的encoder-decoder网络了,如DeepLab v3+等等。

本文为了减少参数、加快训练速度,对decoder网络进行了精简。encoder部分有14个卷积层和5个最大池化层,到了decoder部分只有6个卷积层和5个unpooling layers了

Losses: 本文使用了两个losses, alpha-prediction loss + compositional loss

alpha-prediction loss 指的是每个像素的ground truth 的Alpha值与预测Alpha值之间的绝对差,但是由于绝对差不可微分,采用相对近似值模拟,公式如下:
在这里插入图片描述

compositional loss 是ground truth RGB颜色和预测的RGB颜色之间的loss,c定义RGB通道,类似于前面的alpha-prediction loss,则compositional loss 计算公式为:
在这里插入图片描述

Implementation: 为了防止过拟合,采用了一些策略,基本是一些常用的:

  • randomly crop:没有中心点的随机裁剪超出边界等情况,本文没有讲。
  • resize:从原图中随机crop 320,480,640的训练patch,然后统一resize到320,作为网络输入(这里的操作必须对于你训练的那个样本的background,foreground,alpha同步操作)
  • flipping
  • random dilate:

这部分的操作比较简略,可以适当的采用一些更多的trick。Encoder 网络部分使用了VGG16。

PS: 本文采用了Xavier初始化,Xavier初始化主要适用于线性的激活函数,所以目前用的较多的是何凯明大佬的Kaiming Initialization,pytorch目前默认的初始化方法就是这个。

4.2 Matting refinement stage

跟之前的算法相比,效果已经比较不错了,但由于使用encoder-decoder结构的缘故,得到的结果常常过于平滑。因此,添加了第二阶段的网络,以获得更加精确的alpha matte和更锐利的边缘。

网络结构: 第二阶段网络的输入是image patch和第一阶段得到的对应的alpha预测的串联(一个4通道输入)。输出是对应的ground truth alpha matte。网络是全卷积网络,包含4个卷积层,前3个卷积层都跟着一个ReLU层。为了使得尖锐的边缘即准确轮廓产生,该阶段不再进行降采样过程。此外,在4通道输入数据进入网络前,还采用了一个“ skip-model ”使得其值变成0-1。第二阶段网络不会对alpha matte进行大规模更改,而只是细化和锐化alpha值,其效果如下图所示:

在这里插入图片描述

Implementation: 先仅仅更新第一部分的参数,等到其收敛时,固定参数。然后更新refinement部分。等到refinement part也收敛后,微调整个网络。第一、二阶段都使用了Adam,训练时使用了一个小学习率 1 0 − 5 10^-5 105

五、 实验结果

几个实验对照表:
在这里插入图片描述

在当时 Alpha Matting 比赛中前五名的比赛截图,文章的方法排名第一:
在这里插入图片描述
trimap对alpha预测的影响程度比对:
在这里插入图片描述

六、总结

为了将其推广到自然图像中,文章指出抠图算法除了使用颜色作为主要提示外,需要利用更多的结构和语义特征。这篇文章证明了神经网络能够捕获高级特征并用来改进matting效果。实验也证明了,这种方法的优越性,还能广泛应用到真实图像上。

在这之后利用神经网络来进行image matting的工作,很多都受到这篇文章的启发。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Deep Image Matting 是一种图像分割的技术,其目的是将前景对象从背景中分离出来并以 alpha 通道的形式输出。下面是 Deep Image Matting 的使用教程: 1. 下载模型:可以从代码仓库中下载训练好的 Deep Image Matting 模型,模型文件名为“model.pth”。 2. 准备图像和背景:准备需要进行分割的图像和对应的背景图像。 3. 安装依赖:在 Python 环境中安装 PyTorch 和依赖项,例如 NumPy、Pillow 和 matplotlib 等。 4. 运行代码:将图像和背景图像作为输入,运行分割代码。输出将是包含 alpha 通道的图像。 以下是一个示例代码,其中 image_path 和 background_path 分别为图像和背景图像的路径: ```python import torch import numpy as np from PIL import Image # 加载模型 model = torch.load("model.pth") # 加载图像和背景 image = Image.open(image_path) background = Image.open(background_path) # 将图像和背景转换为张量 image_tensor = torch.tensor(np.array(image)).permute(2, 0, 1).unsqueeze(0).float() / 255 background_tensor = torch.tensor(np.array(background)).permute(2, 0, 1).unsqueeze(0).float() / 255 # 运行模型 output_tensor = model(image_tensor, background_tensor) # 将结果转换为图像 output_array = (output_tensor.squeeze().detach().cpu().numpy() * 255).astype(np.uint8) output_image = Image.fromarray(output_array, mode="L") # 显示结果 output_image.show() ``` 注意,运行代码需要一定的硬件资源和时间,尤其是对于大尺寸的图像。另外,模型的预测精度也取决于训练数据的质量和多样性。因此,在使用 Deep Image Matting 进行实际应用时,需要对数据进行精细的处理和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烤粽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值