Resize

5 分钟阅读

概述

ONNX操作描述:Resize

参考代码:resize.py

坐标转换模式: half_pixelalign_cornersasymmetricpytorch_half_pixeltf_crop_and_resize

插值模式: linearnearestcubic

本文以 $ A[h_a, w_a] $ resize to $ B[h_b, w_b] $举例。

坐标转换模式

Half Pixel

将A中各元素摆放在$ h_a \times w_a $的区域中,将B中各元素摆放在$ h_b \times w_b $的区域中。

那么A中各点的坐标位置对应如下:

$ A_{[0,0]} => [0.5, 0.5]$

$ A_{[0,1]} => [0.5, 1.5]$

$ A_{[y,x]} => [0.5 + y, 0.5 + x] $

B中各元素位置同理。

如果是A resize to B,则先将B区域拉伸至A区域范围;如果是B resize to A,则先将A区域拉伸至B区域范围。

如下图所示:

[注:A拉伸至B,或者B拉伸至A都可以,不影响结果]

以图中A resize to B举例,则有:

$ scale_w = \frac{w_a}{w_b} $​

$ scale_h = \frac{h_a}{h_b} $​

那么经过变化后B中各点的坐标位置对应如下:

$ B_{[0,0]} => [0.5 \times scale_h, 0.5 \times scale_w] $​

$ B_{[0,1]} => [0.5 \times scale_h, 1.5 \times scale_w] $​

$ B_{[y,x]} => [(0.5+y) \times scale_h, (0.5+x) \times scale_w] $​

Align Corners

将A中各元素摆放在$ (h_a - 1) \times (w_a - 1) $的区域中,将B中各元素摆放在$ (h_b - 1) \times (w_b - 1) $的区域中。

那么A中各点的坐标位置,$ A_{[y,x]} => [y, x] $;B中各元素位置同理。

经拉伸后如下图:

其中:

$ scale_w = \frac{w_a - 1}{w_b - 1} $​

$ scale_h = \frac{h_a - 1}{h_b - 1} $​

经过变化后B中各点的坐标位置对应如下:

$ B_{[0,0]} => [0 \times scale_h, 0 \times scale_w] $​

$ B_{[0,1]} => [0 \times scale_h, 1 \times scale_w] $​

$ B_{[y,x]} => [y \times scale_h, x \times scale_w] $​

Asymmetric

[ˌeɪsɪˈmetrɪk], 不对称的。

将A中各元素摆放在$ h_a \times w_a $​​的区域中,将B中各元素摆放在$ h_b \times h_b $​​的区域中。

那么A中各点的坐标位置,$ A_{[y,x]} => [y, x] $​;B中各元素位置同理。

经拉伸后如下图:

其中:

$ scale_w = \frac{w_a}{w_b} $​

$ scale_h = \frac{h_a}{h_b} $​​

经过变化后B中各点的坐标位置对应如下:

$ B_{[0,0]} => [0 \times scale_h, 0 \times scale_w] $​

$ B_{[0,1]} => [0 \times scale_h, 1 \times scale_w] $​

$ B_{[y,x]} => [y \times scale_h, x \times scale_w] $​

插值模式

Linear

取B点最近的四个A点,做加权平均值(双线性差值),得到B点的值。如果B点在w或h方向上超出A边缘,则在该方向上取A边缘值。计算方法如下(越靠近某个点,则该点权重越大,越接近该值):

$ v = v0 \times (R \times B) + v1 \times (L \times B) + v2 \times (T \times R) + v3 \times (R \times B) $

Nearest

取B点最近的一个A点的值

Cubic

取B点最近的八个A点的值,做加权平均值