深度学习语义分割篇——DeepLabV2原理详解篇

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题

🍊专栏推荐:深度学习网络原理与实战

🍊近期目标:写好专栏的每一篇文章

🍊支持小苏:点赞👍🏼、收藏⭐、留言📩

深度学习语义分割篇——DeepLabV2原理详解篇

写在前面

Hello,大家好,我是小苏👦🏽👦🏽👦🏽

在上一节,我已经为大家介绍了DeepLabV1的原理,还不清楚的赶快点击☞☞☞了解详情。🍍🍍🍍那么这篇就和大家唠唠DeepLabV1的兄弟篇——DeepLabV2。其实呢,你要是清楚DeepLabV1的话,那么DeepLabV2对你来说就是小菜一碟了,改进点是比较少也比较好理解的。话不多说,让我们一起走进DeepLabV2的世界叭~~~🚖🚖🚖

论文链接:DeepLabV2论文🍵🍵🍵

 

语义分割存在的挑战

是不是发现和DeepLabV1博客的结构很像呢,在V2论文的INTRODUCTION中也首先提出了DCNN应用于语义分割的三个挑战,如下图所示:

image-20230712212448984

翻译一下:

  1. 特征分辨率降低
  2. 目标在多尺度上的存在
  3. 由于DCNN的不变性降低了定位精度

熟悉,熟悉,实在是太熟悉了,大家一定会有这样的感受。确实如此,这和DeepLabV1的挑战几乎一致,就多了一个第2点,而且其实在DeepLabV1中也使用到了多尺度的方法,不记得的大家可以点击☞☞☞去瞅一眼。🍖🍖🍖

 

DeepLabV2网络优势

image-20230712213431978

  • 速度更快:借助atrous算法(空洞卷积算法),密集的DCNN在NVidia Titan X GPU上以8帧/秒的速度运行。
  • 准确性更高:我们在几个具有挑战性的数据集上获得了最新的结果,包括PASCAL VOC 2012语义分割基准、PASCAL- context、PASCALPerson-Part和cityscape。
  • 模型结构简单:我们的系统由两个非常完善的模块级联组成,即DCNN和CRF。

我想大家又发现了,这个和DeepLab的表述几乎是一样的。🥗🥗🥗


大家通过上面两个小节我想应该会发现,DeepLabV1和DeepLabV2似乎存在很多相似之处,在后文DeepLabV2的网络结构中我会挑一些重点为大家讲解,其实也没几个,先给大家透个底叭,V2较V1主要做了如下改变:

  • 添加了ASPP多尺度结构
  • 修改了backbone
  • 设计了poly学习率更新策略

后面我也将主要从这三个方面为大家展开叙述~~~🍻🍻🍻


DeepLabV2网络结构

前文提到DeepLabV2较DeepLabV1主要添加了ASPP结构、修改了backbone及设计了poly学习率更新策略,其实呢,论文中还做了一些其它的小改进,这里就不一一阐述了。比如对CRF的二元势函数进行了更新,但是呢,由于我在V1中就没有介绍CRF,所以这里也就不介绍啦,感兴趣的去看看论文叭。🍚🍚🍚

ASPP结构

先来说说这个ASPP的全称叭,即atrous spatial pyramid pooling,翻译过来的话叫空洞空间金字塔池化【蹩脚的翻译,勿喷🤐🤐🤐】。下图为ASPP模块的结构示意图:

从上图可以看到ASPP模块是在输出的特征图上并联了四个分支,每个分支上采用了卷积核大小为3×3、膨胀系数依次为6、12、18、24的空洞卷积,以此实现每个分支具有不同的感受野大小,也就具有了解决目标多尺度问题的能力。🏆🏆🏆

大家还记得在DeepLabV1中提到的LargeFOV结构吗,不记得的话点击☞☞☞去了解下叭。🍄🍄🍄那么在DeepLabV2中就没有使用LargeFOV结构了喔,而是用的ASPP结构。其实通过上图你可能就会发现ASPP就像是在LargeFOV的基础上多并联了几个分支,即增加了多尺度信息,所以有了ASPP就用不着LargeFOV模块啦。🥗🥗🥗当然了,V2的论文中也给出了LargeFOV和ASPP的详细结构,如下图所示:

image-20230714154002948

这个图已经非常清晰的展示了ASPP的结构了,但有一点需要大家注意一下,即上图这两个结构都是基于backbone为VGG16绘制的【DeepLabV2中将backbone换成了resnet】,但是不管采用哪种backbone,ASPP结构的核心思想都是一样的,这里稍微来谈谈以resnet为backbone的ASPP结构是什么样的,如下图所示:

image-20230714155203530

我想大家一对比很容易就看出来了,此时每个分支都少了后面两层结构,这里大家注意一下就好。🍗🍗🍗

最后在给大家展示一下采用了ASPP的效果,如下图所示:

image-20230714160039769

其中,ASPP-S表示并联的四个分支采用的膨胀系数r依次为2、4、8、12;ASPP-L表示并联的四个分支采用的膨胀系数r依次为6、12、18、24;🌼🌼🌼

修改backbone

呀呀呀,在上一小节已经透露了,DeepLabV2使用的backbone为resnet,这可以说是最常见的一种网络了,是由咱们中国人何恺明大佬提出的,还不清楚的快点击☞☞☞学起来叭。这里为方便读者阅读,贴出resnet的相关参数,如下图:【以resnet101为例】

DeepLabV2在Layer2层之前的结构和resnet101是完全一致的,经过Layer2层后,图像已经下采样了8倍,和V1一样,现在不希望再过度的下采样导致丢失大量信息了,因此在Layer3和Layer4层不再进行下采样,同样采用空洞卷积来弥补不进行下采样减少的感受野,DeepLab的网络结构如下图所示:

image-20230714162842189

                 图片来自B站霹雳吧啦Wz

其中,Layer3、Layer4的详细结构如下:

image-20230714162926694

                 图片来自B站霹雳吧啦Wz

可以看到,在经过Layer4层后,特征图的下采样倍数仍然是8,大小为 28 × 28 × 2048 28×28×2048 28×28×2048。然后就会接入上文提及的ASPP结构,即并联一个膨胀系数分别为6、12、18、24的空洞卷积,注意一下这里的空洞卷积的卷积核个数都为number_class。🍵🍵🍵

设计poly学习率更新策略

在DeepLabV2中,作者设计了poly学习率更新策略,其公式如下:

l r = l r ∗ ( 1 − i t e r m a x _ i t e r ) p o w e r lr=lr*(1-\frac{iter}{max\_iter})^{power} lr=lr(1max_iteriter)power

其中power是一个超参,默认为0.9。 l r lr lr为初始学习率, i t e r iter iter为当前迭代的step数,$m a x _ i t e r 为训练过程中总的迭代步数。 p o l y 策略的 为训练过程中总的迭代步数。poly策略的 为训练过程中总的迭代步数。poly策略的lr$变化曲线大致如下图所示:

image.png
这样的策略会给实验效果带来多大的影响呢,如下表所示:

image-20230714165920525

震惊,有没有,直接提了3个多点,什么时候我也能成为炼丹大师。🍋🍋🍋

 

DeepLabV2实验对比

在V2中,作者在PASCAL VOC 2012语义分割基准数据集、PASCAL- context、PASCALPerson-Part和cityscape四个数据集上做了实验,下面分别展示一下。

PASCAL VOC 2012语义分割基准数据集🔒🔒🔒

image-20230714170928246

image-20230714171109985

PASCAL- context🔒🔒🔒

image-20230714171204847

image-20230714171218952

PASCALPerson-Part🔒🔒🔒

image-20230714171252473

image-20230714171314054

cityscape🔒🔒🔒

image-20230714171334661

image-20230714171353126

 

小结

好啦,DeepLabV2就为大家介绍到这里了,是不是非常简单腻,下一节将为大家带来DeepLabV3的原理和代码了喔,让我们一起加油叭!!!🌱🌱🌱

 

参考链接

DeepLabV2网络简析🍁🍁🍁

DeepLabV2论文🍁🍁🍁

[论文笔记] DeepLabv2🍁🍁🍁

 
 

如若文章对你有所帮助,那就🛴🛴🛴

一键三连 (1).gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/575865.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv 十九 python下实现多线程间rtsp直播流的复用

在多线程拉流的任务场景中,有时需要将一个rtsp拉取多次,每重新打开一次rtsp视频流就要多消耗一次带宽,为此基于类的静态对象实现rtsp视频流的复用。 1、实现代码 import threading import cv2,time #接收摄影机串流影像,采用多线…

前后端分离开发【Yapi平台】【Swagger注解自动生成接口文档平台】

前后端分离开发 介绍开发流程Yapi(api接口文档编写平台)介绍 Swagger使用方式1). 导入knife4j的maven坐标2). 导入knife4j相关配置类3). 设置静态资源映射4). 在LoginCheckFilter中设置不需要处理的请求路径 查看接口文档常用注解注解介绍 当前项目中&am…

MATLAB:优化与规划问题

一、线性规划 % 线性规划(Linear programming, 简称LP) fcoff -[75 120 90 105]; % 目标函数系数向量 A [9 4 7 54 5 6 105 10 8 53 8 9 77 6 4 8]; % 约束不等式系数矩阵 b [3600 2900 3000 2800 2200]; % 约束不等式右端向量 Aeq []; % 约束等式系…

docker:在ubuntu中运行docker容器

前言 1 本笔记本电脑运行的ubuntu20.04系统 2 docker运行在ubuntu20.04系统 3 docker镜像使用的是ubuntu18.04,这样拉的 docker pull ubuntu:18.04 4 docker容器中运行的是ubuntu18.04的系统,嗯就是严谨 5 这纯粹是学习笔记,实际上没啥价值。…

【spring】AbstractApplicationContext 的refresh() 方法学习

上一篇我们一起学习了【spring】FileSystemXmlApplicationContext 类学习 AbstractApplicationContext 的refresh() 方法介绍 AbstractApplicationContext的refresh()方法仍然是整个Spring应用程序上下文初始化的核心流程入口。大体上的刷新生命周期依然保持一致。 refresh(…

每日一练:LeeCode-48、旋转图像【二维数组+行列交换】

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出…

Java认识泛型类

一、包装类 认识泛型类之前先来认识一下包装类 1、基本数据类型和对应的包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 除了 Integer 和 Character&#xff0…

学点Java_Day12_JDBC

1 JDBC 面向接口编程 在JDBC里面Java这个公司只是提供了一套接口Connection、Statement、ResultSet,每个数据库厂商实现了这套接口,例如MySql公司实现了:MySql驱动程序里面实现了这套接口,Java程序员只要调用实现了这些方法就可以…

自动化测试 —— Pytest fixture及conftest详解

前言 fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似u…

智能设备控制概念及方式详解

设备控制 随着物联网设备的普及,如何让用户或者企业安全、灵活地控制和管理设备变得更加重要。因此,便有了设备控制、群组管理、智能场景、多控关联、定时任务等概念。本文主要讲解移动端应用涉及的物联网设备控制相关概念及方式方法。 在以往简单的应…

快速上手Spring Cloud 十五:与人工智能的智慧交融

快速上手Spring Cloud 一:Spring Cloud 简介 快速上手Spring Cloud 二:核心组件解析 快速上手Spring Cloud 三:API网关深入探索与实战应用 快速上手Spring Cloud 四:微服务治理与安全 快速上手Spring Cloud 五:Spring …

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 专题:一个自制代码…