回顾双线性插值上采样

双线性插值是分别在两个方向计算了共3次单线性插值,如图所示,先在x方向求2次单线性插值,获得R1(x, y1)、R2(x, y2)两个临时点,再在y方向计算1次单线性插值得出P(x, y)(实际上调换2次轴的方向先y后x也是一样的结果)。

文章目录

  • 回顾双线性插值上采样
  • 优化问题:中心对齐
    • 确定周围最近的四个点解决方案
    • 中心点对齐的缩放在卷积网络结构设计中的注意事项
  • 优化问题: align_corners 的原理
    • align_corners=True 对语义分割的中要求

优化问题:中心对齐

把3×3 的插值到4×4, 可能会有两种对齐方法。

对于图A:

  • 这张图是左上角为坐标系原点的情况,我们可以发现最左边x=0的点都会有概率直接复制到目标图像中(至少原点肯定是这样)

对于图B:

  • 这张图是右上角为坐标系原点的情况,我们可以发现最右面的点都会有概率直接复制到目标图像中(至少原点肯定是这样)

因此:采用不用的坐标系产生的结果是不一样的,而且无论我们采用什么坐标系,最左侧和最右侧(最上侧和最下侧)的点是不“公平的”,这是第一个问题。

把3×3 的插值到5×5:

上图:

  • 左侧是原图像(33),右侧是目标图像(55),原图像的几何中心点是(1, 1),目标图像的几何中心点是(2, 2),根据对应关系,目标图像的几何中心点对应的原图像的位置是(1.2, 1.2)
  • 目标图像的原点(0, 0)点和原始图像的原点是重合的,但是目标图像的几何中心点相对于原始图像的几何中心点偏右下,那么整体图像的位置会发生偏移,1个像素点跟相邻像素点的值的渐变或者突变形成图像颜色的渐变或者边界,所以参与计算的点相对都往右下偏移会产生相对的位置信息损失。这是第二个问题。

确定周围最近的四个点解决方案

几何中心点重合

中心点对齐的缩放在卷积网络结构设计中的注意事项

https://blog.csdn.net/xiaojiajia007/article/details/100150726

  • OpenCV缩放图片是基于中心点对齐的,
  • Pytorch中 mode=‘bilinear’, align_corners=False 与OpenCV中的保持一致,
  • Pytorch中 mode=‘bilinear’, align_corners=True 与TensorFlow中的align_corners=True的条件下保持一致。

tf的resize_bilinear并未中心对齐,坐标计算方式为

align_corners=False:

srcX=dstX* (srcWidth/dstWidth) ,
srcY = dstY * (srcHeight/dstHeight)

align_corners=True:

srcX=dstX* (srcWidth-1/dstWidth-1) ,
srcY = dstY * (srcHeight-1/dstHeight-1)

优化问题: align_corners 的原理

align_corners = True时,像素被视为网格的格子上的点,拐角处的像素对齐.可知是点之间是等间距的
align_corners = False时, 像素被视为网格的交叉线上的点, 拐角处的点依然是原图像的拐角像素,但是差值的点间却按照上图的取法取,导致点与点之间是不等距的

我们默认以红色表示原图,蓝色表示 bilinear 上采样两倍后的图片。

首先介绍 align_corners=False,首先观察绿色框内的像素,我们会发现它们严格遵守了 bilinear 的定义。

  • 而对于角上的四个点,其像素值保持了原图的值。
  • 边上的点则根据角点的值,进行了 bilinear 插值。

所以,我们从全局来看,align_corners=False 内部和边缘处采用了比较不同的规则。

align_corners=True 里,像素值位于网格上:

  • 会发现,3∗33*33∗3的图像上采两倍后,变成了 5∗55*55∗5。
  • 更广泛地来讲,对于输入尺寸是(2x+1)∗(2x+1)(2x+1) * (2x+1)(2x+1)∗(2x+1) 的图片,其经过 align_corners=True 的上采样后,尺寸变为 (4x+1)∗(4x+1)(4x+1) * (4x+1)(4x+1)∗(4x+1)。

align_corners=True 对语义分割的中要求

对于语义分割任务等,我们最优的选择是 align_corners=True 以及输入尺寸的倍数加 1。

align_corners=True 配合 n∗x+1n*x+1n∗x+1 的尺寸,可以相对于 aling_corners=False 配合 n∗xn*xn∗x 的尺寸,减少内插的数目,并且避免外插。

从数值上来说,无论 True 还是 False,对于中间的像素,插值计算都是没有问题的。但是 False 的情况会对边角不友好。对于目标检测,鉴于少有物体中心出现在边角,所以影响不大;而 False 带来的整数倍上下采样,又方便了坐标值的计算。但是对于语义分割,边角像素也要纳入 mIoU 的计算,会对最终精度造成明显的影响 (0.5 in mIoU)。

如上,我们讨论了上采样的选择。那么,我们对图像处理时,理想情况下,下采样也应该选择对应的方式。既然上采样 align_corners=True,下采样也理应 align_corners。

  • cv2、PIL的插值都是 align_corners=False;OpenCV还进行了很多速度上的优化,比如用整形计算代替浮点数计算。
  • MXNet 默认 True。
  • 而 pytorch 和 tensorflow 都是可选。

为了保持和下采样时的操作对应一致,笔者建议大家进行密集输出任务的图像预处理时 (尤其是 resize 操作),放弃官方的 transform (PIL 实现) 以及 cv2 的实现,转而使用 pytorch 自己实现一份。

综上,我们分析了 align_corners 的原理,解释了输入尺寸设置为奇数的原因。并且笔者根据分析,推荐使用 pytorch 实现预处理中的 resize。

参考:https://zhuanlan.zhihu.com/p/87572724

可以明显的看到align_corners=True的时候,角点是对齐状态。而align_cornels=False的时候,角点并没有对齐。

用代码去描述上述的区别为

# align_corners = False
# x_ori is the coordinate in original image
# x_up is the coordinate in the upsampled image
x_ori = (x_up + 0.5) / factor - 0.5
# align_corners = True
# h_ori is the height in original image
# h_up is the height in the upsampled image
stride = (h_ori - 1) / (h_up - 1)
x_ori_list = []
# append the first coordinate
x_ori_list.append(0)
for i in range(1, h_up - 1):x_ori_list.append(0 + i * stride)
# append the last coordinate
x_ori_list.append(h_ori - 1)

参考自:
https://discuss.pytorch.org/t/what-we-should-use-align-corners-false/22663/6
https://zhuanlan.zhihu.com/p/87572724

【上采样问题】双线性插值的几何中心点重合与align_corners相关推荐

  1. 学无疑物-上采样之双线性插值法详解

    什么是插值 Interpolation is a method of constructing new data points within the range of a discrete set o ...

  2. 反卷积(Deconvolution)、上采样(UNSampling)与上池化(UnPooling)加入自己的思考(pytorch函数)(三)

    ps:最近在做分割在github上找代码看模型时老发现尺度从小到大那部分,有的是采用上采样(双线性插值)+卷积,有的用反卷积.为什么不相同能,我查阅相关资料发现这位知乎大神根据外网大佬文章总结原因.知 ...

  3. 上采样(放大图像)和下采样(缩小图像)(最邻近插值和双线性插值的理解和实现)

    上采样和下采样 什么是上采样和下采样? • 缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有 两个:1.使得图像符合显示区域的大小:2.生成对应图像的缩略 ...

  4. opencv:用最邻近插值和双线性插值法实现上采样(放大图像)与下采样(缩小图像)

    上采样与下采样 概念: 上采样: 放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的 是放大原图像,从而可以显示在更高分辨率的显示设备上. 下采样: 缩 ...

  5. 深度学习上采样下采样概念以及实现

    #pic_center =400x 系列文章: 文章目录 参考博客 概念 上采样 下采样 实现 上采样 下采样 参考博客 [深度学习]上采样,下采样,卷积 torch.nn.functional.in ...

  6. 线性插值改变图像尺寸_图像分割--gt;上采样的那些事

    在图像分割中,因为FCN的提出,上采样操作成为了分割中不可或缺的部分.上采样就是将提取到的feature map还原到原始分辨率大小的操作,但是这里要注意的是上采样不是下采样的逆过程,也就是说上采样输 ...

  7. 上采样,重采样和下采样,降采样

    一.上采样(重采样) 1.上采样就是重采样也就是放大图像,通常使用的目的是 (1)使图片达到更高的分辨率 (2)再经过pooling后上采样可以放大信息,循环迭代可以不断增强有用信息 2. 上采样原理 ...

  8. 图像的上采样(upsampling)与下采样(subsampled)

    参考: http://blog.csdn.net/majinlei121/article/details/46742339 http://blog.csdn.net/augusdi/article/d ...

  9. 上采样之双线性插值法

    上采样之双线性插值法 One:上采样的定义 上采样的类型: 一.双线性插值: 二.转置卷积 : 三.上采样(unsampling) 四.上池化(unpooling) 总结: tow:具体的讲解双线性插 ...

  10. python图像下采样_图像的上采样(upsampling)与下采样(subsampled)

    缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1.使得图像符合显示区域的大小:2.生成对应图像的缩略图. 放大图像(或称为上采样(upsampli ...

最新文章

  1. MATLAB中文件的读写和数据的导入导出
  2. UIDatePicker | 时间选择器
  3. MATLAB 2018a软件安装教程
  4. Hadoop2常用Shell命令
  5. DCMTK:类DcmUnsigned64bitVeryLong的测试程序
  6. python-pandas 高级功能(通过学习kaggle案例总结)
  7. 考上MBA,为自己装一双翅膀
  8. AForge.net库类下载方式
  9. cordova弹框插件 cordova-plugin-dialogs
  10. CF106C Buns动态规划解决多重背包
  11. 项目简要建设情况汇报材料报告
  12. Android 语音识别+语音搜索源码 Voice Search
  13. mysql where 条件取反_MySQL搜索: WHERE 多条件
  14. redis数据类型及常用数据操作
  15. php http 缓存,HTTP 缓存中的 Vary
  16. 程序员是青春饭吗?30岁后的发展方向和突破
  17. 新坑--阿里云图库引入
  18. linux下和嵌入式linux下通过udp接收来自vlc播放器的视频并转发播放
  19. html显示时钟 翻页 js,js css3翻页数字时钟代码
  20. VMware WorkStation 8序列号

热门文章

  1. Linux系统下Postgresql数据库安装
  2. android schedule 参数,android – requestLocationUpdates minTime参数的用途
  3. Android Studio如何Debug对应so文件C/C++代码
  4. 仅能帮的(非技术分享)
  5. MacBook pro HTML 编写,老司机血泪劝告:买MacBook Pro一定不要买顶配!
  6. Qt利用avilib实现录屏功能_如何找到电脑录屏功能?4种方法教你一键打开,不会用来学一学...
  7. python 生成器_Python生成器
  8. 机器学习和深度学习_人工智能、机器学习和深度学习三者关系?
  9. SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 及动态查询中的标识符函数QUOTENAME
  10. matlab对比r语言,R语言与matlab循环时间对比