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

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

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

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

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

 

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

写在前面

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

​ 之前我已经为大家介绍过最基础的一种语义分割网络——FCN啦🍭🍭🍭,如果你对FCN还不了解的话,可以点击如下链接了解详情,这对你入门语义分割会非常有帮助:

  • 深度学习语义分割篇——FCN原理详解篇🍁🍁🍁
  • 深度学习语义分割篇——FCN源码解析篇🍁🍁🍁

今天为大家带来的是DeepLab系列的第一篇文章,目前此Deeplab系列的更新计划如下:

  • DeepLabV1原理详解篇,详细介绍DeepLabV1的网络结构和关键创新点。
  • DeepLabV2原理详解篇,详细介绍DeepLabV2的网络结构和关键创新点。
  • DeepLabV3原理详解篇,详细介绍DeepLabV3的网络结构和关键创新点。
  • DeepLabV3源码实战篇,带大家阅读源码,对DeepLabV3有更深入的了解。

在此DeepLab系列中没有对DeepLabV1和DeepLabV2做源码解读,我觉得没啥必要,感兴趣的可以去看一看。🥗🥗🥗

论文链接:DeepLabV1论文🍵🍵🍵

 

语义分割存在的问题及解决方法

在论文中,作者提出了将DCNN运用到语义分割任务中存在的两个技术障碍,如下图所示:

image-20230711151155097

翻译过来什么意思呢,即存在信号下采样和空间不变性这两个问题,那么为什么会出现这样的现象呢?又该怎么解决呢?论文中也给出了相关解释:

为什么?🔐🔐🔐

  • 信号下采样:这是指卷积神经网络重复的使用下采样max-pooling,从而导致图像分辨率不断降低。🍊🍊🍊
  • 空间不变性:论文中解释为与从分类器中获得以物体为中心的决策需要空间转换的不变性有关,这本质上限制了DCNN模型的空间精度。说实话,听不懂。🎄🎄🎄其实啊,这里就是说像图像分类、目标检测这些High-Level的视觉任务(以获取图像中物体为核心的任务)需要空间不变性,也就是说对目标检测这类任务而言,对于同一张图片进行空间变换其图像分类的结果是不变的;而像语义分割这些Low-Level视觉任务,对于一张图片进行空间变换后,其结果就会发生变化,这就导致DCNN做语义分割时定位精准度不够。🍉🍉🍉

怎么办?🔑🔑🔑

  • 信号下采样:既然重复使用了下采样max-pooling,那么我们自然会想到少使用几次下采样或者降低stride步长,但是这样会使得感受野变小,这是我们不希望看到的。那么是否有什么方法可以既不用不断下采样降低分辨率,又能保持感受野不变呢?这就要我们的空洞卷积上场了,它可以增大我们的感受野。关于空洞卷积的细节不了解的可以阅读我的这篇博客:Dilated Convolution(空洞卷积、膨胀卷积)详解🧨🧨🧨
  • 空间不变性:为了解决这个问题,作者采用了fully-connected CRF(全连接条件随机场)方法,对DCNN得到的分割结果进行细节上的调整。这个方法在DeepLabV1和DeepLabV2中都使用了,但是在DeepLabV3中就不在使用了,自己看了看,公式怪多的,有点头大,后面也用不到,就没有深入学习了,大家感兴趣的可以去看一下,也推荐一篇博文叭:DenseCRF🧨🧨🧨

 

DeepLabV1网络优势

论文中给出了DeepLabV1网络的三点优势,如下图所示:

image-20230711163858592

  • 速度更快:借助atrous算法(空洞卷积算法),密集的DCNN运行速度为8帧/秒。
  • 准确率更高:在PASCAL语义分割挑战上获得了最先进的结果,比Mostajabi等人的次优方法高出7.2%。
  • 模型结构简单:系统由两个相当完善的模块级联组成,即DCNN和CRF。

 

DeepLabV1网络结构

前面已经为大家简单介绍了一下DeepLabV1网络的一些模块和优势,下面就来为大家来讲讲DeepLabV1的网络结构。我打算采用总-分结构为大家叙述,先和大家唠唠DeepLabV1中几个关键模块,然后再为大家介绍DeepLabV1的整体网络结构。

LargeFOV模块

首先需要说明的是DeepLabV1的框架是基于VGG16实现的,对VGG16不熟悉的可以看一下我的这篇博客:深度学习经典网络模型汇总2——VGGNet🩸🩸🩸,为了方便大家阅读,这里贴出VGG16的网络结构图,如下:

经典CNN网络:VGG16-输入和输出_呆呆珝的博客-程序员宝宝- 程序员宝宝

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-py1kqSVE-1643041241886)(https://media5.datahacker.rs/2019/02/vgg.png)]

那么这个LargeFOV模块是什么呢?又作用在什么位置呢?其实呀,这个LargeFOV模块就是我们在前面说到的空洞卷积,作者将VGG16的第一个全连接层换成了空洞卷积,保证了网络在mIOU不降低的前提下,减少参数量,加快速度。

全连接层换成了空洞卷积?怎么换的呢?或许你会有这样的疑问,我们一起来学习一下。首先将全连接层换成普通卷积这种操作大家是否了解呢,比如在FCN中就将VGG16的第一个全连接层换成了卷积核大小为7×7,卷积核个数为4096的卷积层,对此不了解的可以点击☞☞☞了解详情。🌱🌱🌱知道了如何将全连接层转换成普通卷积,那剩下的就是将普通卷积变成空洞卷积了,这就没什么好说的了,不了解空洞卷积的点击☞☞☞为自己赋能喔。🥗🥗🥗

论文中也做了一系列不同kernel size和input stride(膨胀因子)的对比实验,如下图所示:

image-20230712103020759

根据实验效果,最终作者选择了采用卷积核大小为3×3,input strede为12的空洞卷积。【最后一行感受野大,参数量小,mean IOU高,速度快🥂🥂🥂】


这里其实我是有一些疑惑的,就是不知道这个感受野224是怎么计算得到的,按照我的理解,怎么算感受野也不是这么多,如果有大佬知道,麻烦告诉小弟一声,不胜感激 !!!🤞🏽🤞🏽🤞🏽


fully-connected CRF模块

fully-connected CRF中文翻译为全连接条件随机场,哈哈哈哈,我是一脸懵逼,在前文中我也说到了,这一部分我不会介绍这个模块是怎么实现的,只会说说这个模块的作用。其实啊,这个模块就是让分割更加精细,它相当于我们对得到的粗略的分割图又进行了进一步的细化操作,过程如下:

            image-20230712105940721

网络结构

话不多说,直接上图:

在这里插入图片描述

                  图片来自B站霹雳吧啦Wz

这个结构是基于VGG16的,因此大家需要对比着VGG16来看,让我们来看看它相较于VGG16做了哪些改变叭~~~🍦🍦🍦

  • VGG16所使用的所有Maxpool采用的keenel_size=2,stride=2,padding=0;🍚🍚🍚而在DeepLabV1中,前三个Maxpool采用的keenel_size=3,stride=2,padding=1,此参数配置的Maxpool同样起到下采样的作用,每次下采样2倍,经过3次Maxpool讲原始图像下采样8倍,在语义分割任务中我们不希望图像被过度的下采样,这样会丢失部分信息,因此后面两次Maxpool不再进行下采样,采用keenel_size=3,stride=1,padding=1的参数配置。此外在第五次Maxpool后DeepLabV1还接了一个keenel_size=3,stride=1,padding=1的Avgpool层,同样这层也没有再进行下采样 。🍪🍪🍪
  • 将VGG16模型最后三个卷积层改成了空洞卷积,其中keenel_size=3,r=2,stride=1,padding=2。【r为膨胀因子】【注:什么这里要使用空洞卷积腻,这是因为在DeepLabV1中我们只下采样了8倍,感受野较低,使用空洞卷积能够增大感受野🥝🥝🥝】 image-20230712152303468
  • 将VGG16模型的第一个全连接层换成空洞卷积,其中keenel_size=3,r=12,stride=1,padding=12,这就是上文提到的LargeFOV模块。🍅🍅🍅
  • 将VGG16模型的第二个和第三个全连接层都换成了卷积操作,需要注意一下经过最后一个全连接层(DeepLabV1中的最后一个卷积层)后的输出大小为 28 × 28 × n u m _ c l a s s e s 28×28×num\_classes 28×28×num_classes。🍀🍀🍀

带Multi-Scale的网络结构

论文中还提到了使用了多尺度(Multi-Scale)的结构,即融合了原始图片和前四个Maxpool层的输出,我们直接看下图会更清晰:

在这里插入图片描述

                  图片来自B站霹雳吧啦Wz

这个结构似乎没什么么好说的,现在看来是比较常规的一个多尺度方法,不过还是需要大家注意一下这里原始图片和前四个Maxpool层的输出尺寸的都是 28 × 28 × n u m _ c l a s s e s 28×28×num\_classes 28×28×num_classes,最后将这些特征图进行ad操作。

我们可以来看看是否添加多尺度实验的对照结果,如下图所示:

在这里插入图片描述

第一行为没有添加MSC的效果,第二行为添加了MSC的效果,怎么样,还是挺明显的叭。🍸🍸🍸

 

DeepLabV1实验对比

其实在上文已经展示了相关的对照实验,这里我们再从直观上来感受一下DeepLabV1和其它算法的比较,如下图所示:

image-20230712160854890

第一行表示原图,第二行为ground truths,第三行是最近提出的模型,左边为FCN-8s,右边为TTI-Zoomout-16,第四行为DeepLabV1。从上图可以很明显的看出DeepLabV1的结果更加精细,对图像边缘的处理效果更好。🍵🍵🍵

 

小结

DeepLabV1到这里就差不多为大家介绍完啦,希望大家都有所收获喔~~~🌷🌷🌷最后我想在稍微提一下DeepLabV1是怎么计算损失的。我们知道,FCN是用GT和网络输出结果计算交叉熵损失(cross_entropy)的,不知道的点击☞☞☞补课去,里面介绍的很详细。但是在DeepLabV1中我们会先将GT下采样8倍,然后再与 28 × 28 × n u m _ c l a s s e s 28×28×num\_classes 28×28×num_classes【28×28相较于原图224×224下采样了8倍🍡🍡🍡】的输出特征图计算交叉熵损失。论文中也有相关的表述,如下图所示,大家这里注意一下就好。🌼🌼🌼

image-20230712163713928

 

参考链接

DeepLabV1网络简析🍁🍁🍁

DeepLabV1论文🍁🍁🍁

[论文笔记]DeepLabv1🍁🍁🍁

 
 

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

一键三连 (1).gif

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

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

相关文章

数据库是怎么做到事务回滚的呢?

数据库实现事务回滚的原理涉及到数据库管理系统(DBMS)如何维护事务的一致性和持久性。 基本原理: ACID属性:事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Iso…

【Linux】从零开始认识进程 — 中下篇

送给大家一句话: 人一切的痛苦,本质上都是对自己无能的愤怒。而自律,恰恰是解决人生痛苦的根本途径。—— 王小波 从零认识进程 1 进程优先级1.1 什么是优先级1.2 为什么要有优先级1.3 Linux优先级的特点 && 查看方式1.4 其他概念 2…

c++的学习之路:5、类和对象(1)

一、面向对象和面向过程 在说这个定义时,我就拿c语言举例,在c语言写程序的时候,基本上就是缺什么函数,就去手搓一个函数,写的程序也只是调用函数的,而c就是基于面向对象的开发,他关注的不再是单…

picgo启动失败解决

文章目录 报错信息原因分析解决方案 报错信息 打开Picgo,显示报错 A JavaScript error occurred in the main process Uncaught Exception: Error:ENOENT:no such file or directory,open ‘C:\Users\koko\AppData\Roaming\picgo\data.json\picgo.log’ 原因分析…

[iOS]GCD(一)

[iOS]GCD(一) 文章目录 [iOS]GCD(一)GCD的概要GCD的APIDispatch Queuedispatch_queue_createMain Dispatch Queue和 Global Dispatch Queue.Main Dispatch_set_target_queuedispatch_afterDispatch Groupdispatch_barrier_asyncdispatch_applydispatch_applydispatch_suspend/d…

【功能实现】新年贺卡(蓝桥)

题目分析: 想要实现一个随机抽取功能 功能拆解:题目给了数组,我们采用生成随机数的方式,随机数作为数组的索引值访问数组的值。 并返回获取到的值,将获取到的值插入到页面中。 document.addEventListener(DOMConten…

哪款软件适合做书单的背景图片?安利这3款

哪款软件适合做书单的背景图片?在数字化时代,书单作为推广阅读文化、分享书籍信息的重要载体,其视觉效果与内容的吸引力同等重要。一个精美的书单背景图片,不仅能够吸引读者的眼球,还能增强书单的传播效果。因此&#…

Redis 教程系列之Redis 集群配置(十三)

1.Redis集群方案比较 主从模式 在软件的架构中,主从模式(Master-Slave)是使用较多的一种架构。主(Master)和从(Slave)分别部署在不同的服务器上,当主节点服务器写入数据时,同时也会将数据同步至从节点服务器,通常情况下,主节点负责写入数据,而从节点负责读取数据。…

Java I/O

什么是 IO流? 存储和读取数据的解决方案 I: input O: output 流:像水流一样传输数据 IO流的作用? 用于读写数据(本地文件,网络) IO流从 传输方式 分类 字符是给人看的,字节是给计算机看的。 …

八、C#计数排序算法

简介 计数排序是一种非比较性的排序算法,适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数,然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。 创建一个长度为max-min1的数组count…

Java:反射 reflection ( 概念+相关类+使用方法)

文章目录 一、反射(reflection)1.概念优点:缺点 2.反射的相关类1.Class类1.**反射机制的起源**2.获得类相关的方法3.获得类中属性的相关方法4.获得类中注解相关的方法5.获得类中构造器相关的方法6.获得类中方法相关的方法 2.获取Class对象的三种方法:1.使…

【算法刷题】链表笔试题解析(1)

一、链表分割 题目描述: 链接:链表分割 题目分析: 这题直接处理并不好做,我们可以构建前后两个链表,将小于x值的结点放在链表a内,将其它结点放在链表b内,这样将原链表遍历完后,原链…

JAVA------基础篇

java基础 1.JDK JDK :java development kit JRE:java runtime environment JDK包含JRE java跨平台:因为java程序运行依赖虚拟机,虚拟机需要有对应操作系统的版本,而jre中有虚拟机。 当你想要在Linux系统下运行,则需要…

(数据类型)前端八股文修炼Day1

1.JavaScript有哪些数据类型,它们的区别 JavaScript中有以下种数据类型: 基本数据类型(Primitive Data Types): String:表示文本数据,用单引号()或双引号(…

【C语言】strcmp 的使⽤和模拟实现

前言 这篇文章将要带我们去实现模拟一个strcmp函数 首先我们要知道strcmp函数的定义 strcmp()定义和用法 我们先看一下strcmp在cplusplus网站中的定义 链接: link int strcmp ( const char * str1, const char * str2 );比较两个字符串将 C 字符串 str1 与 C 字符串 str2 …

4.Python数据分析—数据分析入门知识图谱索引(知识体系下篇)

4.Python数据分析—数据分析入门知识图谱&索引-知识体系下篇 一个人简介二机器学习基础2.1 监督学习与无监督学习2.1.1 监督学习:2.1.2 无监督学习: 2.2 特征工程2.3 常用机器学习算法概述2.3.1 监督学习算法:2.3.2 无监督学习算法&#…

数据结构/C++:位图 布隆过滤器

数据结构/C:位图 & 布隆过滤器 位图实现应用 布隆过滤器实现应用 哈希表通过映射关系,实现了O(1)的复杂度来查找数据。相比于其它数据结构,哈希在实践中是一个非常重要的思想,本博客将介绍哈希思想的两大应用,位图…

jmeter常用的函数

20211025白板 课前内容: 参数: 用户定义变量:它是一个全局变量,在启动运行时,获取一次值,在运行过程中,不会动态获取值。 用户定义变量,在启动时获取一次值,在运行过程中…

【Flutter 面试题】 什么是Flutter插件(Plugin)?如何使用和创建插件?

【Flutter 面试题】 什么是Flutter插件(Plugin)?如何使用和创建插件? 文章目录 写在前面口述回答补充说明使用插件创建插件 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月28日,星期四

每天一分钟,知晓天下事! 2024年3月28日 星期四 农历二月十九 1、 四部门:培育空中摆渡、私人包机等新业态,2030年形成万亿级市场规模。 2、 市监总局发文规范外卖营销防止浪费:不将主食纳入满减优惠展示范围。 3、 多…