论文地址:https://arxiv.org/pdf/1703.03872.pdf
内容简介
- 这个网络是用来做抠图的(Matting),能够取得出色的效果,算是利用深度学习进行抠图的鼻祖
- 提出了Adobe Image Matting(AIM,有时也称DIM)数据集,解决了之前抠图数据稀缺的问题,后续很多工作也以此数据集为基础
网络结构
简单来说就是一个Encoder-Decoder + Refine的结构,其中:
在第一阶段,每次Encode下采样将特征图尺寸缩减为原来的1/2,共五次,最终将特征图缩小为1/32;然后再上采样回输入尺寸,获得一个粗分割结果。
而第二阶段的意义在于,由于Encoder最终会将特征图尺寸降到很小,不可避免地会丢失细节,最终Decode出来的图是比较“平滑(smooth)”的,并不精细。
这里的细化,说白了就是将原图和预测的alpha matte按通道连接,扔到一个很小(四层)的卷积网络中进行训练。这么做单纯意义就在于因为没有再下采样(基本什么都没有,只有卷积和relu),不会损失细节,便可能对输出结果进行简单的“打磨”,实现更精细的结果。毕竟一开始第一阶段的任务就相当于“用较复杂的结构打磨trimap”,那么这一阶段打磨一下alpha matte就不需要下采样上采样了。
Dataset
在这篇文章之前,能用的数据就基本只有alphamatting.com上的27张训练图像和8张测试图像(要获得高质量的标注实在麻烦)。这就导致一个问题,之前一些表现很好的方法,实际上可能已经都过拟合了…
但是要重新一个个抠又十分麻烦,因此这里采用了个神奇的方法:首先还是自己抠几个(共493个前景),然后从MS COCO和Pascal VOC里面随机抽100张图作为背景,把前景和背景进行合成,就有49300张训练图了。
这里有个问题就是网络有没有可能受到人工合成因素(比如噪声)的影响,不过在作者的实验中并没有发现问题。
数据集的使用是很有讲究的,由于是合成的,就不能把整张图像放进去训练(这样很容易导致模型直接对前景过拟合),因此网络的实际输入不是完整的合成图像,而是图像块(Image Patch)。对于图像块,其实就是在trimap的位置区域随机选取一点,以该点为基准裁切出一块320×320的区域(实际上文中还裁了480×480,640×640的区域,然后压回320×320,进一步避免裁到相似区域导致过拟合)。
Loss
用了两种loss:
- alpha-prediction loss: 其实就是预测alpha matte和gt alpha matte之间的逐像素差绝对值。不过因为绝对值本身是一次的不可导,因此这里先平方,加上一个小项
ϵ
\epsilon
ϵ,再开根号来进行近似
L α i = ( α p i − α g i ) 2 + ϵ 2 , α p i , α g i ∈ [ 0 , 1 ] \mathcal{L}_{\alpha}^{i}=\sqrt{\left(\alpha_{p}^{i}-\alpha_{g}^{i}\right)^{2}+\epsilon^{2}}, \quad \alpha_{p}^{i}, \alpha_{g}^{i} \in[0,1] Lαi=(αpi−αgi)2+ϵ2,αpi,αgi∈[0,1]
其中 α p i \alpha_{p}^{i} αpi为预测 α \alpha α值, α g i \alpha_{g}^{i} αgi为真实 α \alpha α值, ϵ = 1 0 − 6 \epsilon={10^{ - 6}} ϵ=10−6。 - compositional loss: 合成损失。也就是我们在抠出一个alpha matte后,就可以将相应前景与背景进行合成,得到一个新的图像,将这张图像与gt进行比较,计算逐像素RGB差绝对值。相应公式与上类似:
L c i = ( c p i − c g i ) 2 + ϵ 2 \mathcal{L}_{c}^{i}=\sqrt{\left(c_{p}^{i}-c_{g}^{i}\right)^{2}+\epsilon^{2}} Lci=(cpi−cgi)2+ϵ2
最终的loss就是这两个的加权:
L
overall
=
w
l
⋅
L
α
+
(
1
−
w
l
)
⋅
L
c
\mathcal{L}_{\text {overall }}=w_{l} \cdot \mathcal{L}_{\alpha}+\left(1-w_{l}\right) \cdot \mathcal{L}_{c}
Loverall =wl⋅Lα+(1−wl)⋅Lc
这儿比较有意思的是没有简单地将所有区域的
w
l
w_{l}
wl设置成0.5。对于位于trimap未知区域内的像素,将
w
l
w_{l}
wl设置成1,反之设置成0,本质上是种分类讨论。
Data Augmentation
常规的:
- ColorJitter:色彩抖动
- Flip:左右翻转(上下翻转应该就不用了)
自创的:
- 从trimap的未知区域中裁出320×320的块(毕竟只有未知区域是我们要处理的)
- 将图像随机裁切后resize为320×320
其他
- 用到的trimap是由gt alpha matte随机膨胀得到的
- encoder由VGG-16的前14层初始化