yolov8m-seg(下)的详细后处理
yolov8m-seg的backbone 和 Segment部分结构请跳到这个博文yolov8m-seg(上)详细的backbone和Segment结构(绝对干货)
本次内容是承接上个博文,将详细讲述yolov8m-seg分割的后处理。
一、后处理的输入
后处理的输入,也就是backbone、Segment的输出,不管输入的原始图片多大,网络都是会letterbox到640x640的大小,经过backbone之后,输出特征层P3 P4 P5,每层的特征输入到Segment层后,输出对应的64维的目标框、80类的类别、以及32维的mask系数,以及学习的固定大小的prototype 160x160x32。

二、后处理整体结构
三个特征层的64维度的box框经过yolov8-decoding模块,生成8400x4的目标框;三个特征层的80类类别分数,不需要解码,直接concatenate起来,生成8400x80的类别分数;三个特征层的mask系数,同样直接concatenate起来,生成8400x32的mask系数。8400x4 、8400x80、8400x32共同进入nms中,生成取重复的N个目标,输出Nx1 类别,Nx1分数,Nx4目标框;

2.1、yolov8-decoding
依附anchor框的decoder
yolo系列anchor为基础的box解码公式,例如yolov5,其中网格坐标(cx,cy),Anchor尺寸(aw,ah),网络输出(tx,ty,tw,th)。(cx,cy)是网格的左上角,anchor的center点是某个网格的中心点,因此需要网格的左上角都加上0.5,例如(cx,cy)=(1,5) ,中心点就是(1,5,5.5)

Anchor-free的decoder
Anchor-free类(例如FCOS)的目标框公式如下图,其中对于任意位置(x,y),预测(l,t,r,b),目标框真实位置是(x0,y0)


yolov8m的decoder
下图是yolov8m的box 解码过程,延续了FCOS的思想,区别只有一点,FCOS直接预测(l,t,r,b),而YOLOV8不直接预测,它预测left的16个bin概率,例如P0,P1…P15,计算数学期望四条边的计算公式如下

具体操作步骤如下图:

2.2、生成mask
- 矩阵相乘:Yolov8m-seg输出中的80x80x32,40x40x32,20x20x32的向量是mask_coeff,而160x160x32是模型学习的prototype,将mask_coeffeient和prototype进行矩阵相乘,得到160x160的mask。
- crop_mask:然后将上面解码出来的目标框,从640x640的尺寸上,映射到160x160的尺寸,然后用crop_mask 用检测框告诉它“这个实例只能存在于这个 bbox 内”,框外的 mask 全部置 0。为什么要这样,是因为虽然目标在中间,但是网络可能在其他地方也有响应。
- resize_mask:将160x160尺寸上的mask resize到640x640上。
2.3、映射回原始尺寸
把模型输入尺寸(例如 640×640)上的检测框坐标,映射回原始图片尺寸(例如 720×1280),YOLO在前向推理的时候进行了LetterBox resize,原图例如720x1280,等比例缩放为360x640,然后padding为640x640,模型输出框是在640x640坐标系上,但是显示需要回到720x1280坐标上。
- 首先需要集散缩放比例gain,就是每个边缩放到目标大小,宽和高谁的缩放比例最小,就用哪个比例,比如640/1280=0.5,640/720=0.88,使用0.5的缩放比例,因为letterbox要保持比例。
计算padding,缩放后12800.5=640,所以pad_x=0,高度7200.5=360,所以pad_y = 640 - 360 = 280 / 2 = 140,图像变成640x640。 - 去掉padding,例如在640x640的图上的目标框为[x1,y1,x2,y2],因为y方向上多了140,所以必须剪掉,真正的输出就是[x1-pad_x,y1-pad_y,x2-pad_x,y2-pad_y]。
恢复原图尺寸,减去padding的图片再除以gain即可。 - mask恢复原始图片的操作相似,都是要减去padding,后resize到原始图片大小即可。
更多推荐


所有评论(0)