[SS]语义分割_DeepLab

本文详细介绍了DeepLab系列深度学习神经网络架构,用于语义分割和图像分割任务。包括DeepLabV1、V2、V3及V3+的网络结构、优势、解决的问题等。如V1引入膨胀卷积,V2更换backbone并引入ASPP,V3改进ASPP模块,V3+融合浅层和深层特征,逐步提升图像分割性能。

目录

一、DeepLabV1

1、DeepLab网络 

2、语义分割任务中存在的问题

3、DeepLabV1网络优势 

4、LargeFOV(Field of View)

5、DeepLab-LargeFOV结构

6、MSc(Multi-Scale) 

二、DeepLab V2

1、介绍

2、ASPP(Atrous Spatial Pyramid Pooling) 

3、消融实验

4、Learning rate policy 

5、DeepLabV2网络结构 

三、DeepLab V3

1、介绍

2、cascaded model 

3、ASPP model

4、Multi-grid

5、消融实验

6、训练细节

7、DeepLabV3网络结构

四、DeepLabV3+

1、语义分割

2、DeepLabV3+网络结构

3、backbone网络介绍

4、ASPP模块构建

5、浅层特征和深层特征的融合

6、预测结果 


一、DeepLabV1

DeepLabV1网络简介视频 

DeepLabV1网络简介 

1、DeepLab网络 

        DeepLab 是一个深度学习神经网络架构系列,用于语义分割和图像分割任务。DeepLab 系列由 Google Brain 团队推出,通过引入深度可变形卷积网络(DeepLabv1),空间金字塔池化模块(DeepLabv2),空洞卷积(ASPP)模块(DeepLabv3),以及在DeepLabv3+中的改进,逐步提高了在图像分割任务上的性能。

DeepLab 的关键特点包括:

  1. 多尺度特征融合:通过使用多尺度池化技术,DeepLab 能够同时捕获不同尺度的特征,有利于提高分割准确性和减少分割边界模糊。

  2. 空洞卷积(ASPP)模块:ASPP 模块能够有效地扩大感受野,并在不引入额外参数的情况下增加网络的感知能力,有助于提高分割性能。

  3. 引入深度孪生学习:在 DeepLabv3+ 中,引入了深度孪生学习的概念,通过在不同分支上使用不同分辨率的特征图,并结合全连接层进行互补学习,进一步提高了分割效果。

2、语义分割任务中存在的问题

        在DeepLabV1原论文中,作者提出了两个存在于语义分割任务中的问题:(1)、信号下采样导致分辨率降低;(2)、空间“不敏感”问题。

  1. 信号下采样导致分辨率降低,作者认为是图像经过MaxPooling操作之后会降低特征图的高宽,其次会丢失细节信息以及小目标且无法通过上采样进行还原,作者给出的解决方案是引入了膨胀卷积模块。
  2. 空间不敏感,在分类网络中,希望对图像做任何变换之后并不会影响最终分类结果,但是在语义分割任务中,即使对图像做了很小的变动,如平移了一下图片,那么此时得到的结果与移动之间应该是不相同的。作者认为分类器网络自身就有一定的空间不变性,原博文作者认为是MaxPooling造成的。作者采用了fully-connected CRF(Conditional Random Field)方法解决,在当时常用于语义分割任务中,但是在DeepLabV3就不再使用了。

3、DeepLabV1网络优势 

  •  因为使用了膨胀卷积所以速度更快,但是fully-connected CRFs很耗时间
  • 准确率更高
  • 模型结构简单,主要由DCNNs和CRFs联级构成

4、LargeFOV(Field of View)

        保证mIoU不下降的前提下,减少模型参数数量和加快模型训练速度。

        在原论文中使用的backbone是当时较为主流的VGG-16网络,将全连接层的权重卷积化,将全连接层转化为卷积层,对于VGG-16的第一个全连接层有4096个节点,通过转化之后变为卷积核大小为[7x7],卷积核个数为4096个卷积层。但是如果直接使用这样的卷积层会成为计算瓶颈,为了解决这个问题,作者对该卷积层进行了一个下采样结果,变成[4x4]或者[3x3]大小。  

  • DeepLab-CRF-7x7就是直接将FC1按照FCN论文中的方法转换成大小[7x7]、个数4096个卷积核的卷积层,并且膨胀因子r=4,感受野receptive field=224。
  • DeepLab-CRF是将[7x7]卷积核下采样到[4x4]大小的卷积层,同样膨胀因子r=4,感受野receptive field=128,参数数量减半,训练速度翻倍,但mean IOU由于感受野降低下降了约4个点。
  • DeepLab-CRF-4x4,是在DeepLab-CRF的基础上把膨胀系数r改成了8,感受野receptive field=224,mean IOU又提升了回去了。
  • DeepLab-CRF-LargeFOV,是将[7x7]下采样到[3x3]大小的卷积层,膨胀系数r=12,感受野receptive field=224,不止将卷积核大小下采样了,卷积核个数从4096下采样到了1024,按照FCN中第二个卷积层应该转化成卷积核大小[1x1],卷积核个数为4096的卷积层,这里由于采样FOV,将第二个卷积层的卷积核个数也下采样为1024个,相比DeepLab-CRF-7x7,参数数量减少了6倍,训练速度提升了3倍多,mean IOU不变。

5、DeepLab-LargeFOV结构

图源自博主-太阳花的小绿豆 

        采用的backbone是VGG-16,在VGG-16原论文当中采用的MaxPool层是卷积核大小为[2x2],步距为2的池化层,在DeepLabV1中改成了卷积核大小为[3x3],步距为2,padding为1的MaxPool层。

        首先通过三个MaxPool下采样层之后,下采样倍率为8倍,接下来的两个下采样层的步距设置为1,说明在DeepLabV1网络中只下采样8倍。蓝色框中的第一个卷积层block中有三个[3x3]大小、膨胀系数r=2的膨胀卷积,在最后的MaxPool层之后新加了一个平均池化层AvgPool,卷积核大小为[3x3],步距为1,padding为1,特征图的高和宽也不会发生变化。

        FC1需要进行卷积化,LargeFOV卷积核大小为[3x3],步距为1,膨胀系数r=12,padding为12,通过全卷积层FC1之后特征图的高和宽不会发生变化。FC2通过卷积化转化为卷积层,卷积核大小为[1x1],卷积核个数从4096下采样到1024。最后通过一个[1x1]卷积层,卷积核个数等于类别个数num_cls,包含背景,再通过双线性插值将特征图还原回原图大小。

6、MSc(Multi-Scale) 

图源自博主-太阳花的小绿豆 

        融合多个尺度的数据,包含原图尺度的数据,还包含前四个MaxPool层输出的数据。使用MSc模块大概可以提升mIoU1.5个百分点,在官方提供的源码中,作者推荐使用DeepLab-CRF-LargeFOV模型,并不推荐使用带有MSc的版本,因为使用MSc模块之后会增加训练参数数量,其次会增大训练时所占用的GPU显存,也会减缓模型推理速度。

        DeepLab-MSc-LargeFOV版本模型,增加了MSc模块之后,主分支中并没有任何变化,在原图尺度以及前四个MaxPool层的输出进行了融合。在原图尺度中首先通过了一个卷积核尺寸[3x3],步距为8,padding为1的卷积层,通过8倍下采样之后,输出的特征图的高和宽和主分支上输出的特征图高和宽是一样的,再通过[1x1]的卷积层,再通过一个卷积核大小[1x1],个数为num_cls的卷积层,之后得到的特征图大小和通道数和主分支得到的特征图大小通道数相同都为num_cls。前四个MaxPool层额外接的分支构建基本相同,唯一不同是在四个MaxPool层中,第一个卷积层当中,采用的步距为4,第二个采用的步距为2,第三个和第四个采用的步距都为1。

        除了主分支的输出之外,还额外添加了5个尺度上的输出,包含原图尺度上和四个MaxPool层的输出,最后进行一个各尺度特征图相加操作,特征图shape保持不变,之后进行一个8倍上采样将特征图还原为原图大小。

二、DeepLab V2

DeepLabV2网络简介视频

### `adi_ss_fw_init` 函数的作用与使用方法 在嵌入式软件开发中,特别是在 ADI(Analog Devices Inc.)的多核处理器平台上,`adi_ss_fw_init` 是一个关键的初始化函数,用于配置和启动从核(secondary core)的固件运行环境。该函数通常出现在基于 SHARC+ARM 架构的处理器(如 ADSP-SC58x、ADSP-2156x)的 CCES(CrossCore Embedded Studio)工程中,其主要职责是为从核固件提供运行所需的底层支持,包括内存映射、中断控制器初始化和系统资源的分配。 函数原型通常如下: ```c int adi_ss_fw_init(int coreId, void *pFwImage, size_t fwSize, ADI_SS_FW_CONFIG *pConfig); ``` 其中 `coreId` 指定目标从核的标识符,`pFwImage` 是固件镜像的起始地址,`fwSize` 表示固件镜像的大小,`pConfig` 提供额外的配置参数。该函数执行成功后,从核将具备运行固件的条件,并可进入主循环或等待主核的启动信号。 `adi_ss_fw_init` 的核心功能包括: - 加载固件镜像至从核的程序存储区; - 初始化从核的堆栈、中断向量表和异常处理机制; - 配置共享内存区域和同步机制,为后续的跨核通信打下基础; - 设置从核的时钟、电源管理及系统控制寄存器。 在实际使用中,该函数通常与 `adi_ss_fw_start` 配合使用,前者负责初始化,后者用于启动从核执行固件代码。例如: ```c // 假设从核固件镜像位于 fwImage,大小为 fwSize int status = adi_ss_fw_init(CORE_1, fwImage, fwSize, NULL); if (status == ADI_SS_FW_RESULT_SUCCESS) { status = adi_ss_fw_start(CORE_1); if (status == ADI_SS_FW_RESULT_SUCCESS) { printf("从核已启动\n"); } } ``` 该函数在系统启动流程中通常出现在主核完成自身初始化之后,负责为从核建立一个稳定、可运行的执行环境。它依赖于底层硬件寄存器的正确配置,如系统控制模块(SCU)、内存映射寄存器以及多核同步机制。 ### 相关问题 1. 在 ADI 多核架构中,如何结合 `adi_ss_fw_init` 和链接脚本配置从核的运行环境? 2. `adi_ss_fw_init` 函数在固件加载过程中如何处理内存对齐和访问权限问题? 3. 从核固件初始化完成后,如何通过 `adi_ss_fw_start` 启动从核执行? 4. `adi_ss_fw_init` 是否支持动态加载多个固件版本?如何实现固件热切换? 5. 在调试过程中,如果 `adi_ss_fw_init` 返回失败,常见的排查方法有哪些?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IAz-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值