align_corners 的意义

align_corners 的意义上采样层 upsamplelaye 是语义分割等密集输出 densepredict 任务的必备组件 一般默认选择双线性插值 bilinear 或者最近邻 nearest 的方式 这两种方式在 pytorch 的 interpolate 函数中均有实现 关于它们如何实现 已有好多博客解读 但是 bilinear 情况下 会伴随一个选项 align corners 默认为 False 关于这个选项的含义 pytorch1 3 1 官网是如下解释的 这个解释看起来令人似懂非懂

在这里插入图片描述
上采样层 (upsample layer),是语义分割等密集输出 (dense prediction) 任务的必备组件。一般默认选择双线性插值 (bilinear) 或者最近邻 (nearest) 的方式。这两种方式在 pytorch 的 interpolate 函数中均有实现。关于它们如何实现,已有好多博客解读。但是 bilinear 情况下,会伴随一个选项 align_corners,默认为 False。关于这个选项的含义,pytorch 1.3.1 官网是如下解释的:

在这里插入图片描述

这个解释看起来令人似懂非懂。相比之下,pytorch 0.4.1 的解释更为模糊:

在这里插入图片描述

与此同时,熟悉语义分割任务的同学,会发现输入大小通常会设置为 8 的倍数加 1,比如 513 (PASCAL VOC) 或者 769 (Cityscapes)。好多同行会有这种疑惑:为什么不直接设置成 8 的倍数?

本文期望对如上问题做一个全面的解读。笔者当时遇到这个问题时,全网没有一个友好的解释,只能自己去打印出来思考。根据笔者了解,本文是第一篇解读 align_corners 的中文博文。目前在 pytoch forem 有了一些相关的讨论,不过笔者写作本文时 尚不了解。本文还会对现有 libraries 插值是否 align_corners 做一个总结。看完本文后,相信读者能够全面理解这两个问题。

在接下来的图文中,我们默认以红色表示原图,蓝色表示插值上采样两倍后的图片。

首先介绍 align_corners=False,它是 pytorch 中 interpolate 的默认选项。这种设定下,我们认定像素值位于像素块的中心,如下图所示:

在这里插入图片描述

在这里插入图片描述

这里像素之间毫无对齐的美感,强迫症看到要爆炸。事实上,在 align_corners=True 的世界观下,上图的画法是错误的。在其世界观里,像素值位于网格上,如下图所示:

在这里插入图片描述

下面,我们同时展示两种方法的示例图:

在这里插入图片描述
对于密集输出任务,“整整齐齐”才是王道。对于语义分割任务等,我们最优的选择是 align_corners=True 以及输入尺寸 8 的倍数加 1。这里 8 是因为 dilated ResNet 下采样 8 倍。

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

如上,我们讨论了上采样的选择。那么,我们对图像处理时,理想情况下,下采样也应该选择对应的方式。既然上采样 align_corners=True,下采样也理应 align_corners。接下来,我们调研下几个流行的图像处理库,看下它们的实现是用了哪种设置。对于输入 [[1, 2], [3, 4]]:

在这里插入图片描述

我们发现,cv2、PIL的插值都是 align_corners=False;MXNet 默认 True。而 pytorch 和 tensorflow 都是可选。为了保持和下采样时的操作对应一致,笔者建议大家进行密集输出任务的图像预处理时 (尤其是 resize 操作),放弃官方的 transform (PIL 实现) 以及 cv2 的实现,转而使用 pytorch 自己实现一份。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208157.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:13
下一篇 2026年3月19日 下午12:13


相关推荐

  • linux配置ntp时间同步客户端(小红帽系统怎么关闭程序)

    NTP网络时间服务器在LINUX系统设置方法(小红帽版)NTP网络时间服务器在LINUX系统设置方法(小红帽版)第一种方法:1.Linux系统使用命令行配置:在Linux上面执行ntpdate:ntpdate1Array2.168.0.1#1Array2.168.0.1是NTP服务器的IP2.使用hwclock命令,把时间写入bioshwclock-w如果想定时进行时间校准,可以使用crond服务来定时执行。编辑/etc/crontab文件加入下面一行:308**

    2022年4月10日
    78
  • 初识 CTK[通俗易懂]

    初识 CTK[通俗易懂]CTK是什么CTK为支持生物医学图像计算的公共开发包,其全称为CommonToolkit。Github地址:https://github.co…

    2022年5月3日
    115
  • 新手如何快速上手双拼,提高打字速度-by小鹤双拼输入法QQ群友-弧

    新手如何快速上手双拼,提高打字速度-by小鹤双拼输入法QQ群友-弧新手如何快速上手双拼,提高打字速度-by小鹤双拼输入法QQ群友-弧更新时间:2013-5-30新手如何快速上手双拼,提高打字速度首先说明,此文仅供参考,每个人需要选择适合自己的方法~纵然效率很重要,终究多练是王道。亲们加油吧……一个月从零开始到速度过百真心不难的。第一,双拼方案选择。(1)如果你已经熟练了某种双拼方案,其实没什么必要去更换——条件反射的更改比建立还要难,需要一…

    2022年6月16日
    49
  • 净推荐值(NPS):用户忠诚度测量的基本原理及方法

    净推荐值(NPS):用户忠诚度测量的基本原理及方法文章分享了一个衡量用户与产品或服务之间关系的指标:NPS,干货满满,希望对你有益。初识NPS作为互联网行业的用户体验从业者,我们都或多或少会接触一些衡量用户与产品或服务之间关系的指标,常见的指标如活跃度、留存率、用户满意度等。近几年,NPS(NetPromoterScore净推荐值)在国内流行起来,越来越多的行业及企业开始使用NPS指标作为衡量用户口碑的工具,如通信服务行业的中国移…

    2022年6月14日
    104
  • Android基础篇 RelativeLayout.LayoutParams

    Android基础篇 RelativeLayout.LayoutParams一、前言RelativeLayout.LayoutParams是一个RelativeLayout的布局参数(1)初始化//包裹内容WRAP_CONTENTRelativeLayout.LayoutParamslayoutParams=newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);//全部内容M

    2022年7月17日
    19
  • fileinput.js php,fileinput

    fileinput.js php,fileinput$(“#uploadfile”).fileinput({theme:’explorer-fa’,uploadUrl:upload_url+”?catalog=9″,language:’zh’,overwriteInitial:false,initialPreviewAsData:true,maxFileCount:3,initialPreview:pics,initialPrev…

    2022年6月7日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号