机器学习笔记 - 用于语义图像分割的空洞卷积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

相关文章

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

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

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

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

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Python如何将大TXT文件分割成4KB小文件

《Python如何将大TXT文件分割成4KB小文件》处理大文本文件是程序员经常遇到的挑战,特别是当我们需要把一个几百MB甚至几个GB的TXT文件分割成小块时,下面我们来聊聊如何用Python自动完成这... 目录为什么需要分割TXT文件基础版:按行分割进阶版:精确控制文件大小完美解决方案:支持UTF-8编码

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操