语义分割算法之DeepLabV3+论文理解及代码分析

Deeplabv3+概述(语义分割,小白必看) 关于图像分割的语义分割 阅读详情

前言

之前讲了DeepLabV1,V2,V3三个算法,DeepLab系列语义分割还剩下最后一个DeepLabV3+,以后有没有++,+++现在还不清楚,我们先来解读一下这篇论文并分析一下源码吧。论文地址:https://arxiv.org/pdf/1802.02611.pdf

背景

语义分割主要面临两个问题,第一是物体的多尺度问题,第二是DCNN的多次下采样会造成特征图分辨率变小,导致预测精度降低,边界信息丢失。DeepLab V3设计的ASPP模块较好的解决了第一个问题,而这里要介绍的DeepLabv3+则主要是为了解决第2个问题的。
我们知道从DeepLabV1系列引入空洞卷积开始,我们就一直在解决第2个问题呀,为什么现在还有问题呢?
我们考虑一下前面的代码解析推文的DeepLab系列网络的代码实现,地址如下:https://mp.weixin.qq.com/s/0dS0Isj2oCo_CF7p4riSCA 。对于DeepLabV3,如果Backbone为ResNet101,Stride=16将造成后面9层的特征图变大,后面9层的计算量变为原来的4倍大。而如果采用Stride=8,则后面78层的计算量都会变得很大。这就造成了DeepLabV3如果应用在大分辨率图像时非常耗时。所以为了改善这个缺点,DeepLabV3+来了。

算法原理

DeepLabV3+主要有两个创新点。

编解码器

为了解决上面提到的DeepLabV3在分辨率图像的耗时过多的问题,DeepLabV3+在DeepLabV3的基础上加入了编码器。具体操作见论文中的下图:
在这里插入图片描述其中,(a)代表SPP结构,其中的8x是直接双线性插值操作,不用参与训练。(b)是编解码器,融集合了高层和低层信息。©是DeepLabv3+采取的结构。

我们来看一下DeepLabV3+的完整网络结构来更好的理解这点:

在这里插入图片描述
对于编码器部分,实际上就是DeepLabV3网络。首先选一个低层级的feature用1 * 1的卷积进行通道压缩(原本为256通道,或者512通道),目的是减少低层级的比重。论文认为编码器得到的feature具有更丰富的信息,所以编码器的feature应该有更高的比重。 这样做有利于训练。
对于解码器部分,直接将编码器的输出上采样4倍,使其分辨率和低层级的feature一致。举个例子,如果采用resnet conv2 输出的feature,则这里要 × 4 \times 4 ×4上采样。将两种feature连接后,再进行一次 3 × 3 3 \times 3 3×3的卷积(细化作用),然后再次上采样就得到了像素级的预测。

实验结果表明,这种结构在Stride=16时有很高的精度速度又很快。stride=8相对来说只获得了一点点精度的提升,但增加了很多的计算量。

更改主干网络

论文受到近期MSRA组在Xception上改进工作可变形卷积(Deformable-ConvNets)启发,Deformable-ConvNets对Xception做了改进,能够进一步提升模型学习能力,新的结构如下:
在这里插入图片描述
最终,论文使用了如下的改进:

  • 更深的Xception结构,不同的地方在于不修改entry flow network的结构,为了快速计算和有效的使用内存
  • 所有的max pooling结构被stride=2的深度可分离卷积代替
  • 每个3x3的depthwise convolution都跟BN和Relu

最后将改进后的Xception作为encodet主干网络,替换原本DeepLabv3的ResNet101。

实验

论文使用modified aligned Xception改进后的ResNet-101,在ImageNet-1K上做预训练,通过扩张卷积做密集的特征提取。采用DeepLabv3的训练方式(poly学习策略,crop 513 × 513 513\times 513 513×513)。注意在decoder模块同样包含BN层。

使用1*1卷积少来自低级feature的通道数

上面提到过,为了评估在低级特征使用1*1卷积降维到固定维度的性能,做了如下对比实验:
在这里插入图片描述
实验中取了 C o n v 2 Conv2 Conv2尺度为 [ 3 × 3 , 256 ] [3\times3,256] [3×3,256]的输出,降维后的通道数在32和48之间最佳,最终选择了48。

使用3*3卷积逐步获取分割结果

编解码特征图融合后经过了 3 × 3 3\times 3 3×3卷积,论文探索了这个卷积的不同结构对结果的影响:
在这里插入图片描述

最终,选择了使用两组 3 × 3 3\times 3 3×3卷积。这个表格的最后一项代表实验了如果使用 C o n v 2 Conv2 Conv2和 C o n v 3 Conv3 Conv3同时预测, C o n v 2 Conv2 Conv2上采样2倍后与 C o n v 3 Conv3 Conv3结合,再上采样2倍的结果对比,这并没有提升显著的提升性能,考虑到计算资源的限制,论文最终采样简单的decoder方案,即我们看到的DeepLabV+的网络结构图。

Backbone为ResNet101

在这里插入图片描述

Backbone为Xception

在这里插入图片描述
这里可以看到使用深度分离卷积可以显著降低计算消耗。

与其他先进模型在VOC12的测试集上对比:

在这里插入图片描述在目标边界上的提升,使用trimap实验模型在分割边界的准确度。计算边界周围扩展频带(称为trimap)内的mIoU。结果如下:

在这里插入图片描述
与双线性上采样相比,加decoder的有明显的提升。trimap越小效果越明显。Fig5右图可视化了结果。

结论

论文提出的DeepLabv3+是encoder-decoder架构,其中encoder架构采用Deeplabv3,decoder采用一个简单却有效的模块用于恢复目标边界细节。并可使用空洞卷积在指定计算资源下控制feature的分辨率。论文探索了Xception和深度分离卷积在模型上的使用,进一步提高模型的速度和性能。模型在VOC2012上获得了SOAT。Google出品,必出精品,这网络真的牛。

代码实现

结合一下网络结构图还有我上次的代码解析点这里 看,就很容易了。


from __future__ import absolute_import, print_function

from collections import OrderedDict

import torch
import torch.nn as nn
import torch.nn.functional as F

from .deeplabv3 import _ASPP
from .resnet import _ConvBnReLU, _ResLayer, _Stem


class DeepLabV3Plus(nn.Module):
    """
    DeepLab v3+: Dilated ResNet with multi-grid + improved ASPP + decoder
    """

    def __init__(self, n_classes, n_blocks, atrous_rates, multi_grids, output_stride):
        super(DeepLabV3Plus, self).__init__()

        # Stride and dilation
        if output_stride == 8:
            s = [1, 2, 1, 1]
            d = [1, 1, 2, 4]
        elif output_stride == 16:
            s = [1, 2, 2, 1]
            d = [1, 1, 1, 2]

        # Encoder
        ch = [64 * 2 ** p for p in range(6)]
        self.layer1 = _Stem(ch[0])
        self.layer2 = _ResLayer(n_blocks[0], ch[0], ch[2], s[0], d[0])
        self.layer3 = _ResLayer(n_blocks[1], ch[2], ch[3], s[1], d[1])
        self.layer4 = _ResLayer(n_blocks[2], ch[3], ch[4], s[2], d[2])
        self.layer5 = _ResLayer(n_blocks[3], ch[4], ch[5], s[3], d[3], multi_grids)
        self.aspp = _ASPP(ch[5], 256, atrous_rates)
        concat_ch = 256 * (len(atrous_rates) + 2)
        self.add_module("fc1", _ConvBnReLU(concat_ch, 256, 1, 1, 0, 1))

        # Decoder
        self.reduce = _ConvBnReLU(256, 48, 1, 1, 0, 1)
        self.fc2 = nn.Sequential(
            OrderedDict(
                [
                    ("conv1", _ConvBnReLU(304, 256, 3, 1, 1, 1)),
                    ("conv2", _ConvBnReLU(256, 256, 3, 1, 1, 1)),
                    ("conv3", nn.Conv2d(256, n_classes, kernel_size=1)),
                ]
            )
        )

    def forward(self, x):
        h = self.layer1(x)
        h = self.layer2(h)
        h_ = self.reduce(h)
        h = self.layer3(h)
        h = self.layer4(h)
        h = self.layer5(h)
        h = self.aspp(h)
        h = self.fc1(h)
        h = F.interpolate(h, size=h_.shape[2:], mode="bilinear", align_corners=False)
        h = torch.cat((h, h_), dim=1)
        h = self.fc2(h)
        h = F.interpolate(h, size=x.shape[2:], mode="bilinear", align_corners=False)
        return h


if __name__ == "__main__":
    model = DeepLabV3Plus(
        n_classes=21,
        n_blocks=[3, 4, 23, 3],
        atrous_rates=[6, 12, 18],
        multi_grids=[1, 2, 4],
        output_stride=16,
    )
    model.eval()
    image = torch.randn(1, 3, 513, 513)

    print(model)
    print("input:", image.shape)
print("output:", model(image).shape)

参考文章

https://blog.youkuaiyun.com/u011974639/article/details/79518175


欢迎关注我的微信公众号GiantPadaCV,期待和你一起交流机器学习,深度学习,图像算法,优化技术,比赛及日常生活等。
图片.png

1.deeplabv3+网络结构及原理 这里的网络结构及原理可以看这篇博客,该博客翻译原论文解释得很清楚。 阅读详情

相关推荐

DeepLabv3+

一.摘要 本文在进行语义分割任务时将空间金字塔池化模块或encoder-decoder结构引入到深度神经网络中。以前的网络通过对输入的feature map使用多种尺度的卷积核或者池化操作以及多种感受野能够编码出多尺度的环境信息。而之后的一些工作中提出的网络通过逐渐恢复空间信息能够捕获更加精细的物体边界。在本文中,将以上两种优势(多尺度特征+恢复空间信息)进行结合。特别地,本文提出的deeplabv3+在deeplabv3的基础上加入了简单却有效的decoder模块去细化分割结果,特别是物体的边界。 二

yy2050645的博客 2万+

DeepLabv3+图像语义分割实战:训练自己的数据集

DeepLabv3+是一种非常先进的基于深度学习的图像语义分割方法,可对物体进行像素级分割。 本课程将手把手地教大家使用labelme图像标注工具制作数据集,并使用DeepLabv3+训练自己的数据集,从而能开展自己的图像语义分割应用。 本课程有两个项目实践: (1) CamVid语义分割 :对CamVid数据集进行语义分割 (2) RoadScene语义分割:对汽车行驶场景中的路坑、车、车道线进行物体标注和语义分割 本课程使用TensorFlow版本的DeepLabv3+,在Ubuntu系统上做项目演示。 包括:安装deeplab、数据集标注、数据集格式转换、修改程序文件、训练自己的数据集、测试训练出的网络模型以及性能评估。 本课程提供项目的数据集和Python程序文件。 下图是使用DeepLabv3+训练自己的数据集RoadScene进行图像语义分割的测试结果:

Pytorch 语义分割DeepLabV3+ 训练自己的数据集

照葫芦画瓢总结记录了一下DeepLab分割系列,并对Deeplab V3++实现 一、DeepLab系列理解 1、DeepLab V1 原文:Semantic image segmentation with deep convolutional nets and fully connected CRFs(https://arxiv.org/pdf/1412.7062v3.pdf) 收录:ICLR 2015 (International Conference on Learning Representatio

yx868yx的博客 7932

DeepLab V3+

对于语义分割任务,深度神经网络通常使用空间金字塔池化模块或编码器-解码器结构。前者通过以多种速率和多种有效视野的滤波器或池化操作来探测传入特征以编码多尺度上下文信息,而后者则通过逐渐恢复空间信息来捕捉更加清晰的物体边界。在本文中,我们提出了将两种方法的优点结合起来的方法。具体而言,我们的提出的模型DeepLabv3+扩展了DeepLabv3,通过添加一个简单而有效的解码器模块来特别改善物体边界的分割结果。我们进一步探索了Xception模型,并将深度可分离卷积应用于空洞空间金字塔池化和解码器模块,从而得到了

我的博客 8189

DeepLabV3+神经网络解析

DeepLabV3+神经网络解析论文:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation什么是DeeplabV3+网络deeplabV3+主要结构主干网络(DCNN)空洞卷积(膨胀卷积)空洞空间卷积池化金字塔(atrous spatial pyramid pooling (ASPP))利用特征获得预测结果损失函数结果对比 论文:Encoder-Decoder with Atrous Separab

Jkway 9669

工程师必看:如何用功率谱密度搞定随机振动测试(附Grms计算实例)

本文为工程师详解如何通过功率谱密度(PSD)曲线计算Grms(总均方根加速度),从而量化随机振动测试的强度。文章拆解了平直谱、斜谱的计算公式,提供了完整的Grms计算实例,并指出了单位换算、对数坐标等常见工程陷阱,帮助工程师精准完成测试准备与设备推力评估。

3c4x5z6v7b的博客 625

分割算法DeepLabV3+论文理解及代码分析

前言 之前讲了DeepLabV1,V2,V3三个算法,DeepLab系列语义分割还剩下最后一个DeepLabV3+,以后有没有++,+++现在还不清楚,我们先来解读一下这篇论文并分析一下源码吧。论文地址:https://arxiv.org/pdf/1802.02611.pdf 背景 语义分割主要面临两个问题,第一是物体的多尺度问题,第二是DCNN的多次下采样会造成特征图分辨率变小,导致预测精度降低,边界信息丢失。DeepLab V3设计的ASPP模块较好的解决了第一个问题,而这里要介绍的DeepLabv3+

Maple__Boy 4025

C# WPF多页面间的数据共享(经典)

实现页面间的数据共享有很多方法,比如:①事件的发布订阅 ②委托③ioc容器④静态类等,这节主要通过静态的集合实现数据的添加和获取。

sf315418的博客 639

基于MindSpore复现Deeplabv3—语义分割

基于MindSpore复现Deeplabv3—语义分割 实验介绍 本实验主要介绍使用MindSpore深度学习框架在PASCAL VOC2012数据集上训练Deeplabv3网络模型。本实验使用了MindSpore开源仓库model_zoo中的deeplabv3模型案例。 图像的语义分割是计算机视觉中重要的基本问题之一,其目标是对图像的每个像素点进行分类,将图像分割为若干个视觉上有意义的或感兴趣的区域,以利于后续的图像分析和视觉理解。输入输出为大小相同的图片。 随着DCNN(深度卷积网络)的发展,图片中的特

kewei chen 7572

Excel数据透视表实战:分组折线图制作与动态分析指南

数据可视化是数据分析的关键环节,其核心原理在于将抽象数据转化为直观图形,以揭示趋势、对比差异。在众多图表类型中,折线图因其能清晰展示连续数据随时间或其他序列的变化趋势,而成为趋势分析的利器。其技术价值在于通过视觉编码,将多维数据关系降维呈现,从而辅助决策。在业务分析、运营监控等应用场景中,常需对比不同分组(如产品线、销售区域)在同一时间序列上的表现,这正是分组折线图要解决的核心问题。本文聚焦于利用Excel数据透视表这一强大工具,高效构建动态分组折线图,并深入探讨数据透视表在数据重塑和图表自动化中的实战应用

weixin_29057237的博客 380

告别虚拟机!用ZYNQ7000和PYNQ 2.6.0打造一个能实时识别人脸的“智能摄像头”

本文详细介绍了如何利用Xilinx ZYNQ7000开发板和PYNQ 2.6.0框架构建实时人脸识别系统。通过硬件加速和嵌入式开发技术,该系统实现了低延迟、低功耗的独立运行能力,适用于边缘计算和物联网应用。文章包含从环境搭建到核心功能实现的完整指南,并提供了性能优化和问题排查的实用技巧。

weixin_42543046的博客 391

基于Pytorch实现的图像分割算法: DeepLabV3+

图像分割可以算是图像处理领域最重要的几个问题之一了。随着自动驾驶,广告推荐,手机照片处理,知识图谱等智能应用的快速普及,基于语义分析的图像分割、理解与识别变得越来越重要。近年来比较热的视觉领域工作,很大比重是围绕如何使用大规模数据,结合结构优良的深度网络模型,实现图像分割计算。今天,我们就来学习一项该领域的著名工作(DeepLabV3+)。

2万+

从网口变压器到TVS管:手把手设计通过4KV浪涌的以太网电路

本文详细解析工业级以太网接口4KV浪涌防护设计,从网口变压器选型到TVS管布局,提供通过IEC61000-4-5标准测试的完整方案。重点介绍Bob Smith电路优化和PCB设计技巧,帮助工程师有效应对雷电感应和设备开关瞬态干扰,确保工业设备稳定运行。

study的专栏 284

DeepLabv3+:语义分割领域的新高峰

在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考。在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果。点击本文底部的「阅读原文」即刻加入社区,查看更多最新论文推荐。这是 PaperDaily 的第 44 篇文章关于作者:陈泰红,小米高级算法工程师,研究方向为人脸检测识别,手势识别与跟踪。■ 论文 | Encoder-Decoder with

Paper weekly 4847

Cadence Orcad Capture原理图断线的检查与避免方法

在设计电路图中,尤其是直接借鉴别人的设计进行二次开发的过程中难免会遇到如下尴尬的情况。有没有眼神好的朋友发现图纸的哪里有不对劲的地方呢?

fydar的博客 3269

Deepfake检测模型-PyDeepFakeDet项目复现实验报告-深度学习

该实验是对于https://github.com/wangjk666/PyDeepFakeDet模型的复现。PyDeepFakeDet 是一款集成的、可扩展的 Deepfake 检测工具。目标是提供最先进的 Deepfake 检测模型以及用于在常用 Deepfake 数据集上训练和评估新模型的接口。

一位不是很硕的鉴伪方向硕士 5494

Deeplabv3+网络结构详解与模型的搭建

aaaaa

天马行空的博客 2万+

STM32 BOOTLOADER配置以及APP跳转实现(裸机)

Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行。

吻等离子的博客 3355

图像语义分割:TensorFlow Deeplabv3+ 训练自己数据集

本文主要介绍如何使用自己的数据集训练DeepLabv3+分割算法,代码使用的是官方源码。 1、代码简介 当前使用TensorFlow版本的官方源码,选择它的原因是因为代码中的内容比较全面,除了代码实现以外,还提供了许多文档帮助理解与使用,同时还提供了模型转换的代码实现。 代码地址: 【github】models/research/deeplab at master · tensorflow...

ling620的专栏 4874

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

DeepLabv3.pytorch:强大的语义分割工具

DeepLabv3.pytorch:强大的语义分割工具 项目的核心功能/场景 DeepLabv3.pytorch 是一个基于 PyTorch 的 DeepLabv3 算法实现,用于语义分割任务。 项目介绍 DeepLabv3.pytorch 是一个开源项目,旨在实现 DeepLabv3 算法,并尽可能复用 PyTorch 中 torchvision 的 ResNet 实现。该项目的目标是提供一种高...

gitblog_00765的博客 667

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于DeepLabV3 +网络的注意力机制图像语义分割方法

图像语义分割是一种通过为目标类别中的每个点分配基于其“语义”的标签来区分图像中不同种类事物的技术。目前使用的Deeplabv3+图像语义分割方法计算复杂度高,内存消耗大,难以在计算能力有限的嵌入式平台上部署。在提取图像特征信息时,Deeplabv3+难以充分利用多尺度信息。这可能导致详细信息的丢失和损害分割的准确性。提出了一种基于DeepLabv3+网络的改进图像语义分割方法,以轻量级的MobileNetv2作为模型的主干。

weixin_63230513的博客 5434

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

DeepLabV3 - 详细介绍

基本情况 这是在DeepLabV1、2基础上的再扩展; V1 主要是将VGG最后两个的池化改成了stride=1,然后采用了空洞卷积来扩大感受野,上采样使用了双线性插值; V2主要是在模型最后进行像素分类之前增加一个类似 Inception 的结构,即ASPP模块,通过不同rate得到不同尺度的特征图,再进行预测; V3 主要是对之前模块的升级,从而提升性能。 引言&相关工作 一般的分割存在两个挑战,一个是分辨率的下降(由下采样导致),常常采用空洞卷积来代替池化解决,效果不错; 另一个是存在多个尺

qq_43492938的博客 3万+

【深度学习项目】语义分割-DeepLab网络(DeepLabV1、DeepLabV2介绍)

DeepLab 是一种专门为语义分割任务设计的深度学习模型,由 Google 团队提出。它在处理具有复杂结构和多尺度对象的图像时表现出色,能够精确地捕捉边界信息,并且有效地解决了传统卷积神经网络(CNN)中由于下采样操作导致的空间分辨率损失的问题。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

基于DeeplabV3+的语义分割实现

摘要: 当今机器学习不断发展,成为社会的热点新闻,机器学习能在各个领域不断发展并且应用。其中语义分割是研究最为频繁的领域,在深度学习中,由于分割模型的参数量确实是很大,所用到的算法既耗费时间又耗费精力,于是提出轻量级的DeeplabV3的模型方法,最终实现语义分割的效果。为了实现对图像深度的理解,达到检测识别图片中物体的各类,能够更充分的理解图片的含义,而DeeplabV3是语义分割的新高峰,我们基于DeeplabV3的模型方法在VOC2007公开数据集进行训练预测,该方法为一种轻量级网络,主要包括编码器和

weixin_54189936的博客 1601

【深度学习项目】语义分割-DeepLab网络(DeepLabV3介绍、基于Pytorch实现DeepLabV3网络)

DeepLab 是一种专门为语义分割任务设计的深度学习模型,由 Google 团队提出。它在处理具有复杂结构和多尺度对象的图像时表现出色,能够精确地捕捉边界信息,并且有效地解决了传统卷积神经网络(CNN)中由于下采样操作导致的空间分辨率损失的问题。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

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

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

秃头小苏的博客 2877
上一篇: Pytorch实战Kaggle房价预测比赛
下一篇: 人脸识别系列三 | MTCNN算法详解上篇
just_sort
博客等级 码龄11年 2357粉丝 1667原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值