首页 > 编程知识 正文

实例分割训练,遥感影像实例分割

时间:2023-05-03 18:32:08 阅读:12792 作者:4606

SOLOv1论文链接: https://arxiv.org/abs/1912.04488

项目地址: https://github.com/WXinlong/SOLO

SOLO有助于端到端的训练,不需要后期处理,只需要mask的标签信息,不需要bbox标签信息,在MASKCOCO上实现与Mask R-CNN几乎同等效果的SOLO只需要解决2像素级的分类问题。 与语义分割一样,在本质上,SOLO通过离散量化将坐标回归转换为分类问题,从而避免启发式坐标归一化和log变换,并确定通常用于yog变换的背景当前实例分割的两个主要策略。

基于检测的实例分割:实际上是MaskRCNN系列,它检测实例对象的边界框,在框内进行语义划分,然后在前后景区进行划分。 还可以得到实例的分割结果。基于像素编码的实例分割:对输入图像进行像素编码,通过聚类手段获得分割结果。 他们要么依赖检查结果,要么需要后处理。 繁杂,速度慢。

独奏思想作者的第一个思想知道,语义分割是将分割任务按分类任务,即像素进行分类。 实例拆分也可以这样做吗?语义分割每个像素点都需要对应一个类别,我们可以利用通道数来表示像素每个类别的概率但是,实例拆分并不需要为每个像素分配类。 我应该如何用什么来表示这个用分类的方式实现实例分割的想法呢? 这也就是说,是论文提出的“事例类别”的概念。

那么核心问题就是:

1、什么是物体的实例类别?

2、实例类别做好后,如何划分不同的实例?

第一个问题作者是怎么想的:

物体的语义类别由人为定义区分,由人来标记。 照片中物体的什么属性可以用来区分实例呢? —— 位置和形状我们自然发现,不同实例的对象的坐标位置天生不同,而且他们重叠,人也很难区分。 而且他们的形状也经常不同。 作者首先分析了MSCOCO数据集的验证数据集,发现36780个对象中98.3%的实例对象之间的中心点距离超过30像素。 在剩下的1.7%中,40.5%的两个实例对象的大小比率超过了1.5倍的比率。 在此基础上,可以充分推论出利用目标的Center locations和目标的Sizes是否就能较好表示不同的实例对象?这是作者提出的实例类别的概念:(量化的)实例的中心点位置和形状。

第二个问题:

实例分割和语义分割在算法处理上的最大区别在于,实例分割需要处理同类实例重叠和粘连的问题。那么如果将不同的实例分配到不同的输出channel上,不就可以解决这个问题了吗作者正是这样一种思路,但面临着两个问题:一个是信道分配顺序问题,语义划分按类别进行信道分配。 实例划分要求将同一类的不同实例分配给不同的通道,并需要解决按哪些规则分配。 二是尺度问题,不同尺度的物体采用相同大小的输出进行预测,存在正负样本不均衡、小目标分割边缘不够精细的问题。所以作者利用位置来分配实例应该落入哪一个通道,利用FPN来解决尺度问题。

独奏的具体框架问题的建模基于以上思想,问题的核心是实例类的表示和利用实例类进行像素分类的问题。

独奏核心:将实例划分问题转换为两个问题:类预测实例mask生成。

将输入图像分割为s的平方格目: S S 如果目标的中心落到格子里边,该格目输出实例的语义类别semantic category分割实例mask(segmenting instance mask )

问题:如何判断目标的中心,落在格子里? 33558www.Sina.com/:c维的语义等级概率,即在上述输出语义分割的方式中,一个像素点是相对于n通道的语义等级概率,但这里是每个格子与c通道对应的语义等级概率。 那么,一张输入图像全部以S S个格子输出S S C。 这里有每个格子的semantic category

问题:这就是问题所在,如果两个物体重叠,或者一个网格中的多个实例很难解决。 但是,这也是论文提到的统计数据中的少数情况。

重要假设:每个格子都只属于一个单独的实例。每个格子仅仅属于(可以分配)一个语义类别。

如果将一张图像分割为S S个格子,则输出shape为

H W S

2 H × W × S^{2} H×W×S2
每个通道表示对应的Positive的一个格子的分割结果。这里所谓的Positive指的是,只要这个格子在任何一个Groud Truth的中心区域里,就将这个格子认为是Positive的。


最后将semantic category和instance mask 一对一关联。

综上:
SOLO将图像划分为SxS个网格,认为每个网格都是一个潜在的目标实例。

具体实现上,图像经过全卷积网络(FCN)后进入两个分支的预测。一个类别分支,预测每个网格所处的物体类别,每个网格对应一个C维类别向量(C为类别数),总的类别矩阵大小为S x S x C;一个mask分支预测每个网格所属的物体mask,总的mask矩阵大小为H x W x (S x S)。

请注意:mask是不关乎类别的,无论是什么物体,只要该物体落入了这个网格,mask 分支都预测它的mask。如下图所示:在中间两个长颈鹿存在的网格中,分割的mask是两者都有的。

mask分支预测得到的每个网格的mask的大小是和原图大小相等,每个网格只对应落入此网格的物体的mask。

这样来自相同位置(网格)的物体类别和相应mask就出来了,每个网格完成了单个目标实例的分割。

由于一个物体可能落在不同的相邻网格里,所以以上过程得到的肯定是多个网格含有相同的物体的mask。故最后必须进行NMS(非极大抑制),以消除重复的分割结果。

回顾

后面具体的就不写了。感兴趣的自己看论文吧。这里想自己再思考一下作者解决这个问题的过程。
从Introduction里面看,作者的思路是:

bbox其实是区分不同实例对象的一个定位条件。那么如果不用bbox或者其他关联信息,我们怎么区分不同的实例对象?
–>不同的实例对象有不同的中心位置和大小。

好,有了区分不同实例对象的条件,那我们怎么做对每个对象做分割?

我们知道语义分割将分割任务当成了分类任务,即对每个像素分类。那么实例分割可不可以也这么做呢?语义分割每个像素点都需要对应一个类别,我们可以利用通道数来表示像素每个类别的概率。自然而然,我们可以想到如果每个实例类别可以分配到不同的通道上,用不同通道表示每个类别的概率,那不也可以分类了吗!

那我们怎么定义实例类别?
刚刚已经知道了,不同的实例对象有不同的中心位置和大小。
位置的话,把特征图划分成小块,每个小块认为只包含一个目标,这样就可以通过位置区分很多实例了,另外就是如果两个目标很不幸落在同一个块内,那么大概率他们的尺寸不同,那么通过FPN就把这两个目标分到不同分辨率的特征图上面去了,这样就完成了实例分割最重要的实例目标区分,至于实例目标的mask和类别,可以很方便的通过语义分割来解决:要不直接多分类,要不二分类+类别预测。

总结:其实感觉solo v1最大的问题还是在于多个尺寸类似的实例对象出现在同一网格。能不能引入实例权重的概念优化这个问题?类似于注意力机制。

**疑问:**其实还是不太理解为什么,一个网格对应的mask channel上分割结果就只有那一个实例。这不是看到部分,得到全部吗?不太理解。。。有明白的评论告诉我一下!

SOLOv2

论文链接:SOLOv2: Dynamic, Faster and Stronger
项目地址:https://github.com/WXinlong/SOLO

对SOLOv1 的两点改进:

对于mask生成,加入动态卷积,根据不同实例确定卷积核的大小。提出Matrix NMS,大大提升速度。 改进1-动态卷积的引入


为什么要引入动态卷积?
答:对于原来的实例mask表示和学习,消耗大量内存和计算资源。因为对FPN网络的不同level的特征图,都要去做网格划分和采用不用的卷积,造成低效。但是其实很多地方根本就没有实例对象,根本不需要大的卷积核去做操作。

Matrix NMS

具体的就不写了。。反正只是一个快速NMS的工具。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。