实例分割——Mask R-CNN、YOLOV8、RTMDET、DeepLab四种实例分割算法比对

1.概述

1.1 语义分割与实例分割

实例分割和语义分割都是计算机视觉领域中图像分割的任务,它们在目标和方法上有一些区别:

语义分割

  • 语义分割的目标是对图像中的每个像素打上类别标签,即识别出图像中每个像素属于哪个预定义的类别(例如,人、汽车、建筑物等)。
  • 语义分割不区分同类对象的不同实例,关注的是像素级别的分类,而不是特定实例的识别。
  • 语义分割的典型应用包括自动驾驶、医学影像分析、机器人视觉等。
  • 语义分割模型通常使用编码器-解码器架构,如FCN、U-Net、DeepLab等,它们能够保留图像的空间分辨率,同时学习到像素级别的分类特征。

实例分割

  • 实例分割不仅需要识别出图像中的对象,还要区分对象的不同实例。这意味着即使是同一类别的对象,实例分割模型也需要能够区分它们,并对每个实例的每个像素进行标记。
  • 实例分割是目标检测和语义分割的结合,它要求模型同时输出对象的类别和位置(通过边界框),以及对象的像素级掩码。
  • 实例分割在应用上更注重个体的区分,如在拥挤场景下区分不同的人或物体。
  • 实例分割的算法包括Mask R-CNN、YOLOv8等,这些算法通常包含目标检测的组件来定位图像中的对象,然后对每个提议的区域进行像素级的分割。

1.2 实例分割任务

两种分割方法的评估指标也有所不同。语义分割常用的评估指标是mIoU(mean Intersection-Over-Union),而实例分割除了使用mIoU评估分割质量外,还需要评估检测的准确性。与目标检测不同,实例分割不仅识别对象的存在,还为每个检测到的对象生成一个像素级别的掩码,这允许更精细的分析和编辑。

实例分割的应用非常广泛,包括但不限于:

  1. 自动驾驶:识别和区分道路上的行人、车辆、交通标志等。
  2. 医学成像:在医学图像中分割不同的器官或病变区域。
  3. 机器人视觉:帮助机器人识别和操作特定的物体。
  4. 图像编辑:在图像编辑软件中,用户可以轻松地选择和编辑特定的对象。

实例分割的算法通常包括以下几个步骤:

  1. 候选区域生成:使用区域建议网络(Region Proposal Network, RPN)或其他方法来生成可能包含对象的区域。
  2. 分类和边界框回归:对这些候选区域进行分类,判断它们是否包含特定的类别,并对边界框进行调整以更准确地定位对象。
  3. 掩码预测:对于每个已识别的对象,预测一个掩码来区分对象的轮廓。

分割任务:

实例分割:

从上面这个例子可以看出,检测任务定位了对象的包围框,语义分割分割出了人这个类别,不过把所有的人一起分割了,实例分割区分出了每个人,并分别进行了分割。实际在做实例分割时,通常同时输出对象的检测框,并给出对象的分割结果。

2. Mask R-CNN

Mask R-CNN是由何凯明等人在2017年提出,用于同时进行目标检测、实例分割和关键点检测。这项工作在计算机视觉领域具有里程碑意义,因为它提供了一个统一的框架来处理这些任务,而不是将它们视为独立的挑战。
Mask R-CNN的核心思想是在已有的Faster R-CNN目标检测框架上增加一个并行的分支来预测对象的掩码,从而实现像素级别的对象分割。这个掩码分支是一个小型的全卷积网络(FCN),它应用于每个感兴趣区域(Region of Interest, RoI),以逐像素的方式预测对象的掩码。
为了解决RoI Pooling中的量化问题,Mask R-CNN引入了RoIAlign层,它通过双线性插值精确地计算输入特征在RoI上的值,而不进行量化,从而更好地保持空间对齐,这对于生成高质量的分割掩码至关重要。
Mask R-CNN的网络架构包括用于特征提取的卷积骨干网络和用于边界框识别和掩码预测的网络头部。它可以与多种架构一起实例化,如ResNet和ResNeXt,以及特征金字塔网络(FPN),后者可以构建一个内部特征金字塔,从而提高检测的准确性和速度。
在训练和推理方面,Mask R-CNN展示了快速的原型制作能力,可以在合理的时间内完成训练,同时保持高准确率。此外,Mask R-CNN还能够扩展到人体姿态估计等其他任务,展示了其灵活性和泛化能力。
Mask R-CNN的代码已经在GitHub上开源,由Facebook AI Research (FAIR) 提供,名为Detectron2,这使得研究人员和开发者可以利用和进一步研究这一算法。
相关论文和代码链接如下:

  • 论文: Mask R-CNN
  • 代码: Detectron2

这里只讨论RoI Pooling后的Head部分,

Mask R-CNN同时支持输出检测框,实例分割结果,关键点,这里我们只讨论Mask Head部分,即上图中的右侧绿色分支。

值得注意的是,上图是粗略表示,关于proposalHead中的使用和Mask/Box/KeyPoint Head之间的关系可以参考下面两个图。

在训练时,Mask/KeyPoint Head都使用proposal框来当作检测box框选对象,如下图蓝色线流所示:

在预测时,Mask/KeyPoint Head不再使用proposals转而使用Box Head预测的检测框来框选对象,因此Mask/KeyPoint Head依赖检测框的输出,如下图紫色线流所示意,

Mask R-CNNMask Head分析如下,整理自detectron2代码库:

Mask Head的输入有两个,一个是bounding boxes或者proposals(测试推理时使用boxes,训练时使用RPN给出的proposals),另一个是backbone提取的feature map

Mask Head的结构如上图,先是对feature map根据bounding boxesROI Pooling,得到每个ROI的特征图,然后是连续几层常规卷积,最后再跟一层转置卷积进行X2上采样,同时卷积输出通道变成num_class,得到的输出shape=(B*N,num_class, 28, 28),这里28x28就是ROI区域对应的mask,这里对每个对象预测了num_classmask,在Mask R-CNN中,直接使用Box Head预测的label id来取对应的masksigmoid以作为最终当前实例的分割结果。

转置卷积的介绍参考这里转置卷积 (opens new window)。

得到28X28的实例ROI分割结果后,要将其变换到原图像上,这里使用了grid_sample方法,使用grid_sample变换,会根据box坐标将ROI Mask变换到原图像box所处的区域。变换后再根据超参数阈值对mask做二值化即可得到最后的分割结果。

2.YOLOV5/8实例分割方法

YOLOV5/8中使用的Instance分割方法和Mask RCNN中区别比较大,

其利用Head1中尺寸最大的特征图作为Mask分支的输入,经过proto_pred卷积层的处理得到shape:(B, mask_channel, H, W)mask_feature

检测框的预测分支和目标检测中的YoloV5 Head基本相同,除了对于feature_map的通道上增加了计算每个实例掩码用的参数,参数的数量同proto_pred输出的mask_channel,所以对于80X80/40X40/20X20feature_map,其通道数为: 4 + 1 + num_classes + mask_channel

拿到解码后的检测框,经过nms处理后得到最后的检测框,取对应的mask_channelcoeffsmask_feature相乘加权即可得到最后的实例分割结果,完整过程如下图:

3. RTMDet中的实例分割

RTMDet中和YOLOV5处理方式很相似,都是对每个检测框实例计算坐标时同时给出预测mask所需的权重参数,区别在与YOLOV5/8中直接用参数和mask_feature进行加权求和,而RTMDET预测了169个参数,构造了3层卷积,来和mask_feature运算得到分割mask

还有一点RTMDetmask_feature 并非只使用了80X80feature map,它还将其余两个头上的特征图上采样后与其进行concatenate,输入mask_feature分支后得到Batch_SizeX8X80X80mask特征图。特征图并不能直接用来和predicted kernel卷积得到Instance Mask,RTMDet算法使用的mask feat先重复了检测实例的个数次,然后合并了检测框在特征图上的坐标,最后与predicted kernel做卷积的输入mask特征图变成了(N,10,80,80)

RTMDet实例分割推理的完整过程可参考下图,

RTMDet根据predicted_kernel升成卷积的方法被称为动态卷积Dynamic Convolution,如下图,

如上,就是Mask R-CNN/YOLOV8/RTMDet三种实例分割的方法,总结来看,YOLOV8/RTMDet方法相似,RTMDet处理mask预测的方法更复杂一些,YOLOV8中的加权求和变成了三层卷积,输入的特征图重复了num_instance次,并合并了mask_feature上对应的priorsnum_instance对应点的相对坐标。YOLOV8/RTMDet输出Instance Mask的分辨率比Mask RCNN要大,Mask RCNN经过转置卷积上采样后输出的RoI分割图的大小是28X28,经过GridSample后还原到原分辨率上。不过Mask R-CNN输出的是RoI的分割图,而YOLOV8/RTMDet输出的是在整幅图像上的分割图。

4.DeepLab中的实例分割

DeepLab系列是一系列用于图像分割任务的深度学习模型,它们在处理像素级语义理解方面表现出色。DeepLabv2是DeepLab系列中的一个里程碑,它引入了Atrous Spatial Pyramid Pooling(ASPP)模块,该模块通过多尺度卷积核捕获不同尺度的特征,从而提高分割精度。
在这里插入图片描述

  • 多孔卷积(Atrous Convolution):这是一种卷积操作,它允许模型在不增加计算量的情况下捕获更大的感受野。通过调整卷积核的采样率(dilation rate),可以在不同的尺度上提取特征。
  • 多尺度上下文:通过使用不同的多孔速率,模型能够同时捕获到局部和全局的上下文信息,这对于理解图像中不同尺寸的物体非常有帮助。
  • Atrous Spatial Pyramid Pooling(ASPP)模块:这是DeepLabv2中的一个核心组件,它通过不同尺度的卷积核捕获多尺度的特征,并将这些特征融合以提高分割的准确性。
  • 全局平均池化(Global Average Pooling, GAP):在ASPP模块中,作者使用了全局平均池化来生成图像级别的特征。这些特征包含了整个图像的全局信息。
  • 1×1卷积:在全局平均池化之后,使用1×1卷积来进一步提取特征,这通常用于降维或增加模型的非线性表达能力。
  • 双线性上采样(Bilinear Upsampling):这是一种上采样技术,用于将特征图从低分辨率映射到高分辨率,以匹配原始输入图像的尺寸。
  • 改进的ASPP:在DeepLabv3+中,ASPP模块得到了进一步的改进,包括使用更多的卷积核和不同的多孔速率来捕获更丰富的上下文信息。

改进的ASPP中,模型使用了三个不同尺度的3×3卷积核,这些卷积核具有不同的多孔速率(6, 12, 18),以及一个1×1卷积核,它们都具有256个滤波器和批量归一化层。这样的设计允许模型在不同的尺度上捕获和融合特征,从而提高分割性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云动态摘要 2024-05-09

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

YOLOv5,YOLOv7改进之结合​SOCA

1.SOCA moudle结构图 2,YOLOv5,YOLOv7改进之结合​SOCA 1.配置common.py文件 #SOCA moudle 单幅图像超分辨率 class Covpool(Function):@staticmethoddef forward(ctx, input):x = inputbatchSize = x.data.shape[0]dim = x.data.shape[1]h = x.data.shape[2]w = x.data.sha…

PLC学习笔记

PLC学习笔记 前言一、一些基操知识二、GX works2编程2.1 位逻辑1.2 中间寄存器1.3 PLC的扫描方式 总结 前言 我这个人真的是太渴望知识了~ 一、一些基操知识 一般X表示输入,Y表示输出。一般八个为一组X0~X7M表示中间寄存器,M0~M7时间T、计数C 二、GX …

短信群发公司

伴随着移动互联网和智能手机的普及,短信群发成为了企业与个人之间高效沟通的一种重要方式。短信群发公司应运而生,致力于为用户提供专业、安全、高效的群发服务。 服务内容 短信群发公司提供多样化的服务内容,满足不同用户的需求。短信群发公…

javaWeb快速部署到tomcat阿里云服务器

目录 准备 关闭防火墙 配置阿里云安全组 点击控制台 点击导航栏按钮 点击云服务器ECS 点击安全组 点击管理规则 点击手动添加 设置完成 配置web服务 使用yum安装heepd服务 启动httpd服务 查看信息 部署java通过Maven打包好的war包项目 Maven打包项目 上传项目 …

深度学习笔记001

目录 一、批量规范化 二、残差网络ResNet 三、稠密连接网络(DenseNet) 四、循环神经网络 五、信息论 六、梯度截断 本篇blog仅仅是本人在学习《动手学深度学习 Pytorch版》一书中做的一些笔记,感兴趣的读者可以去官网http://zh.gluon.a…

Abp框架,EF 生成迁移文件时,自动添加表和字段注释内容

在使用 abp 框架,或者ef 的时候都会遇到一个问题,就是建实体后要将实体描述生成到数据库中,就需要手动去添加 [Comment("注释内容")] 注解,这样相当于手动写两次注释(即使你是 Ctrl C)&#x…

若依集成mybatis-plus 超详细教程(亲测可用)

文章目录 简介步骤第一步第二步第三步第四步第五步第六步 使用QueryWrapperservice层impl 实现接口类层Mapper层 简介 话不多说 直接跟着下面的教程操作,如果有报错私信我,或者通过博文下面的微信名片加我微信,免费解答哦! 步骤 …

解决方案:‘Series‘ object has no attribute ‘xxxx‘

文章目录 一、现象二、解决方案 一、现象 ...... model.fit(X_train, y_train) y_pred model.predict(X_test) recall recall_score(y_test, y_pred) precision precision_score(y_test. y_pred) ......执行语句到**“precision precision_score(y_test. y_pred)”**这里发…

StarRocks 跨集群数据迁移,SDM 帮你一键搞定!

作者:严祥光,StarRocks Active Contributor,StarRocks 存算分离核心研发,在社区中主要负责数据导入、跨集群同步、数据迁移和容灾等工作。 有时候,你可能会为以下需求而苦恼,苦苦搜索更好的解决方案&#x…

记录创建项目java version 没有8的问题

问题: 解决方案 java版本选择21(21可以兼容jdk8) SpringBoot选择3.2.5 进入项目后手动在pom.xml中修改版本

基于stm32的spi从机实验HAL库编程

目录 基于stm32的spi从机实验HAL库编程前言业务场景硬件设计接线配置swd接口配置spi配置DMA配置中断配置系统时钟配置工程生成代码写点从机代码上机现象后记本文使用的测试工程 基于stm32的spi从机实验HAL库编程 前言 在微控制器的世界中,串行外设接口(SPI)是一种…

java面向对象实现文字格斗游戏细节完善版

为了完善上一篇的文字格斗游戏的细节,所以加了些代码,使得交互更加的具体有趣! 效果 大家可以多运行几次代码,得到不同的战况!! 代码实现 1.bean类 import java.util.Random;public class TextGame {private Strin…

ardupilot的固定翼飞行模式

飞行模式 APM所有的飞行模式都在对应的机型的文件夹下的mode.h里面有定义,针对于不同的模型,功能函数在基类中Mode中都是以纯虚函数实现了, 然后在继承的子类中重新实现它,以实现多态。 takeoff模式 参见网址在 ArduPlane 4.0 及更高版本中,自动起飞本身也是一种模式(…

文件操作

前言: 文件内容属性 要向访问文件就要打开文件——>用进程来打开——>要把文件先加载到内存中——> 一个进程可以打开多个文件,OS中也有可能多个进程打开了多个文件 文件以多,就需要进行管理,——先描述再组织 没有被打开…

【图文教程】PyCharm安装配置PyQt5+QtDesigner+PyUic+PyRcc

这里写目录标题 PyQt5、Qt Designer、PyUic、PyRcc简介(1)下载安装PyQt5(2)打开designer.exe所在位置(3)在PyCharm中配置QtDesigner(4)验证QtDesigner是否配置成功(5&…

thinkphp6使用layui分页组件做分页效果

博主用的是layui2.9.8的版本,但这个版本的分页组件是动态效果的,但我需要的是静态分页,所以我自己封装了一个生成layui的分页代码生成代码。代码如下: 1、先创建文件,路径是extent/layui/LayuiPage.php,加…

HashMap前世今生

概述 HashMap是我们常用的一种数据结构,他是一个key-value结构。我们来深入了解一下。 1.8之前用的数组加链表 1.8之后用的数组加链表加红黑树,当链表数量大于8时,将链表转为红黑树。当红黑书节点小于6又会转为链表。 浅析HashMap的put()方…

达梦数据库限制用户登录IP测试

达梦数据库创建用户时可以限制登录ip和时间段。 创建测试测试用户 create user test1 identified by Test_1234 ALLOW_IP "192.168.100.101"; 限定该用户只能通过192.168.100.101地址登录数据库 连接测试 上图可见,192.168.100.101客户端可以连接上19…

纯血鸿蒙APP实战开发——Grid和List内拖拽交换子组件位置

Grid和List内拖拽交换子组件位置 介绍 本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明: 拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。拖拽List中子…