目标分割技术-语义分割总览

前言

博主现任高级人工智能工程师,曾发表多篇SCI且获得过多次国际竞赛奖项,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。目的就是为了让零基础快速使用各类代码模型,每一篇文章都包含实战项目以及可运行代码。欢迎大家订阅一文速学-深度学习项目实战

目标分割技术-语义分割总览

目标分割是计算机视觉领域的一个重要任务,旨在从图像或视频中准确地分割出特定的目标或对象。与目标检测关注物体位置和边界框不同,目标分割要求精确地识别并标记目标的每个像素,实现对目标的像素级别理解。

定义

我们可以把目标分割拆解为两个技术实现部分:一为语义分割、二为实例分割。对于图像分类、目标检测和图像分割而言:

  • 图像分类旨在判断该图像所属类别。
  • 目标检测是在图像分类的基础上,进一步判断图像中的目标具体在图像的什么位置,通常是以外包矩形(bounding box)的形式表示。
  • 图像分割是目标检测更进阶的任务,目标检测只需要框出每个目标的包围盒,语义分割需要进一步判断图像中哪些像素属于哪个目标。但是,语义分割不区分属于相同类别的不同实例,也就是说如果存在目标物体重叠的情况,语义分割只会识别为一个共同的像素目标:在这里插入图片描述
    ,而实例分割需要区分开来:在这里插入图片描述

那么我们再对图像分割总体定义了解:在计算机视觉领域,图像分割(Object Segmentation)指的是将数字图像细分为多个图像子区域(像素的集合)的过程,并且同一个子区域内的特征具有一定相似性,不同子区域的特征呈现较为明显的差异:在这里插入图片描述

图像分割的目标就是为图像中的每个像素分类。应用领域非常的广泛:自动驾驶、医疗影像,图像美化、三维重建等等:

在这里插入图片描述

原理

简单来说,我们的目标是输入一个RGB彩色图片(height×width×3)或者一个灰度图(height×width×1),然后输出一个包含各个像素类别标签的分割图(height×width×1)。如下图所示:

在这里插入图片描述

我们肉眼可以很明显区分目标物体,但是想让计算机实现目标切割,只能输出为图片数据形式我们再进行处。在图像处理部分,我们知道图片由三维数组RGB形式构成,不同像素块之间会存在些许差异,也就是说我们可以利用这些像素差异来实现区分不同的目标物体,但是如果存在像素之间颜色差异不大,那么久比较难区分不同的物体。预测目标可以采用one-hot编码,即为每一个可能的类创建一个输出通道。也就是把上述Semantic Labels的矩阵不同数字给割裂出来:

在这里插入图片描述

当将预测结果叠加到单个channel时,它可以给出一张图像中某个特定类的所在区域:

在这里插入图片描述

对于上述目标分割图像较为感兴趣的可以去看看PASCAL VOC数据集,PASCAL VOC(Visual Object Classes)数据集是一个广泛用于目标检测、图像分类和语义分割等计算机视觉任务的数据集。该数据集由英国牛津大学计算机视觉实验室于2005年至2012年发布,并由标准化的图像注释和评估协议定义:在这里插入图片描述

  • JPEGImages中存放图片文件
  • imagesets中的segmentation中记录了用于分割的图像信息
  • SegmentationClass中是语义分割的标注信息
  • SegmentationObject中是实例分割的标注信息

在这里插入图片描述在这里插入图片描述

实现技术

了解以上基本概念之后,我们可以来了解一些实现目标分割的技术了,依然是分为两块:语义分割和实例分割来讲解。

语义分割(Semantic Segmentation)

定义: 语义分割旨在将图像中的每个像素分配到对应的语义类别,而不区分不同的实例。例如,在一张包含汽车、行人和道路的图像中,语义分割的目标是将图像中的每个像素标记为汽车、行人或道路。前面一段文章已经描述的比较具体了,不了解的再去看看前面的图片就好了。

算法: 一些常见的语义分割算法包括:

  • Fully Convolutional Networks (FCN)
  • U-Net
  • DeepLab
  • SegNet

这些算法挨个介绍,以后将陆续进行实现。传统的基于CNN的语义分割方法为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入,用于训练和预测。但是此类算法都通常有三个比较大的弊端:

  1. 计算存储效率低下,存储空间占用很高,比如对一个像素使用的图像块的大小为15×15,需要不断滑动窗口,每次滑动窗口之后再给CNN进行判别分类。因此,所需的存储空间根据滑动窗口的次数和大小需求很大。
  2. 计算效率低下,相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。
  3. 分类性能受限,像素块的大小限制了感受野的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部特征。

后续算法在CNN上进行不断修改优化后形成了现在的语义分割算法生态。

Fully Convolutional Networks (FCN)

Fully Convolutional Networks(FCN)是一种用于图像分割的深度学习架构,由Jonathan Long、Evan Shelhamer和Trevor Darrell于2015年提出。相较于传统的卷积神经网络(CNN)架构,FCN的创新之处在于它将全连接层替换为全卷积层,从而使网络能够接受任意大小的输入图像,并输出对应大小的分割结果。

通常,传统的CNN结构在经过卷积层提取图像特征之后,会通过若干全连接层将这些特征映射成一个固定长度的特征向量。这种结构适用于图像级的分类和回归任务。举例来说,AlexNet等经典的CNN模型,特别是在图像分类任务(如ImageNet分类)中,最终的目标是得到整个输入图像的一个数值描述,通常是一个概率分布向量。

以AlexNet为例,其结构包括卷积层、池化层和全连接层。在卷积和池化层中,图像的局部特征被提取并逐渐减小空间维度。而在全连接层中,这些特征会被压缩成一个固定长度的向量,最终输出分类的概率分布。这样的设计使得模型能够在高层次上理解整个图像,并输出关于整个输入图像的全局信息,这对于图像分类是合适的。然而,对于一些需要更细粒度的信息,比如目标的位置或者像素级的分割等任务,这样的结构可能显得不够灵活。

与此不同,全卷积网络(FCN)等结构则通过替代全连接层为全卷积层,使得模型能够处理变尺寸的输入图像,并且能够输出对应大小的分割结果。这种结构更适用于像素级的任务,如语义分割或实例分割。可以理解起来比较抽象,我们看图:

以传统的VGG卷积网络为例:

在这里插入图片描述

在经历了卷积和池化之后,最后经过全连接层将7x7x512的特征压缩成一个固定长度4096的一维向量。我们再来看看FCN网络结构:

在这里插入图片描述

FCN网络结构主要分为两个部分:全卷积部分和反卷积部分,没有全连接层,也就是说不需要固定长度的特征向量,全卷积部分为一些经典的CNN网络(如VGG,ResNet等),用于提取特征,主要还是通过反卷积层来进行实现语义分割的,反卷积层(Deconvolutional Layer)通常用于上采样操作,将低分辨率的特征图映射到与输入图像相同的分辨率,以便生成像素级别的分割结果。然而,需要注意的是,术语“反卷积”在这里的含义与传统卷积的操作方向相反。

上采样 Upsampling:

在卷积过程的卷积操作和池化操作会使得特征图的尺寸变小,为得到原图像大小的稠密像素预测,需要对得到的特征图进行上采样操作。可通过双线性插值(Bilinear)实现上采样,且双线性插值易于通过固定卷积核的转置卷积(transposed convolution)实现,转置卷积即为反卷积(deconvolution)。在论文中,作者并没有固定卷积核,而是让卷积核变成可学习的参数。转置卷积操作过程如下,下图中蓝色是反卷积层的input,绿色是反卷积层的output,元素内和外圈都补0的转置卷积:
在这里插入图片描述

从上图可以看到卷积把2×2原图扩大了两圈,再通过3×3的卷积核,卷积结果图像被增大为4×4的大小。卷积后,结果图像比原图大:称之为full卷积,其实full卷积就是反卷积的过程,通过full卷积将原图扩大,增大原图的分辨率,所以对图像进行反卷积也称为对图像进行“上采样”。因此,也可以很直接地理解到,图像的卷积和反卷积并不是一个简单的变换、还原过程,也就是先把图片进行卷积,再用同样的卷积核进行反卷积,是不能还原成原图的,因为反卷积后只是单纯地对图片进行扩大处理,并不能还原成原图像。

反卷积层的目标是通过上采样将抽象的语义特征还原到更接近输入图像的原始分辨率。这有助于保留局部细节,提高分割的精度。在TensorFlow中,反卷积操作通常通过Conv2DTranspose层实现。这个层与正常的卷积层相似,但它执行的是转置卷积(transposed convolution),也被称为分数步长卷积(fractionally strided convolution)或反卷积。该操作通过在输入之间插入零元素(填充)来实现上采样:

from tensorflow.keras.layers import Conv2DTranspose# 假设输入特征图大小为 (4, 4, 256)
input_feature_map = Input(shape=(4, 4, 256))# 反卷积层
upsampled_feature_map = Conv2DTranspose(128, (3, 3), strides=(2, 2), padding='same')(input_feature_map)

strides=(2, 2)表示在高度和宽度方向上的步幅为2,实现了对输入特征图的上采样操作。

U-Net

U-Net是一种用于图像分割任务的深度学习架构,由Ronneberger等人于2015年提出。U-Net之所以得名,是因为其网络结构呈U形状。它在医学图像分割等领域取得了很大成功,特别适用于小样本、不平衡数据等情况。医务人员除了想要知道图像的类别以外,更想知道的是图像中各种组织的位置分布,而U-net就可以实现图片像素的定位,该网络对图像中的每一个像素点进行分类,最后输出的是根据像素点的类别而分割好的图像。

U-Net的网络结构分为两个主要部分:编码器(Encoder)和解码器(Decoder),中间是一个U形状的结构连接它们。该结构保留了图像分辨率的信息,有助于更好地捕获图像的局部和全局特征。

在这里插入图片描述

上图箭头分别代表一下转换操作:

  1. 蓝色箭头:利用3×3的卷积核对图片进行卷积后,通过ReLU激活函数输出特征通道;
  2. 灰色箭头:对左边下采样过程中的图片进行裁剪复制;
  3. 红色箭头:通过最大池化对图片进行下采样,池化核大小为2×2;
  4. 绿色箭头:反卷积,对图像进行上采样,卷积核大小为2×2;
  5. 青色箭头:使用1×1的卷积核对图片进行卷积。

具体网络架构和操作如上图展示。该U-net网络一共有四层,分别对图片进行了4次下采样和4次上采样。下章搭建语义分割将详细讲述每一层的网络操作,有代码更加具体。

DeepLab

DeepLab是由Google Research开发的一种用于图像分割任务的深度学习架构,其目标是实现高质量的语义分割。DeepLab的一系列版本不断引入新的技术和改进,其中最重要的是DeepLabV3和DeepLabV3+。

DeepLabV1:
  1. 空洞卷积(Atrous Convolution): DeepLabV1引入了空洞卷积,也称为膨胀卷积,用于扩大感受野,以更好地捕捉图像中的上下文信息。
  2. 多尺度处理: 在不同的空洞率下应用多个卷积核,以处理不同尺度的信息。
DeepLabV2:
  1. 条件随机场(Conditional Random Field,CRF): 引入了全连接CRF用于对分割结果进行精炼,以改善边界的细节。
DeepLabV3:
  1. 空洞卷积的变体: 使用了带有不同空洞率的空洞卷积模块,形成了深层空洞卷积网络(ASPP)结构。ASPP模块并行地运用多个不同的空洞率,以捕捉多尺度的上下文信息。
  2. 多尺度金字塔池化(ASPP): 用于有效地处理不同尺度的特征,提高分割性能。
  3. 全局平均池化: 使用全局平均池化层来处理不同尺寸的输入图像。
DeepLabV3+:
  1. 编码器-解码器结构: 引入了编码器-解码器结构,使用深度可分离卷积进行更高效的特征提取。
  2. Xception模型作为基础: 使用Xception模型作为编码器,提高了特征提取的效果。
  3. 解码器的空间上采样: 使用双线性插值和卷积来进行空间上采样,以将编码器的输出还原到原始分辨率。
SegNet

SegNet是一种用于图像分割任务的深度学习架构,由剑桥大学的研究团队于2015年提出。SegNet主要专注于语义分割,即将图像分割成不同的语义区域。其设计灵感来自于对深度学习在自动驾驶领域的应用,如道路分割。

SegNet包括编码器(Encoder)和解码器(Decoder)两个部分,其结构与自编码器有些相似。

编码器:

  • 编码器由卷积层和池化层组成,用于提取输入图像的高级特征。这些特征在编码器中被下采样,降低了空间分辨率。

解码器:

  • 解码器与编码器相反,由上采样层和反卷积层组成。解码器的任务是将编码器产生的低分辨率特征图还原到原始输入图像的分辨率。

(Decoder)两个部分,其结构与自编码器有些相似。

编码器:

  • 编码器由卷积层和池化层组成,用于提取输入图像的高级特征。这些特征在编码器中被下采样,降低了空间分辨率。

解码器:

  • 解码器与编码器相反,由上采样层和反卷积层组成。解码器的任务是将编码器产生的低分辨率特征图还原到原始输入图像的分辨率。

SegNet在编码器阶段使用最大池化,但与传统的最大池化不同,它会记录每个池化窗口中最大值的索引。这些池化索引将被传递到解码器,以在上采样阶段进行非线性上采样。SegNet主要用于图像分割任务,特别是在自动驾驶领域中的道路分割任务。它可以将图像中的每个像素分配到属于哪个语义类别,从而在自动驾驶系统中实现对道路、车辆、行人等的精确识别。

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

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

相关文章

uniapp 富文本以及移动端富文本的展示问题

富文本展示有几种方式: 1.<view v-html"content"></view> 2. uniapp自带组件 rich-text rich-text | uni-app官网 <rich-text :nodes"content"></rich-text> 3.uView组件 u-parse Parse 富文本解析器 | uView 2.0 - 全面兼…

NSSCTF web刷题记录6

文章目录 [HZNUCTF 2023 final]eznode[MoeCTF 2021]地狱通讯-改[红明谷CTF 2022] Smarty Calculator方法一 CVE-2021-26120方法二 CVE-2021-29454方法三 写马蚁剑连接 [HZNUCTF 2023 final]eznode 考点&#xff1a;vm2沙箱逃逸、原型链污染 打开题目&#xff0c;提示找找源码 …

rabbit MQ的延迟队列处理模型示例(基于SpringBoot死信模式)

说明&#xff1a; 生产者P 往交换机X&#xff08;typedirect&#xff09;会发送两种消息&#xff1a;一、routingKeyXA的消息&#xff08;消息存活周期10s&#xff09;&#xff0c;被队列QA队列绑定入列&#xff1b;一、routingKeyXB的消息&#xff08;消息存活周期40s&#xf…

开发上门按摩系统对技师如何管理,薪资结构怎么设计

开发完上门按摩系统平台上线之后&#xff0c;对技师的管理和薪资结构是非常重要的环节&#xff0c;关乎着平台的服务能力和服务质量&#xff0c;那么应该如何去管理和设计薪资结构呢 首先说技师管理&#xff1a; 一、培训和认证&#xff1a;平台应对技师进行全面的培训&#xf…

电脑磁盘怎么设置密码?磁盘加密软件哪个好?

电脑磁盘经常被用于存放各种重要数据&#xff0c;而为了避免数据泄露&#xff0c;我们需要为磁盘设置密码&#xff0c;以防止未授权人员使用磁盘。那么&#xff0c;电脑磁盘怎么设置密码呢&#xff1f;下面我们就一起来了解一下。 如何设置磁盘密码&#xff1f; 想要为磁盘设置…

释放搜索潜力:基于Docker快速搭建ES语义检索系统(快速版),让信息尽在掌握

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

某高品质房产企业:借助NineData平台,统一数据库访问权限,保障业务安全

该企业是中国领先的优质房产品开发及生活综合服务供应商。在 2022 年取得了亮眼的业绩表现&#xff0c;销售额市场占有率跻身全国前五。业务涵盖房产开发、房产代建、城市更新、科技装修等多个领域。 2023 年&#xff0c;该企业和玖章算术&#xff08;浙江&#xff09;科技有限…

动态规划求 x 轴上相距最远的两个相邻点 java 代码实现

如图为某一状态下 x 轴上的情况&#xff0c;此时 E、F相距最远&#xff0c;现在加入一个点H&#xff0c;如果H位于点A的左边的话&#xff0c;只需要比较 A、H 的距离 和 E、F 的距离&#xff1b;如果点H位于点G的右边&#xff0c;则值需要比较 G、H 的距离 和 E、F 的距离&…

OceanBase:OBServer节点管理

目录 1.查看节点 2.添加节点 2.1 创建数据目录 2.2.OceanBase 运行时所依赖的部分三方动态库 2.3.安装 OceanBase 数据库的 RPM 包 2.4.启动节点 observer 进程 2.5.向集群中添加节点 3.隔离节点 4.重启节点 4.1 停止服务 4.2 转储 4.3 关闭进程 4.4 启动进程 4.…

《多GPU大模型训练与微调手册》

多GPU微调预备知识 1. 参数数据类型 torch.dtype 1.1 半精度 half-precision torch.float16&#xff1a;fp16 就是 float16&#xff0c;1个 sign&#xff08;符号位&#xff09;&#xff0c;5个 exponent bits(指数位)&#xff0c;10个 mantissa bits(小数位) torch.bfloat16…

PHP手动为第三方类添加composer自动加载

有时候我们要使用的第三方的类库&#xff08;SDK&#xff09;没用composer封装好&#xff0c;无法用composer进行安装&#xff0c;怎么办呢&#xff1f;&#xff1f;&#xff1f; 步骤如下&#xff1a; 第一步、下载需要的SDK文件包&#xff0c;把它放在vendor目录下 第二步、…

ubuntu22.04安装网易云音乐

附件&#xff1a; https://download.csdn.net/download/weixin_44503976/88557248 wget https://d1.music.126.net/dmusic/netease-cloud-music_1.2.1_amd64_ubuntu_20190428.deb wget -O patch.c https://aur.archlinux.org/cgit/aur.git/plain/patch.c?hnetease-cloud-m…

windows11记事本应用程序无法打开,未响应,崩溃,卡死

windows11记事本应用程序无法打开&#xff0c;未响应&#xff0c;崩溃&#xff0c;卡死 文章目录 问题描述搜索引擎&#xff08;度娘&#xff09;卸载后如何安装问题未解决另一个解决方案&#xff1a;步骤&#xff1a;1.设置 → 语音和区域 → 输入2.选择“高级键盘设置”3.替…

基于springboot实现班级综合测评管理系统项目【项目源码+论文说明】

基于springboot实现班级综合测评管理系统演示 摘要 随着互联网技术的高速发展&#xff0c;人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理&#xff0c;交易等&#xff0c;而且过程简单、快捷。同样的&#x…

Redis的性能管理

一、Redis性能管理 1.1 查看redis的内存使用情况 redis-cli info memory 或 redis-cli 127.0.0.1:6379> info memoryused_memory&#xff1a;redis中的数据占用的内存。 used_memory_rss&#xff1a;是redis向操作系统申请的内存。 used_memory_peak&#xff1a;redis内存…

数据结构-插入排序+希尔排序+选择排序

目录 1.插入排序 插入排序的时间复杂度&#xff1a; 2.希尔排序 希尔排序的时间复杂度&#xff1a; 3.选择排序 选择排序的时间复杂度&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的…

多目标应用:基于非支配排序的鲸鱼优化算法NSWOA求解微电网多目标优化调度(MATLAB代码)

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、基于非支配排序的鲸鱼优化算法NSWOA 基于非支配排序的鲸鱼优化算法NSWOA简介&#xff1a; 三、基于非支配排序的鲸鱼优化算法NSWOA求解微电网多目标优化…

前端js调取摄像头并实现拍照功能

前言 最近接到的一个需求十分有意思&#xff0c;设计整体实现了前端仿 微信扫一扫 的功能。整理了一下思路&#xff0c;做一个分享。 tips: 如果想要实现完整扫一扫的功能&#xff0c;你需要掌握一些前置知识&#xff0c;这次我们先讲如何实现拍照并且保存的功能。 一. windo…

腾讯云轻量数据库试用初体验

腾讯云轻量数据库1核1G开箱测评&#xff0c;轻量数据库服务采用腾讯云自研的新一代云原生数据库TDSQL-C&#xff0c;轻量数据库兼100%兼容MySQL数据库&#xff0c;实现超百万级 QPS 的高吞吐&#xff0c;128TB海量分布式智能存储&#xff0c;虽然轻量数据库为单节点架构&#x…

vue3+vite+SQL.js 读取db3文件数据

前言&#xff1a;好久没写博客了&#xff0c;最近一直在忙&#xff0c;没时间梳理。最近遇到一个需求是读取本地SQLite文件&#xff0c;还是花费了点时间才实现&#xff0c;没怎么看到vite方面写这个的文章&#xff0c;现在分享出来完整流程。 Tips:解决了打包后wasm文件404问…