作者‖ flow
编辑‖ 3D视觉开发者社区
论文链接https://openaccess.thecvf.com/content/CVPR2021/papers/Chen_Learning_Continuous_Image_Representation_With_Local_Implicit_Image_Function_CVPR_2021_paper.pdf
代码链接: https://yinboc.github.io/liif/
一、概述
LIIF在离散2D与连续2D之间构建了桥梁,进而对图像进行分辨率调整,实现所谓的“无限放大”。通过局部的隐式图像函数对连续的图像进行表达。所谓的局部隐式表达(local implicit image Function, LIF),指函数以图像坐标以及坐标周围的二维特征作为输入,以某给定坐标处的RGB数值作为输出。由于坐标是连续的值,因此LIIF可以以任意分辨率进行表示。为了生成影像的连续表达,我们通过一个用于超分的自监督任务训练得到一个编码器。学得的连续表达就可以以任意分辨率进行超分,超分的分辨率甚至可以高达30x。换句话说,LIIF搭建了2D离散值和连续表达之间的桥梁,因此,它天然的支持GT的尺寸不一样的情况。
二、局部隐式图像函数(Local Implicit Image Function, 简称LIIF)
在LILF的表达中,将每一个连续的图像 I ( i ) I^{(i)} I(i)都会被表达成2D的特征图 M ( i ) ∈ R H ∗ W ∗ D M^{(i)} \in \mathbb{R}^{H*W*D} M(i)∈RH∗W∗D。解码的函数 f θ f_{\theta} fθ将被所有的影像共用,其参数 θ \theta θ由MLP获得,数学表达为:
s = f θ ( z , x ) s = f_\theta(z,x) s=fθ(z,x)
其中, z z z是一个向量,可以理解为隐藏的特征编码, x ∈ X x \in \mathcal{X} x∈X是在连续影像坐标域上的一个2D的坐标, s ∈ S s \in \mathcal{S} s∈S是预测的值,比如说RGB图上的颜色值。
MLP的python代码为:
@register('mlp') class MLP(nn.Module): def __init__(self, in_dim, out_dim, hidden_list): super().__init__() layers = [] lastv = in_dim for hidden in hidden_list: layers.append(nn.Linear(lastv, hidden)) layers.append(nn.ReLU()) lastv = hidden layers.append(nn.Linear(lastv, out_dim)) self.layers = nn.Sequential(*layers) def forward(self, x): shape = x.shape[:-1] x = self.layers(x.view(-1, x.shape[-1])) return x.view(*shape, -1)
不妨假设 x x x在二维空间上两个维度的范围分别为: [ 0 , 2 H ] [0,2H] [0,2H]以及 [ 0 , 2 W ] [0,2W] [0,2W],且称 M ( i ) M^{(i)} M(i)为潜在编码,其将均匀地分布在连续的影像域中,如下图中的蓝圈所示:
对于平均分布的潜在编码 M ( i ) M^{(i)} M(i)而言,我们为每一个篮圈都分配一个2D坐标。
对于连续的影像 I ( i ) I^{(i)} I(i),在某个坐标位置 x q x_q xq的RGB值被定义为:
I ( i ) ( x q ) = f θ ( z ∗ , x q − v ∗ ) I^{(i)}(x_q) = f_{\theta}(z*,x_q - v*) I(i)(xq)=fθ(z∗,xq−v∗)
其中, z ∗ z* z∗是在欧几里得意义上与坐标 x q x_q xq最近的潜在编码, v ∗ v* v∗是潜在编码 z ∗ z^*