cv2.reisze, interpolate采样比较

cv2.reisze, interpolate采样比较

resize, unsample, interpolate

本文比较cv2.reisze, PIL.Image.resize, torch.nn.functional.interpolate, mxnet

torch interpolate

注意:

  1. scale_factor与size只能设置一个。
  2. 当设置scale_factor时,会对输出size下取整,比如输入[2, 2], scale_factor=2.1, 则输出size为[4.2, 4.2] = [4, 4]。
  3. 当设置scale_factor时,再设置recompute_scale_factor时,会根据输出的实际大小重新计算一下scale_factor。
  4. 用scale_factor不用size是因为scale_factor可以不写死大小,而size会固定输出大小,在处理多分辨率输入图像的时候会有问题。
input:输入Tensor。

size:插值后输出Tensor的空间维度的大小,这个spatial size就是去掉Batch,Channel,Depth维度后剩下的值。比如NCHW的spatial size是HW。

scale_factor(float 或者 Tuple[float]):spatial size的乘数,如果是tuple则必须匹配输入数据的大小。
mode(str):上采样的模式,包含'nearest' | 'linear' | 'bilinear' | 'bicubic' | 'trilinear' | 'area'。 默认是 'nearest'。

align_corners(bool):在几何上,我们将输入和输出的像素视为正方形而不是点。 如果设置为True,则输入和输出张量按其角像素的中心点对齐,保留角像素处的值。 如果设置为False,则输入和输出张量按其角像素的角点对齐,插值使用边缘值填充来处理边界外值,当scale_factor保持不变时,此操作与输入大小无关。 这仅在mode为 'linear' | 'bilinear' | 'bicubic' | 'trilinear'时有效。默认值是False。

recompute_scale_factor(bool):重新计算用于插值计算的
scale_factor。 当 scale_factor 作为参数传递时,它用于计算 output_size。 如果 recompute_scale_factor 为 False 或未指定,则传入的 scale_factor 将用于插值计算。 否则,将根据用于插值计算的输出和输入大小计算新的 scale_factor(即,等价于显示传入output_size)。 请注意,当 scale_factor 是浮点数时,由于舍入和精度问题,重新计算的 scale_factor 可能与传入的不同。
x = nn.functional.interpolate(x, scale_factor=2, mode='bilinear', align_corners=False) 

ops_version对导出onnx影响:

op9, op10是Unsample,而op11变成了Resize。
onnx_interpolate

不同的ops_version对interpolate的支持程度:

F.interpolate nearest bilinear, align_corners=False bilinear, align_corners=True bicubic
op-9 Y Y N N
op-10 Y Y N N
op-11 Y Y Y Y

align_corner的表现行为:

align_corner
align_corner

opencv, PIL的align_corner为False, mxnet为True,而torch和tensorflow可以设置。

Reference

https://www.freesion.com/article/9926552179/
https://zhuanlan.zhihu.com/p/407963223
https://zhuanlan.zhihu.com/p/87572724?from_voters_page=true

posted @ 2022-01-07 13:45  bairuiworld  阅读(1234)  评论(0编辑  收藏  举报