Image Matting传统方法和深度学习方法回顾

Image Matting课题回顾

  • Introduction
  • 简单图像的Image Matting--证件照换背景
  • 复杂图像的Image Matting
    • 1. Deep Image Matting
    • 2. AlphaGAN Matting
  • 结合显著性检测自动生成Trimap
    • 1. 手动标注生成Trimap
    • 2. 自动生成Trimap
  • 实验结果
  • 写在最后

  Image Matting是一个基本的计算机视觉问题,有着广泛的应用。这个是之前的一次大作业选题,一直忘记整理了。这篇博客主要从最简单的 证件照换背景入手,以此为切入点,开始探究复杂图片的Image Matting课题上经典的传统方法和近年来兴起的深度学习方法。在传统方法部分,有比较典型的三种经典算法: Bayesian Matting、Closed Form Mating、KNN Matting。而在深度学习方面的 Deep Image Matting、AlphaGAN Matting。最后,经过对现有方法的对比总结,发现现有的方法有一个很大的问题是需要手工标记的Trimap才能进行Image Matting,因此尝试结合 显著图实现不需要人为标注Trimap,来进行抠图。

Introduction

  图像和视频中的前景准确估计问题,在实际应用中具有十分重要的意义。它是图像编辑和电影制作中的一项关键技术。1996年Alvy Ray Smith等人的《Blue Screen Matting》[1],正式定义了Image Matting问题,即Image Matting问题核心是以下公式:

I i = α i F i + ( 1 − α i ) B i {I_i} = {\alpha _i}{F_i} + (1 - {\alpha _i}){B_i} Ii=αiFi+(1αi)Bi

其中 I i {I_i} Ii是原始图像的像素,为已知量; α i {\alpha _i} αi是透明度, F i {F_i} Fi是前景像素, B i {B_i} Bi是背景像素,这三个变量为未知量。对于这个公式的理解,我们可以把原始图像看做是前景和背景按照一定权重( α i {\alpha _i} αi透明度)叠加组成的。对于完全确定是前景的像素, α i = 1 {\alpha _i} = 1 αi=1;对于完全确定是背景的像素, α i = 0 {\alpha _i} = 0 αi=0;对于不确定是前景还是背景的像素, α i {\alpha _i} αi是介于0到1之间的浮点数。如下图所示,Image Matting问题研究的是,如何通过 I I I,推测出未知的三个变量 α \alpha α F F F B B B ,难度可想而知。
Image Matting传统方法和深度学习方法回顾_第1张图片
  在得到如上图所示透明度图片 α \alpha α后,结合原图我们就可以简单地进行更换背景,这在图像和视频处理中具有重要的使用价值,如下图所示。
Image Matting传统方法和深度学习方法回顾_第2张图片
  1996年Alvy Ray Smith等人的《Blue Screen Matting》[1]给出了Triangulation Matting的方法,整体思想是:既然Image Matting原问题那么难,不如把条件放松,使得问题简单一些,假设我知道了 B B B I I I,那么有没有可能得到 α \alpha α F F F,于是作者提出针对同一张前景,切换背景,来应用最小二乘法,计算得到对应的透明度和前景。
  2004年Jian Sun等人的《Poisson matting》[2]开始在Image Matting课题上提出使用Trimap作为辅助工具。Trimap分为三种颜色,黑色代表完全背景(此处 α \alpha α为0),白色代表完全前景(此处 α \alpha α为1),灰色代表不确定区域( α \alpha α为0.5)。因为前面提到过由于方程是病态的,所以要有约束条件才有解,而Trimap就相当于约束条件,并且简化计算。自此,Image Matting变为下图所示过程:
Image Matting传统方法和深度学习方法回顾_第3张图片

简单图像的Image Matting–证件照换背景

  证件照换背景应该算是最简单的Image Matting,由于证件照背景属性的特殊性,这个抠图很容易可以实现。算法分为几个步骤:

1. 读入原始证件照图片
2. 转换到HSV色彩空间
3. 设置HSV空间的阈值获得图片背景的mask
4. 腐蚀膨胀去除干扰点
5. 遍历像素点替换背景颜色

这里代码很简单,python+opencv库:

import cv2
import numpy as np

img = cv2.imread('lqt.jpg')
# 缩放
img = cv2.resize(img, None, fx=0.5, fy=0.5)
rows, cols, channels = img.shape
cv2.imshow('img', img)

# 转换hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_blue = np.array([90, 70, 70])
upper_blue = np.array([124, 255, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask)

# 腐蚀膨胀
erode = cv2.erode(mask, None, iterations=1)
cv2.imshow('erode', erode)
dilate = cv2.dilate(erode, None, iterations=1)
cv2.imshow('dilate', dilate)

# 遍历替换,line27指定背景颜色
for i in range(rows):
    for j in range(cols):
        if dilate[i, j] == 255:
            img[i, j] = (0, 0, 255)
cv2.imshow('res', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

大致效果如下图所示,可以实现任意颜色纯色背景的替换。
Image Matting传统方法和深度学习方法回顾_第4张图片

复杂图像的Image Matting

  传统方法部分,有比较典型的三种经典算法:Bayesian Matting、Closed Form Mating、KNN Matting[3-5]。时间关系,我就不在这里写了 PS:公式太多,整理了word,再搬过来又要用LaTex再敲一遍 但是这些传统方法的思想还是很值得思考,有兴趣的可以研究一下,网上也有很多资料。
  近年来,随着深度学习技术的发展,使得Deep Learning在计算机视觉领域的应用变得越来越广泛。主要介绍2017年CVPR的Deep Image Matting[6]和AlphaGAN[7]。

1. Deep Image Matting

Image Matting传统方法和深度学习方法回顾_第5张图片
  这个网络基于典型的Encoder-Decoder结构,做深度学习的应该比较熟悉这种结构在图像分割和以图得图的GAN网络中最常见。Encoder用pre-trained的VGG16,把fc6从全连接换成了卷积,并在输入增加了第四通道channel4,用来存放输入的trimap,因为channel4而增加的weights全部初始化为0。Decoder用简单的unpooling(上池化)和convolution的组合来做upsampling(上采样)和空间结构推断。右边的refine network是为了解决第一阶段预测输出边缘blur的情况。
  值得一提的是这篇文章提出了两种Loss,这两种Loss分别是Alpha-prediction Loss和Compositional Loss。Alpha-prediction Loss即Ground Truth α \alpha α值和预测每个像素 α \alpha α值之间的绝对差异。

L α i = ( α p i − α g i ) 2 + ε 2          α p i ,    α g i ∈ [ 0 ,    1 ] L_\alpha ^i = \sqrt { { {(\alpha _p^i - \alpha _g^i)}^2} + {\varepsilon ^2}} \;\;\;\;\alpha _p^i,\;\alpha _g^i \in [0,\;1] Lαi=(αpiαgi)2+ε2 αpi,αgi[0,1]

  Compositional Loss,即Ground Truth 前景、背景和预测alpha matting组成的预测RGB图片与Ground Truth RGB图片之间的绝对差异。
L c i = ( c p i − c g i ) 2 + ε 2          c p i ,    c g i ∈ [ 0 ,    1 ] L_c^i = \sqrt { { {(c_p^i - c_g^i)}^2} + {\varepsilon ^2}} \;\;\;\;c_p^i,\;c_g^i \in [0,\;1] Lci=(cpicgi)2+ε2 cpi,cgi[0,1]

而神经网络训练的Loss是由两种Loss加权,在实验中作者设置 ω l = 0.5 {\omega _l} = 0.5 ωl=0.5,即两种Loss的贡献一样。
L o v e r a l l = ω l ⋅ L α + ( 1 − ω l ) ⋅ L c {L_{overall}} = {\omega _l} \cdot {L_\alpha } + (1 - {\omega _l}) \cdot {L_c} Loverall=ωlLα+(1ωl)Lc

  最后附上作者的 源码,按readme很容易跑起来。

2. AlphaGAN Matting

  基于前面Deep Image Matting的启发,我们知道Image Matting这个任务本质上是一个以图得图的任务,而处理这种任务最常见的就是图像分割和GAN(生成对抗网络)。这里我们选择探究GAN网络在Image Matting问题上的应用。
  生成对抗网络GAN由生成网络G(Generator)和判别网络D(Discriminator)组成。在训练过程中,生成网络G的目标是尽量生成真实的图片去欺骗判别网络D。而D的目标是尽量把G生成的图片和真实的图片区分开来。这样G和D构成了一个动态的“零和博弈”。GAN就是通过Generator和discriminator进行零和博弈,来不断生成,不断欺骗来获得更好的效果。
  2018年BMVC有一篇论文:AlphaGAN。这篇文章是基于之前的Deep Image Matting做的。AlphaGAN matting 很大程度上借鉴了Deep Image matting,源码在这。
  AlphaGAN matting 将Deep Image matting中的深度网络拿来作为了GAN的generator,改进只是只是把encoder中的VGG16换成了ResNet50,并把少部分卷积层替换,采用的损失函数和5.1中我们提到的loss一致。AlphaGAN matting 的discriminator采用PatchGAN,也是以图得图问题中比较先进且常用的discriminator。PatchGAN对图片中每个N×N的小块(Patch)计算概率,然后将这些概率求平均值作为整体的输出,这样做可以加快速度以及加快收敛。

结合显著性检测自动生成Trimap

  到目前为止,大家都能看出来Image Matting最大的弊端:给定一张图,需要一张手工标记的trimap才能开始Image Matting。下面我们讨论怎样让trimap的生成变得更加智能。

1. 手动标注生成Trimap

  前面提到的Image Matting方法都需要手工标注的Trimap才可以进行抠图。而这些trimap大多依赖手工标记生成,如利用Photoshop等,但这些专业的图像操作软件对于普通人利用起来并非易事。于是网上也有封装好的Robust Matting程序来协助我们手工标记来生成trimap。
Image Matting传统方法和深度学习方法回顾_第6张图片

2. 自动生成Trimap

我们想到用显著图(saliency map)结合一些图像处理方法来实现从原始图片到trimap,再从trimap到图。从而实现只需要给定一张原始图片,就可以输出抠完图的结果。
算法流程:

  1. 利用目前比较先进的显著物体检测算法(salient object detection)[8]来得到显著图。
  2. 对显著图进行阈值分割,粗略地划分前景区域和背景区域。
  3. 对得到的二值图分别进行一次腐蚀和一次膨胀操作。
  4. 两次操作的差记为未知区域。
  5. 由前景区域、背景区域、未知区域生成trimap。
    Image Matting传统方法和深度学习方法回顾_第7张图片

实验结果

Image Matting传统方法和深度学习方法回顾_第8张图片
Image Matting传统方法和深度学习方法回顾_第9张图片
  如上图所示,相关方法在标准数据集上都做到了很不错的matting效果,部分matting算法在一些细节部分存在丢失,但整体的效果都不错。
  在对标准数据集的图片进行测试后,我们采用自己找来的图片来提取trimap后利用之前提到的五种方法进行抠图,实验效果如下图所示,相关结果也比较优秀。
Image Matting传统方法和深度学习方法回顾_第10张图片
  最后是我们提出的利用显著性检测来实现对一些图片生成trimap的结果展示,可以看出在一些显著性比较明显的图片上,trimap生成也还不错:
Image Matting传统方法和深度学习方法回顾_第11张图片

写在最后

Image Matting传统方法和深度学习方法回顾_第12张图片
  说实话,对于多目标,自动生成trimap再抠图可能并不是那么明智的选择;而对于复杂场景,显著图效果会直接影响trimap的效果,比如上面两张图。我也尝试过用端到端的GAN来自动生成Trimap没怎么优化效果很差,期待后面能看到新奇的工作来让Image Matting更智能!

参考文献

[1]AR. Smith and JF. Blinn. “Blue screen matting.” Conference on Computer Graphics and Interactive Techniques, 1996.
[2]J. Sun, J. Jia, CK. Tang, and HY. Shum. “Poisson matting.” ACM Transactions on Graphics, 2004:315-321.
[3]Y.Y. Chuang, B. Curless, D. Salesin, R. Szeliski. “A Bayesian Approach to Digital Matting.” The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2001.
[4]A. Levin D. Lischinski and Y. Weiss. “A Closed Form Solution to Natural Image Matting.” The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2007.
[5]Q. Chen, D. Li, C.-K. Tang. “KNN Matting.” The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2012.
[6]Ning Xu, Brian Price, Scott Cohen and Thomas Huang. “Deep Image Matting.” The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017.
[7]S. Lutz, K. Amplianitis, and A. Smolic. “AlphaGAN: Generative Adversarial Networks for Natural Image Matting.” The British Machine Vision Conference (BMVC), 2018.
[8]Q. Hou, MM Cheng, X. Hu. “Deeply Supervised Salient Object Detection with Short Connections.” IEEE Transactions on Pattern Analysis and Machine Intelligence(TPAMI), 2018:1-1.

你可能感兴趣的:(计算机视觉,人工智能,计算机视觉,算法,python)