YOLACT是一种集检测,分类,语义实例分割于一身的模型,
paper细节这篇文章讲得很详细,不再码字了。
如果想更清楚地了解各个处理细节,请参考yolact ncnn保姆级源码解读
主要写一下paper中作笔记标出来的地方。
目标检测有two-stage和one-stage一说,以前的R-CNN,Faster R-CNN是two-stage检测,
后来YOLO改进成了one-stage.
实例分割也是,Mask R-CNN是two-stage分割,先有box region, 然后有mask,
这种方法存在feature repooling,即先有ROI,然后把box内的feature送到mask predictor.
这两个stage是序列的,顺序一定,先来后到,前一阶段不完成后面就不能开始,因此在加速上有些困难。
FCIS做到了把两阶段并行,但是存在大量的post processing,也不算real-time.
作者就想到把实例分割也做成one-stage,达到real time的效果。
backbone是熟悉的ResNet-101,然后作者发现如果是分割大的目标,效果会比其他方法好(边界部分比较准确),
据分析是由于没有feature repooling带来的损失。
模型就并行的两个branch,一个mask,一个目标框+分类。
mask预测是用FCN结构,预测ptototypes
目标框则是在目标检测分支加了一个extra head,用来预测mask coefficients
在通过了NMS的目标框中,预测mask。
记得语义分割模型中,mask经常有断断续续的效果,比如
有段文字不知道是不是说的这个现象,
卷积层(conv)会利用到pixel的连续性,认为彼此连接的pixel大概率会是同一实例,
而FC层不会。
因此,模型有两个分支,fc层用作产生mask coeffients,
conv层用作产生protype masks.
为了提高较小目标的效果,会把P3层的deep feature上采样到输入图像的1/4大小。
很多时候,为了提高实效性,会把图像下采样减小尺寸,
但是这里作者不建议这么做,减小尺寸会大幅降低performance.
如果想提速,建议使用ResNet-50或者DarkNet-53.
在连续帧的效果回避Mask R-CNN, 比如视频中,mask的抖动要小。
分析是即使目标框有抖动,因为是one-stage, prototype也不会受影响。