Matting(抠图)--用深度学习自动去除照片背景

转自:https://zhuanlan.zhihu.com/p/38031181算法

https://zhuanlan.zhihu.com/p/151212267浏览器

如今又有一个 AI 能干 Photoshop 的活了——自动抠图,一键去除照片背景。服务器

这款 AI 抠图产品已经成型,叫作 GreenScreen。网络

 

集智体验了一下,效果还不错。好比,咱们让 AI 为象征自由的男人——香蕉君抠个图吧。架构

熟悉的原图:机器学习

 

 

而后咱们把香蕉君的照片拖到网站上,让 AI 去除背景,说时迟那时快只听嗖的一声:ide

 

嗯效果还不错工具

 

 

可能有人会说香蕉君这张照片背景是纯黑色的,也太好抠了。行吧那咱们换个复杂点的,让 AI 把灭霸君从这张经典比心心图上抠下来:性能

 

 

一样,咱们把照片拖入网站,让 AI 去除背景,结果出来了:学习

 

 

除了旁边物体没有去完整外,总体效果仍是不错的吧?

 

并且抠好的图能够右键保存为 PNG 格式,随时都能使用。

 

若是你想体验一下,网站传送门:

https://greenscreen-ai.boorgle.com/

 

那么这款 AI 抠图大师是怎么炼成的?咱们来看看做者 Gidi Shperber 分享背后的故事。


过去几年,我(做者Gidi Shperber ——译者注)一直想完成一个真正的机器学习项目。

几个月前学习了深度学习的课程后,我看到了实现这个夙愿的机会:深度学习技术的迅速进步,能让咱们完成不少之前没法作到的事情。

 

本文就分享一下我是如何让深度学习完成以往咱们用修图软件所作的工做——移除照片背景。

 

总的来讲,若是使用一些工具好比 Photoshop、PowerPoint,移除照片背景不管是经过手工仍是半手工,仍是比较容易完成的工做。然而,据我所知,目前彻底自动实现照片背景移除,仍然是一项很是有难度的任务,虽然有很多这方面的尝试,但尚无一款产品能在背景移除任务中取得使人满意的效果。

 

咱们要移除什么背景?这就变成了一个很重要的问题,由于一个深度学习模型越具体(好比对物体、角度有详细的要求),图像分割的质量就越高。在刚开始这项任务时,我从宏观上下了个定义:一个通用的图像背景移除 AI,应该能自动识别出任何类型照片的前景和背景。

不过在训练完第一个模型后,我逐渐明白若是重点关注具体类型的照片,效果会更好。所以,我决定重点移除自拍照和人物肖像照片。

 

 

自拍照有一些比价显著的特色:首先前景比较突出和集中(一个或多个“人物”),这样能让咱们很好的将物体(脸部+上半身)和背景分割,并且能保持稳定和连贯的角度;其次须要处理的物体始终一致(人物)。

 

脑中作了这些假设后,我就开始了理论研究、代码实现以及数小时的训练过程,建立可以一键轻松实现照片背景移除的自动化服务。

 

咱们工做的主要部分就是训练模型,可是也不能低估部署模型的重要性。即使是表现良好的分割模型,也不如分类模型(好比 SqueezeNet)那样紧凑,所以主动检查了服务器部署和浏览器部署两种选项。

 

语义分割

在面对深度学习和计算机视觉任务时,显而易见,最适合解决图像背景移除问题的技术就是语义分割。

 

固然也存在其它的一些方法,好比用深度检测实现分割,但对于解决咱们这个问题来讲,好像不太成熟。

 

语义分割,连同分类和物体检测,是计算机视觉领域最有名的三大任务。分割实际上也是一种分类任务,也就是将全部像素进行归类。不想图像分类或图像检测,分割模型真的能让咱们看到它“理解”了图像,不只仅是说“这张图像中有只猫咪”,并且能在像素层面上指出猫咪在哪里、是什么猫咪。

 

那么分割的工做原理是什么?为了能帮你们更好的理解这一点,咱们先来看看该领域早期的一些成果。

 

最先的想法是利用某些早期分类神经网络,好比 VGG 和 AlexNet。在 2014 年时,VGG 是当时最早进的图像分类模型,在今天仍然很是使用,由于其架构简单直接。查看 VGG 靠前的层级时,你可能会注意到围绕须要分类的数据项有不少较高的激活,更深一些的层有更强的激活,但因为重复的池化操做这些激活的性质会变得粗糙。有了这点理解后,那么就能够假设分类训练模型在略做调整后,也能用于发现或分割物体。

 

语义分割的早期结果每每伴随着一些分类算法出现。下面是一些用 VGG 产生的较为粗糙分割结果:

 

 

靠后层级的结果:

 

 

双线性采样以后的结果:

 

 

这些结果仅来自于将全链接层转换为原始形状,但保留了空间特征,获得所有卷积的神经网络。在上面的例子中,咱们往 VGG 中输入一张 768*1024 的图像,获得一个 24*32*1000 的层。24*32 就是该图像的池化版本(池化了 32),1000 就是 ImageNet 的类别数量,从中能够导出分割结果。

 

为了能让预测更顺畅些,研究人员使用了一种简单的双线性上采样层。

 

在 FCN 论文中(https://arxiv.org/abs/1411.4038),研究人员优化了上面的理念。他们将一些层相连,从而获取了更多的特征解释,而且依据上采样率,将其命名为FCN-32,FCN-16和FCN-8:

 

 

在层之间添加一些跳转链接,能让预测从初始图像中编码出更精细的细节。进一步训练还能优化结果。

 

这项技术并不像以前想的那么糟糕,并且证实了深度学习在语义分割任务上有很大的应用潜力。

 

 

FCN 解释了分割的概念,研究人员也尝试了几种不一样的架构用于语义分割。主要理念仍是同样的:使用知名架构,上采样,网络层之间跳跃链接。这些技巧在现在的一些新的模型中仍然常见。

 

回到咱们的项目

在作了一些理论研究后,我确立了三种适用于此项任务的模型:FCN,Unet 和 Tiramisu,最后的 Tiramisu 模型采用了很是深的编码器-解码器架构。期间也考虑了 mask-RCNN,但实现它彷佛和咱们的任务内容相去甚远。

 

FCN 看似并不相关,由于它的结果并不理想,但另外两个模型的结果却不错:Unet 和 Tiramisu 不只结构紧凑,并且运行速度快。在模型实现方面,Unet 实现起来很是直接(我用的是 Keras),Tiramisu 也是易于实现。

 

接着用一些数据集开始训练这两种模型。我必须提一句,在首次尝试 Tiramisu 后,发现其结果对我有更大的使用潜力,由于它能捕捉图像中的锋利边缘。而 Unet 彷佛并不够好,结果要逊于 Tiramisu。

 

 

数据

在使用什么模型有了总体的方向后,接着就该搜罗合适的数据集了。用于分割任务的数据并不像用于分类或检测任务的数据那样常见。此外,手动为数据添加标签也不现实。最多见的用于分割任务的数据集是 COCO 数据集(包含 90 个类别下的 8 万张图像)、VOC 数据集(包含 20 类别的 1 万 1 千张图像)和最新的 ADE20K 数据集。

 

咱们选择 COCO 数据集(http://mscoco.org/),由于它里面包含的人物图像更多一些,更符合咱们的任务须要。

 

在考虑移除图像背景的任务时,我比较好奇是使用和任务用途很是相关的图像,仍是使用更通用的数据集。一方面,使用包含更多图像和类的更为通用的数据集,能让模型处理更多的场景和挑战。另外一方面,一个通宵咱们就能训练超过15张图像。若是咱们用整个COCO数据集训练模型,最终模型会查看每张图像两次(平均来看),所以略微削减一点对咱们更好一点。另外,这样也能生成更专一于咱们用途的模型。

 

另外一个值得提的事情是,最初用的 CamVid 数据集(http://mi.eng.cam.ac.uk/research/projects/VideoRec/CamVid/)训练的Tiramisu模型。该数据集虽然有些缺陷,但重要的是,它的图像比较一致:全部的图像都是从汽车上拍摄的道路照片。所以很容易理解,从这样的数据集中学习,对咱们的任务基本无用,所以短暂尝试后,决定改用COCO数据集。

 

CamVid数据集中的图像

 

COCO 数据集附有很是简单明了的 API,能让咱们确切地知道每张图像中包含什么物体。

 

通过一些试验后,我决定精简数据集:首先咱们过滤那些只有人物的图像,这样剩下了 4 万张图像。接着,丢弃全部包含不少人物的图像,这样剩下了只有 2 千张图像,比较契合咱们产品的目标。最后,咱们只留下 20%-70% 的图像区域被标记为人物的照片,将背景中人物太小或存在奇怪物体的图像。这样通过处理后,最终的数据集包含了 1 万 1 千张图像,我认为对于当前阶段来讲足够了。

 

左图:正常照片,中图:太多人物,右图:人物过小

 

Tiramisu 模型

 

如以前所说,咱们选用了 Tiramisu 模型。虽然它的全名“100 层 Tiramisu”暗示它是个巨大的模型,但实际上它很是简练,只有 9 百万个参数。做为对比,VGG16 模型的参数多达130万个。

 

Tiramisu 模型基于 DensNet 模型,它是个比较新颖的图像分类模型,全部的层内部链接。并且,和 Unet 同样,Tiramisu 模型为上采样层添加了跳跃链接。

 

若是仔细回想一下,这种架构比较符合 FCN 里体现的理念:使用分类架构,上采样,添加跳跃链接以获取更精细的细节。

Tiramisu模型的总体架构

 

DenseNet 模型能够看做 Resnet 模型的一个天然演变,但不是只“记住”每一个层与相邻层的链接,而是整个模型的全部层之间的链接。这些链接被称为“高速链接”。它会致使过滤器数量激增,这被称为“增加率”。Tiramisu 模型有16的增加率,所以咱们为每一层添加 16 个新的过滤器,直到最终达到某一层有 1072 个过滤器。你可能以为会有 1600 个层,毕竟被称为“100 层 Tiramisu”,但上采样层会丢掉一些过滤器。

 

DenseNet模型架构示意图

 

训练

咱们按照初始论文所描述的方式训练了模型:标准的交叉熵,学习率为 1e-3 的 RMSProp 优化器,较小的衰减值。我将包含 1 万 1 千张图像的数据集进行了分拆,70% 用于训练,20% 用于验证,10% 用于测试。下方全部图像都是取自咱们的测试集。

 

为了能让训练计划和初始论文一致,我将周期大小设置为 500 张图像。这样也能让咱们按期以不断优化的结果保存模型,由于咱们以更多的数据训练了模型。

 

此外,咱们只用两个类训练模型:背景和人物。咱们首先试着训练 COCO 数据集中的一些类,不过很快就发现这对咱们训练没多少帮助。

 

数据问题

 

数据集的一些缺陷也损害的模型的性能:

 

  • 动物——咱们的模型有时会分割动物,这固然会形成很低的IOU。在咱们任务中往主要类别增长动物进去或者是其它东西会形成结果变差。
  • 身体部位——因为咱们是用程序过滤数据集,就无法判断人物类其实是人仍是某些人体部位,好比手和脚。这些图像并不在咱们的目标范围内,但仍是处处出现。

 

动物,人体部位,手持物体

 

  • 手持物体——数据集中的不少图像都和运动相关,好比棒球帽、网球拍、滑雪板这些物件处处都有。对于怎么分割这些物体,模型有点混乱。和上面出现动物的状况同样,将它们归为主要类或单独的类,都有助于提升模型性能。

 

含运动设备的照片

 

  • 粗糙的真实数据——COCO数据集并不是按照逐个像素标记的,而是使用多边形标注。有时会很好,但有时数据就比较粗糙,会妨碍模型学习。

 

很是粗糙的照片

 

结果

最终结果虽称不上完美,但也算理想:测试集中的 IoU 为 84.6%,而目前最好的结果为 85%。获得这个数据也是很是坎坷的,由于在不一样的数据集和类中,它会不断变更。有些类比较容易分割,好比房子、道路,在这些类中,大部分模型都能达到 90% 的 IoU;而在另外一些比较麻烦的类中,好比树和人物,大部分模型只能达到 60% 的 IoU。为了估量这方面的难度,咱们帮模型专一于单一类别,以及有限类型的图像。

相关文章
相关标签/搜索