這篇文章做了啥
迭代式的單圖片反射消除,有一說一,這篇文章讓我想起來之前看到的一篇去雨的RESCAN,去雨的一篇文章,也是利用迭代式的思想,不斷的去除圖像中的雨,使得每一次迭代對於輸入進行逐漸優化。RESCAN這篇文章也是利用的卷積LSTM,並且下一次是對上一次的迭代的結果進行優化。代碼鏈接,流程圖如下,
上圖的意思是,下一次輸入的圖片是上一次輸出的結果,並且feature的利用也是遵循lstm傳遞的思想
具體的forward的代碼block如下
def forward(self, x):
ori = x
old_states = [None for _ in range(len(self.rnns))]
oups = []
for i in range(settings.stage_num):
states = []
for rnn, state in zip(self.rnns, old_states):
x, st = rnn(x, state)
states.append(st)
x = self.dec(x)
if settings.frame == 'Add' and i > 0:
x = x + Variable(oups[-1].data)
oups.append(x)
old_states = states.copy()
x = ori - x
return oups
這篇文章的motivation是啥
作者說,預測透射區域和反射區域應該是相輔相成的,所以有兩個branch來進行反光消除,通過預測反光的區域,能夠使得圖片去除反光區域更加干凈。
這篇文章的網絡結構
對於每一個time step的網絡結構如下
上圖中,輸入的\(\hat{T}\)和\(\hat{R}\)是網絡預測的結果,和原圖\(I\)一起concate成9通道的圖片送到兩個網絡中,一個網絡是\(G_T\),一個網絡是\(G_R\),下標\(T\)和下標\(R\)分別表示transmission和reflection,即透射圖和反射圖。作者在論文中說,這兩個網絡結構式一樣的,但是作用不一樣,一個是預測transmission,一個是預測reflection。encoder一共用了11個conv-relu blocks。decoder用了8個conv-relu blocks。作者說這兩個backbone都是卷積lstm,結合到有一個iterative的想法(目前為止並沒有開源代碼),這個應該是和RESCAN的結構是相似的。
因為是下一個time step是對上一個time step的輸出結果的優化,所以,整個訓練的pipline如下
loss函數
作者一共定義了4個loss。
第一個loss是重建loss,定義為
兩路branch產生的\(\hat{T}\)和\(\hat{R}\)加在一起,和原圖做差,理論上來說應該是和原圖一樣的。
同時對於透射圖,加了一個perceptual loss函數,定義如下
同時,作者對於透視圖和反光圖定義了一個mse loss,這里的反光圖作者用的是直接做差得到的residual。以及增加了一個對抗的loss,感覺現在如果GAN不做創新的話,大多數也不會去獨特的聲稱提出了某種GAN,只是作為一種提高精度的trick。對抗loss的權重較低。
實驗
作者自己拍了一個數據集,並且命名為nature。200張訓練,20張測試,感覺還是太少了。如下表格所示
作者的方法達到了比較好的結果
可以看一下,去除的也並不是特別干凈,尤其是最后一行,感覺需要一個很大的數據集合來做。
同時作者也做了一些ablation study,比如time step
在time step為3的時候,結果能夠達到最好。
總結一下
總的來說,作者用了兩個比較重要的思想,第一個是,iterative,第二個是,可以同時預測反光區域和透射區域,二者應該是相輔相成的。記得之前看過南理工一篇講的是用GAN做shadow remove就有說,陰影區域和其他區域應該是相輔相成的,所以作者同時預測了兩個區域來提高陰影去除的精度。
感覺iterative在一些神經網絡的任務上,還是由可以繼續做一些任務的空間的。