【论文学习】Fast End-to-End Trainable Guided Filter

【fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处】

前言

  很久没写博客了,主要原因就是工作之后,为了避开工作内容,很多东西不能写!所以接下来的博客可能更多的探讨论文、数学知识和一些基础性的技术。

  这篇文章是18年就发表的一篇文章,19年就读到了,一直没写出来分享;起初接触的时候觉得很有意思,因为我一直认为将传统图像处理中的方法结合到深度学习中,能够提供很多启发。但是当我仔细阅读过后,发现这篇文章有一定的理论漏洞,所以今天特地写出来分享一下我的理解。

论文地址:https://arxiv.org/pdf/1803.05619v1.pdf
代码地址:https://github.com/wuhuikai/DeepGuidedFilter

背景

  大家都知道,深度学习的参数量和计算量要远远高于传统学习的方法,而且随着现在显卡性能的提升日常所训练的网络也是越来越大;虽然可以解决更复杂的问题,但是在实际的工程部署中却很难得到运用,一般的普通的台式机要这些模型都吃力。所以,如何在既保证效果又保证性能,成为了近年来各大顶会的热门。
  2017年,Google 提出了HDRNet《Deep Bilateral Learning for Real-Time Image Enhancement》,将 bilateral filter 与神经网络结合;通过神经网络,在低分辨下学习局部和全局的特征,得到线性变换系数,然后使用 bilateral grid 对系数上采样,减少了计算量有保证了效果;可以说是极其优秀的工作。

核心思想

  再把目光回到这篇文章,这篇文章的思路与HDRNet也是一样,只不过借助的是Guided filter 的思想,因为相比双边滤波,引导滤波的时间复杂度更低。

  完整的模型首先通过低分辨的输入得到低分辨的结果图,这样网络所需要学习的特征更少,而且feature map的尺寸更小,可以大大节省计算量;然后通过文章提出的 Guided filtering layer 得到pixel wise的线性变换系数;然后用双线性插值对线性系数进行上采样,最终通过线性变换得到高分辨输出。
【论文学习】Fast End-to-End Trainable Guided Filter_第1张图片
  在上图中, I h I_h Ih 表示高分辨的输入图像, I l I_l Il 表示下采样后的低分辨输入图像, O l O_l Ol 表示经过全卷积网络 C l C_l Cl 处理的低分辨输出, O h O_h Oh 表示最终得到的高分辨的输出图像。

  文章的重点自然就是 Guided filtering layer ,首先来回顾一下引导滤波中最核心的公式,输出图像中的像素值由引导图像中像素值线性变换得到;目前想得到高分辨输出,对应的只有高分辨的输入;所以本论文中用高分辨输入 I h I_h Ih 作为引导图。
q i = a k ˉ I i + b k ˉ q_{i}=\bar{a_{k}}I_{i}+\bar{b_{k}} qi=akˉIi+bkˉ
  再来看看线性变换系数如何得到。高分辨的线性变换系数是由低分辨的线性变换系数上采样得到的;而低分辨的系数需要通过 I l I_l Il 得到,与 I h I_h Ih 对应, I l I_l Il 要作为低分辨情况下的引导图,而此时引导滤波还需要一个输入图像, O l O_l Ol 自然就是这个输入。(tips:为什么要对线性变换系数上采样,而不是对低分辨输出上采样?1. 这样获取线性变换系数的计算量小。2.传统图像处理的经验表明对线性变换系数进行上采样最终的效果更好。)
【论文学习】Fast End-to-End Trainable Guided Filter_第2张图片
  上图中, I l I_l Il 经过函数 F ( I ) F(I) F(I) 得到引导图像 G l G_l Gl ,后面就是正常的引导滤波的线性系数求取步骤。当然了,文章将其中的很多步骤都换成了不同的卷积,使整个模型都是可训练的。 F ( I ) F(I) F(I) 设计成全卷积模块,均值滤波替换成了空洞卷积,局部线性模型替换成了逐点卷积;最终得到了下面这个模块。
【论文学习】Fast End-to-End Trainable Guided Filter_第3张图片
  最终的结果对比,我就不介绍了,文章一般都说自己的好,又快又好。

文章再看

  经过上面的介绍,似乎也没什么问题,思想还挺巧妙的。但是仔细一想,似乎值得商榷。引导滤波中,引导图很关键,因为他核心的假设就是输出图像与引导图像在局部上是一个线性的模型,也就是说引导图会决定了输出图像的特征和质量,最终结果是输入图像的特征根据引导图像得到约束。而本文中用低分辨输入 I l I_l Il 经过函数 F ( I ) F(I) F(I) 得到引导图像 G l G_l Gl ,这就有一个很重要的问题: G l G_l Gl 的特征是否靠近想要的特征?但是从代码和论文来看, F ( I ) F(I) F(I) 是一个非常小的模块,并不能巨大地改变 I l I_l Il 的特征,所以 G l G_l Gl 的特征分布是接近于 I l I_l Il ,那么这样一来由 G l G_l Gl 得到的线性系数产生的输出图像是靠近 I l I_l Il 的,而靠近输入图像的结果,不会是我们想要的。举个例子,按照本文的思路,输入图像是无雾(或者噪声)的图像,引导图像是通过有雾(噪声)图像简单变换得到的,那么,最终得到的应该是有雾(或者噪声)的图像。

  通过上面简单的分析可以看出,其实我们应该利用 O l O_l Ol 作为引导图,因为 O l O_l Ol 的特征理论上是与目标空间一致的,而 I l I_l Il 应该作为输入。所以,我可以猜测,如果单独训练小网络 C l C_l Cl ,再接入 Convolutional Guided filtering layer 很难得到理想的结果;而整个模型一起训练,最终的 O l O_l Ol 应该也与 O h O_h Oh 下采样的图相差较多。

  为什么不用 O l O_l Ol 作为引导图,因为在高分辨下对应的是待获取的 O l O_l Ol 。但是,这是不是说本文的工作就没有意义了呢?我觉得也还是有可行性的。要知道引导滤波也可以表示成双边滤波类似的表达形式,如下;也就是输出图像中的点 I I I 的像素值,由其输入图像中对应位置的点 I ′ {I}' I 的周围点像素值的加权得到,通过本文中的方式得到的可能就是综合了输入图像周围像素值及权重的线性变换系数。
q i = ∑ j W i j ( I ) ⋅ p j q_{i}=\sum_{j} W_{ij}\left ( I \right )\cdot p_{j} qi=jWij(I)pj

最后

  这是我个人的见解,也不一定正确,写出来与大家分享,希望跟大家一起讨论。

你可能感兴趣的:(图像处理,深度学习,论文笔记)