yolov8m-seg详细的网络结构以及内部实现细节(绝对干货)
在ultralytics工程中,通过debug的形式,对yolov8m-seg测试一张图片的过程进行逐步查看,画出以下网络结构图。
这里直接总结了:
为什么说yolov8-seg是实例分割,因为yolov8-seg是以目标框为单位进行分割的,一个目标框,就是一个实例,所以一个目标框中的mask点,肯定属于一个实例。实例分割和语义分割不同,之前的语义分割,只是判断该像素点是mask,还是背景,但是对于分割出来的mask点,哪些mask点属于实例A,哪些mask点属于实例B呢,语义分割时无法分清楚的。
从下面的流程图中可以看出来:
- yolov8-seg依旧做目标检测的任务,不要以为你输入的label只是mask点,在数据加载部分,从mask点计算出mask所在的目标框是很容易的,所以yolov8-seg的label,是类别id号、目标框的4个位置坐标、然后是你所标注的mask点;
- forward完之后,网络的输出的三层特征是,以输入3x384x640,网络yolov8m-seg为例,从下往上,第一层:960x12x20,第二层:384x24x40,第三层:192x48x80;
- 做目标检测,生成了65个channel,其中1个是类别,64是4x16,是要估计的x-16dim,y-16dim,w-16dim,h-16dim;
- 做目标分割,生成32个channel,用于估计mask。
- 注意,三层特征合并到一起,共预测了5040个目标框,每个目标框预测了1个类别,目标框的4个值,以及32维的mask特征
- 然后对这5040个目标框进行nms,加上分数阈值的过滤,可以得到1~2个目标框
- 注意,这32维的mask特征,不是对分割点的直接预测,而是一个系数,proto模型使用192x48x80的特征,学习了一个32x96x160的Proto特性,在同一张图片上只生成一次 Proto特性(共享),每个预测框都有一个32维的系数,不同实例的差异来自 这32维的mask_coeff,每个预测框用这32维的系数,乘以32x96x160的Proto特性,得到,该目标框对应的mask图,但是这个mask图是96x160的,网络内部会自动resize到输入图片的大小,你使用的时候,可以自动再resize到图片的原始大小;
- Proto = 生成“公共模板” Mask coeff = 每个目标只需给“模板的配方” 合成 → 实例的最终 mask
- 每个目标框对应一个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工程中,会自动生成
更多推荐
所有评论(0)