Image Matting傳統方法和深度學習方法回顧


  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問題核心是以下公式:

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

其中Ii{I_i}是原始圖像的像素,爲已知量;αi{\alpha _i}是透明度,Fi{F_i}是前景像素,Bi{B_i}是背景像素,這三個變量爲未知量。對於這個公式的理解,我們可以把原始圖像看做是前景和背景按照一定權重(αi{\alpha _i}透明度)疊加組成的。對於完全確定是前景的像素,αi=1{\alpha _i} = 1;對於完全確定是背景的像素,αi=0{\alpha _i} = 0;對於不確定是前景還是背景的像素,αi{\alpha _i}是介於0到1之間的浮點數。如下圖所示,Image Matting問題研究的是,如何通過II,推測出未知的三個變量α\alphaFFBB ,難度可想而知。
在這裏插入圖片描述
  在得到如上圖所示透明度圖片α\alpha後,結合原圖我們就可以簡單地進行更換背景,這在圖像和視頻處理中具有重要的使用價值,如下圖所示。
應用實例
  1996年Alvy Ray Smith等人的《Blue Screen Matting》[1]給出了Triangulation Matting的方法,整體思想是:既然Image Matting原問題那麼難,不如把條件放鬆,使得問題簡單一些,假設我知道了BBII,那麼有沒有可能得到α\alphaFF,於是作者提出針對同一張前景,切換背景,來應用最小二乘法,計算得到對應的透明度和前景。
  2004年Jian Sun等人的《Poisson matting》[2]開始在Image Matting課題上提出使用Trimap作爲輔助工具。Trimap分爲三種顏色,黑色代表完全背景(此處α\alpha爲0),白色代表完全前景(此處α\alpha爲1),灰色代表不確定區域(α\alpha爲0.5)。因爲前面提到過由於方程是病態的,所以要有約束條件纔有解,而Trimap就相當於約束條件,並且簡化計算。自此,Image Matting變爲下圖所示過程:
在這裏插入圖片描述

簡單圖像的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

  傳統方法部分,有比較典型的三種經典算法: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

在這裏插入圖片描述
  這個網絡基於典型的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=(αpiαgi)2+ε2        αpi,  αgi[0,  1]L_\alpha ^i = \sqrt {{{(\alpha _p^i - \alpha _g^i)}^2} + {\varepsilon ^2}} \;\;\;\;\alpha _p^i,\;\alpha _g^i \in [0,\;1]

  Compositional Loss,即Ground Truth 前景、背景和預測alpha matting組成的預測RGB圖片與Ground Truth RGB圖片之間的絕對差異。
Lci=(cpicgi)2+ε2        cpi,  cgi[0,  1]L_c^i = \sqrt {{{(c_p^i - c_g^i)}^2} + {\varepsilon ^2}} \;\;\;\;c_p^i,\;c_g^i \in [0,\;1]

而神經網絡訓練的Loss是由兩種Loss加權,在實驗中作者設置ωl=0.5{\omega _l} = 0.5,即兩種Loss的貢獻一樣。
Loverall=ωlLα+(1ωl)Lc{L_{overall}} = {\omega _l} \cdot {L_\alpha } + (1 - {\omega _l}) \cdot {L_c}

  最後附上作者的源碼,按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。
在這裏插入圖片描述

2. 自動生成Trimap

我們想到用顯著圖(saliency map)結合一些圖像處理方法來實現從原始圖片到trimap,再從trimap到圖。從而實現只需要給定一張原始圖片,就可以輸出摳完圖的結果。
算法流程:

  1. 利用目前比較先進的顯著物體檢測算法(salient object detection)[8]來得到顯著圖。
  2. 對顯著圖進行閾值分割,粗略地劃分前景區域和背景區域。
  3. 對得到的二值圖分別進行一次腐蝕和一次膨脹操作。
  4. 兩次操作的差記爲未知區域。
  5. 由前景區域、背景區域、未知區域生成trimap。
    在這裏插入圖片描述

實驗結果

在這裏插入圖片描述
在這裏插入圖片描述
  如上圖所示,相關方法在標準數據集上都做到了很不錯的matting效果,部分matting算法在一些細節部分存在丟失,但整體的效果都不錯。
  在對標準數據集的圖片進行測試後,我們採用自己找來的圖片來提取trimap後利用之前提到的五種方法進行摳圖,實驗效果如下圖所示,相關結果也比較優秀。
在這裏插入圖片描述
  最後是我們提出的利用顯著性檢測來實現對一些圖片生成trimap的結果展示,可以看出在一些顯著性比較明顯的圖片上,trimap生成也還不錯:
在這裏插入圖片描述

寫在最後

在這裏插入圖片描述
  說實話,對於多目標,自動生成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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章