天天看點

Single Image Reflection Separation with Perceptual LossesCVPR-2018

CVPR-2018

摘要

我們提出了一種從單個圖像中分離 reflction(鏡像)的方法。該方法使用了一個經過訓練的全卷積網絡,利用低級和進階圖像資訊進行端到端損失訓練。我們的損失函數包括兩種感覺損失:一種是通過視覺感覺網絡的特征損失,另一種是 transmission layers 的圖像特征編碼的對抗性損失。我們還提出了一種新的 exclusion loss,實作像素層級的強制分離。我們建立了現實世界中帶有 reflection 的圖像資料集和 對應的 ground-truth transmission layers 進行定量評估和模型訓練。我們通過全面的定量實驗驗證了我們的方法,并表明我們的方法在PSNR、SSIM和感覺使用者研究中優于最先進的反射去除方法。我們還将我們的方法擴充到另外兩個圖像增強任務,以示範我們的方法的普遍性。

Introduction

在本文中,我們提出了一個具有感覺損失的完全卷積網絡,它既編碼了低層次的圖像資訊,也編碼了高層次的圖像資訊。我們的網絡以一幅圖像作為輸入,直接生成兩幅圖像:the reflection layer and the transmission layer(反射層和投射層,即鏡像和非鏡像)。我們進一步提出了一種新的 exclusion loss,可以有效地在像素級别上實作透射和反射的分離。為了全面評估和訓練不同的方法,我們建構了一個包含真實世界圖像和地面真實透射圖像的資料集。我們的資料集涵蓋了各種自然環境,包括室内和室外場景。我們還使用這個真實世界的資料集來定量地比較我們的方法和以前的方法。總之,我們的主要貢獻是:

  • 提出了一種具有感覺損失的深度神經網絡用于圖像的反射分離。我們通過兩種不同層次的圖像資訊損失來進行感覺監控:視覺感覺網絡的特征損失和輸出-透射層的對抗性損失。
  • 我們提出了一個精心設計的 exclusion loss,強調在梯度域中分離的層的獨立性。(透射資訊與反射資訊不共享邊緣)
  • 我們建立了一個現實世界圖像的資料集,包含反射資訊的圖像與相應的隻含有透射資訊的圖像。這個新的資料集可以定量評估和比較我們的方法和現有的算法。
  • 我們的反射分離訓練模型可以直接應用于其他兩項圖像增強任務,除焰和除霧。

OverView

理想的反射分離模型應該能夠了解圖像中的内容。為了訓練我們的網絡f對輸入圖像的語義了解,我們從ImageNet資料集上預訓練的VGG-19網絡中提取特征,形成超列特征。使用超列特性的好處是,輸入被增強為有用的特性,這些特性抽象了大型資料集(如ImageNet)的視覺感覺。在給定像素位置上的超列特性是在該位置上網絡的標明層之間的激活單元的堆棧。在這裡,我們在預先訓練的VGG-19網絡中采樣了層“conv1 2”、“conv2 2”、“conv3 2”、“conv4 2”和“conv5 2”。超列特征總共有1472個次元。我們将輸入圖像I和它的超列特征連接配接(concat)起來作為f的增廣輸入。

  • 超列(雙線性插值,concat)
input = tf.concat([tf.image.resize_bilinear(vgg19_f,(tf.shape(input)[],tf.shape(input)[]))/,input], axis=)
           

我們的網絡f是一個完全卷積的網絡,我們的網絡有一個很大的感覺野 513×513 (膨脹卷積)可以有效地聚合全局圖像資訊。關于網絡設計的了解

  • 第一層的f是一個1×1卷積,将(1472 + 3)減少到64個通道。
net=slim.conv2d(input,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv0')
           
  • 以下8層3×3 膨脹卷積。所有中間層都有64個特征通道。
net=slim.conv2d(input,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv0')
    net=slim.conv2d(net,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv1')
    net=slim.conv2d(net,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv2')
    net=slim.conv2d(net,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv3')
    net=slim.conv2d(net,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv4')
    net=slim.conv2d(net,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv5')
    net=slim.conv2d(net,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv6')
    net=slim.conv2d(net,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv7')
    net=slim.conv2d(net,channel,[,],rate=,activation_fn=lrelu,normalizer_fn=nm,weights_initializer=identity_initializer(),scope='g_conv8')
           
  • 最後一層是線性變換為 RGB 通道的兩張圖像即 transmission layer 和 reflection layer.
net=slim.conv2d(net,*,[,],rate=,activation_fn=None,scope='g_conv_last') 
    # output  channels -->  for transmission layer and  for reflection layer
           

Train

使用特征損失來表示我們預測(生成)的透射圖像與ground truth圖像(預先準備的無反射圖像)在特征空間中的差異。

特征損失(Feature Loss)主要的計算方式:

  • 将生成的透射圖像 transmission_layer 與target一起丢進VGG19的網絡提取特征,緊接着計算他們之間的L1 Loss(計算’conv1 2’, ’conv2 2’, ’conv3 2’, ’conv4 2’, and ’conv5 2’的特征圖內插補點,計算時不同層賦予不同的權重)。
p=compute_l1_loss(vgg_real['input'],vgg_fake['input'])
    p1=compute_l1_loss(vgg_real['conv1_2'],vgg_fake['conv1_2'])/
    p2=compute_l1_loss(vgg_real['conv2_2'],vgg_fake['conv2_2'])/
    p3=compute_l1_loss(vgg_real['conv3_2'],vgg_fake['conv3_2'])/
    p4=compute_l1_loss(vgg_real['conv4_2'],vgg_fake['conv4_2'])/
    p5=compute_l1_loss(vgg_real['conv5_2'],vgg_fake['conv5_2'])*10/
    return p+p1+p2+p3+p4+p5
           

筆者訓練時沒有用root_training_synthetic_data

loss_percep_t = compute_percep_loss(transmission_layer, target)
           

Adversarial loss

這裡其實可以類比pix2pix,與pix2pix中的判别器網絡一緻,基于條件GAN,與patchGAN,使得生成的折射層圖像更像真正的無反射圖像,其實可以了解為生成圖像後的一個判真判假過程,使生成圖像更像真的。

訓練過程對損失函數作了優化,-logD代替log(1-D),避免梯度消失。

# Adversarial Loss
    with tf.variable_scope("discriminator"):
        predict_real,pred_real_dict = build_discriminator(input,target)
    with tf.variable_scope("discriminator", reuse=True):
        predict_fake,pred_fake_dict = build_discriminator(input,transmission_layer)

    d_loss=(tf.reduce_mean(-(tf.log(predict_real + EPS) + tf.log( - predict_fake + EPS)))) * 
    g_loss=tf.reduce_mean(-tf.log(predict_fake + EPS))
           

Exclusion loss

為了更好的分離transmission layer和reflection layer,這個損失是關鍵的。因為這兩者不共享邊緣,我們的任務就是要使得這兩者在梯度域上的相關性最小。

Single Image Reflection Separation with Perceptual LossesCVPR-2018

where λT and λR are normalization factors, ∥ · ∥F is the Frobenius norm, ⊙ denotes element-wise multiplication,and n is the image downsampling factor: the images fT and fR are downsampled by a factor of 2^(n−1) with bilinear interpolation.

Single Image Reflection Separation with Perceptual LossesCVPR-2018

注意正則化因子λT和λR方程中至關重要,由于傳輸和反射層可能包含不平衡梯度大小。反射層可以是低強度的模糊,由小的梯度組成,也可以反射非常明亮的光,組成圖像中最亮的點,産生高對比度反射,進而形成大的梯度。規模差異|∇T |和|∇R |兩層預測會導緻不平衡的更新。我們觀察到,如果沒有适當的歸一化因子,網絡會抑制梯度更新率較小的層,使其接近于零。

# Gradient loss
    loss_gradx,loss_grady=compute_exclusion_loss(transmission_layer,reflection_layer,level=)
    loss_gradxy=tf.reduce_sum(sum(loss_gradx)/)+tf.reduce_sum(sum(loss_grady)/)
           

總的loss

繼續閱讀