卷积核膨胀(dilation)解析

article/2025/11/6 12:54:30

本文转自http://blog.csdn.net/tangwei2014和https://blog.csdn.net/jiongnima/article/details/69487519,转载目的便于自己查看学习

第一位大神解析:

deeplab发表在ICLR 2015上。论文下载地址:Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS.

  1. deeplab方法概述
    deeplab方法分为两步走,第一步仍然采用了FCN得到 coarse score map并插值到原图像大小,然后第二步借用fully connected CRF对从FCN得到的分割结果进行细节上的refine。(有关FCN的内容介绍,可以参考我的前面得一篇博客:http://blog.csdn.net/tangwei2014/article/details/46882257)
    下面这张图很清楚地展示了整个结构:
    这里写图片描述
    然后这张图展示了CRF处理前后的效果对比,可以看出用了CRF以后,细节确实改善了很多:
    这里写图片描述

  2. deeplab对FCN更加优雅的处理方式
    在第一步中,deeplab仍然采用了FCN来得到score map,并且也是在VGG网络上进行fine-tuning。但是在得到score map的处理方式上,要比原FCN处理的优雅很多。
    还记得CVPR 2015的FCN中是怎么得到一个更加dense的score map的吗? 是一张500x500的输入图像,直接在第一个卷积层上conv1_1来了一个100的大padding。最终在fc7层勉强得到一个16x16的score map。虽然处理上稍显粗糙,但是毕竟人家是第一次将图像分割在CNN上搞成end-to-end,并且在当时performance是state-of-the-art,也很理解。
    deeplab摒弃了这种做法,取而代之的是对VGG的网络结构上做了小改动:将VGG网络的pool4pool5层的stride由原来的2改为了1。就是这样一个改动,使得vgg网络总的stride由原来的32变成8,进而使得在输入图像为514x514,正常的padding时,fc7能得到67x67的score map, 要比FCN确实要dense很多很多。
    但是这种改变网络结果的做法也带来了一个问题: stride改变以后,如果想继续利用vgg model进行fine tuning,会导致后面filter作用的区域发生改变,换句话说就是感受野发生变化。这个问题在下图(a) (b)中通过花括号体现出来了:

  3. Hole算法
    于是乎,作者想出了一招,来解决两个看似有点矛盾的问题:
    既想利用已经训练好的模型进行fine-tuning,又想改变网络结构得到更加dense的score map.
    这个解决办法就是采用Hole算法。如下图(a) (b)所示,在以往的卷积或者pooling中,一个filter中相邻的权重作用在feature map上的位置都是物理上连续的。如下图(c)所示,为了保证感受野不发生变化,某一层的stride由2变为1以后,后面的层需要采用hole算法,具体来讲就是将连续的连接关系是根据hole size大小变成skip连接的(图(c)为了显示方便直接画在本层上了)。不要被(c)中的padding为2吓着了,其实2个padding不会同时和一个filter相连。
    pool4的stride由2变为1,则紧接着的conv5_1, conv5_2和conv5_3中hole size为2。接着pool5由2变为1, 则后面的fc6中hole size为4。
    这里写图片描述

 

第二位大神解析:

原作者解析caffe的卷积层时,在conv_layer.cpp中有一个卷积核膨胀操作,在conv_layer.cpp的第17行有如下代码

 

const int kernel_extent = dilation_data[i] * (kernel_shape_data[i] - 1) + 1;


   上面的代码描述了卷积核的膨胀操作,我们不妨来做个假设,卷积核为3*3的,膨胀系数为2,那么,卷积核膨胀之后,卷积核的单边尺寸就变成了2*(3-1)+1,即卷积核的尺寸变成了5*5,笔者在最初看到这一行代码的时候相当疑惑,不太明白卷积核由3*3变成5*5是怎么操作的,这个时候,caffe.proto就起了作用,我们打开caffe.proto,找到卷积层的参数定义,在message ConvolutionParameter中,找到关于dilation的定义如下

  // Factor used to dilate the kernel, (implicitly) zero-filling the resulting// holes. (Kernel dilation is sometimes referred to by its use in the// algorithme à trous from Holschneider et al. 1987.)repeated uint32 dilation = 18; // The dilation; defaults to 1


   在caffe.proto中,阐述了卷积核膨胀的使用情景,即在à trous算法中,这是一个有关小波分析的算法。卷积核膨胀是将卷积核扩张到膨胀尺度约束的尺度中,并将原卷积核没有占用的区域填充零,为了使说明更加形象,下面笔者绘制卷积核膨胀示意图为大家解析一下卷积核膨胀操作:

   在上面的示意图中,卷积核由3*3膨胀到了5*5,读者朋友们可以看到,膨胀后的卷积核中填充了一些0,读者朋友们可以试着画出其他尺寸的卷积核搭配不同膨胀系数的膨胀效果,而具体的膨胀操作是在img2col中实现的,img2col.cpp笔者将在后话解析。

   下面笔者分析一下膨胀系数与卷积核膨胀的关系,首先回到卷积核膨胀公式:

膨胀的卷积核尺寸 = 膨胀系数 * (原始卷积核尺寸 - 1) + 1

   首先由于卷积的操作特性,卷积核尺寸是奇数,则原始卷积核尺寸减一为偶数。那么,在上述公式中,膨胀系数*偶数-1为奇数,保证了膨胀的卷积核尺寸为奇数。其次,笔者认为,卷积核的膨胀系数刻画了卷积核高和宽方向的扩张倍数,可将上述公式看作:

膨胀的卷积核尺寸 - 1 = 膨胀系数 * (原始卷积核尺寸 - 1)

   到此为止,卷积核膨胀就解析完毕了,通过对卷积核膨胀的理解,笔者感受到,在阅读源码不明白时,尤其在对卷积这种抽象的操作中的细节不明白时,可以动笔画一画,将不形象转为形象,问题就迎刃而解了!

 


http://chatgpt.dhexx.cn/article/SVkSlLiG.shtml

相关文章

【DL】卷积膨胀 Dilation

Backto DeepLearning Index dilation dilation 是对 kernel 进行膨胀,多出来的空隙用 0 padding。用于克服 stride 中造成的 失真问题。 对应关系是 k d = ( k − 1 ) d + 1 k_{d} = (k -1)\times d + 1 kd​

Pytorch中dilation(Conv2d)参数详解

目录 一、Conv2d 二、Conv2d中的dilation参数 一、Conv2d 首先我们看一下Pytorch中的Conv2d的对应函数(Tensor通道排列顺序是:[batch, channel, height, width]): torch.nn.Conv2d(in_channels, out_channels, kernel_size, str…

Linux的入门

文章目录 1 Linux应用场景2 Linux的应用领域2.1 个人桌面的应用2.2 服务器领域2.3 嵌入式领域 3 Linux 介绍4 Linux 和 Unix 的关系4.1 Linux 的由来:4.2 Linux 与 Unix 的关系 5 安装 vm 和CentOS5.1 基本说明5.2 网络连接的理解 6 虚拟机克隆7 虚拟机快照8 虚拟机…

Linux 快速入门到实战【一】

一、操作系统概述 1. 计算机原理 ​ 现代计算机大部分都是基于冯.诺依曼结构,该结构的核心思想是将程序和数据都存放在计算机中,按存储器的存储程序首地址执行程序的第一条指令,然后进行数据的处理计算。 ​ 计算机应包括运算器、控制器、…

linux快速入门 --- 常用指令 学习

目录 为什么要学Linux? Linux的安装 安装 使用finalshell连接虚拟机 了解一下Linux的目录结构(不需要记忆) Linux中常用的命令(重点) Linux命令初体验--几个常用命令 Linux命令格式 显示指定目录下的内容 ls和…

Linux命令快速入门

Linux命令初体验----01几个常用命令 序号命令对应英文作用1lslist查看当前目录下的内容2pwdprint work directory查看当前所在目录3cd[目录名]change directory切换目录4touch[文件名]touch如果文件不存在,新建文件5mkdir[目录名]make directory创建目录6rm[文件名…

如何快速入门并轻松简单的学习Linux?

首先,写这篇文章的初衷是写给那些想学习linux,并真正想用它做些有意义事情的人。希望能帮助初学者找到正确的学习linux思维或者方向。 1、做好思想准备 如果你想系统的学习linux,你必须做好思想准备。如果你真正想系统的学习linux&#xff0c…

linux基础-快速入门

主要内容介绍 1、LINUX操作系统安装及初始化配置(熟悉); 2、LINUX操作系统目录组成结构及文件级增删改查操作(重点); 3、LINUX操作系统用户、权限管理(重点); 4、开源软…

Linux快速入门打开你的学习之道

附Java/C/C/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50本(珍藏版) ②【算法…

快速入门:LINUX基础 ——教你使用 linux 操作

文章目录 一、LINUX介绍二、环境搭建三、如何在LINUX下做开发1.LINUX 中—vi的使用 四、LINUX常用初级指令介绍和使用五、Linux虚拟机和windows间的文件传输方式LINUX和WINDOWS文件共享 六、VMware虚拟接网络连接的三种方式LINUX虚拟机网络配置: 七、Linux线程概念引…

Linux 入门

Linux 入门 一、Linux简介 1.Linux介绍 Linux 是一种自由和开放源码的类 UNIX 操作系统。 Linux 英文解释为 Linux is not Unix。 Linux 是在 1991 由林纳斯托瓦兹在赫尔辛基大学上学时创立的,主要受到 Minix 和 Unix 思想的启发。 Linux 内核最初只是由芬兰人…

【Linux快速入门】文件目录操作

文章目录 概念1. Linux文件系统概述2. Linux文件目录结构3. Linux文件和目录操作3.1 文件操作3.1.1 创建文件3.1.2 复制文件3.1.3 移动文件3.1.4 删除文件3.1.5 查看文件3.1.6 输出指令3.1.7 >和>>指令 3.2 目录操作3.2.1 创建目录3.2.2 复制目录3.2.3 移动目录3.2.4 …

liunx快速入门

文章目录 第一章、Liunx基础知识1.1 Liunx和Windows和区别1、操作和配置:2、Liunx命令提示符:3、Liunx命令格式:4、Liunx和Windows的用户和密码:5、Liunx中用户和组:6、Liunx和Windows浏览文件:7、Liunx和Windows软件的…

入门必备 | 零基础如何快速入门Linux?

-------首先我们还是来普及以下概念,讲点虚的。现在是图形系统的天下,windows我们用了20年。成功归功与它图形界面,你会点鼠标吗你会敲键盘吗?所以你会上网会聊天会玩游戏了。 第一步 选个linux系统 -------现在发行的Linux系统很多redhat&a…

[Linux](2)快速入门Linux基础指令

文章目录 ls 指令(list files)pwd 指令(print work directory)cd 指令(change directory)定位文件(路径)cd 指令的使用 touch 指令mkdir 指令(make directory)rmdir 指令、rm 指令(remove)man 指令cp 指令(copy file)mv 指令(move file)cat 指令(concatenate)more 指令、less 指…

快速入门linux基本操作大全

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、 支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和 64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能…

【Linux】快速入门法宝~你值得拥有

查阅命令帮助信息 man man是manual的缩写,是Linux提供的一个手册,包含了绝大部分的命令、函数的详细使用 man的操作建 操作键功能说明空格键显示手册的下一屏内容回车键一次滚动手册页的一行b回滚一屏f前滚一屏q退出/内容搜索/后面的内容↑、↓向上或向…

Linux 系统如何快速入门?分享民工哥总结的经验

我应该如何入门Linux系统运维?Linux系统运维到底需要学哪些技术?怎么学?系统、服务报错了,如何处理?为什么监控系统不报警,或报警没有通知…?数据库丢数据了,如何恢复?如…

Linux快速入门之一(基础)

该篇解析Linux的基础理论和常用基本的命令操作 一.学习方式: 1.认识Linux(理解目录结构) 2.掌握常用的命令(文件管理、文件属性、目录管理、Vim编辑器、账号管理、磁盘管理) 3.软件的安装和部署(本章描述java、tomcat、docker的…

Linux基础开发工具快速入门

学习导航 一、软件包管理器yum1.linux如何进行安装2.什么是软件包3.yum如何安装程序(1)原理的感性理解(2)yum常用指令 二、Linux编辑器Vim的使用1.初步认识2.Vim命令模式下的批量化操作(1)复制粘贴(2)快速移动(3)修改 3.Vim底行模式下的操作 三、Linux编译器gcc、g的使用1.预处…