这篇文章做了啥
迭代式的单图片反射消除,有一说一,这篇文章让我想起来之前看到的一篇去雨的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在一些神经网络的任务上,还是由可以继续做一些任务的空间的。