摘要:研究者首先在 Adobe Matting 數據集(只用不透明物體的圖像)上訓練了一個深度蒙版網絡。該網絡將帶有人物的圖像 I、純背景圖像 B』、人物 S、相鄰幀的時間堆棧 M(可選)的軟分割作爲輸入,輸出則是一個前景圖 F 和一個前景蒙版α。

參與:Racoon、張倩

轉自:機器之心

綠幕是影視劇中摳圖、換背景的利器,但如果不在綠幕前拍攝,我們還能完美地轉換背景嗎?華盛頓大學的研究者最近就上傳了這樣一份論文,不在綠幕前拍攝也能完美轉換視頻背景,讓整個世界都變成你的綠幕。

從作者給出的 demo 可以看到,他們的方法效果非常驚豔,即使視頻中的人瘋狂甩頭髮也沒有影響合成效果:

做各種動作也沒有「穿幫」:

即使人物和背景不好區分、手持鏡頭稍微晃動時摳圖效果也不賴:

目前,這篇論文已被 CVPR 2020 大會接收。

  • 論文鏈接: https://arxiv.org/pdf/2004.00626.pdf

  • GitHub鏈接: https://github.com/senguptaumd/Background-Matting

在論文中,研究者提出了一種創建蒙版(matting)的新方法。多數現有的蒙版方法都需要以綠幕爲背景,或者手工創建一個三元圖(trimap)。當然,也有些自動方法不需要三元圖,但效果會很差。本文提出的這個蒙版方法也不需要三元圖,但摳圖、換背景效果要更好。

當然,達到這麼好的效果是有條件的。除了原始圖像/視頻之外,研究者還要求拍攝者多拍一張不帶人物的背景圖。這一過程要比創建三元圖節省很多時間。研究者用對抗損失訓練了一個深度網絡,用來預測蒙版。他們首先利用帶有 ground truth 的合成數據訓練了一個具有監督損失的蒙版網絡。爲了在不加標記的情況下縮小合成圖像與真實圖像的差距,他們在第一個網絡的指導下訓練了另一個蒙版網絡,並通過一個判別器來判斷合成圖像的質量。研究者在諸多圖像和視頻上測試了他們提出的新方法,發現這一方法顯著優於之前的 SOTA。

在關於這一論文的討論中,我們可以看到很多潛在的應用場景,比如 vlog(雲旅遊)、視頻會議等。

對於廣大「菸酒僧」來說,如果導師下次再讓你發一段在實驗室工(摸)作(魚)的視頻,或許也能用得上呢。

方法

系統的輸入是一張圖像或一個視頻,圖像/視頻中的人站在靜態的自然背景前,此外還需輸入一張純背景圖。背景圖的獲取很簡單,只需要讓人物走出取景區域,然後操作曝光、焦距都已固定的相機進行拍攝(如智能手機相機)。對於手持相機,研究者假設相機的移動幅度很小,利用單應性(homography)將背景與給定的輸入圖像對齊。從輸入中,研究者還提取了目標人物的軟分割。對於視頻輸入,可以添加臨近的幀來輔助生成蒙版。

圖 2:方法概覽。

在 Adobe 數據集上進行監督訓練

研究者首先在 Adobe Matting 數據集(只用不透明物體的圖像)上訓練了一個深度蒙版網絡。該網絡將帶有人物的圖像 I、純背景圖像 B』、人物 S、相鄰幀的時間堆棧 M(可選)的軟分割作爲輸入,輸出則是一個前景圖 F 和一個前景蒙版α。爲了生成 S,研究者應用了人物分割、腐蝕(erode)、膨脹(dilate)以及高斯模糊。在處理視頻時,他們將 M 設爲 I 前後相連的兩幀。設兩幀間隔爲 T,則選取的相鄰幀爲 {I−2T , I−T , I+T , I+2T }。這些圖像被轉換爲灰度圖,以忽略顏色,更加專注於運動信息。如果輸入中沒有視頻,研究者就將 M 設定爲 {I, I, I, I},這些圖像也轉化爲灰度圖。將輸入集合表示爲 {I,B′,S,M},權重參數爲θ的網絡的運算可表示爲:

研究者提出了一個語境轉換塊(Context Switching block,CS block)網絡,以根據輸入圖像更有效地結合所有輸入信息的特徵(見上圖 2)。舉個例子,當人物的一部分背景相似時,網絡應該更加關注該區域的分割線索。該網絡有四個編碼器,分別產生 256 個通道的特徵圖,然後通過應用 1x1 卷積、BatchNorm 和 ReLU 將來自 I 的圖像特徵分別與 B '、S 和 M 的結合起來,爲這三對中的每一對生成 64 通道特徵。最後,他們通過 1x1 卷積、BatchNorm 和 ReLU 將這三組 64 通道特徵與最初的 256 通道特徵相結合,得到編碼後的特徵並將其傳給網絡的其他部分,包括殘差塊和解碼器。研究者觀察到,上述 CS 塊架構有助於網絡從 Adobe 數據集泛化到實際數據。

研究者在 Adobe 數據集上用監督損失訓練網絡 G_Adobe ≡ G(·; θ_Adobe):

其中,(F, α) = G(X; θ_Adobe),梯度項α 可以鼓勵模型生成更高銳度的圖像。

在無標記真實數據上進行對抗訓練

雖然研究者提出的 CS 塊在結合了數據增廣後,顯著縮短了真實圖像與使用 Adobe 數據集合成的圖像之間的差距。然而,該方法在處理真實圖像時仍然存在以下困難:

  • 在手指、手臂、頭髮附近的背景被複制到蒙版中;

  • 圖像分割失敗;

  • 前景重要部分的顏色與背景顏色相似;

  • 圖像與背景之間沒有對齊。

爲解決以上問題,研究者提出用一種自監督學習方法從未標註的真實數據中訓練模型。

該方法的主要思路是:蒙版估計中的主要誤差會導致在新背景下合成的圖片失真。例如,不好的蒙版可能會包含一些原圖像背景,當在與新背景合成時會將之前背景的一部分內容複製到新背景下。於是,研究者訓練了一個對抗判別器來區分合成圖像與真實圖像,以此提高蒙版網絡的性能。

研究者使用 LS-GAN 框架來訓練生成器 G_{Real} 與判別器 D,最小化以下目標函數來訓練生成器:

其中,(F, α) = G(X; θ_{Real}),\bar{B} 爲判別器用於生成合成圖像的給定背景。研究者將λ設置爲 0.05,並在訓練過程中每兩個 epoch 將其減少一半,以使判別器起到重要作用。研究者給 alpha 損失函數設置了較高的權重來鼓勵模型生成更高銳度的圖像。

研究者使用如下目標函數訓練判別器:

其中,θ_{Disc} 代表判別器網絡的權重,同時 (F, α) = G(X; θ_{Real})。

實驗結果

研究者將該方法與其他方法進行了比較,包括幾種在基準上表現良好的深度蒙版算法,比如 Bayesian Matting、Context-Aware Matting、Index Matting 和 Late Fusion Matting。

在 Adobe 數據集上的結果

研究者首先使用 2.69 萬個樣本來訓練 GAdobe,在 100 個隨機背景上合成 269 個目標,加上背景的擾動版本作爲網絡輸入,使用 Adam 優化器進行訓練,批處理大小爲 4,學習率爲 1e。

實驗比較了 Adobe Dataset 中 220 種合成素材的結果,如下圖所示:

表 1:Adobe Dataset 上的 Alpha 蒙版錯誤,數值越低代表性能越好。

真實數據上的結果

此外,研究者使用智能手機 iPhone 8 在室內和室外分別在手持和固定攝像機的情況下拍攝了視頻。

圖 3:(a-e)是自然背景下手持相機拍攝視頻所呈現的 alpha 通道和前景,(e)是一個動態背景下的失敗案例。

除此之外,研究者針對用戶羣體進行了調查,結果包括測試視頻的評分總和。分數證明本論文所提出的方法優於其他方法,尤其是在攝像機拍攝的場景下,但手持拍攝的視頻中,由於非平面背景導致的視差,還是會出現一些蒙版錯誤。

表 2:在 10 個真實世界視頻中的用戶研究結果(固定攝像機)。

表 3:在 10 個真實世界視頻上的用戶研究(手持相機)。

開源代碼使用簡介

環境配置

將項目克隆到本地:

git clone https://github.com/senguptaumd/Background-Matting.git

作者提供的代碼需要在 Python 3 環境下運行,並在 Pytorch=1.1.0,Tensorflow=1.14,cuda10.0 版本下測試通過。接下來我們創建 conda 虛擬環境並安裝依賴項:

conda create --name back-matting python=3.6

conda activate back-matting

確保 CUDA 10.0 爲默認的 cuda。如果電腦上 CUDA 10.0 安裝在/usr/local/cuda-10.0 目錄下,運行如下命令:

export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64

export PATH=$PATH:/usr/local/cuda-10.0/bin

安裝 PyTorch 和 Tensorflow 以及相關依賴項:

conda install pytorch=1.1.0 torchvision cudatoolkit=10.0 -c pytorch

pip install tensorflow-gpu=1.14.0

pip install -r requirements.txt

在樣本圖像上運行推斷程序

(1)準備數據

爲實現對人物摳圖的綠幕效果,我們需要以下數據:

  • 帶有人物的圖像(擴展名爲_img.png)

  • 沒有人物的背景圖像(擴展名爲_back.png)

  • 需要插入人物的目標背景圖像(存放在 data/background 文件夾下)

我們也可使用 sample_data/文件夾進行測試,並參考它準備自己的測試數據。

(2)預訓練模型

從作者提供的雲盤中下載預訓練模型,並將其放在 Models/目錄下。

  • Pre-processing

  • Segmentation

  • Background Matting needs a segmentation mask for the subject. We use tensorflow version of Deeplabv3+.

(3)預處理

作者使用 TensorFlow 版的 Deeplabv3+來生成用於人物摳圖的分割 mask:

cd Background-Matting/

git clone https://github.com/tensorflow/models.git

cd models/research/

export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slimcd ../..

python test_segmentation_deeplab.py -i sample_data/input

當然,我們也可以使用其他任何一種圖像分割網絡來替代 Deeplabv3+。將分割後的結果保存成擴展名爲_masksDL.png 的文件。

之後,我們需要對圖像進行對齊預處理,即將背景與輸入圖像進行對齊。需要注意的是,在拍攝圖像時我們需要關閉自動對焦與自動曝光功能。運行 python test_pre_process.py -i sample_data/input 即可對圖像進行預處理。它會自動地對齊背景圖片,並調節偏置與增益來匹配輸入圖像。

(4)人像摳圖

運行如下代碼即可實現背景替換。對於使用了三腳架來拍攝的圖片,選擇 -m real-fixed-cam  可得到最好的效果。選擇 -m syn-comp-adobe  會讓我們使用在 Adobe 合成數據集上訓練的模型,而不是真實的數據(效果最差)。

python test_background-matting_image.py -m real-hand-held -i sample_data/input/ -o sample_data/output/ -tb sample_data/background/0001.png

END

備註:分割

圖像分割交流羣

語義分割、實例分割、全景分割、摳圖等技術, 若已爲CV君其他賬號好友請直接私信。

我愛計算機視覺

微信號 : aicvml

QQ羣:805388940

微博/知乎:@我愛計算機視覺

投稿:[email protected]

網站:www.52cv.net

在看,讓更多人看到  

相關文章