[Matting]论文阅读:Deep Image Matting 详细解读

写在前面
文章链接: link
github复现链接: link
随着深度学习的成熟与发展,抠图的方法从早些年间基于传播的方法和基于采样的方法到现在使用卷积神经网络来完成抠图的过程,中间伴随着众多挑战:

1.总所周知,深度学习出色的结果是通过大量的数据喂出来的,而在抠图任务上,我们需要的是高质量的抠图数据,而标注一张图片的所需成本又较高,除了一些大型的公司可以大投入去做这件事,我们这些学生党普通人只能望而却步。数据量少且质量不高成为一个亟待解决的问题。
2.针对于分割任务的网络已经层出不穷,但是由于抠图任务的特殊性(将图片分为前景和背景的线性组合),是介于分类和分割之间的。如何将一些在分类和分割任务上表现出色的骨干网络用于抠图任务是我们要重点去研究的。

我本人在开题开抠图方向之前是做超像素与图像传统分割的研究的,而分割任务和抠图任务的相似性使我产生了浓厚的兴趣,之前也读了一些传统的方向的抠图论文,会慢慢的总结并分享出来。

而《Deep Image Matting》也是较早的一批使用深度学习方法做抠图的,但是这篇文章只是针对于边缘的未知区域进行的抠图,也就是说前提是你要大概的知道前景和背景的区域。搁别人说就是一篇朴实无华得文章,但是基本上后边得人用深度学习得 方法做matting也是都会参考一下这篇文章。

最近也在边看边学习,写下这篇博客,当成自己学习笔记和大家分享,如有错误,请大家不要吝惜,敬请指教。早之前在讨论班讲得这篇博客,现在写在博客上,和大家分享,共同进步,一起成长。

一 、摘要

任务

抠图任务
针对于matting任务来说,只是在图像合成过程中一个小的环节。只是为了提取出ALPHA matte遮罩图,这个就相当于一个指导书,分别从两个对象(FG,BG)中拿到相应得部分,然后去根据下述抠像方程得公式去合成一幅图像。
抠像方程
大家可以去细细的理解这个任务。

针对于之前的传统方法的缺点:
在面对前景和背景颜色接近或者纹理特征较复杂的时候,表现不好。1.只使用了低级的手工特征,2.缺少高级的上下文特征。

为了解决以上缺点,本文提出了两部分网络及一个还可以的数据集:
·编码器-解码器结构,将原图和trimap图作为四通道作为输入提取高级特征,并结合上下文特征预测输出图像的alpha
·在编码器-解码器网络之后,增加了一个小的卷积网络,对 预测得到的alpha进行处理,为了得到一个边缘更加尖锐的边缘。

还有更为重要的数据问题,这个就非常牛逼了。做了使用自己的标注的493张数据和 voc poc数据进行融合,得到了49300张新的数据。在一定程度上解决了数据量和质量不足的问题。

二、方法

在这里插入图片描述
模型结构:由两部分组成,第一部分完成对alpha的预测;第二部分对预测的alpha调整使其的边缘更加锐利。

2.1 第一部分(Matting encoder-decoder stage)

编码器-解码器

输入: 合成的图像(Image)和三分图(Trimap)
看过DIM数据集合成的图片的就知道,那合成的图片不能说和自然图片一摸一样,可以说是基本没啥联系,人加人,物加人,显著性的目标上再叠加一个显著性的目标,基本与自然图像毫无关系。但是这都没关系,为什么?正式因为三分图的加入,因为matting任务的特殊性,只针对与边界的混合像素进行操作,这就可以理解了三分图的重要性,就是标明确定的前景和背景区域,只留下边界中未知的像素点给网络处理。

编码器层: 使用vgg16进行权重初始化
VGG16是比较老的分类网络,分类比较老的网络用来提取语义特征,是因为matting 再概括上还是一个分类的任务,所以我认为啊,使用分类的网络提取特征的效果比较好。
除了最后的全连接层不适用,其他全部使用VGG的结构。并且使用再预训练的权重初始化编码器啊层的参数权重。

解码器层:
为了降低网络的总体参数量,在解码器的时候只使用了6个decode层。即可达到效果。

LOSS:
混合损失
第一个用来判断逐像素点的alpha值的损失,第二个用来判断融合图像后的一个效果。
都用来约束ALPHA生成的质量。

2.2 第二部分(Matting refinement stage)

融合网络
在使用编码器和解码器之后进行预测中,得到的预测的图明显的可以看出对边界的感知能力较低。得到的ALPHA MATTE比较光滑,并且产生了明显的光晕。如下图所示,stage1是只经过编码器和解码器的预测图,stage1-2是进行过增强网络部分的图。
在这里插入图片描述
我们从视觉上也能看出一些差异,实际上就是处理并部分消除了光晕部分,使得最后的结果更加的锐化。
在网络中未显示的部分是此部分网络的输入是从原图进行了一次卷积而提取的低级特征,然后并上编码器和解码器网络预测的特征共同输入进网络中的。就是将原图的低级边界纹理特征进行一个重新的重视。

此部分,引起了大连理工的大佬的研究,就是如何去融合一个低级特征和一个高级的语义特征,从而完成一个端到端的抠图过程。这篇文章最近刚看完,下次分享。

2.3 数据部分(Composed Datasets)

在这里插入图片描述

三、实验结果

3.1 训练过程

如下图是是在训练过程中的一些细节,我进行了一个总结
在这里插入图片描述

3.2 实验结果

在这里插入图片描述

与其他方法的比较。
在这里插入图片描述
复现的结果与论文的比较。
在这里插入图片描述

四、结束语

就是一篇用CNN用在MATTING任务的论文,但是这篇文章启发了很多人去做一些改进的点儿或者在此基础上做出自己的创新。

本人创建的一个qq群:261457538。供大家讨论 Deep learning on matting。
奥利给,如要转载,请先告知。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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 进行实际应用时,需要对数据进行精细的处理和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值