2019年的IJCV,做引导超分的,最论文最后把应用邻域扩展到了去噪、图像恢复等方向
本博文不是对论文的全文翻译,只是根据自己理解来写的小笔记。该笔记不是手把手教学哈,阅读之前请将原论文看一遍·。
【一】论文概述
主要思想:简而言之,对于每一个像素点,学习一个3*3大小的weight和offset。weight好理解,就是权重值嘛,normalize之后和为1。offset的理解可以看下图:
图1 offset示意图
图a是一个规范的网格;图b是网络输出的3*3大小的offset;图c中的橙色点,才是最终用于与weight相乘的点,offset表示蓝色点到橙色点的偏移值。(橙色点大多数都是亚像素点,作者使用bilinear插值来计算橙色点的像素值。后文中会提到。)
得到每一个像素点的weight和offset,然后基于depth图像,可计算结果图像每一个像素的值。
简而言之,就是设计了一个新的图像滤波器。不同于手工设计的滤波器,它随着图像的改变而改变,且采样点位置也会变化(我感觉这篇文章一大亮点就是学习了offset)
【二】网络结构
(首先吧,我感觉它这个网络图和网络表格就画的有点不严谨。。。)
图2 网络结构图
2.1 Feature extraction + Weight & offset regression
输入:Target和Guidance
一次的输出:
weight | offset |
NOTE:
一次输出只能得到1/16的点,所以这个模块作者运行了16次,才得到了完整的weight和offset。
而图2中的weight和offset分别是 和 ,这只是针对一个pixel的。(offset是用来表示的,故为 。文中 k=3)
2.1.1 Feature extraction
这一部分就是一个普通的卷积层。对于每一个128*1*1尺寸的输出,都对应着输入图像中51*51大小的感受野。整个网络结构如下图所示:
这个D指的应该是通道数,target image的D是1,guidance是3。第一行和最后一行说明的是,对于输入图像中51*51大小的感受野,最后输出一个128*1*1大小的特征向量(并没有把图像划分成51*51的子图像,这里它只是强调其感受野大小是51)。
这里还有一个关键点是DownConv。作者在文中的testing提到,他们设计网络的两个准则是:1)尽量大的感受野;2)速度要快。为了在这两者之间平衡,使用了DownConv模块,本质上就是multi-pixel stride 多像素步长的卷积。
但是,由于有两个步长为2的DownConv,导致一次向前传播仅能得到1/16的结果。所以需要运行16次forward才能得到完整的结果。(FDKN就是针对这一部分进行改进的)
2.1.2 Weight & offset regression
先看下图:
Weight:target和guidance都会产生的weight,经过一层sigmoid后(粉红色边框),再将两个分支得到的weight,进行对应元素的相乘,得到合并的weight。为了保证sum(weight)=1,加了一层归一化操作(蓝色边框)。
offset:操作和weight基本一致,但没有sigmoid层和归一化。(因为偏移量有正有负,爱怎么偏移就怎么偏移,也不需要归一化)
2.2 Weight average
这一步就是讲述了,得到了每个点的offset和weight之后,怎么得到最终的预测residual。
大致思路:先根据offset采样,然后与weight相乘,得到每个点的预测值。
这一里面唯一存在的问题就是,offset是浮点型的,所以采样后点大多数都是亚像素点。这里,作者采用bilinear的方法,获取亚像素点对应的像素值。
下面是几个公式的解释:
公式3
公式4
公式5
s(q)是亚像素点,t0,t1,t2,t3分别是离亚像素点最近的四个像素点。s(q)的值将由这四个点插值来得到。ft就是网络输入的低分辨率深度图。G(s,t)的公式如下:
其实就是普通的bilinear公式,不了解的可以百度一下。
至此,DKN的大致内容已经讲完了,FDKN思路差不多,主要是去掉了DownConv,使得一次就可以得到全部点的weight和offset,而不需要16次。这里就不再细讲。
论文全文链接:[1910.08373] Deformable Kernel Networks for Joint Image Filtering (arxiv.org)