Resize

4 分钟阅读

概述

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_b}{w_a} $

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

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

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

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

$ B_{[y,x]} => [\frac{0.5+y}{scale_h}, \frac{0.5+x}{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_b - 1}{w_a - 1} $

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

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

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

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

$ B_{[y,x]} => [\frac{y}{scale_h}, \frac{x}{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点的值,做加权平均值

评论