人臉超分辨率,基于迭代合作的方法
分享一篇 2020CVPR 錄用論文:Deep Face Super-Resolution with Iterative Collaboration between Attentive Recovery and Landmark Estimation,其提出了一種基于迭代合作的人臉超分辨算法。
該方法將 16x16 的低分辨率圖片超分辨率為 128x128,在 CelebA 和 Helen數(shù)據(jù)集上的 PSNR 指標(biāo)分別達到了 27.37 和 26.69,超過了當(dāng)前已有的人臉超分辨率算法。
目前代碼已經(jīng)開源:
https://github.com/Maclory/Deep-Iterative-Collaboration
(目前已有72星標(biāo))
論文作者信息:

作者來自清華大學(xué)自動化學(xué)院、智能技術(shù)與系統(tǒng)國家重點實驗室、北京信息科學(xué)與技術(shù)國家研究中心和清華大學(xué)深圳國際研究生院。
01
Motivation
在以往的一些人臉超分辨率算法中,人臉先驗信息(facial prior)如面部關(guān)鍵點通常被引入,用于輔助網(wǎng)絡(luò)生成更加真實的超分辨率圖像。但是這些方法存在兩個問題:
- 通過低分辨率圖片LR或者粗超分辨率圖片SR得到的人臉先驗信息不一定準(zhǔn)確
- 大部分方法使用人臉先驗的方式為簡單的 concatenate 操作,不能充分利用先驗信息
為了解決上述的兩個問題,作者提出了一個基于迭代合作的人臉超分辨率算法DIC,為了讓生成的圖片更加真實,也給出了該網(wǎng)絡(luò)的 GAN 版本:DICGAN。
02
Method

從網(wǎng)絡(luò)結(jié)構(gòu)圖可以看出,為了解決先驗網(wǎng)絡(luò)不能從 coarse SR 中得到準(zhǔn)確的先驗信息,作者設(shè)計了一個反饋迭代網(wǎng)絡(luò),,使得生產(chǎn)的超分辨率圖片越來越趨近于真實圖片,而更加真實的圖片通過先驗網(wǎng)絡(luò)可以提取更加準(zhǔn)確的先驗信息以再次提升圖片的質(zhì)量。
下圖展示了該迭代的機制的優(yōu)勢,隨著迭代次數(shù)的增加,關(guān)鍵點預(yù)測的也越來越準(zhǔn)確,生成的圖像質(zhì)量也越來越好。作者也通過實驗證明了,當(dāng)?shù)螖?shù)超過 3次時,網(wǎng)絡(luò)性能的提升有限。


另一方面,為了充分利用人臉先驗信息,作者提出了一個 Attentive Fusion 模塊如下圖所示:

可以看出,作者將面部關(guān)鍵點預(yù)測網(wǎng)絡(luò)(網(wǎng)絡(luò)結(jié)構(gòu)圖中的 Face Alignment 模塊)輸出的特征圖分成五組:左眼、右眼、嘴、鼻子和面部輪廓。再將每個組的特征圖通過 softmax 后相加得到每個注意力矩陣(Attention matrix)。
用這 5 個注意力矩陣分別去 reweight 網(wǎng)絡(luò)中的五個分支的 feature maps,再加在一起得到融合特征。那么作者如何確定關(guān)鍵點預(yù)測網(wǎng)絡(luò)輸出的特征圖那幾個channel 是左眼,哪些 channel 是右眼呢?從作者開源的代碼中可以看出,這些 channel 是人為指定的,如規(guī)定第 32 到第 41 個通道是左眼的關(guān)鍵點。
- if heatmap.size(1) == 5:
- return heatmap.detach() if detach else heatmap
- elif heatmap.size(1) == 68:
- new_heatmap = torch.zeros_like(heatmap[:, :5])
- new_heatmap[:, 0] = heatmap[:, 36:42].sum(1) # left eye
- new_heatmap[:, 1] = heatmap[:, 42:48].sum(1) # right eye
- new_heatmap[:, 2] = heatmap[:, 27:36].sum(1) # nose
- new_heatmap[:, 3] = heatmap[:, 48:68].sum(1) # mouse
- new_heatmap[:, 4] = heatmap[:, :27].sum(1) # face silhouette
- return new_heatmap.detach() if detach else new_heatmap
- elif heatmap.size(1) == 194: # Helen
- new_heatmap = torch.zeros_like(heatmap[:, :5])
- tmp_id = torch.cat((torch.arange(134, 153), torch.arange(174, 193)))
- new_heatmap[:, 0] = heatmap[:, tmp_id].sum(1) # left eye
- tmp_id = torch.cat((torch.arange(114, 133), torch.arange(154, 173)))
- new_heatmap[:, 1] = heatmap[:, tmp_id].sum(1) # right eye
- tmp_id = torch.arange(41, 57)
- new_heatmap[:, 2] = heatmap[:, tmp_id].sum(1) # nose
- tmp_id = torch.arange(58, 113)
- new_heatmap[:, 3] = heatmap[:, tmp_id].sum(1) # mouse
- tmp_id = torch.arange(0, 40)
- new_heatmap[:, 4] = heatmap[:, tmp_id].sum(1) # face silhouette
- return new_heatmap.detach() if detach else new_heatmap
- else:
- raise NotImplementedError('Fusion for face landmark number %d not implemented!' % heatmap.size(1))
以上就是本篇論文最為核心的兩個創(chuàng)新點。了解了整個網(wǎng)絡(luò)運行的原理之后,網(wǎng)絡(luò)的損失函數(shù)就很好理解了:


03
Result
下圖為 DIC/DICGAN 與其他方法的結(jié)果對比圖:


可以看出 DIC/DICGAN 生成的圖片恢復(fù)了更多的細節(jié),更加真實。由于DICGAN 是基于 GAN 的方法,相較于基于 PSNR 方法的 FSRNet,指標(biāo)略低,但是生成的圖像更加真實。這也是當(dāng)前超分辨率任務(wù)中存在的一個問題:基于 GAN 的方法生成的圖像視覺質(zhì)量更好,但是 PSNR 指標(biāo)低。
04
Resource
- 論文鏈接:https://arxiv.org/pdf/2003.13063.pdf
- 項目鏈接:https://github.com/Maclory/Deep-Iterative-Collaboration