这里直接总结了:
为什么说yolov8-seg是实例分割,因为yolov8-seg是以目标框为单位进行分割的,一个目标框,就是一个实例,所以一个目标框中的mask点,肯定属于一个实例。实例分割和语义分割不同,之前的语义分割,只是判断该像素点是mask,还是背景,但是对于分割出来的mask点,哪些mask点属于实例A,哪些mask点属于实例B呢,语义分割时无法分清楚的。
从下面的流程图中可以看出来:

  1. yolov8-seg依旧做目标检测的任务,不要以为你输入的label只是mask点,在数据加载部分,从mask点计算出mask所在的目标框是很容易的,所以yolov8-seg的label,是类别id号、目标框的4个位置坐标、然后是你所标注的mask点;
  2. forward完之后,网络的输出的三层特征是,以输入3x384x640,网络yolov8m-seg为例,从下往上,第一层:960x12x20,第二层:384x24x40,第三层:192x48x80;
  3. 做目标检测,生成了65个channel,其中1个是类别,64是4x16,是要估计的x-16dim,y-16dim,w-16dim,h-16dim;
  4. 做目标分割,生成32个channel,用于估计mask。
  5. 注意,三层特征合并到一起,共预测了5040个目标框,每个目标框预测了1个类别,目标框的4个值,以及32维的mask特征
  6. 然后对这5040个目标框进行nms,加上分数阈值的过滤,可以得到1~2个目标框
  7. 注意,这32维的mask特征,不是对分割点的直接预测,而是一个系数,proto模型使用192x48x80的特征,学习了一个32x96x160的Proto特性,在同一张图片上只生成一次 Proto特性(共享),每个预测框都有一个32维的系数,不同实例的差异来自 这32维的mask_coeff,每个预测框用这32维的系数,乘以32x96x160的Proto特性,得到,该目标框对应的mask图,但是这个mask图是96x160的,网络内部会自动resize到输入图片的大小,你使用的时候,可以自动再resize到图片的原始大小;
  8. Proto = 生成“公共模板” Mask coeff = 每个目标只需给“模板的配方” 合成 → 实例的最终 mask
  9. 每个目标框对应一个mask图,然后每个目标框的轮廓点是通过findContours 得到的轮廓点

目录

(1)overlap_mask训练参数

(2)yolov8m-seg backbone结构图如下

(3)检测neck结构图如下

(4)分割neck结构图如下

(5)Proto模型

(6)后处理流程如下

(7)创建输入结果

(8)yolov8-seg分割数据输入格式

正文

(1)overlap_mask训练参数

注意:使用ultralytics工程,在训练yolov8m-seg网络时,有一个参数是overlap_mask,overlap_mask=True时:将对象掩码合并为单个掩码以进行训练,即重叠区域只属于其中一个目标的,不属于其他目标,这个参数训练出来的模型,会把重叠的两个目标,一个目标是完整的,另一个目标是非重叠区域。
在这里插入图片描述

在ultralytics工程中,通过debug的形式,对yolov8m-seg测试一张图片的过程进行逐步查看,画出以下网络结构图

(2)yolov8m-seg backbone结构图如下

在这里插入图片描述

(3)检测neck结构图如下

decode_bboxes是将4x5040和anchor对应起来。
在这里插入图片描述

(4)分割neck结构图如下

在这里插入图片描述

(5)Proto模型

在这里插入图片描述

(6)后处理流程如下

1)、后处理的输入37x5040,32是掩码mask,4 是x1y1x2y2,1是1个类别分数,该任务中,只有一类,有5040个目标。
2)、5040个框中,取类别分数>阈值的框。在我测试的一个图片例子中,使用分数阈值过滤后,剩余21个目标,即37x21。
3)、获取这21个目标中分数最高的下标id .
4)、将这21个目标分数从大到小排序,通过目标框和目标框的分数进行nms,选中了id=12和id=0的两个目标框;
5)、获得这两个目标框的对应的37个数值。

(7)创建输入结果

图片的输入尺寸为:384x640
一个框的maks是32维,2个框是2x32,
之前计算的protos,是32x96x160
protos,view成32x15360
mask = 2x32 @ 32 x 15360 = 2x15360 view 2x96x160

在第5步的后处理中,得到的box框是 输入384x640图片上的
32为mask 是在 之前计算的protos,32x96x160 上的
因此将384x640上的box,缩小到96x160上

现在mask大小是2x96x160,有两个目标框,只需要目标框内的mask有效,其他都是false

然后将mask 上采样为 2x384x640大小

mask 中 大于0的为1,小于0的为0

(8)yolov8-seg分割数据输入

分割输入的txt,第一位是类别id,后面紧跟着mask的点x1,y1,x2,y2,x3,y3,x4,y4,不需要输入分割对应的box的框,ultralytics工程中,会自动生成

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐