教程/讲解视频点击文末名片

1、什么是语义分割,什么是FCN
我们提出了一种新颖且实用的深度全卷积神经网络架构,用于语义像素级分割,命名为SegNet。
语义分割是指为图像中的每个像素分配一个类别标签(如道路、天空、汽车),以实现对场景的细粒度理解。
全卷积神经网络(Fully Convolutional Network,简称 FCN)于2015提出。是深度学习用于语义分割领域的开山之作,在传统卷积神经网络(CNN)的基础上进行了改进,传统 CNN 主要用于图像分类任务。它的结构通常包括卷积层、池化层和全连接层。在图像分类中,CNN 的输出是一个固定大小的向量(例如,1000 类分类任务的输出向量长度为 1000),表示输入图像属于各个类别的概率分布。
全连接层的输入大小是固定的,这意味着输入图像的大小也必须固定。此外,全连接层的参数量巨大,导致模型复杂度高且难以扩展到像素级任务。
全卷积神经网络的核心思想是将传统 CNN 中的全连接层替换为卷积层,实现对任意大小输入图像的像素级处理。
在这里插入图片描述

如fig1所示,全卷积网络先使用卷积神经网络抽取图像特征,然后通过卷积层将通道数变换为类别个数,最后再通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。因此,模型输出与输入图像的高和宽相同,且最终输出通道包含了该空间位置像素的类别预测。

2、SegNet架构简介

该核心可训练分割引擎由编 码器网络、对应的解码器网络以及像素级分类层组成。编码器网络的拓扑结构与VGG16网络[1]中的13个卷积层完全一致。解码器网络 的作用是将低分辨率编码器特征图映射为全输入分辨率特征图,以便进行像素级分类
SegNet 的核心就是一个“分割引擎”,它由三部分组成:

  1. 编码器网络(Encoder):负责提取图像的特征。
  2. 解码器网络(Decoder):负责把提取到的特征恢复成和输入图像一样大的特征图。
  3. 像素级分类层(Pixel-wise Classification Layer):负责给每个像素分配一个类别(比如“这是道路”“这是车辆”“这是行人”)。
    编码器网络(Encoder)
    编码器网络的结构和 VGG16 网络中的前 13 个卷积层一模一样。你可以把 VGG16 想象成一个“特征提取器”,它通过一层一层的卷积操作,把输入的图像变成一个低分辨率的特征图。这个特征图虽然小,但包含了图像的关键信息。
    简单来说,编码器的工作就是:
  • 输入一张大图像(比如 224×224)。
  • 经过 13 层卷积操作,输出一个很小的特征图(比如 7×7)。
  • 这个特征图虽然小,但包含了图像的“精华”信息。
    解码器网络(Decoder)
    解码器的作用是把编码器输出的低分辨率特征图恢复成和输入图像一样大的特征图。这个过程有点像“放大镜”,把小图变成大图。
    解码器的工作流程是:
  • 上采样(Upsampling):解码器利用编码器阶段保存的最大池化索引,把小特征图“放大”成大特征图。这个过程是非线性的,不需要学习额外的参数。
  • 稀疏特征图(Sparse Feature Map):上采样后的特征图是稀疏的,只有部分位置有值,其他位置是零。
  • 卷积操作(Convolution):通过卷积操作,把稀疏特征图变成密集特征图。这个过程会让特征图更加“完整”,为后续的分类做好准备。
    像素级分类层(Pixel-wise Classification Layer)
    最后一步是像素级分类。解码器输出的高分辨率特征图包含了每个像素的特征信息。像素级分类层的任务是:
  • 对每个像素的特征进行分类,判断它属于哪个类别(比如“道路”“车辆”“行人”)。
  • 输出一个和输入图像一样大的分割图,每个像素都有一个类别标签。
    3、SegNet创新点
    SegNet的创新点在于解码器对低分辨率输入特征图进行上采样的方式。具体而言,解码器利用编码器对应步骤中计算的最大池化索引进行非线性上采样,从而无需学习上采样过程。 上采样后的特征图具有稀疏性,随后通过与可训练滤波器卷积生成密集特征图。
    优势总结
  1. 无需学习上采样参数:
  • 传统方法需要学习额外的参数来进行上采样,而 SegNet 直接利用编码器阶段保存的索引信息进行上采样,避免了学习上采样参数的复杂性和计算开销。
  1. 保留更多细节信息:
  • 通过最大池化索引进行上采样,能够更准确地恢复特征图的细节信息,因为它是基于原始特征图中的最大值位置进行恢复的,而不是通过插值或其他近似方法。
  1. 稀疏特征图的高效性:
  • 稀疏特征图在存储和计算上更加高效,因为只有部分位置有非零值。通过卷积操作生成密集特征图后,这些稀疏特征图可以被有效地转换为适合分类的密集特征图。
  1. 背景:为什么需要上采样?
    在 SegNet 中,编码器部分会把输入图像逐步压缩成低分辨率的特征图,这样可以提取图像的核心特征。但是,为了进行像素级分割,我们需要把这些低分辨率的特征图恢复到和输入图像一样的分辨率,这样才能对每个像素进行分类。这个过程就叫“上采样”。
  2. 传统方法的局限性
    在传统的上采样方法中,比如反卷积(Deconvolution)或插值(Interpolation),通常需要学习额外的参数来完成上采样。这些方法的问题是:
  • 需要额外的参数:这些参数需要通过训练来学习,增加了模型的复杂性和训练时间。
  • 可能丢失细节:这些方法在恢复图像细节方面可能不够精确,导致分割结果不够准确。
    4、对比
    Deconvolutional Network
    DeepLab-LargeFOV
    DeepLab-LargeFOV 是一种用于语义分割的深度学习模型,属于 DeepLab 系列的早期版本。它的核心思想是通过使用空洞卷积(Atrous Convolution)来扩大感受野(Field of View)
  1. 普通卷积(Normal Convolution)
    先来说说普通的卷积。想象一下,你有一张照片,你想用一个小窗口(卷积核)在照片上滑动,每次滑动都计算一下窗口内的像素值,然后生成一个新的像素值。这个过程就像是用一个小刷子在照片上涂抹,每次涂抹只覆盖一小块区域。
    举个例子:
  • 假设你有一个 3×3 的卷积核,它会在输入图像上滑动,每次计算一个 3×3 区域内的像素值,生成一个新的像素值。
  • 如果输入图像的分辨率是 224×224,经过普通卷积后,输出图像的分辨率会变小(比如 222×222),因为卷积核滑动时会丢失边缘信息。
  1. 空洞卷积(Atrous Convolution)
    空洞卷积和普通卷积有点像,但它有一个特别的地方:它会在卷积核中“跳过”一些像素。这就像是你在用一个小刷子涂抹时,故意跳过一些点,而不是连续地涂抹。
    具体来说:
  • 膨胀系数(Dilation Rate):空洞卷积有一个参数叫膨胀系数(dilation rate)。膨胀系数决定了卷积核中像素之间的间隔。
  • 膨胀卷积核:如果膨胀系数是 1,空洞卷积就和普通卷积一样。但如果膨胀系数大于 1,卷积核就会“膨胀”,跳过一些像素。
    举个例子:
  • 假设你有一个 3×3 的卷积核,膨胀系数是 2。那么,这个卷积核实际上会覆盖一个 5×5 的区域,但中间的像素是跳过的。
  • 具体来说,普通卷积的 3×3 卷积核是这样的:
  • 复制
    1 2 3
    4 5 6
    7 8 9
  • 但膨胀系数为 2 的空洞卷积核覆盖的区域是这样的:
  • 复制
    1 0 2 0 3
    0 0 0 0 0
    4 0 5 0 6
    0 0 0 0 0
    7 0 8 0 9
  • 其中,0 表示跳过的像素。
  1. 空洞卷积的优势
  • 扩大感受野:普通卷积的感受野比较小,每次只能看到一个小区域。空洞卷积通过跳过像素,可以覆盖更大的区域,从而扩大感受野。这就好像是你用一个小刷子,但每次涂抹时可以跳过一些点,覆盖更大的范围。
  • 不丢失分辨率:普通卷积会导致输出图像的分辨率变小,但空洞卷积可以在不丢失分辨率的情况下扩大感受野。这就好像是你在用一个小刷子涂抹时,虽然跳过了一些点,但整体覆盖的范围更大了,而且不会丢失细节。
  • 计算效率高:空洞卷积通过跳过像素,减少了计算量,同时保持了输出图像的分辨率。

5、SegNet的背景和设计动机

  1. 语义分割的应用和背景
    语义分割是一种技术,它的任务是把图像里的每个像素都标注出它属于什么类别(比如道路、建筑物、汽车、行人等)。这种技术用途很广,比如:
  • 场景理解:让计算机明白图像里都有哪些东西,它们之间的关系是什么。
  • 自动驾驶:帮助自动驾驶系统识别道路、行人、交通标志等。
  1. 早期方法和深度学习的突破
    以前,人们主要用一些简单的视觉线索(比如颜色、纹理)来做语义分割,但这种方法效果不太好。后来,深度学习出现了,它在很多领域都取得了重大突破,比如:
  • 手写数字识别:识别手写的数字。
  • 语音处理:把语音转换成文字。
  • 图像分类:判断图像里是什么东西。
  • 物体检测:在图像里找到物体的位置。
    深度学习的出现让语义分割的效果也有了很大的提升。
  1. 像素级标注的挑战
    虽然深度学习在语义分割上取得了进步,但直接用传统的深度学习架构(比如VGG16)来做像素级标注还是有问题的。主要问题是:
  • 最大池化和下采样:这些操作会让特征图的分辨率变低,导致边界信息丢失。这在需要精确边界的地方(比如道路和人行道的分界线)就不太好了。
  1. SegNet的设计动机
    SegNet就是为了解决这些问题而设计的。它的目标是:
  • 高效:既要节省内存,又要运行速度快。
  • 精确:能够精确地标注每个像素的类别,尤其是边界部分。
  • 端到端训练:通过随机梯度下降(SGD)等技术,一次性训练整个网络,这样更容易重复和优化。
  1. SegNet的设计细节
    编码器(Encoder)
  • 结构:SegNet的编码器和VGG16的卷积层一模一样,但移除了VGG16的全连接层。这样参数量大大减少,训练起来也更容易。
  • 功能:提取图像的特征,但不会丢失太多细节。
    解码器(Decoder)
  • 核心组件:解码器是SegNet的关键,它由多个解码器层组成,每个解码器层都对应一个编码器层。
  • 最大池化索引:解码器利用编码器记录的最大池化索引,对特征图进行上采样。这样可以恢复边界信息,让分割结果更精确。
  • 非线性上采样:通过这种方式,解码器可以把低分辨率的特征图还原成高分辨率的图像。
  1. SegNet的优势
  • 高效:参数量少,运行速度快,内存占用低。
  • 精确:通过记录最大池化索引,能够恢复边界信息,适合需要精确分割的任务。
  • 端到端训练:整个网络可以一次性训练,优化起来更方便。
  1. 应用场景
    SegNet特别适合道路场景理解,比如:
  • 道路和建筑物:这些大类别的像素占大部分,需要生成平滑的分割结果。
  • 行人和小目标:即使目标很小,也能通过保留边界信息来精确分割。
    6、模型解剖
    编码器网络中的每个编码器通过滤波器组进行卷积运算, 生成一组特征图
  • 操作:编码器通过一组滤波器(也可以叫卷积核)在图像上滑动,每个滤波器会提取图像的某种特征(比如边缘、纹理等),最后生成一组特征图。
  • 举例:就像用不同的放大镜去看一幅画,每个放大镜(滤波器)会帮你看到画里不同的细节(特征)。
    随后对这些特征图进行批量归一化处理
  • 操作:对生成的特征图进行批量归一化处理。
  • 目的:让特征图的数据分布更加“规整”,避免在训练过程中出现数值不稳定的情况,这样可以让训练过程更加顺利。
  • 举例:就像在比赛前把所有选手的起跑线都调整到同一个位置,这样比赛才会更公平。
    然后应用元素级修正线性非线性函数
  • 操作:对特征图的每个元素应用ReLU函数,即如果元素的值大于0就保持不变,小于0就变成0。
  • 目的:给模型引入非线性,让模型能够学习更复杂的特征和模式。
    随后执行最大池化操作,采用2×2窗口和步 长为2(非重叠窗口),并将输出结果进行2倍下采样。最大 池化用于实现对输入图像小范围空间位移的平移不变性。下 采样使得特征图中每个像素对应一个较大的输入图像上下文 (空间窗口)
  • 操作:用一个2×2的窗口在特征图上滑动,每次取窗口里最大的值,然后把特征图缩小2倍(步长为2)。
  • 目的:
    • 平移不变性:让模型对图像的小范围移动不那么敏感。比如,一个物体在图像里稍微移动了一下位置,模型仍然能认出来。
    • 提取上下文信息:下采样后,特征图中的每个像素对应了输入图像中一个更大的区域(空间窗口),这样可以让模型更好地理解图像的整体结构。
  • 举例:就像从远处看一幅画,你只能看到大致的轮廓,但看不到细节。不过这样也有好处,比如你可以更容易地看出画的整体布局。
    因此我们提出了一种更高效的存储方案:仅需存储最大池化索引i。e、每个池化窗口中最 大特征值的位置信息会被存储在对应的编码器特征图中。从 原理上说,这种方法可以为每个2×2的池化窗口分配2位数 据,因此相比以浮点精度存储特征图
    虽然最大池化和下采样有很多好处,但它们也会导致一个问题:特征图的空间分辨率降低,边界细节丢失。这在需要精确分割的任务(比如语义分割)中是不利的,因为我们需要明确的边界划分。
    (1)存储所有特征图的方案
  • 方案:如果内存足够,可以存储所有经过下采样的特征图。
  • 问题:在实际应用中,内存通常是有限的,所以这个方案不太可行。
    (2)存储最大池化索引的方案
  • 方案:只存储每个池化窗口中最大特征值的位置信息(索引),而不是存储整个特征图。
  • 优点:
    • 高效:每个2×2的池化窗口只需要2位数据来存储索引,相比存储浮点特征图,这种方式节省了很多内存。
    • 举例:假设一个2×2的窗口里有4个值,最大值的位置可以用2位二进制数来表示(00、01、10、11),这样存储起来非常节省空间。
  • 缺点:虽然这种方法节省了内存,但会导致精度略有损失。不过,后续的研究表明,这种损失在实际应用中是可以接受的。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch 数据加载全攻略:从自定义数据集到模型训练

目录 一、为什么需要数据加载器? 二、自定义 Dataset 类 1. 核心方法解析 2. 代码实现 三、快速上手:TensorDataset 1. 代码示例 2. 适用场景 四、DataLoader:批量加载数据的利器 1. 核心参数说明 2. 代码示例 五、实战&#xff1…

Python--plist文件的读取

Python练习:读取Apple Plist文件 Plist文件简介 ​​定义​​:Apple公司创建的基于XML结构的文件格式​​特点​​:采用XML语法组织数据,可存储键值对、数组等结构化信息文件扩展名​​:.plist应用场景: ​​iOS系统:​…

JAVA几个注解记录

在Java中,Data、AllArgsConstructor和NoArgsConstructor是Lombok库提供的注解,用于自动生成Java类中的样板代码(如getter、setter、构造函数等),从而减少冗余代码,提高开发效率。以下是它们的详细功能和使用…

js对象简介、内置对象

对象、内置对象 jarringslee 对象 对象(object)是js的一种引用数据类型,是一种无序的数据集合“ul”(类比于数组,有序的数据集合“ol”)。 基本上等于结构体。 对象的声明 //基本方法 let 对象名 {声…

【工程篇】07:如何打包conda环境并拷贝到另一台服务器上

这是一份以名为 qwen2.5-vl 的 Conda 环境为例的详细操作手册,指导您如何将其打包并迁移至另一台服务器。操作手册:迁移 Conda 环境 qwen2.5-vl 至新服务器 本文档将提供两种有效的方法来迁移您的 qwen2.5-vl 环境。请根据您的具体需求和服务器条件选择最…

rustdesk远控电脑替代todesk,平替向日葵等软件

rustdesk网页端远控电脑docker run --restart always \ --privileged \ -p 9000:9000 \ -p 21114:21114 \ -p 21115:21115 \ -p 21116:21116 \ -p 21116:21116/udp \ -p 21117:21117 \ -p 21118:21118 \ -p 21119:21119 \ -e KEYj8muHpzr2HK00zm9D94b1UFkaJ1bEiWsyA1qxb1nOA \ …

板凳-------Mysql cookbook学习 (十二--------1)

第9章 存储例程,触发器和计划事件 326 9.0 概述 326 9.1 创建复合语句对象 329 mysql> -- 恢复默认分隔符 mysql> DELIMITER ; mysql>mysql> DROP FUNCTION IF EXISTS avg_mail_size; Query OK, 0 rows affected (0.02 sec)mysql> DELIMITER $$ mysq…

密码学系列文(3)--分组密码

一、分组密码概述分组密码是许多系统安全的一个重要组成部分,可用于构造:拟随机数生成器流密码消息认证码(MAC)和杂凑函数消息认证技术、数据完整性机构、实体认证协议以及单钥数字签字体制的核心组成部分应用中对于分组密码的要求:安全性运行…

WCDB soci 查询语句

测试代码 #pragma once #include <string> #include <vector>// Assume OperationLog is a struct representing a row in the table struct OperationLog {int id;std::string op_type;std::string op_subtype;std::string details;std::string timestamp; };clas…

lesson16:Python函数的认识

目录 一、为什么需要函数&#xff1f; 1. 拒绝重复造轮子 2. 让代码像句子一样可读 3. 隔离变化&#xff0c;降低维护成本 二、函数的定义&#xff1a;编写高质量函数的5个要素 基本语法框架 1. 函数命名的黄金法则&#xff08;PEP8规范&#xff09; 2. 不可或缺的文档…

通过轮询方式使用LoRa DTU有什么缺点?

在物联网系统中&#xff0c;DTU&#xff08;Data Transfer Unit&#xff09;通常用于通过485或M-Bus等接口抄读子设备的数据&#xff0c;并将这些数据传输到平台侧。然而&#xff0c;如果DTU采用轮询方式与平台通信&#xff0c;会带来一系列问题&#xff0c;尤其是在功耗和系统…

Syntax Error: Error: PostCSS received undefined instead of CSS string

报错&#xff1a;Syntax Error: Error: PostCSS received undefined instead of CSS string npm rebuild node-sass报错&#xff1a;npm i canvas 报错 canvas2.11.2 run install node-pre-gyp install --fallback-to-build --update-binary npm install canvas --canvas_binar…

人工智能之数学基础:概率论和数理统计在机器学习的地位

概率和统计的概念概率统计是各类学科中唯一一门专门研究随机现象的规律性的学科&#xff0c;随机现象的广泛性决定了这一学科的重要性。概率论是数学的分支&#xff0c;它研究的是如何定量描述随机现象及其规律。我们之前经常在天气软件上看到&#xff1a;“今天下雨的概率是95…

第十四章 Stream API

JAVA语言引入了一个流式Stream API,这个API对集合数据进行操作&#xff0c;类似于使用SQL执行的数据库查询&#xff0c;同样可以使用Stream API并行执行操作。Stream和Collection的区别Collection:静态的内存数据结构&#xff0c;强调的是数据。Stream API:和集合相关的计算操作…

Oracle数据库各版本间的技术迭代详解

今天我想和大家聊聊一个我们可能每天都在用&#xff0c;但未必真正了解的技术——Oracle数据库的版本。如果你是企业的IT工程师&#xff0c;可能经历过“升级数据库”的头疼&#xff1b;如果你是业务负责人&#xff0c;可能疑惑过“为什么一定要换新版本”&#xff1b;甚至如果…

论文reading学习记录3 - weekly - 模块化视觉端到端ST-P3

文章目录前言一、摘要与引言二、Related Word2.1 可解释的端到端架构2.2 鸟瞰图2.3 未来预测2.4 规划三、方法3.1 感知bev特征积累3.1.1 空间融合&#xff08;帧的对齐&#xff09;3.1.2 时间融合3.2 预测&#xff1a;双路径未来建模3.3 规划&#xff1a;先验知识的整合与提炼4…

crawl4ai--bitcointalk爬虫实战项目

&#x1f4cc; 项目目标本项目旨在自动化抓取 Bitcointalk 论坛中指定板块的帖子数据&#xff08;包括主贴和所有回复&#xff09;&#xff0c;并提取出结构化信息如标题、作者、发帖时间、用户等级、活跃度、Merit 等&#xff0c;以便进一步分析或使用。本项目只供科研学习使用…

调用 System.gc() 的弊端及修复方式

弊端分析不可控的执行时机System.gc() 仅是 建议 JVM 执行垃圾回收&#xff0c;但 JVM 可自由忽略该请求&#xff08;尤其是高负载时&#xff09;。实际回收时机不确定&#xff0c;无法保证内存及时释放。严重的性能问题Stop-The-World 停顿&#xff1a;触发 Full GC 时会暂停所…

git merge 和 git rebase 的区别

主要靠一张图&#xff1a;区别 git merge git checkout feature git merge master此时在feature上git会自动产生一个新的commit 修改的是当前分支 feature。 git rebase git checkout feature git rebase master&#xff08;在feature分支上执行&#xff0c;修改的是master分支…

Java学习--JVM(2)

JVM提供垃圾回收机制&#xff0c;其也是JVM的核心机制&#xff0c;其主要是实现自动回收不再被引用的对象所占用的内存&#xff1b;对内存进行整理&#xff0c;防止内存碎片化&#xff1b;以及对内存分配配进行管理。JVM 通过两种主要算法判断对象是否可回收&#xff1a;引用计…