論文:RRU-Net: The Ringed Residual U-Net for Image Splicing Forgery Detection
代碼:https://github.com/yelusaleng/RRU-Net
圖像篡改區域定位可以認為是像素級的二分類問題,因此很多人採用分割網絡進行篡改區域定位,但以前的分割算法主要是偏向於強信號特徵(可視的,跟內容特徵強相關),而圖像篡改定位更偏向於弱信號特徵(不可視的,跟內容特徵弱相關),所以直接使用以前的分割網絡沒有取得很好的效果。 RRU-Net 發表在2019CVPRW, 文中基於 U-Net 提出了一種環狀殘差網絡 RRU-Net 用於圖像拼接偽造檢測。RRU-Net 是一個端到端的圖像本質屬性分割網絡,無需任何預處理和後處理即可完成偽造區域檢測。RRU-Net 的核心思想是加強 CNN 的學習方式,並由CNN中殘差的傳播和反饋過程實現。殘餘傳播調用輸入的特徵信息以解決更深層網絡中的梯度退化問題;殘差反饋合併輸入特徵信息,使未篡改區域和篡改區域之間的圖像屬性差異更加明顯。RRU-Net 的主要工作為以下三個方面:
圖像本質屬性的差異是檢測圖像偽造的重要依據,但是隨著網絡體系結構的深入,梯度退化問題將影響圖像本質屬性的差異特徵。RRU-Net 受 Res Net 的中shortcut 啟發在U-net中引入了這種連接方式,也就是通過 Residual Propagation 殘差傳播來解決梯度退化的問題。它的 block buliding 如下:
上圖是Residual Propagation block 的示意圖,包含兩個卷積層(稀疏卷積+relu)和殘差傳播。其輸出如下: 其中 x 是輸入,yf 是輸出,Wi 表示第 i 層的權重,式中的F(x,Wi) 表示待學習的殘差映射σ 表示 relu。Residual Propagation看起來像人腦的回憶機制。當我們學習更多新知識時,我們可能會忘記先前的知識,因此我們需要回憶機制來幫助我們喚起那些先前的模糊記憶。 RRU-Net 認為如果可以進一步增強未篡改和篡改區域之間的圖像本質屬性的差異,則可以進一步提高檢測性能。之前有的方法通過將篡改圖像通過SRM濾波層來疊加額外的噪聲屬性差異,增強檢測效果。但SRM 是一種手動選擇方法,只適用於RGB圖像篡改檢測。但當篡改區域和非篡改區域來自同一相機時,由於噪聲屬性相同,SRM方法表現不好。 RRU-Net 提出了 residual feedback來加強CNN的學習能力,它是一種自動學習的方法,而不僅僅關注一個或幾個特定的圖像屬性。設計了一個簡單有效的attention機制,加在residual feedback,給輸入的辨識度高的特徵分配更多注意力。attention機制採用帶有sigmoid 激活函數的簡單 gating 門控機制,學習有辨識度的特徵通道之間的非線性相互作用,避免特徵信息的擴散。然後將sigmoid激活得到的響應值疊加在輸入信息上,放大未篡改區域和篡改區域的圖像本質屬性差異。它的 block buliding 如下: 上圖是Residual Feedback block 的示意圖,其輸出如下: 其中 yf 為公式2的輸出(由於RRU 將Residual Propagation 和 Residual Feedback結合),G是一個線性映射(代碼中是RELU),用來改變 yf 的維度,s 表示sigmoid激活函數。 RRU-Net 認為 residual feedback 類似人腦的 consolidation 機制,我們需要鞏固我們已經學過的知識,獲得新的特徵理解。通過殘差反饋,篡改區域放大到全局最大響應值。 RRU 將 Residual Propagation 和 Residual Feedback 兩個方法相結合到RRU 的單元 Ringed Residual Structure,其結構如下圖:圖中 x1代表該操作只執行一次,x2代表執行兩次。RRU-Net 的 Ringed Residual Structure 代碼如下:
class RRU_first_down(nn.Module): def __init__(self, in_ch, out_ch): super(RRU_first_down, self).__init__() self.conv = RRU_double_conv(in_ch, out_ch) self.relu = nn.ReLU(inplace=True)
self.res_conv = nn.Sequential( nn.Conv2d(in_ch, out_ch, kernel_size=1, bias=False), nn.GroupNorm(32, out_ch) ) self.res_conv_back = nn.Sequential( nn.Conv2d(out_ch, in_ch, kernel_size=1, bias=False) )
def forward(self, x): ft1 = self.conv(x) r1 = self.relu(ft1 + self.res_conv(x)) ft2 = self.res_conv_back(r1) x = torch.mul(1 + torch.sigmoid(ft2), x) ft3 = self.conv(x) r3 = self.relu(ft3 + self.res_conv(x))
return r3 RRU-Net 的網絡結構和 U-Net 差不多,主要的差別在於在 U-Net 基礎上引入了 Residual Propagation 和 Residual Feedback 相結合的結構 Ringed Residual Structure。下面是RRU-Net的網絡結構圖:
下圖是 RRU-Net 和其他的方法檢測相同偽造圖像的結果比較,可以看出 RRU-Net 檢測的篡改區域雖然比 Ground Truth 小一些,但是誤識的區域少,並且檢測出來的篡改區域相較完整。 RRU-NET 在 CASIA1.0 和 COLUMB 兩個偽造圖像數據集上的實驗結果,CASIA 1.0 包括的篡改方式有拼接和複製粘貼攻擊方式,但是本文只選取了其中的拼接攻擊方式的數據集。COLUMB 是只包含拼接攻擊的數據集 從實驗結果可以看出 RRU-Net 對於拼接的篡改方式具有很好的效果,在CASIA1.0 和 COLUMB兩個數據集上準確率和F1-score 都實現了最好的成績 。