语义分割 DeepLab V1网络学习笔记 (附代码)

news2024/9/28 15:19:44

论文地址:https://arxiv.org/abs/1412.7062

代码地址:GitHub - TheLegendAli/DeepLab-Context

1.是什么?

DeepLab V1是一种基于VGG模型的语义分割模型,它使用了空洞卷积和全连接条件随机(CRF)来提高分割的准确性。其总体架构包括一个卷积神经网络和一个CRF后处理模块。在卷积神经网络中,使用了空洞卷积来扩大感受野,从而提高了分割的准确性。在CRF后处理模块中,使用了全连接CRF来进一步优化分割结果。

以下是DeepLab V1模型的主要特点和:

  • 使用了VGG模型作为卷积神经网络的基础模型。
  • 使用了空洞卷积来扩大感受野,从而提高了分割的准确性。
  • 使用了全连接CRF来进一步优化分割结果。

2.为什么?

在论文的引言部分(INTRODUCTION)首先抛出了两个问题(针对语义分割任务): 

信号下采样导致分辨率降低:
在DCNN中重复最大池化和下采样带来的分辨率下降问题,分辨率的下降会丢失细节。max-pooling会降低特征图的分辨率,而利用反卷积等上采样方法会增加时空复杂度,也比较粗糙,因此利用空洞卷积来扩大感受野,相当于下采样-卷积-上采样的过程被一次空洞卷积所取代。空洞卷积可以扩展感受野,获取更多的上下文信息。
作者说主要是采用Maxpooling导致的,为了解决这个问题作者引入了'atrous'(with holes) algorithm(空洞卷积 / 膨胀卷积 / 扩张卷积)

空间“不敏感” 问题。
以获取图像中物体为核心的决策,必然需要空间不变性/不敏感。换句话说,对于同一张图片进行空间变换(如平移、旋转),其图片分类结果是不变的。但对于图像分割等,对于一张图片进行空间变换后,其结果是改变的。
作者说分类器自身的问题(分类器本来就具备一定空间不变性),我个人认为其实还是Maxpooling导致的。为了解决这个问题作者采用了fully-connected CRF(Conditional Random Field)方法。

Q:为什么说“CNNs 的不变性特性可能导致在特征提取过程中丢失一些空间信息”?
A:这主要是由于以下几个原因:

池化操作:CNN 中常用的池化层(如最大池化或平均池化)会减小特征图的空间尺寸,以减少计算量并增强空间不变性。然而,这种下采样的操作也导致了部分空间信息的丢失。当特征图被缩减时,原始图像中细微的空间结构和位置信息可能被模糊化或忽略,因此在一定程度上丢失了细粒度的空间信息。

卷积核尺寸:在卷积操作中,使用的卷积核尺寸通常较小,只关注局部感受野内的特征。这意味着较大的空间结构可能在特征提取过程中被忽略。虽然通过堆叠多个卷积层可以逐渐扩大感受野,但仍然存在一定程度的局部性。

权值共享:虽然权值共享增强了模型的平移不变性,但这也导致了一些空间信息的丢失。由于卷积核在整个图像上是共享的,网络学习到的特征对于不同位置的相同特征可能具有相同的响应,但对于不同特征的位置信息的差异性较小。

 解决方案
为了克服这些技术障碍,在像素级标注任务中,可以采取一些策略,如:

避免过度的信号下采样:可以适当减少池化层的使用,或者使用更少的步长来进行池化,以保留更多的空间信息。

结合上采样技术:可以使用转置卷积或其他上采样技术来恢复特征图的空间分辨率,从而更好地处理像素级标注任务。

结合多尺度特征:可以在网络中引入多尺度的特征表示,以捕获不同尺度的信息,并提高对不同大小目标的感知能力。

使用适当的损失函数:对于像素级标注任务,可以使用适当的损失函数,如交叉熵损失或Dice损失,来优化网络并鼓励更准确的像素级标注结果。

3.怎么样?

3.1 模型示意图

深度卷积神经网络(具有完全卷积层)生成的粗糙分数图通过双线性插值进行上采样。然后,应用全连接CRF来优化分割结果。最佳观看方式为彩色显示。 

3.2 LargeFOV

经过上采样得到 224 × 224 × n u m   c l a s s e s 224 \times 224 \times \mathrm{num \ classes}224×224×num classes 的特征图并非模型最终输出结果,还要经过一个 Softmax 层后才是模型最终的输出结果。Softmax 层的作用是将每个像素的类别预测转换为对应类别的概率。它会对每个像素的 num_classes 个类别预测进行归一化,使得每个预测值都落在 0 到 1 之间,并且所有类别的预测概率之和为 1。这样,对于每个像素点,我们可以得到每个类别的概率,从而确定该像素属于哪个类别的概率最大。最终的输出结果通常是经过 Softmax 处理后的特征图,其中每个像素点都包含了 num_classes 个类别的概率信息。

LargeFOV 本质上就是使用了膨胀卷积。

通过分析发现虽然 Backbone 是 VGG-16 但所使用 Maxpool 略有不同,VGG 论文中是 kernel=2,stride=2,但在 DeepLab v1 中是 kernel=3,stride=2,padding=1。接着就是最后两个 Maxpool 层的 stride 全部设置成了 1(这样下采样的倍率就从原来的 32 变成了 8)。最后三个 3 × 3  的卷积层采用了膨胀卷积,膨胀系数 r = 2 

然后关于将全连接层卷积化过程中,对于第一个全连接层(FC1)在 FCN 网络中是直接转换成卷积核大小为 7 × 7 ,卷积核个数为 4096 40964096 的卷积层(普通卷积),但在 DeepLab v1 中作者说是对参数进行了下采样最终得到的是卷积核大小 3 × 3 ,卷积核个数为 1024 10241024 的卷积层(膨胀卷积),对于第二个全连接层(FC2)卷积核个数也由 4096 40964096 采样成 1024 10241024(普通卷积)。

将 FC1 卷积化后,还设置了膨胀系数(膨胀卷积),论文 3.1 中说的是 r = 4 但在 Experimental Evaluation 中 Large of View 章节里设置的是 r = 12 对应 LargeFOV。对于 FC2 卷积化后就是卷积核 1 × 1 ,卷积核个数为 1024  的普通卷积层。接着再通过一个卷积核 1 × 1 ,卷积核个数为 num_classes(包含背景)的普通卷积层。最后通过 8 倍上采样还原回原图大小。

3.3 CRF

对于每个像素位置 i 具有隐变量 xi (这里隐变量就是像素的真实类别标签,如果预测结果有21类,则 i ∈ ( 1 , 2...21 ) ,还有对应的随机场观测值 yi (即像素点对应的颜色值)。以像素为节点,像素与像素间的关系作为边,构建了一个条件随机场(CRF)。通过观测变量 yi 来预测像素位置 i 对应的类别标签 xi。条件随机场示意图如下:


 

整个模型的能量函数

3.4 MSc(Multi-Scale)

作者将两层的 MLP(第一层:具有 128 个 卷积核且大小为 3 × 3 3\times 33×3 的卷积,第二层:具有 128 个卷积核且大小为 1 × 1 1\times 11×1 的卷积)分别附加到输入图像和前四个最大池化层的输出上,然后将它们的特征图与主网络的最后一层特征图进行连接。因此,送入 Softmax 层的聚合特征图将增加 5 × 128 = 640 5 \times 128 = 6405×128=640 个通道。
即 DeepLab v1 除了使用之前主分支上输出外,还融合了来自原图尺度以及前四个 Maxpool 层的输出,更详细的结构参考下图。


3.5 代码实现

VGG16

import torch
import torch.nn as nn
class VGG13(nn.Module):
    def __init__(self):
        super(VGG13, self).__init__()
        self.stage_1 = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(),
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(),
            nn.MaxPool2d(2,2),
        )
        
        self.stage_2 = nn.Sequential(
            nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.MaxPool2d(2,2),
        )
        
        self.stage_3 = nn.Sequential(
            nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(256),
            nn.ReLU(),
            nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(256),
            nn.ReLU(),
            nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(256),
            nn.ReLU(),
            nn.MaxPool2d(2,2),
        )     
        
        self.stage_4 = nn.Sequential(
            nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.MaxPool2d(2,stride=1, padding=1),
        )
        
        self.stage_5 = nn.Sequential(
            #空洞卷积
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=2, dilation=2),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=2, dilation=2),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=2, dilation=2),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.MaxPool2d(2, stride=1),
        ) 
        
    def forward(self, x):
        x = x.float()
        x1 = self.stage_1(x)
        x2 = self.stage_2(x1)
        x3 = self.stage_3(x2)
        x4 = self.stage_4(x3)
        x5 = self.stage_5(x4)
        return [x1, x2, x3, x4, x5]

DeepLabV1 

class DeepLabV1(nn.Module):
    def __init__(self, num_classes):
        super(DeepLabV1, self).__init__()
        #前13层是VGG16的前13层,分为5个stage
        self.num_classes = num_classes
        self.backbone = VGG13()
        
        self.stage_1 = nn.Sequential(
            #空洞卷积
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=4, dilation=4),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            
            nn.Conv2d(512, 512, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            
            nn.Conv2d(512, 512, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(512),
            nn.ReLU(),
        )
        self.final = nn.Sequential(
            nn.Conv2d(512, self.num_classes, kernel_size=3, padding=1)
        )
        
    def forward(self, x):
        #调用VGG16的前13层 VGG13
        x = self.backbone(x)[-1]
        x = self.stage_1(x)
        x = nn.functional.interpolate(input=x,scale_factor=8,mode='bilinear')
        x = self.final(x)
        return x

参考:

DeepLabV1网络简析

论文阅读 || 语义分割系列 —— deeplabv1 详解

[语义分割] DeepLab v
1网络(语义分割、信号下采样、空间上的不敏感性、LargeFOV、膨胀卷积、空洞卷积、MSc、Multi-Scale)

第五章:DeepLabV1——深度卷积神经网络和全连接条件随机场的语义图像分割 

语义分割系列-4 DeepLabV1-V3+(pytorch实现)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL手工注入漏洞测试(PostgreSQL数据库)-墨者

———靶场专栏——— 声明:文章由作者weoptions学习或练习过程中的步骤及思路,非正式答案,仅供学习和参考。 靶场背景: 来源: 墨者学院 简介: 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

10、pytest通过assert进行断言

官方实例 # content of test_assert1.pydef f():return 3def test_function():assert f() 4def test_assert_desc():a f()# assert a % 2 0assert a % 2 0, "value was odd, should be even"解读与实操 pytest允许你使用标准python断言来验证测试中的期望和值&…

【工具使用-Audition】如何使用Audition频谱分析

一,简介 本文以Audition 2020为例,介绍如何生成频谱分析的图像。 二,操作步骤 使用快捷键“shift D” 三,总结 本文主要介绍如何查看频谱分析,供参考。

不会代码(零基础)学语音开发(语音控制双色LED)

语音开发板到手后,跟着说明做一遍。例程:语音控制双色LED! 首先,进行固件烧录。 资料中已经给了固件,按照手册中的说明进行烧录即可。整体感受还挺简单,认真读手册即可实现。 需要注意的事项&#xff1a…

C语言——交换两个int变量的值,不能使用第三个变量。

交换两个int变量的值&#xff0c;不能使用第三个变量。即 a3,b5,交换之后a5,b3; #include<stdio.h> int main() {int a3;int b5;printf("a%d b%d\n",a,b);aa^b;ba^b;aa^b;printf("a%d b%d\n",a,b); } “^”——按位异或操作符&#xff0c;这里的按…

【ArcGIS Pro微课1000例】0048:深度学习--人群计数

文章目录 一、小学回忆录二、深度学习计算人头数三、案例实现一、小学回忆录 加载配套实验数据包中的图片及训练模型。你还记得当年的小学毕业班有多少同学吗?今天我们就用ArcGIS提供的人工智能工具,重温一下童年记忆。 二、深度学习计算人头数 本案例使用到的是深度学习中…

应急响应-挖矿病毒处理

应急响应-挖矿病毒处理 使用top​命令实时监控占用CPU资源的是哪个进程&#xff0c;结果可以看到是2725这个进程。 ​​ 再使用netstat -anltp命令查看网络连接状态&#xff0c;定位到对应的PID号后&#xff0c;就拿到了远程地址 ​​ 拿到远程IP&#xff0c;结果是VPN入口…

智能指针与动态内存

动态内存 new placement new 是 C 中的一种内存分配方式&#xff0c;它允许在给定的内存地址上构造对象&#xff0c;而不是在默认的堆上分配新的内存。这对于某些特殊的内存管理场景非常有用&#xff0c;例如在特定的内存池中分配对象。 C11 引入了 "new auto" 语法…

Jupyter NoteBook未授权访问漏洞

任务一&#xff1a; 复现未授权访问的漏洞 任务二&#xff1a; 利用Jupter Notebook控制台执行系统命令&#xff0c;读取/etc/passwd内容 1.搭建环境 2.new下面直接进入终端&#xff0c;而且也不需要登录&#xff0c;我就直接进入了管理界面 3.直接把指令输入进入&#xf…

5个非常良心好用的软件工具,适合各种场景

​ 本期给大家分享5个非常良心好用的软件工具&#xff0c;适合各种场景&#xff0c;能够高效提升你的学习和办公效率&#xff01; 1.多窗口管理——Multrin ​ Multrin是一款多窗口管理软件&#xff0c;可以将不同的应用程序窗口组合成一个标签页&#xff0c;方便在多任务场景…

无惧泄密:揭秘上海迅软DSE防拷贝大杀器!

对于企事业单位而言&#xff0c;文档的安全保护不仅要从源头上进行&#xff0c;杜绝文档在使用、传播过程中产生的泄密风险&#xff0c;同时也要对文档内容本身进行保护。为防止有心人通过拷贝、截屏、拍照等方式盗窃走重要文档内容信息的情况&#xff0c;天锐绿盾文件防泄密软…

【C++ STL】vector类最全详解(什么是vector?vector类的常用接口有哪些?)

目录 一、前言 二、什么是vector ? &#x1f4a6; vector的基本概念 &#x1f4a6;vector的作用是什么 &#x1f4a6;总结 三、 vector的(一维)定义 四、vector(一维)常用接口的使用 &#x1f4a6;vector的常见构造&#xff08;初始化&#xff09; &#x1f4a6;vector…

Python + Appium框架原生代码实现App自动化测试

Step1&#xff1a;首先介绍下pythonappium的框架结构 如下截图所示 . (1)&#xff1a;apk目录主要放置待测app的apk资源&#xff1b; (2)&#xff1a;config目录主要放置配置文件信息&#xff0c;包含&#xff1a;数据库连接配置、UI自动化脚本中所需的页面元素信息及app启…

python pyaudio实时读取音频数据并展示波形图

python pyaudio实时读取音频数据并展示波形图 下面代码可以驱动电脑接受声音数据&#xff0c;并实时展示音波图&#xff1a; import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import pyaudio import wave import os import op…

基于ssm 传统文化资源库导览系统-计算机毕设 附源码 63347

ssm 传统文化资源库导览系统 目 录 摘 要 Abstract 第1章 前 言 1.1 研究背景 1.3 系统开发目标 第2章 系统开发环境 2.1 java技术 2.4 SSM框架 第3章 需求分析 3.1 需求分析 3.2 系统可行性分析 3.3 项目设计目标与原则 3.4 系统流程分析 第4章 架…

大学里面转专业介绍

目录 个人情况转专业过程中的经验分享转专业后的学习建议和心态调整转专业后的时间平衡 个人情况 信息科学与工程学院计算机科学与技术专业2019级本科生&#xff0c;曾从物理与微电子科学学院后转入信息科学与技术学院。学习成绩连续三年专业前10% 项目&#xff1a;爬虫项目、…

Shopee过期的折扣活动如何删除?Shopee促销商品如何下架?——站斧浏览器

商家们可以轻松删除虾皮过期活动以及下架促销商品&#xff0c;保持店铺的整洁和顾客的购物体验。那么shopee过期的折扣活动如何删除&#xff0c;shopee促销商品如何下架。 Shopee过期的折扣活动如何删除&#xff1f; 在删除虾皮过期活动时&#xff0c;商家们需要遵循以下步骤…

gitlab高级功能之mirroring - push mirroring(一)

今天给大家介绍一个gitlab很高级也是非常有用的功能 - gitlab的mirroring&#xff0c;你可以将仓库镜像到外部或从外部镜像仓库过来&#xff0c;从而可以实现分支、标签和提交的自动同步。 文章目录 1. mirroring的实现方式2. push mirroring2.1 简介2.2 说明 3. 配置推送镜像3…

行业分析:轻轨行业发展现状及市场投资前景

轻轨是城市轨道建设的一种重要形式&#xff0c;也是当今世界上发展最为迅猛的轨道交通形式。轻轨的机车重量和载客量要比一般列车小&#xff0c;因此叫做“轻轨”。 城市轻轨具有运量大、速度快、污染小、能耗少、准点运行、安全性高等优点。城市轻轨与地下铁道、城市铁路及其…

使用JDBC连接和操作数据库以及myBatis初级入门

JDBC简介和使用 java程序操作数据库的方式有很多种&#xff0c;下面列举一些市面上常用的方式&#xff1a; 从图片分析的知&#xff1a; MyBatis MyBatisPlus 这两个所占的比重比较大。都是用于简化JDBC开发的 JDBC&#xff1a;(Java DataBase Connectivity)&#xff0c;就…