Decoders对于语义分割的重要性 | CVPR 2019

「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑
作者 | Lin-Zhuo Chen
转载自博客
链接:https://linzhuo.xyz/posts/DUpsample/
今天为大家推荐一篇 CVPR2019 关于语义分割的文章 Decoders Matter for Semantic Segmentation: Data-Dependent Decoding Enables Flexible Feature Aggregation,该文章提出了一种不同于双线性插值的上采样方法,能够更好的建立每个像素之间预测的相关性。得益于这个强大的上采样方法,模型能够减少对特征图分辨率的依赖,能极大的减少运算量。该工作在 PASCAL VOC 数据集上达到了 88.1% 的 mIOU,超过了 DeeplabV3 + 的同时只有其 30% 的计算量。
论文传送门:https://arxiv.org/abs/1903.02120
1. Introduction
在之前的语义分割方法中,双线性插值通常作为其最后一步来还原特征图的分辨率,由于非线性差值不能建立起每个像素的预测之间的关系,因此为了得到精细的结果,对特征图的分辨率要求较高,同时带来了巨额的计算量。
为了解决这个问题,本工作提出了 Data-dependent Up-sampling (DUpsample),能够减少上采样操作对特征图分辨率的依赖,大量的减少计算量。同时得益于 DUpsample, Encoder 中的 low-level feature 能够以更小的运算量与 Decoder 中的 high-level feature 进行融合,模型结构如下所示:
我们可以看到,该网络将传统的非线性插值替换成 DUpsample,同时在 feature fuse 方面,不同于之前方法将 Decoder 中的特征上采样与 Encoder 特征融合,本工作将 Encoder 中的特征下采样与 Decoder 融合,大大减少了计算量 ,这都得益于 DUpsample。
2. Our Approach
之前的语义分割方法使用下列公式来得到最终的损失:
其中 Loss 通常为交叉熵损失,F 为特征图,Y 为 ground truth,由于双线性插值过于简单,对特征图 F 的分辨率较高,因此引入了大量的计算。一个重要的发现是语义分割输入图像的 label Y 并不是 i.i.d 的,所以 Y 可以被压缩成 Y′,我们令, 并将 Y 划分成
的子窗口,每个子窗口的大小为 r×r,接着我们将每个子窗口
拉伸成向量
,其中
,随即我们将向量 v 压缩成低维向量 x,我们使用线性投影来完成,最后,我们有:
,其中
,用来将 v 压缩成 x,
为 reconstruction matrix, v′为重建后的 v,我们可以用压缩后的向量 x 组合成 Y′.
矩阵 P 和矩阵 W 可以通过最小化下列式子得到:
我们可以使用梯度下降,或者在正交约束的条件下使用 PCA 求解。
使用压缩后的 Y′为目标,我们可以使用下列损失函数来预训练网络:
另一种直接的方法是在 Y 空间计算 loss,也就是并非将 Y 压缩到 Y′, 我们可以将 F 使用 W(上面预训练得到的)上采样然后计算损失,公式如下:
其中以两倍为例,DUpsample 的操作如下图所示:
我们可以用 1X1 卷积来完成上述的权重与特征相乘的过程。但是当我们将这个模块嵌入到网络时会遇到优化问题。因此我们使用 softmax with temperature 函数来解决这个问题:。
我们发现 T 可以使用梯度下降学习得到,这样减少了调试的麻烦。
有大量的工作说明,与 low-level features 结合可以显著的提升分割的精度,其做法如下:,
f 是在上采样之后的卷积操作,其计算量依赖于特征图的空间大小,这样做会显著增加计算量。得益于 DUpsample,我们可以使用下列操作来减少计算量:
,
这样做不仅保证了在低分辨率下的有效性,而且减少了计算量,同时允许任意 level feature 的融合。
只有使用了 DUpsample,上述操作才变得可行,否则语义分割的精度会被双线性插值限制。
3. Experiments
本次实验使用以下两种数据集:PASCAL VOC 2012 和 PASCAL Context benchmark。我们使用 ResNet-50 或 Xception-50 作为我们的 backbone,具体训练细节详见论文。
首先我们设计实验说明双线性插值的上限远远低于 DUpsample。首先我们搭建一个简易网络实现 auto-encoder,其中上采样方式分别使用双线性插值与 DUpsample, 输入分别为 ground_truth,得到下表中的 mIOU*,这个指标代表上采样方法的上限。同时我们使用 ResNet50 作为主干网络,输入为 raw image 去实现语义分割,得到下表中的 mIOU:
通过上表我们可以发现:
1) 在相同条件下,DUpsampling 效果优于 bilinear。
2)DUpsampling 在 output_stride=32 的情况下效果与 bilinear 在 output_stride=16 的情况下结果相当。
接下来我们设计实验说明融合不同的 low-level 特征对结果的影响,如下表所示:
值得说明的是,并不是所有与 low-level feature 的融合都会提升结果,例如 conv1_3,因为其结果不够鲁棒。因此和什么 low-level feature 相结合对语义分割的结果有很大的影响。
接下来我们设计实验与双线性插值进行比较:
可以看到我们的方法优于传统的双线性插值上采样方法。同时我们验证了不同的 softmax 对结果的影响,在没有使用 softmax with tenperature 的情况下只有 69.81 的 mIOU(这里没设置消融实验有些疑惑,感觉不同的 softmax 对实验结果影响挺大的)。
最后将我们的方法与最新的模型进行比较,结果如下(分别为 PASCAL VOC 与 PASCAL context):
我们的方法在只用 deeplabv3+ 30% 的计算量的情况下,超越了当前所有的方法。
总的来说,我觉得这个论文提出的想法很有趣,是一篇很有 insight 的论文。
由于论文现在还没有开源,笔者尝试实现了一下 DUpsample 的操作和网络:
https://github.com/LinZhuoChen/DUpsampling。
目前还在建设中,欢迎大家关注和 star。
(*本文是AI科技大本营转载文章,转载请联系原作者)
◆
精彩推荐
◆
推荐阅读:
NLP泰斗董振东老师与他的知网 | 纪念
线下沙龙 | 2019如何学Python?这里有你需要的答案
10行代码,用Python写一个USB“病毒”?
Python官方中文文档上线,Pythoner快收藏福利!
JavaScript 力压 Java 成最受欢迎编程语言,TypeScript 大涨!
工作 996,生病 ICU!这一次,程序员不忍了!
“V神给了我1000个ETH, 我用来招了两个程序员” 独立开发者做到极限就是Paul Hauner | 人物志
阿里带火的中台,究竟是个啥?
曝光!月薪5万的程序员面试题:73%人都做错,你敢试吗?
❤点击“阅读原文”,查看历史精彩文章。
相关文章:

【Go】Go基础(八):结构体和方法
一、 结构体(struct) 1、结构体定义 type identifier struct {field1 type1field2 type2... }声明:new(Type) 和 &Type{}是等价的 2、初始化结构体 type Interval struct {start intend int }初始化方式: intr : Inter…

Windows 2008 R2 SP1部署Lync2010企业版(四)
9 部署存档和监控服务器 1) 以域管理身份登录SQL01服务器。 2) 单击“开始”,依次指向“程序”、“管理工具”,然后单击“服务器管理器”显示服务器管理器。 3) 单击“添加功能”启动“添加功能向导”,选择“消息队列”,下一步。 …

【Go】Go基础(九):接口(Interfaces)与反射(reflection)
一、接口(interfaces) 1、概述 接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。 通过如…

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger
原型链是JS的必备,作为ECMAScript4,原型链也是支持的。 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用。 本文旨在介绍如何使用原型链。 任意对象类型都有一个prototype属性,包括导入的Unity的A…

教育部发文35所高校新增AI本科专业!想回去重新高考
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑作者 | 琥珀出品 | AI科技大本营(ID:rgznai100)2019 年 3 月 28 日,教育部公布了 2018 年度普通高等学校本科专业备案和审批结果。消息一出&…

莱芜市公安局交警支队智能交通项目集成及容灾公开招标公告
莱芜市公安局交警支队智能交通建设项目公开招标公告 时间:2011-7-5 点击:249莱芜市公安局交警支队智能交通建设项目公开招标公告一、招标人名称:莱芜市公安局交警支队 联系方式:0634-5667998(吕老师)二、招标代理机构名称&#x…

【Go】Go基础(十):文件读写
一、读写数据 1、读取用户的输入 使用fmt 包提供的 Scan 和 Sscan 开头的函数; * Scanln 扫描来自标准输入的文本,将空格分隔的值依次存放到后续的参数内,直到碰到换行。 * Scanf 与其类似,除了 Scanf 的第一个参数用作格式字符…

怎样能拿到第一份编程工作?这里告诉你答案 | 码书
“写代码时,每次都要告诉自己:最后负责维护代码的,会是一个知道你住在哪的变态暴力狂。” ——约翰伍德(John Woods)拿下第一份编程工作需要付出更多努力,但是如果采纳下面的建议,应该不会有太大…

JSON知识点
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读…

asp常用函数(备忘)
1.数组长度: <% Dim grade,i gradesplit("1,2,5,10,20,50,100,200,500,1000",",") for i0 to ubound(grade) response.write grade(i)&"\n" next %> 2.获得插入的id set rs server.createobject(&q…

【leetcode】力扣刷题(1):两数之和(Go、Python)
一、问题描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums [2, 7,…

轻松练:如何从900万张图片中对600类照片进行分类|技术头条
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天,请扫码咨询 ↑↑↑作者 | Aleksey Bilogur译者 | 风车云马责编 | Jane出品 | AI科技大本营(公众号id:rgznai100)【导语】完成一个简单的端到端的机器学习模型需要几步&…

介绍两个好玩的和Github相关的Chrome扩展
1. Octotree 默认的github网页里的代码显示没有我们在IDE里看到的直观,即代码文件所在的文件夹无法以树形层级结构显示在屏幕左边。 安装Octotree之后: 方便多了。 2. Isometric Contributions github commit的统计页面比较平淡: 安装了Isome…

Schema约束模式实例
book.xsd <?xml version"1.0" encoding"UTF-8"?> <!-- xmlns:默认命名空间 xmlns:xs:当前的文档的标记来自http://www.w3.org/2001/XMLSchema命名空间 前缀:xs elementFormDefault:当前文档使用的标记必须是使用http://www.w3.…

【leetcode】力扣刷题(2):两数相加(go语言)
一、问题描述 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可…

“GANs之父”Ian Goodfellow被爆已从Google离职
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天,请扫码咨询 ↑↑↑整理 | 一一出品 | AI科技大本营(ID:rgznai100)3 月 28 日,深度学习大牛李沐在知乎爆料称,他从某机器学习大佬处获悉,…

Gulp快速入门教程
Gulp是基于流的前端自动化的构建工具,虽说如今是webpack盛行的时代,但是gulp和webpack整合效果更美味的,鱼与熊掌都可兼得哦!本文只介绍下Gulp的基本使用和一些常用的Gulp插件,废话不多说,一起来看看吧。 g…

linux 防火墙 命令
-- 永久设置防火墙(重启不恢复) 开启:chkconfig iptables on 关闭:chkconfig iptables off-- 暂时设置防火墙(重启后恢复) 开启:service iptables start 关闭:service i…

如何将TensorFlow Serving的性能提高超过70%?
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天,请扫码咨询 ↑↑↑译者 | Major出品 | AI科技大本营(ID:rgznai100)TensorFlow已经发展成为事实上的ML(机器学习)平台,在业界和研究领域都很流行。对TensorFlow…

【leetcode】力扣刷题(3):无重复字符的最长子串(go语言)
一、问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是…

单点登录与权限管理本质:session和cookie介绍
本篇开始写「单点登录与权限管理」系列的第一部分:单点登录与权限管理本质,这部分主要介绍相关的知识概念、抽象的处理过程、常见的实现框架。通过这部分的介绍,能够对单点登录与权限管理有整体上的了解,对其相关概念、处理流程、…

【.Net MF网络开发板研究-04】Socket编程之服务端
前几篇文章介绍了Http相关的应用,其实从技术角度而言,应该先介绍Socket编程,然后再介绍Http,毕竟Http是用Socket相关函数编程实现的。 .NET Micro Framework的Socket函数和桌面版.NET Framework中的函数完全兼容,换句话…

【Qt】Qt中调用python接口
在Qt程序中调用python函数从步骤 1、在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/lib/python3.4/config-3.4m-x86_64-linux-gnu -lpython3.42、添加python头文件 #undef slots #include <python3.4/Python.h> #define …

优雅的理解 call 和 apply 的使用方法
作者在看到一篇优雅的使用 js 的各种方法解决算法的时候产生的疑问,到底什么时候使用 apply 和 call 啦? 每次看到别人用 apply 和 call 其实从以前的懵懵懂懂到现在的明白,但是自己从来未下手去用过,最近比较闲。开始打一下 Jav…

何恺明等人提TensorMask框架:比肩Mask R-CNN,4D张量预测新突破
整理 | 刘畅、Jane 责编 | Jane 出品 | AI科技大本营(id:rgznai100) 看到今天要给大家介绍的论文,也许现在大家已经非常熟悉 Ross Girshic、Piotr Dollr 还有我们的大神何恺明的三人组了。没错,今天这篇重磅新作还是他们的产出&am…

init.rc的disabled含义
http://www.kandroid.org/android_pdk/bring_up.htmlhttp://androidnote.com/Article_show.asp?ArticleID649如果该服务选项中没有disabled定义,则在init.rc中解析到这个服务的时候,会马上执行这个服务。而如果在服务的选项中增加了disabled定义&#x…

【Qt】在ubuntu14.04上安装Qt5.12(失败)
注意 在ubuntu14.04上安装Qt5.12最终失败了,Qt5.12需要的libdbus库的版本和ubuntu14.04中的不一致,如果强行升级libdbus库版本,会导致系统桌面无法启动。 再次提示:不要按照下述步骤操作,它只是一个记录失败操作的笔记。 如果有大神安装成功了,还请不吝赐教。 1、安装Q…

80+机器学习数据集,还不快收藏
整理 | suiling 出品 | AI科技大本营(ID:rgznai100) 对于从事机器学习的小伙伴来说,机器学习必须以大量的数据为基础,否则构建再好的模型也不能达到你想要的效果。同时,不同质量的数据集也会影响到模型训练的效果。之…

SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署
前言 本篇文章引导你使用Jenkins部署[SpringBoot项目],同时使用Docker和Git实现简单的持续集成和持续部署。(项目地址:sso-merryyou) 流程图如下: push代码到Github触发WebHook。(因网络原因,本篇使用gitee…

LINUX下用C语言历遍目录 C语言列出目录
(被考了一题遍历目录,连需要的系统库函数我都不知道...打击中...)小羽给了一个答案:#include<stdio.h> #include<dirent.h>int main(int argc,char **argv) { DIR *p; struct dirent *dirp; if (argc ! 2) …