机器学习笔记 - 用于语义图像分割的空洞卷积DeepLabv3

本文主要是介绍机器学习笔记 - 用于语义图像分割的空洞卷积DeepLabv3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、什么是DeepLabv3?

        DeepLabv3 是用于语义分割任务的深度神经网络 (DNN) 架构。虽然不是比较新的网络模型,但是也是分割模型里的杰出代表之一,所以还是值得深入了解。

        它使用Atrous(Dilated)卷积来控制感受野和特征图分辨率,而不增加参数总数。另一个主要属性是所谓的“Atrous Spatial Pyramid Pooling”,它可以有效地提取包含有用分割信息的多尺度特征。一般来说,网络能够捕获具有丰富远程信息的密集特征图,可用于准确分割图像。

        深度和全卷积神经网络已被证明对于分割任务是有效的。通常,编码器用于将输入图像编码为压缩表示,而解码器用于将这些特征上采样到所需的分辨率。编码器和解码器之间通常存在跳过连接,以在整个网络中传递具有表达能力的高级信息。请参见下图的示例。

        编码器通常使用重复的最大池化和跨步操作来以显着降低的分辨率获得压缩表示。DeepLab 架构提出了一种不同的方法,其中使用空洞卷积块来获得更高分辨率的特征图,并使用双线性上采样来获得所需的分辨率。

二、空洞卷积

        Atrous Convolution(与 Dilated Convolution 相同)是 DeepLab 架构的基石。在空洞卷积中,我们只是将零插入到卷积核中以增加内核的大小,而不增加可学习参数的数量(因为我们不关心零)。

        在上图中,我们可以看到 3x3 的空洞核具有 5x5 的感受野。如果我们堆叠空洞卷积层,我们不仅会有一个大的感受野,而且会比常规卷积有更密集的特征图。参见下图。

        在上图的顶部,我们可以认识到 Atrous 卷积是常规卷积的推广,其中速率r决定了要插入的零的数量。在常规卷积中r = 1

        空洞卷积具有以下优点:

        1、能够在更深层次上提取更密集的特征

        2、允许通过速率控制感受野

        3、保留与常规卷积相同数量的可学习参数

        空洞卷积构建更深层次的网络,在不增加参数数量的情况下以更精细的分辨率保留更多高级信息。请参见下图,其中输出步幅定义为输入和输出图像之间的比率。具有更高输出步幅的网络将能够提取更好、更高分辨率的特征。

DeepLab 采用了一种称为多重网格方法的方法,其中不同的空洞卷积率应用于网络的不同块。请参见图底部,其中随着信息深入网络,速率会增加。

        在 Atrous 架构中,解码器不需要从极度精简的特征图中进行上采样。通过使用空洞卷积,我们正在构建一个可以提取高分辨率特征图的主干网。

        空洞卷积的缺点:空洞卷积可以在网络深处提取大型特征图,但代价是增加内存、显存消耗。另外推理时间也会更长,不过花费这样的代价是我们获得了一个强大的模型。

三、空洞空间金字塔池

        如果说空洞卷积是基石,那么空洞空间金字塔池化 (ASPP) 就是基础。

        空间金字塔池化(SPP)在多个尺度上对特征进行重新采样,然后将它们池化在一起(通常使用平均池化层)。

        在 ASPP 的情况下,特征尺度通过空洞卷积率来改变。需要注意的一件事是,当速率太大时,空洞卷积本质上会变成 1x1 卷积。在这种情况下,速率接近特征图的大小,并且无法捕获整个图像的上下文。为了克服这个问题,应用了 1x1 卷积,它保留了原始特征图形状,从而从整个特征图中获取信息。将输出连接起来,然后应用全局平均池。

四、整体架构

        现在组合在一起形成 DeepLabv3 架构的底层块。下图显示了 DeepLabv3 网络的基本架构,其中主要块只是主干和头部。每个主块都由子块组成。

虽然主干和头部是神经网络架构的常用术语,但子块名称不一定是通用的。重要的部分是理解底层概念,以便您可以将它们应用到任何深层架构中。

        整体主干将图像特征编码为丰富的高分辨率特征图。下采样主干网获取输入图像并提取浅层特征,而Atrous主干网以高分辨率编码深层特征而不增加参数总数。

         在网络的第二部分中,DeepLabv3 头应用于主干网的末端以产生输出。该头首先由一个 ASPP 块组成,该块对不同尺度的特征进行重新采样,并将它们汇集在一起​​,提供高质量的多尺度信息。在 ASPP 块之后,我们有一个附加块,它本质上将特征映射投影到所需数量的分割类。最后,使用双线性上采样来获得与输入图像相同分辨率的特征图。

四、网络实现

        主干网(有时称为编码器)通常是 ImageNet 模型的修改版本,例如 ResNet 或 MobileNet,但我们实际上可以使用任何类型的网络,只要我们将空洞卷积应用于最终层以获得精细分辨率特征地图。尽管我们通过扩大一些卷积来改变架构,但我们没有改变任何权重,因此我们仍然可以毫无问题地使用预先训练的权重。以与骨干网训练相同的方式准备输入也很重要。

        我们可以自己为 DeepLabv3 头编写代码,但如果你不想自己写,torchvision既有预先训练的主干,也有预先训练的头部,这里是文档的链接。

DeepLabV3 — Torchvision main documentationicon-default.png?t=N7T8https://pytorch.org/vision/master/models/deeplabv3.html        让我们看一个例子。

from torchvision.models.segmentation import deeplabv3_resnet50deeplabv3 = deeplabv3_resnet50(weights='COCO_WITH_VOC_LABELS_V1', weights_backbone='IMAGENET1K_V1'
)# change outputs to desired number of classes
deeplabv3.classifier[4] = torch.nn.Conv2d(256, num_classes, kernel_size=(1, 1), stride=(1, 1))

        我们还可以使用分割模型 Pytorch,它支持各种预训练的主干/编码器,但分割头似乎没有经过预训练。

import segmentation_models_pytorch as smpdeeplabv3 = smp.DeepLabV3(encoder_name='timm-mobilenetv3_small_100',encoder_weights='imagenet',classes=num_classes
)

五、小结

        DeepLabv3 架构由两个主要模块组成:一个能够通过 Atrous Convolution 提供精细分辨率特征图的主干,以及一个能够以精细分辨率提取多尺度特征、将其投影到所需特征数量的DeepLabv3 Head。映射(分割类的数量),并将它们上采样到输入图像分辨率。

        由于 DeepLabv3 具有模块化架构,我们可以混合搭配不同的模块以获得所需的性能。例如,我们可以使用预先训练的 ResNet101 主干来获得高性能,或者我们可以为了速度而放弃一些准确性,而使用 MobileNet 主干。我们甚至可以添加多个头来执行多任务学习,例如同时执行分割和深度估计。

这篇关于机器学习笔记 - 用于语义图像分割的空洞卷积DeepLabv3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578097

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)