YOLO-实例分割头
记录
介绍实例分割头的 网络结构,以及在推理阶段后处理流程
1.对三个特征图P3,P4,P5的处理及输出
对于目标检测头Detect 和 实例分割头Segment 其输入都是一样,三个不同通道数,不同长宽的特征图输入。
即三个输入为:
分割头部分
最后得到分割头的输出(上图最右边)
在拿到分割结果后,使用该结果进行后处理,得到最终输出结果
1.特征层输入
输入三个特种层P3,P4,P5
P3 (1,64,80,80)
P4 (1,128,40,40)
P5 (1,256,20,20)
第一条支路,输出原型掩码
期间经过一条转置卷积上采样 HW从 80x80 变为160x160
第二条支路,输出掩码系数
内部包含三条小支路,
将三个输入的特征图通道数转换为
P3: 64 --》32
P4: 128--》32
P5: 256--》32
第三条支路,原来目标检测任务中的检测头 Detect
将Detect Head结果进行后处理 输出为 (1,84,8400),以及原来的三个输出结果
将三个支路的输出进行整合,输出两个结果
结果1
x[0],mc
x[0]=116= 80个类别+4bbox+32mc (原型掩码·)
结果2
x[1],mc,p
检测头输出、原型掩码、掩码系数
上述图:左图代表第一条支路,右图代表 第二条支路
2.后处理
一组掩码系数为32个, 表示对于32个通用形状基底的权重, 每个实例掩膜是32个通用形状的加权和
针对分割头(有两个输出)的第一个输出,使用NMS, 将8400检测实例 剔除部分后,仅保留5个(这里是举例子,具体结合实际),38表示 x1,y1,x2,y2,confidence,class, 32个掩码系数
将32个原型掩码 乘以 掩码系数(160x160=25600), 进行加权和操作 @ -->得到(5,25600),再经过view得到 (5,160,160), 至此得到5个实例(object)的mask
(这个有些晕了,不清楚是否正确)
将 5个实例的bbox (5,4) 与 5个实例的mask (5,160,160)
进行crop_mask操作
crop_mask
将落在bbox的mask进行保留, 落在bbox以外的maks进行去除
然后对bbox里面的mask进行 阈值截断,bbox内部mask的数值:0~0.5的置0, 0.5~1置1
效果如下:
白色对图像右下角的人的一部分像素
原来mask尺寸为160x160,经过双线性插值上采样,得到mask为640x640
个人:
看完了,但是比较疑惑?
1.原图如果为1280x720, 是不是实例分割效果会比 原图为640x720会差一些,因为将1280x720压缩到640x640, 则1280x720中的小像素目标可能会有信息丢失,
2.该怎么改进分割头呢?加上深度可分离卷积吗? 类似yolo11的detect head
问题后续看看,查看是否有答案?()
参考资料:
bup-Enzo-Mi
yolo 实例分割 | Segmentation Head 结构 与 推理阶段后处理流程_哔哩哔哩_bilibili