1.总结
先看的YOLOV8的分割原理,在YOLOV8里面第一次了解到了prototypes maks,原型掩码,当时不是非常的明白,这两天看到YOLACT论文,突然明白yolov8 的 prototypes maks 思想,是来自这里。具体yolov8分割流程,可以移步我的另一篇文章:yolov8m-seg详细的网络结构以及内部实现细节(绝对干货)
YOLACT分割的核心内容就是,把实例分割的任务分成了两个并行的任务:
- 生成了一个prototypes maks 原型掩码集合;
- 使用模型去预测每个实例的mask coefficients,即掩码系数;
- 将mask coefficients 和prototypes maks进行线性组合,注意,得到的是全图的mask,全图的,不是单个实例的,这样,然后通过预测的位置位置框,将其crop出来
要想理解YOLACT论文中提出的新的实例mask预测方法,我觉得有必要了解下,以前是怎么做实例分割的,例如二阶的Fast RCNN做实例分割,高度依赖位置特征,这些方法将位置特征重新池化到目标框区域内,通过ROIpool/align,然后将特征喂给mask 估计器,这种方法是顺序的,很难加速。
在进一步了解YOLOACT具体是怎么操作prototypes maks的,根据yolov8的学习经验,这里有几个问题,想先提出来:
- yolov8中网络模型学习出来的prototypes maks是32x96x160,整个数据集中的目标实例,都在这个32x96x160上学习自己的系数,不分类别,这种共性的属性,适合所有的类别么?
接下来,可以深入了解下YOLOACT的具体思想了
2.YOLOACT 网络框架
其实前面的总结已经说了很清楚了,那么要实现,就需要增加这两步:
- 使用P3层特征,从P5上采样到P4再上采样到P3,然后经过Protonet,获得prototype maks;
- 之前的yolo系统,头部分分支用来预测每个anchor框的位置和类别,YOLOACT在此基础上增加了一个分支,用来预测每个anchor框的mask系数,mask系数和第一步的prototype maks线性组合,就是全图的的mask,目标框内的mask,才是该目标的预测的mask。
3.prototype
上图是protonet,会生成k个prototype,论文中说,这个操作和语义分割和相似,仔细想想FCN,确实是,都是从backbone中直接拿特征,然后做卷积,上采样,卷积,再上采样,但是,YOLOACT和语义分割的不同点在于,语义分割是直接对卷积出来的特征直接计算损失函数,而YOLOACT对组装后的最终掩码计算损失。
Mask Coefficients
熟悉yolo框架的,对上图的结构应该很了解,这里就不详细展开说了。
Mask Assembly
实例的mask,是maks 系数的分支,得到的系数,就是prototype的线性组合,我这里再详细展开说下,在yolov8中,prototype mask 是32x96x160,可以理解为生成了32个96x160的原型掩码,后面会分析,每个原型掩码都是不一样的,然后在头部分支上,生成的Mask Coefficients大小为32x5040,5040是anchor框的个数,也就是,每个框,我生成了32个的maks 系数,这32个系数是对32个原型掩码进行线性组合使用的,即32x32x960x160,得到的每个框的maks是960x160,是整个原图的,再通过预测框进行crop,就得到了该实例的mask。
Losses
本论文使用三个损失函数,分别是分类损失、位置损失、mask损失,这三个损失的权重是1,1.5,6.125,分类损失和位置损失,和yolo类似,maks损失,使用像素级别的,二元交叉损失函数。
YOLOACT在论文中也提到了,YOLOACT学习的是一种分布式特征,在这种特征空间中,每个实例通过类别间共享的prototypes原型进行分割,例如yolov8中的原型是32x96x160,