当前位置: 首页 > 编程日记 > 正文

CV07-DeepLab v3+笔记

目录

一、Dilated Convolution 膨胀卷积

二、ASPP与Encoder & Decoder

三、深度可分离卷积

3.1 深度可分离卷积原理

3.2 深度可分离卷积减小参数量和计算量

3.3 深度可分离卷积实现细节

四、Xception作为Backbone


DeepLab v3+笔记,记录一些自己认为重要的要点,以免日后遗忘。

论文地址:https://arxiv.org/abs/1802.02611

DeepLab v3+将特征提取阶段最后几个layer的conv(图片中黄色部分)变成了dilated conv,使分辨率不再降低,但增大感受野。也就是说这样在保留位置信息的同时,语义信息保持不变。

DeepLab v3+采用ASPP(Atrous Spatial Pyramid Pooling)空洞空间金字塔池化,用不同的感受野和上采样,实现多尺度提取特征。

DeepLab v3+采用深度可分离卷积,降低参数数列,提高计算效率。

复现DeepLabV3+的代码地址https://github.com/Ascetics/Pytorch-SegToolbox/blob/master/models/deeplabv3p.py

一、Dilated Convolution 膨胀卷积

Dilated Convolution膨胀卷积在语义分割(Deeplab v3+)、目标检测(SSD)、生成算法(pixelcnn)中都有广泛应用。

膨胀卷积与膨胀率

第一张图描述膨胀卷积过程。膨胀卷积是将卷积核变大,一个3×3的卷积核(深蓝色),膨胀为5×5卷积核,还是9个参数,但他们之间加入了空白(浅蓝色部分)。

第二、三、四图描述膨胀卷积率。当rate=1时,参数距离为1,这就是普通卷积;当rate=2时,参数距离为2,参数之间增加1个空白;当rate=3时,参数距离为3,参数之间增加2个空白……所以这个rate就是参数距离,rate-1就是参数间距。公式描述就是,其中i表示哪个像素的卷积操作,r是参数距离,k是哪个参数。

y[i]= \sum_{k} x[i+r\cdot k]w[k]

膨胀卷积输入输出维度大小公式。

\begin{aligned} input &: (N,C_{in},H_{in},W_{in})\\ output &: (N,C_{out},H_{out},W_{out})\\ H_{out}&=\left \lfloor \frac{H_{in}+2\times padding[0]-dilation[0]\times (kernel\_size[0]-1)-1}{stride[0]}-1 \right \rfloor\\ W_{out}&=\left \lfloor \frac{W_{in}+2\times padding[1]-dilation[1]\times (kernel\_size[1]-1)-1}{stride[1]}-1 \right \rfloor\\ \end{aligned}

膨胀卷积的same卷积加padding大小。

padding = dilation\times \frac{kernel\_size-1}{2}

膨胀卷积的感受野。在一张图上连续用dilation=1、dilation=2和dilation=4的卷积,感受野的变换对比。

  • 如果是dilation=1的3×3卷积,9个参数,也就是普通卷积,其感受野为3×3;
  • 如果是dilation=2的3×3卷积,9个参数,在前面dilation=1结果的基础上,其感受野为7×7;
  • 如果是dilation=4的3×3卷积,9个参数,在前面dilation=1和dilation=2的基础上,其感受野增大到15×15;
膨胀卷积与感受野

膨胀卷积的计算有2中实现方式。一种是根据上面的描述,在卷积核里面插入空白(也就是插入0)再卷积,这种方式效率低,一般不用。另一种方式是,在输入上等间隔采样(dilation间隔采样)计算,这种效率高。在pytorch中,膨胀卷积的API就是在Conv2d里面加上dilation参数来实现的,dilation就是膨胀率,默认dilation=1就是普通卷积。

二、ASPP与Encoder & Decoder

论文定义输入图像分辨率与输出图像分辨率比值为output stride,比如一次maxpool k=2就是output stride=2x。

先理解图中(a)说的SPP(Spatial Pyramid Pooling 空间金字塔池化),这里有篇博客把SPP讲的很清楚了https://www.cnblogs.com/marsggbo/p/8572846.html#commentform。

然后理解图中(b)说的Encoder-Decoder,这个办法U-Net里面用过,U-Net是每一次上采样都进行特征融合。

(空洞)空间金字塔池化 ASPP

再看图理解ASPP(Atrous Spatial Pyramid Pooling)。 就是图(a)和图(b)相结合得到了(c)这种Encoder-Decoder结构。注意图片里面的细节,ASPP的输出经过两次4倍上采样得到稠密估计,那么在实现的时候,也要考虑,如何从骨干网络里面找到相应的output stride为4x和16x的输出。ASPP有5个尺度。卷积可以局部提取特征,ImagePooling可以全局提取特征,多尺度特征融合。特征融合用concatenate的方法叠加,不是直接相加(FCN以后直接相加的方法很少了)。

DeepLab v3+

通过论文Fig2,来掌握整个DeepLab v3+的过程。Input经过骨干网络(backbone,也就是图中标注DCNN Atrous Conv的部分)得到两个输出:一个是low-level feature,这是个output=4x的输出;另一个是高级特征,给ASPP的输出,这是个output=16x的输出。

Encoder部分。高级特征经过ASPP的5个不同的操作得到5个输出,其中1个1×1卷积,3个不同rate的dillation conv,1个ImagePooling。这里要注意ImagePooling是全局平均池化之后再上采样到原来大小。这5个输出经过concatenate操作和1×1卷积得到output stride=16x的输出。

Decoder部分。两个输入分别操作:low-level featur经过1x1卷积调整维度(output stride=4x),论文4.1节介绍实验结果表明low-level feature调整到48 channels时效果最好;Encoder输出上采样4倍(output stride从16x变为4x)。将两个4x特征concatenate,后面接一些3×3卷积,再上采样4倍得到Dense Prediction。论文4.1节介绍实验结果表明decoder两个4x输出特征concatenate,后面接2个out_channels=256的3x3卷积,输出效果较好,可采用这种设计。

Decoder里面所有的Upsample都是用双线性差值。

注意backbone的选取,需要自己寻找output stride = 4x和16x的输出。

三、深度可分离卷积

3.1 深度可分离卷积原理

深度可分离卷积将普通卷积分成两步:

  • 第一步,每个channel单独做卷积,也就是图中(a)说的depthwise;
  • 第二步,将第一步卷积结果用1×1卷积夸channel组合起来,也就是图中(b)说的pointwise。

可以理解成为,第一步在每个通道做卷积,结果是channel数不变。第二步用1×1卷积调整channel数。

DeepLab v3+里面所说Atrous Separable Convolution指的是将深度可分离卷积的第一步改为dilation卷积。用于ASPP和Decoder部分。

深度可分离卷积、空洞深度可分离卷积

3.2 深度可分离卷积减小参数量和计算量

为什么深度可分离卷积可以减少参数呢?看图,普通卷积、分组卷积(N组) 、深度可分离卷积的示意图。深度可分离卷积把普通卷积变成空间卷积与通道卷积分开计算,解耦操作的相关性,减少了参数量和计算量,参数量公式对比看表格。目前在pytorch上还没有深度可分离卷积的API,但是可以自己实现,当group=in_channels=out_channels就相当于depth-wise conv,后面接一个1×1卷积就相当于point-wise conv。

三种卷积示意图
三种卷积参数数量对比

参数数量

Conv

in_channels=I,out_channels=O

kernel_size=K

K^{2}\times I\times O

Group Conv

in_channels=I,out_channels=O

kernel_size=K,groups=N

\frac{K^{2}\times I\times O}{N}

Depth-wise Conv + Point-wise Conv

in_channels=I,groups=I

out_channels=O,kernel_size=K

K^{2}\times I+I\times O

3.3 深度可分离卷积实现细节

在Xception论文里提到了深度可分离卷积的实现细节,通过实验在Depth-wise Conv和 Point-wise Conv之间不加ReLU效果最好,加了ELU或ReLU反而不好。实现的时候应当是BN→ReLU→Depth-wise→Point-wise,Depth-wise Conv和 Point-wise Conv之间不加ReLU和BN。

                    

四、Xception作为Backbone

论文第7页提出用改进的AlignedXception作为DeepLabV3+的骨干网络。

这里我们只记录AlignedXception的实现细节。

  1. 在Xcepition的Entry Flow中,所有的下采样MaxPool全部改为Stride=2的SeparableConv;
  2. 网络加深,Middle Flow中,Block由原来的重复8次改为重复16次;
  3. 最后一次下采样及以后的网络,要注意stride和dilation的选取。

为了实现代码复用,可以根据output_stride=8、16、32设置strides和dilations两个tuple。

  • strides[0]和dilations[0] 在Entry Flow的第三个block使用;
  • Middle Flow都不进行下采样,stride都等于1,dilation都使用dilations[1];
  • strides[1]和dilations[1] 在Exit Flow的block使用。

这里是复现的AlignedXception的代码https://github.com/Ascetics/Pytorch-SegToolbox/blob/master/backbones/aligned_xception.py

相关文章:

1116.加减乘除

题目描述:根据输入的运算符对输入的整数进行简单的整数运算。 运算符只会是加、减-、乘*、除/、求余%、阶乘!六个运算符之一。 输出运算的结果,如果出现除数为零,则输出“error”,如果求余运算的第二个运算数为0,也输出…

Flutter专题1-环境搭建

Flutter专题1-环境搭建和创建项目 这里以MaciOS为例,其他平台参考官网https://flutter.dev/docs/get-started/install 1. 系统要求 系统:macOS (64-bit) 硬盘空间:2.8G 工具:Git 2.获取Flutter SDK 2.1下载SDK,从https://flutter.dev/docs/development/tools/s…

ORB_SLAM2源码:ORBmatcher.cc

ORBmatcher.cc中的函数,主要实现(1)路标点和特征点的匹配(2D-3D点对)。(2)特征点和特征点的匹配(2D-2D点对)。SearchByProjection的函数重载看得我一脸懵逼。在这做一下笔…

iOS国际化技巧

参考链接:http://www.cocoachina.com/ios/20151120/14258.html http://www.jianshu.com/p/88c1b65e3ddb http://www.cnblogs.com/levilinxi/p/4296712.html http://www.cocoachina.com/appstore/20160310/15632.html http://www.cocoachina.com/ios/20170214/18681.html转载于:…

CV08-数据预处理与数据增强

复现车道线分割项目(Lane Segmentation赛事说明在这里),学习数据预处理和数据增强。学习分为Model、Data、Training、Inference、Deployment五个阶段,也就是建模、数据、训练、推断、部署这五个阶段。现在进入的是Data阶段。项目的…

ORB_SLAM2程序入口(System.cc)

程序入口 ORB_SLAM2的程序入口为src/System.cc。在CMakeList.txt中可知,ORB_SLAM2的可执行程序为: Examples/Stereo/stereo_kitti.cc等。 add_executable(stereo_kitti Examples/Stereo/stereo_kitti.cc) target_link_libraries(stereo_kitti ${PROJECT…

HDU 6229 Wandering Robots 找规律+离散化

题目链接:Wandering Robots 题解:先讲一下规律,对于每一个格子它可以从多少个地方来有一个值(可以从自己到自己),然后答案就是统计合法格子上的数与所有格子的数的比值 比如说样例的3 0格子上的值就是 3 4 …

app、H5、safari、appstore应用主页评分页之间拉起调用、打开手机某些系统功能、app打开文档

定义打开URL的方法 - (void)openURL:(NSString *)urlStr {NSURL *url [NSURL URLWithString:urlStr];UIApplication *app [UIApplication sharedApplication];if ([app canOpenURL:url]) { #ifdef __IPHONE_10_0[app openURL:url options:[NSDictionary dictionary] complet…

XML学习总结

1、XML结构 2、XmlNodeType值为一个枚举类型: 假设我们对一个XML文件进行遍历,不推断节点是否为Element类型。就会将文本节点遍历出来,出现#test。 3、XmlElement和XmlNode的差别:(摘自CSDN论坛) &#xff…

Linux01-基本操作与Shell

目录 一、环境 二、Linux目录结构及基本操作 2.1 Linux目录结构 2.2 基本操作 三、shell 3.1 shell的意义 3.2 su - 一、环境 2019年搞下RHCE的证书,但是一直没有整理Linux学习的笔记,为了不让到手的知识被遗忘,从今天起整理Linux学习…

ORB_SLAM2中Tracking线程的三种追踪方式

1、参考关键帧追踪模式 bool Tracking::TrackReferenceKeyFrame()对参考关键帧中的路标点进行跟踪。在Tracking线程中,每传入一帧,都会进行位姿优化。 以上一帧的位姿为当前位姿进行优化。 (1)计算当前帧的词袋 mCurrentFra…

nodejs 中间件 反向代理 接口转发

背景 随着后端业务系统的增加,纵向需求不断扩展,一个业务系统已经无法满足需求了,衍生出多个业务系统,对外暴露的ip、端口就可能有多个,此时不方便外部接口调用,有些特殊行业客户出于安全性考虑不发提供多…

oneinstack

https://oneinstack.com/转载于:https://www.cnblogs.com/diyunpeng/p/9740895.html

最近在做托盘时,发现 CnTrayIcon1的OnClick 事件,不能被其它按钮来执行,蛋疼。...

比如: procedure TForm1.Button1Click(Sender: TObject);begin CnTrayIcon1.OnClick ; // 这句就是不能通过!!end; 有过路的高手,指点学生一下。谢谢转载于:https://www.cnblogs.com/hahy8008/p/6783614.html

Linux02-帮助手册

目录 一、man手册 1.1 man的基本使用 1.2 mandb更新文档 二、/usr/share/doc 三、access.redhat.com 门户 一、man手册 1.1 man的基本使用 man就是mannual的缩写,手册的意思。Linux的命令很多,参数选项更多,人脑一般是记不住的&…

ORB_SLAM2中Tracking线程

Tracking线程是ORB_SLAM2的主线程。在System.cc中,使用构造函数进行了初始化,开启了三个线程。 可执行程序—>System构造函数(初始化三个线程)—>处理输入的帧(TrackMonocular)—>调用Tracking线程…

selenium的基础知识点

from selenium import webdriver from scrapy.selector import Selector#模拟登陆 browser webdriver.Chrome(executable_pathChromedriver.exe) #路径是Chromedriver.exe的存放位置,windows下只要配置好这个环境就不需要了browser.get(http://w) #需要登陆的那个网…

iOS 直播专题2-音视频采集

从设备(手机)的摄像头、MIC中采集音频、视频的原始数据ios的音视频采集可以从AVFoundation框架里采集 视频采集 这里我们选取GPUImage来采集视频,因为这个框架集成了很多视频滤镜,例如美颜 采集流程: 摄像头采集视频代码 GPUImageVideoCamera.m // 从前摄像头或后摄像头…

bzoj 4871: [Shoi2017]摧毁“树状图”

4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec Memory Limit: 512 MBSubmit: 53 Solved: 9[Submit][Status][Discuss]Description 自从上次神刀手帮助蚯蚓国增添了上千万人口(蚯口?),蚯蚓国发展得越来越繁荣了&#xff01…

Linux03-本地账户和组

目录 一、本地账户/etc/passwd 二、本地组/etc/group 三、切换账户su - 四、增删改本地账户useradd、userdel、usermod 五、账户默认配置文件/etc/login.defs 六、设置密码passwd(5)命令 七、增删改组groupadd、groupdel和groupmod 八、通过sudo以root身份运行命令 九…

ORB_SLAM2单目初始化策略

基本流程 单目初始化程序存储在Initializer.cc中   需要注意,对于双目/RGB-D相机,初始化时,由于可以直接获得相机的深度信息,因此无需求H/F,直接作为关键帧插入就行。   使用RANSACDLT求解H,RANSAC八点…

Powerdesigner逆向工程64位Oracle数据库

Powerdesigner老版本不支持64位Client,新版本弄不到破解码 解决方法,用Powerdesigner32位Oracle Clent访问64位Oracle Server 遇到的坑分享下 安装完64位的Oracle Server ,32位的 Oracle Clent默认的listener.ora文件有PROGRAM和ENVS这两个节点 Plsql(3…

运行jsp时,报错404

The origin server did not find a current reprsentation for the target resource or is not willing to disclose that one exists. 解决: 1. web.xml文件位置是否放错,应该放在WebContent/WEB-INF文件夹中 2. web.xml文件中是否有拼写错误&#xff0…

iOS 直播专题3-前置处理

前置处理 对视频添加美颜、水印、滤镜等对音频进行混音、消除环境音、声音特效等上一篇iOS 直播专题2-音视频采集提到视频采集采用的是GPUImage框架,这个框架集成了很多滤镜效果 这里主要介绍美颜、水印处理 处理流程: 美颜 这里的美颜效果用的是GPUImageBeautyFilter 功…

ORA-10873解决办法

今天,发现SAP系统的oracle数据库宕掉了。报错ORA-10873,经过查证解决该问题。记录一下,备忘。 一、问题 Oracle版本为12.1.0.2.0,在启动服务器后启动数据库startup,报错ORA-10873。 二、查证 到SAP Support Portal上…

ORB_SLAM2局部建图线程

局部建图线程入口:可执行程序在初始化三个线程的时候,在System.cc的构造函数中进入局部建图线程 mpLocalMapper new LocalMapping(mpMap, //指定使iomanipmSensorMONOCULAR); // TODO 为什么这个要设置成为MONOCULAR??&#…

十一连测day1

这次测试,是福建第三中学的某同学出的,感觉难度还行吧,今天我就浅谈一下这场比赛的时间分配与心得 打开题目,看到了T1,这题是一道计数题吧,感觉心态一下子就崩了,100%的数据点应该是组合数学容斥…

iOS 直播专题5-推流

常用的推流协议有: 协议内容RTP实时流传输协议,但不保证服务质量RTCPRTP数据流协议的一个姐妹协议,为RTP提供服务质量反馈SRTP & SRTCPRTP和RTCP的安全版本,提供数据加密、消息认证功能RTSP控制声音或影像的多媒体数据串流协议RTMPADOBE公司播放器与服务器之间多媒体数…

centos6.5-vsftp搭建

我的机子是默认是没有的vsftp。 yum install -y vsftp 创建账户专为ftp而生。useradd ftp01 更改账户不可登录系统。usermod -s /sbin/nologin ftp01 vsftp默认是可以匿名登录的,也是默认的端口,这些不安全选项都要修改! anonymous_enableYES…

Linux04-文件系统权限与ACL权限

目录 一、文件系统权限 1.1、认识文件系统权限 1.2、管理文件系统权限 1.3、特殊权限 1.4、默认权限 二、ACL权限 2.1、ACL本质是文件系统的一个挂载选项 2.2、更改文件的ACL权限 2.3、设置文件和目录的默认ACL权限 Linux中的权限管理分为两种类型 用户自主访问控制&…