圖像修復問題就是還原圖像中缺失的部分。基於圖像中已有信息,去還原圖像中的缺失部分。
從直觀上看,這個問題能否解決是看情況的,還原的關鍵在於剩餘信息的使用,剩餘信息中如果存在有缺失部分信息的patch,那麼剩下的問題就是從剩餘信息中判斷缺失部分與哪一部分相似。而這,就是現在比較流行的PatchMatch的基本思想。
CNN出現以來,有若干比較重要的進展:
- 被證明有能力在CNN的高層捕捉到圖像的抽象信息。
- Perceptual Loss的出現證明了一個訓練好的CNN網絡的feature map可以很好的作為圖像生成中的損失函數的輔助工具。
- GAN可以利用監督學習來強化生成網絡的效果。其效果的原因雖然還不具可解釋性,但是可以理解為可以以一種不直接的方式使生成網絡學習到規律。
基於上述三個進展,參考文獻[1]提出了一種基於CNN的圖像復原方法。
CNN網絡結構
該算法需要使用兩個網絡,一個是內容生成網絡,另一個是紋理生成網絡。內容生成網絡直接用於生成圖像,推斷缺失部分可能的內容。紋理生成網絡用於增強內容網絡的產出的紋理,具體則為將生成的補全圖像和原始無缺失圖像輸入進紋理生成網絡,在某一層feature_map上計算損失,記為Loss NN。
內容生成網絡需要使用自己的數據進行訓練,而紋理生成網絡則使用已經訓練好的VGG Net。這樣,生成圖像可以分為如下幾個步驟:
定義缺失了某個部分的圖像為x0
- x0輸入進內容生成網絡得到生成圖片x
- x作為最後生成圖像的初始值
- 保持紋理生成網絡的參數不變,使用Loss NN對x進行梯度下降,得到最後的結果。
關於內容生成網絡的訓練和Loss NN的定義,下面會一一解釋
內容生成網絡
生成網絡結構如上,其損失函數使用了L2損失和對抗損失的組合。所謂的對抗損失是來源於對抗神經網絡.
在該生成網絡中,為了是訓練穩定,做了兩個改變:
- 將所有的ReLU/leaky-ReLU都替換為ELU層
- 使用fully-connected layer替代chnnel-wise的全連接網絡。
紋理生成網絡
紋理生成網絡的Loss NN如下:
它分為三個部分,即Pixel-wise的歐式距離,基於已訓練好紋理網絡的feature layer的perceptual loss,和用於平滑的TV Loss。
α和β都是5e-6,
Pixel-wise的歐氏距離如下:
TV Loss如下:
Perceptual Loss的計算比較複雜,這裡利用了PatchMatch的信息,即為缺失部分找到最近似的Patch,為了達到這一點,將缺失部分分為很多個固定大小的patch作為query,也將已有的部分分為同樣固定大小的patch,生成dataset PATCHES,在匹配query和PATCHES中最近patch的時候,需要在紋理生成網絡中的某個layer的激活值上計算距離而不是計算像素距離。
但是,尋找最近鄰Patch這個操作似乎是不可計算導數的,如何破解這一點呢?同MRF+CNN類似,在這裡,先將PATCHES中的各個patch的的feature_map抽取出來,將其組合成為一個新的卷積層,然後得到query的feature map後輸入到這個卷積層中,最相似的patch將獲得最大的激活值,所以將其再輸入到一個max-pooling層中,得到這個最大值。這樣,就可以反向傳播了。
高清圖像上的應用
本算法直接應用到高清圖像上時效果並不好,所以,為了更好的初始化,使用了Stack迭代算法。即先將高清圖像down-scale到若干級別[1,2,3,…,S],其中S級別為原圖本身,然後在級別1上使用圖像均值初始化缺失部分,得到修復後的結果,再用這個結果,初始化下一級別的輸入。以此類推。
效果
上圖從上往下一次為,有缺失的原圖,PatchMatch算法,Context Decoder算法(GAN+L2)和本算法。
內容生成網絡的作用
起到了內容限制的作用,上圖比較了有內容生成網絡和沒有內容生成網絡的區別,有的可以在內容上更加符合原圖。
應用
圖像的語義編輯,從左到右依次為原圖,扣掉某部分的原圖,PatchMatch結果,和本算法結果。
可知,該方法雖然不可以復原真實的圖像,但卻可以補全成一張完整的圖像。這樣,當拍照中有不想幹的物體或人進入到攝像頭中時,依然可以將照片修復成一張完整的照片。
總結
CNN的大發展,圖像越來越能夠變得語義化了。有了以上的圖像復原的基礎,儘可以進行發揮自己的想象,譬如:在圖像上加一個東西,但是光照和顏色等缺明顯不搭,可以用紋理網絡進行修復。
該方法的缺點也是很明顯:
- 性能和內存問題
- 只用了圖片內的patch,而沒有用到整個數據集中的數據。
閱讀更多 人工智能小迷妹 的文章