一文掌握智能抠图DeepImageMatting(pytorch实现)
⼀⽂掌握智能抠图DeepImageMatting(pytorch实现)
⽬录
⼀. 抠图概述
语义分割模型能够从复杂的背景中准确的分割出前景边界,但是在提取边界细节信息时效果并不是很理想。本⽂将详细阐述如何利⽤深度学习来构造⼀个精抠模型,使得最终的图像边界更加⾃然。本⽂实现时主要参考阿⾥巴巴推出的SHM算法中的MNet模块。
1. 抠图
语义分割是端到端的对像素按照语义进⾏多分类,⽽抠图则更进⼀步,抠图将图⽚分成前景和背景两部分然后提取前景部分。在抠图中会有⼀个alpha通道的概念,可以理解为透明度,⼤部分抠图模型将抠图建模为下⾯的⼀个公式:
其中即为  为观测图像,为前景,为背景。即为alpha,透明度的意思。要理解抠图,必须先理解上述这个看似简单的公式,按照公式理解:观测图像等价于前景和背景的线性混合,各部分的混合度由控制。如果读者有PhotoShop的操作经验,那么完全可以将和理解为PhotoShop中的图层, 是两个图层的叠加。抠图的最终⽬标其实是为了得到,⽽这个并不是⼀个简单的0、1⼆值分类或者是简单的多分类,在
实际操作中也看作⼀个通道(alpha通道),它的取值范围和RGB颜⾊空间⼀样是[0,255]的整数。从这个⾓度来理解,如果语义分割任务中只定义两个语义(前景和背景),那么语义分割的每个像素它的预测范围是0或1,即⼆值分类。⽽抠图的话,每个像素的预测范围是0到255的整数,其精度要求更⾼。因此,抠图可以看作是⾼版本的语义分割任务,其难度更⼤。
下⾯举⼀个例⼦来观察语义分割和抠图的不同:
图1.1 原始⽰例图
假设在暗室摄影棚中拍摄了⼀张器⽫图,如上图所⽰。很明显,这个器⽫具有明显的透明属性。由于背景⼏乎纯⿊,我们可以采⽤语义分割技术直接将器⽫分割出来,如下图所⽰:
图1.2 语义分割掩码(mask)图
很明显,语义分割将整个器⽫前景按照⾮0即255的⽅式(⼆值⽅式)分割了出来,分割出来的前景如下:
世界钢笔排名
图1.3 语义分割前景图
由于在边界处直接硬分割,因此,器⽫内部透明部分带着原始的灰⾊背景。此时,如果我们继续将该图与其它图像进⾏合成,那么会合成出下⾯的图像:
图1.4 语义分割合成图
可以看到,带着“灰⾊底纹”的器⽫合成到新图上后具有明显的缺陷,主观感受较差。
下⾯再看⼀下抠图的效果,抠图后我们会得到⼀张代表图像前景透明度的alpha图,如下所⽰:
图1.5 抠图得到的alpha通道图
可以看到,相⽐图1.4得到的⼆值掩码图,利⽤抠图技术得到的alpha通道图其取值范围更⼤。根据抠图合成公式,与新图进⾏合成可以得到下⾯的图像:
图1.6 抠图合成⽰例
此时新的合成图像其透明区域⾃带了⼀部分原始图像背景,其合成效果更加⾃然。以上就是语义分割和抠图的不同之处。
对于抠图任务来说,我们最需要的就是通过算法来计算其alpha通道图。
2. 语义分割和抠图的协同处理
前⾯的内容简单总结⼀下,语义分割采⽤的是在前景图像边界处硬分割的⽅式(0或255),抠图采⽤的是在前景图像边界处软分割的⽅式(0到255)。那么在实际的处理过程中语义分割和抠图是完全没有联系的吗?其实不是。在解释这个问题前需要先理解⼀个抠图领域经常使⽤的概念:Trimap。
由于抠图难度⾮常⼤,所以很多研究学者通过某些⽅式来获取⼀些先验值从⽽能够⽅便的获取alpha通道图。Trimap就是⼀种先验图的表⽰⽅式。在Trimap图中,可以完全肯定是前景区域的那么⽤纯255的⽩⾊标注,可以完全肯定是背景区域的那么⽤值为0的⿊⾊标注。对于边界不确定部分,⽤值为128的灰⾊标注。例如图1.1,它的⼀种Trimap图如下所⽰:
图1.7 Trimap图⽰例
也就是说,Trimap图的作⽤是告诉后⾯的抠图算法,已经预先知道了哪些地⽅是前景,哪些地⽅是背景,⽽且这些区域基本上“板上钉钉”了,基本不需要再靠抠图算法去辨识了。抠图算法需要做的就是对那些不确定区域(灰⾊区域)进⾏精细的抠图即可。在这种情况下,抠图算法可以根据提前知道的前景和背景区域去探知区分前景和背景的特征,然后通过这种先验知识,再对灰⾊区域进⾏精细抠图。你好六月
Trimap的存在是为了简化整体的抠图难度,这也是⽬前⼤部分抠图算法采⽤的策略,例如典型的Closed-form抠图和KNN抠图算法,它们都需要提前提供⼀张⽤于辅助的Trimap图⽤来完成整个的抠
图任务。也就是说抠图⼀般分为两个步骤:粗分割和细分割。粗分割是为了得到Trimap图,细分割是为了进⼀步细化抠图结果。
到这⾥再重新审视下Trimap,可以发现,如果将前景看作⼀种语义,背景看作⼀种语义,不确定区域(灰度区域)看作⼀种语义,那么Trimap每个像素只属于三种语义信息,这跟语义分割的内容完全⼀致,因此,完全可以采⽤语义分割的⽅法来得到Trimap图,然后再进⾏精细化抠图。
史上最贱的小游戏
图1.9 完整的抠图流程
对于⼀般应⽤场景来说,使⽤语义分割就可以满⾜精度要求了,但是对于⼀些图像编辑、摄影剪辑、后期合成等任务,那么就需要⾼精度的抠图算法来实现了。
风筝节本⽂拟解决肖像照抠图合成任务,主要⽤来复现论⽂(SHM)中的MNet模块,该算法由阿⾥巴巴团队提出,是⼀种基于深度学习的⼈像抠图技术。SHM是第⼀种全⾃动抠图算法,可以学习将语义信息和⾼质量细节与深层⽹络联合起来,实现端到端训练。整个算法不需要⽤户提供任何交互式输⼊,可以直接对原图进⾏⼈像⾼精度(发丝级别)提取。SHM核⼼算法采⽤了两个模型:TNet和MNet。其中,TNet 就是⼀个PSPNet语义分割模型⽤来⽣成⼈像Trimap,⽽MNet则借鉴了 (DIM)的思路采⽤了编解码结构⽹络进⾏精细抠图。该论⽂详细讲解了整个训练的实现细节,整体来说,SHM算法更加的⼯程化,综合性更强。因此,如果能够完成SHM的论⽂复现,那么相信读者在语义分割和抠图领域能够有更加深⼊的认识。
下⾯将以MNet模型为主线详细讲解实际的抠图处理流程。
⼆.  MNet算法和Pytorch实现
1. MNet算法原理
MNet算法主要参考DIM,其实现⽅式与DIM基本相同,都采⽤编解码结构进⾏精细抠图。不同之处在于DIM算法的输⼊是原图
开学第一课观后感四年级+Trimap图,⽽MNet算法的输⼊是原图+前景掩码+背景掩码+不确定区域掩码,本质上是⼀样的,因
为Trimap就是由前景掩码、背景掩码、不确定区域掩码结合⽽成。另⼀个不同之处在于DIM算法在编解码结构后⾯还增加了⼏个卷积层⽤于调整,⽽MNet算法则摒弃了最后⼏个卷积层。
MNet模型结构如下图所⽰:
上图中TNet⽹络就是⼀个语义分割⽹络,⽤于进⾏图像的Trimap⽣成,这⾥⽣成的是背景、前景、不确定区域的掩码。可以看到,MNet 将背景、前景、不确定区域三部分(3通道数据)和原图的R通道、G通道、B通道共组成6通道数据作为输⼊,然后通过⼀个编解码结构的⽹络来获取精细的alpha。
从实现效果上来总结⼀下,TNet⽹络得到的结果是个精准的粗预判结果,“准⽽粗”。MNet得到的结果是个精细的结果,但是不准,即“不准但细”。很⾃然的,将两者进⾏结合就可以得到⼀个“准⽽细”的抠图结果。整个⽹络设计最精彩的部分就是将两个模型连接在⼀起,可以形成⼀个端到端的模型,TNet和MNet⽹络可以在整体的⼀个训练过程中优势互补,真正的实现1+1>2。当然在实际实现的过程中,为了避免训练不收敛,可以分别对TNet和MNet模型进⾏预训练,然后再进⾏端到端的整体训练。
最后再详解⼀下编解码模型的概念。
分割任务中的编码器encode与解码器decode就像是玩“你来⽐划我来猜”的双⽅:⽐划的⼈想把看到的东西⽤⼀种⽅式描述出来,猜的⼈根据⽐划的⼈提供的信息猜出答案。其中,“⽐划的⼈”叫做编码器,“猜的⼈”就是解码器。具体来说,编码器的任务是在给定输⼊图像后,通过神经⽹络学习得到输⼊图像的特征图;⽽解码器则在编码器提供特征图后,逐步实现每个像素的类别标注,也就是分割。通常,分割任务中的编码器结构⽐较类似,⼤多来源于⽤于分类任务的⽹络结构,⽐如VGG。这样做有⼀个好处,就是可以借⽤在⼤数据库下训练得到的分类⽹络的权重参数,通过迁移学习实现更好的效果。因此,解码器的不同在很⼤程度上决定了⼀个基于编解码结构的分割⽹络的效果。
在图像分割领域,编解码⽹络结构的典型代表就是UNet⽹络,相⽐其它语义分割模型,使⽤UNet往往可以得到更加清晰的分割边界。如果进⼀步加强⽹络的编解码性能,那么⾃然的,可以精确提取出发丝级别的alpha抠图通道特征。值得⼀说的是MNet的前⾝即DIM算法在 alphamatting抠图挑战赛中获得第⼀名,性能超过了⼀众传统的KNN等抠图算法,这⾜以证明编解码⽹络模型的威⼒。
2. 环境配置
3.  数据集
相⽐语义分割数据集来说,⽤于抠图的训练数据往往难以获得,因为其抠图精度⾮常⾼,需要⼿⼯PS逐张精细的操作和挑选。既然如此,那么怎么获得数量众多的⾼精度抠图数据集⽤于模型训练呢?DIM算法的作者提出了⼀种⾮常实⽤的⽅法:⼈⼯合成。⾸先⼿⼯标注少量部分样本,得到每个样本的alpha通道图,然后根据每个样本的alpha通道图将前景抠出然后再和其它背景图像合成,由于每张前景图可以和多张背景图合成(DIM算法中每张前景与100张背景合成)从⽽可以⼤幅扩充数据集,并且每张训练图像都有现成的⾼精度alpha通道图。
这⾥会存在⼀个问题,这种⼈⼯合成的⾮⾃然产⽣的图像是否能够真实的提⾼模型的抠图精度呢?DIM算法已经为我们证明了这⼀点。从模型本⾝⾓度来分析,MNet算法更多的是将注意⼒关注于图像的局部,⽽不是图像的全局语义部分,因此,尽管新合成的图像很多在语义上存在明显的不合理(例如⼈不⼤可能出现在⽔⾯上等),但是,在局部细节上却可以教会模型如何精细的抠出局部细节。
本⽂使⽤DIM提供的数据集来预训练MNet⽹络。该数据集包含431张前景和对应的alpha图,每张alpha图均为⼈⼯PS精细抠图的结果,精度⾮常⾼。部分样例如下图所⽰:
中国美女最多的城市
可以看到DIM数据集的标注精度⾮常⾼,不管是发丝还是透明物体均具有⾮常⾼的抠图精度。
在实现时⾸先将DIM数据集在COCO2014上进⾏合成,每张图像与coco的100张背景图像进⾏合成,从⽽⽣成  431x 100=43100张训练图像,部分合成样例如下图所⽰:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。