Keras實現:用部分卷積補全影象不規則缺損
實現: Keras" target="_blank" rel="nofollow,noindex">MathiasGruber/PConv-Keras
編譯:Bot
編者按:影象補全是一個熱門研究領域,今年4月,NVIDIA發表了一篇精彩的論文:
Image Inpainting for Irregul ar Holes Using Partial Convolutions。文章指出,以往影象補全技術都是用殘缺位置周邊的有效畫素統計資訊填充目標區域,這種做法雖然結果平滑,但存在效果不逼真、有偽像,且後期處理代價昂貴的缺點。因此他們用大量不規則掩膜影象訓練了一個深度神經網路,它能為影象生成合理掩膜,再結合僅以有效畫素為條件的部分卷積(Partial Convolutions),最終模型的影象補全效果遠超前人的成果。
而近日,有網友復現了這篇論文,並在GitHub上公開了他的Keras實現,感興趣的讀者前去一看: github.com/MathiasGruber/PConv-Keras

環境
- Python 3.6
- Keras 2.2.0
- Tensorflow 1.8
如何使用這個repo
repo中包含的 PConv2D
keras實現可以在 libs/pconv_layer.py
和 libs/pconv_model.py
中找到。除此之外,作者還提供了四個jupyter NoteBook,詳細介紹了實現網路時經歷的幾個步驟,即:
PConv2D PConv2D
實現細節
在設計影象補全演算法時,研究人員首先要考慮兩個因素:從哪裡找到可利用的資訊;怎麼評判整體補全效果。無論是天然破損的影象,還是被人為打上馬賽克的影象,這之中都涉及影象語義上的預測。
這篇論文發表之前,學界在影象補全上的最先進方法之一是利用剩餘影象的畫素統計資訊來填充殘缺部分,這利用了同一幅影象素間的連線性,但缺點是隻反映了統計上的聯絡,無法真正實現語義上的估計。後來也有人引入深度學習的方法,訓練了一個深度神經網路,以端到端的方式學習語義先驗和有意義的隱藏表示,但它仍侷限於初始值,而且使用的是固定的替換值,效果依然不佳。
NVIDIA在論文中提出了一種新技巧:新增部分卷積層(Partial Convolutional
Layer),並在這一層之後加上一個掩膜更新步驟。部分卷積層包含生成掩膜和重新歸一化,它類似影象語義分割任務中的 segmentation-aware convolutional (分段感知卷積),能在不改變輸入掩膜的情況下分割影象資訊。
簡而言之,給定給定一個二元掩膜,部分卷積層的卷積結果只取決於每一層的非殘缺區域。相比segmentation-aware convolutional,NVIDIA的創新之處是自動掩膜更新步驟,它可以消除部分卷積能夠在非掩膜值上操作的任何掩膜。
具體設計過程可以閱讀論文檢視,下面我們只總結一些細節。
生成掩膜
為了訓練能生成不規則掩模的深度神經網路,論文研究人員擷取視訊中的兩個連續幀,用遮擋/解除遮擋建立了大量不規則掩膜,雖然他們在論文中稱將公開這個資料集,但現在我們還找不到相關資源。
在這個Keras實現中,作者簡單建立了一個遮擋生成函式,用OpenCV繪製一些隨機的不規則形狀,以此作為掩膜資料,效果目前看來還不錯。
部分卷積層
這個實現中最關鍵的部分就是論文的重點“部分卷積層”。基本上,給定卷積filter W和相應的偏差b,部分卷積的形式是:

其中⊙表示點乘,即每個矩陣元素對應相乘,M是由0和1構成的二進位制掩碼。在每次完成部分卷積操作後,掩膜要進行一輪更新。這意味著如果卷積能夠在至少一個有效輸入上調節其輸出,則在該位置移除掩碼:

這樣做的結果是,在網路夠深的情況下,最終掩碼將全部為0(消失)。
UNet架構
下圖是論文中提供的PConv整體架構,它類似UNet,只不過其中所有正常的卷積層都被部分卷積層代替,使影象+掩膜無論何時都能一起通過網路


損失函式
論文涉及的損失非常多樣,簡而言之,它包括:
- 掩膜區(
)和非掩膜區(
)的每個畫素損失
- 基於ImageNet預訓練的VGG-16(pool1, pool2 and pool3 layers)的感知損失(
)
- VGG-16在預測影象(
)和計算影象(
)上的風格損失(以非殘缺區畫素為真實值)
- 殘缺區域每個畫素擴張的總變差損失(
),也就是1畫素擴張區域的平滑懲罰
以上損失的權重如下:

論文補全效果
下圖是論文中呈現的影象補全效果,其中第一列是輸入影象,第二列是GntIpt演算法的輸出,第三列是NVIDIA論文的結果,第四列是真實完整影象。可以發現,無論影象缺失區域有多不規則,PConv的補全效果在顏色、紋理、形狀上都更逼真,也更平滑流暢。

下面是官方製作的演示視訊:

小結
最後一點,也是最重要的一點,如果是在單個1080Ti上訓練模型,batch size為4,模型訓練總用時大約在10天左右,這是個符合論文結果的資料。所以如果有讀者想上手實踐,記得提前做好硬體和時間上的準備。