首先Pytorch中grid_sample函数的接口声明如下:
torch.nn.functional.grid_sample(input, grid, mode='bilinear', padding_mode='zeros', align_corners=None)
在官方文档里面关于该函数的作用是这样描述的:
Given an input and a flow-field grid, computes the output using input values and pixel locations from grid.
简单来说就是,提供一个input的Tensor以及一个对应的flow-field网格(比如光流,体素流等),然后根据grid中每个位置提供的坐标信息(这里指input中pixel的坐标),将input中对应位置的像素值填充到grid指定的位置,得到最终的输出。
关于input、grid以及output的尺寸如下所示:(input也可以是5D的Tensor,这里我们只考虑4D的情况)
这里的input和output就是输入的图片,或者是网络中的feature map。关键的处理过程在于grid,grid的最后一维的大小为2,即表示input中pixel的位置信息
- padding_mode='zeros':对于越界的位置在网格中采用pixel value=0进行填充。
- padding_mode='border':对于越界的位置在网格中采用边界的pixel value进行填充。
- padding_mode='reflection':对于越界的位置在网格中采用关于边界的对称值进行填充。
对于mode='bilinear'参数,则定义了在input中指定位置的pixel value中进行插值的方法,为什么需要插值呢?因为前面我们说了,grid中表示的位置信息x和y的取值范围在
nearest和bilinear
两种模式。 nearest就是直接采用与
双线性插值:
上面讲到双线性插值会对
![49622ee41b3539e98df39fa0b9328fdc.png](https://img-blog.csdnimg.cn/img_convert/49622ee41b3539e98df39fa0b9328fdc.png)
其双线性插值的结果为:
![3a5bb1420ec23faa6f826816b97f0cda.png](https://img-blog.csdnimg.cn/img_convert/3a5bb1420ec23faa6f826816b97f0cda.png)
采用下图我们可以对双线性插值有个更为直观的认识:
![30cf2b70c77e9f4417ea5dbb8a9a3bb9.png](https://img-blog.csdnimg.cn/img_convert/30cf2b70c77e9f4417ea5dbb8a9a3bb9.png)
从上图中可以看到双线性插值就是首先在平面
下面给出正式的推导:
已知四点的坐标如下所示:
![e1ca3545b2da10d9cb3c20667745e453.png](https://img-blog.csdnimg.cn/img_convert/e1ca3545b2da10d9cb3c20667745e453.png)
Q11=(x1,y1,f(x1,y1)), Q21=(x2,y1,f(x2,y2)), Q12=(x1,y2,f(x3,y3)), Q22=(x2,y2,f(x4,y4))
其中有z=f(x,y):
先在x方向上进行插值有:
然后在y的方向上进行插值:
将x方向
以上式子便是最终双线性插值的最终表达式,由于4个点的权重部分中分母是相同的可以忽略不计,现在再回去看上面的例子是不是就一目了然了。