圖像去模糊:PSS-NSC

圖像去模糊:PSS-NSC

 

[20190925 添加開源code]

CVPR2019​jiaya.me

firenxygao/deblur​github.com

本文是香港中文大學、騰訊優圖賈佳亞團隊投於CVPR2019的一篇關於圖像去模糊的方法。
動態場景去模糊(相機抖動、目標運動導致的模糊)是底層視覺中一種極具挑戰性的任務。不同於已有方法中的參數獨立或參數共享模式,作者提出一種廣義而有效的選擇性共享機制用於約束去模糊網絡。在每個尺度的子網絡中,作者提出一種嵌套跳過連接架構替代殘差模塊/卷積堆疊模塊。除此之外,作者還構建一個更大的去模糊數據集。最後,作者通過充分的實驗驗證了所提嵌套跳過連接的SOTA性能。

Abstract

在網絡架構方面,作者引入一種嵌套跳過連接模塊;在數據集方面,作者構建一個更多更高質量包含5290圖相對的數據集。該文的貢獻主要包含以下幾個方面:

  • 作者分析了去模糊網絡中的參數策略,並提出一種參數選擇性共享機制;
  • 作者提出一種嵌套跳過連接結構用於特徵變換;
  • 作者構建一個更大、更高質量的去模糊數據集。

Method

上圖給出了作者所提出的網絡架構示意圖,它由特徵提取、特徵非線性變換、特徵重建三種類型的模塊構成。下面分別從參數選擇性共享、嵌套跳過連接兩個方面進行簡單介紹。

參數選擇性共享

​ 文獻1提出一種參數獨立Coarse-to-Fine的圖像去模糊架構,但是它缺乏處理不同尺度模糊的約束;文獻2提出一種參數共享Coarse-to-Fine的圖像去模糊架構。

​ 作者從以下兩個角度考慮參數問題:

  • 什麼類型的參數可以進行跨尺度共享;
  • 通尺度不同模塊的參數是否可以共享。

上圖給出了銳利塊與模塊塊在不同尺度下的效果對比,可以看出:(1)銳利塊具有相似性,下采樣後仍然銳利;(2)粗尺度下模糊塊在細尺度下變得銳利。

如果特徵提取模塊參數跨尺度共享,它無法同時提取銳利與模糊特徵。比如,粗尺度下學習的銳利特徵提取參數無法在細尺度下提取模塊特徵。基於該發現,作者將文獻2中的參數共享機制進行了鬆弛處理,特徵提取採用非共享模式(見下圖b),這樣可以保證網絡可以在每個尺度自動提取最具辨別力的特徵。

完成尺度可變特徵提取後,特徵非線性變化與特徵重建的目的是將其轉換爲銳利特徵,故而非線性特徵變換模塊可以進行跨尺度參數共享(類似SRN),將上圖b。受啓發於傳統迭代去模糊方案,作者假設同樣存在尺度內參數共享,進而提出了尺度內參數共享架構。(見上圖c)

上圖給出了作者在SRN(上圖a)基礎上提出的改進參數共享方案(見上圖b和c)。上圖b方案爲特徵提取模塊參數不共享,特徵非線性變換參數共享;上圖c爲特徵提取模塊參數不共享,特徵非線性變換跨尺度、跨模塊參數共享。

嵌套跳過連接

上圖給出了一階跳過連接、以及二階三階跳過連接示意圖。他們分別定義如下:

[公式]

上述架構從視覺上有些類似DenseNet架構,但存在兩點區別:

  • 這裏的跳過連接指的是相加而非拼接;
  • 直接連接的數量爲  ,而DenseNet中最後一個卷積的連接數則是(L+1).

更高階的殘差提升信息傳遞改善梯度消失問題。該嵌套跳過連接模塊可以生成更復雜的特徵同時更易於優化訓練。作者採用該架構替換ResBlock模塊。

個人理解嵌套跳過連接實際上就是殘差連接,只不過三階殘差由三個殘差模塊構成罷了。 不過嵌套連接可以在更微小的Block中進行嵌套,這點是殘差模塊所不具備的。可參考文末提供的Block代碼。期待作者

@jiangsutx

開源代碼 。

網絡架構

類似於文獻1與文獻2,作者採用了Coarse-to-Fine策略構建網路架構。三個尺度中的特徵提取、特徵重建採用參數不共享方案,特徵非線性變換採用特徵共享方案。卷積核大小設爲爲3x3以控制模型大小。默認每個非線性特徵變換模塊包含4個處理單元(每個單元包含兩個卷積),特徵提取與重建模塊則爲stride=2的卷積核轉置卷積,子網絡的每個階段包含17個卷積核爲$3\times3$的卷積。

損失函數選擇MSE,定義如下:

Experiments

參考文獻1中GoPro數據集的製作方法,作者採用GoPro Hero6與iPhone7設備構建了更大的數據集。爲避免GoPro數據缺陷,作者在製作數據過程中提出如下三個指導原則,共計收集5290圖像對,它是對GoPro的補充。

  • 固定相機以確保不存在相機抖動;
  • 白天在戶外採集視頻以確保低噪聲;
  • 僅收集具有足夠細節的場景以避免大面積平滑區域(如天空、背景)。

在訓練過程中,圖像塊大小爲256x256,BatchSize=16,參數初始化方法爲Xavier,優化器爲Adam,學習率爲0.0001,指數型學習率下降(0.3),共計訓練4000個epoch。

爲驗證所提參數選擇性共享機制的有效性,作者對比了參數獨立、參數全局共享、參數選擇性共享等對比,相關指標如下所示。

從上表可以看出一下幾個重要發現:

  • 參數共享優於參數獨立(更高的性能、更少的參數量);
  • 選擇性參數共享可以進一步提升去模糊性能;
  • 尺度內參數共享可以取得與非貢獻同比的性能,但參數量僅爲其一半。

爲驗證所提嵌套跳過連接的有效性,作者對比了(均只含有8個卷積)卷積堆疊、ResBlock、DenseBlock以及Nested,如下表所示:

從中可以看出:

  • ResBlock由於卷積堆疊;
  • Nested與ResBlock均優於DenseBlock;
  • Nested取得最佳性能。

最後,作者對比了所提方法與其他SOTA方法在GoPro數據及上的性能對比與視覺效果(從左到右:輸入、文獻1、文獻2以及本文方法)對比,如下所示。

Conclusion

作者分析了去模糊架構中的參數貢獻問題並提出參數選擇性共享機制;同時作者還提出一種新的嵌入跳過連接架構;除此之外,作者還構建了一個更大、更高質量的去模糊數據集。通過集成上述改進,作者所提框架取得了SOTA去模糊性能。

--------------------------------------------------

  1. [CVPR2017] Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring.
  2. [CVPR2018] Scale-recurrent Network for Deep Image Deblurring.

參考代碼

# 因作者並未開源,故而不確定NestedBlock具體形式。
# 這裏只是參考文中架構圖簡單的對比了NestedBlock與ResBlock
# 可以與下面的標準殘差模塊對比分析兩者之間的差異。
# 更具體的網路架構這裏不再列出
# 看懂了文中架構圖,結合NestedBlock以及SRN可以輕鬆的寫出相關架構代碼
class Block(nn.Module):
    def __init__(self, inc):
        super().__init__()
        self.conv1 = nn.Conv2d(inc, inc, 3, 1, 1)
        self.relu  = nn.ReLU()
        self.conv2 = nn.Conv2d(inc, inc, 3, 1, 1)
    def forward(self, x):
        return self.conv2(self.relu(self.conv1(x)))

class NestedBlock(nn.Module):
    def __init__(self, inc):
        super().__init__()
        self.blk1 = Block(inc)
        self.blk2 = Block(inc)
        self.blk3 = Block(inc)
        self.blk4 = Block(inc)
    def forward(self, x):
        x1 = self.blk1(x)
        x2 = self.blk2(x + x1)
        x3 = self.blk3(x + x1 + x2)
        x4 = self.blk3(x + x1 + x2 + x3)
        return x + x1 + x2 + x3 + x4
  
class ResBlock(nn.Module):
    def __init__(self, inc):
        super().__init__()
        self.conv1 = nn.Conv2d(inc, inc, 3, 1, 1)
        self.relu  = nn.ReLU()
        self.conv2 = nn.Conv2d(inc, inc, 3, 1, 1)
    def forward(self, x):
        res = self.conv2(self.relu(self.conv1(x)))
        return res + x

 

編輯於 2019-09-25

 

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