paper
https://arxiv.org/abs/1904.02689
git
https://github.com/dbolya/yolact
目的:
像maskrcnn->fastrcnn,在单阶段检测算法上增加分割。
0 效果
19年最新的CVPR,目前达到实时级别,~30fps。训练时只是用了一个GPU titanxp.
精度跟MS RCNN差的比较多,10左右。
同样精度时,比maskrcnn快3.8倍左右。
1 创新点
1 解决分割的新的分两步方法。
在单阶段识别基础上,将分割任务划分为两个子任务:what 和where.
where:在一张图上(并不像maskrcnn使用ROIPOOING带来质量损失)产生一系列prototypes,
what:预测每个实例预测掩膜mask的线性结合系数。(该方法能够自主的定位实例位置,同时这些mask类别上独立,因此可以在类间共享)
2.提出了Fast NMS
带来12ms的提速,以非常小的精度损失。
同时做了很多speed vs performance对比实验:
- backbone (resnet50,101,darknet53 ) 图像分辨率(400 550 700)
- prototype数量
- 速度
其中,fc-mask是掩膜输出使用fc层的模型,为了证明使用FCN网络的protonet作为掩膜预测的有效性(FCN具有空间特性,而fc适合输出cls和bbox系数)。
2 相关工作
实例分割也分为单阶段(6,22,4)和两阶段(MASK MASKSCORING ),间接方式一般先语义分割随后边界检测、像素聚类或学习形成实例掩膜,是多阶段往往包含大量的聚类过程。
而能达到实时性的往往效果较差。
Box2pix在 KITTI 、Cityscape数据集上能够达到35fps,11fps,但是在多类目标上的迁移性较差。
综上,mask 仍然很牛掰。
对于prototype,是文本和可视词这类文本处理的方法,利用稀疏性和位置先验。现在扩展到视觉领域,表征特征。(prototype的稀疏性是指??)
本文prototype不是针对整个数据集学习,而是对每个实例图片。
3 YOLACT
增加两个分支
1.使用全卷积网络产生原图尺寸的prototype masks ,并不依赖于某个实例。FCN可以有更好的空间相关性。
2.在检测网络上增加head,利用fc层为每个锚点预测mask系数向量,该向量对prototype空间中的实例(个人理解更像是被检测网络中挑出来的)进行编码。fc层能更好产生语义向量。
最后,对经过NMS筛选出来的实例通过线性组合两个分支生成掩膜。
3.1 prototype生成(protonet)
protonet= FCN -->k channels prototype masks
P3出来尺寸69*69*256(FPN最大尺寸最底层的输出,可以有更好的鲁棒性),两个3*3卷积后,upsample一倍(到原图的1/4,高分辨率可以提高掩膜质量和小目标检测效果),最后是1*1×k卷积接RELU(响应值不设边界,更有利用表征特征,比如指出背景位置)。
中间用的什么激活函数需要看code,看过的可以解答:
3.2 mask coefficients
经过FPN第Pi层输出,除了两个预测类别c和边界框4的分支,增加了mask系数预测分支k个,对应k个prototpyes.所以对于每个锚点预测c+4+k个值。Pi层共a个锚点。
为了保证非线性,需要能够减掉prototype。否则不能生成掩膜。(跟非线性什么关系??)
kmask 系数分支使用tanh,在没有非线性下输出更加稳定。?(跟谁比较?)
3.3 mask assembly
为了产生最终的mask,将二者结合。
利用次公式计算输出。
其中P是prototypes尺度HWk,
C是mask coefficients尺度n*k,其中n是n个实例结果(经过NMS和score thresh后的)
最后sigmod非线性输出。
此处线性组合保证简洁快速。
loss
cls 和box是SSD的
mask是二值交叉熵损失BCE(M,Mgt)
小目标crop
为保存在prototype中的小目标
测试时候用bbox裁剪,
训练时候真值框代替裁剪,并通过真值框区域划分Lmask??
(有小目标判断?怎么划分loss mask)
backbone
因为两个分支网络都难train,速度特征丰富度都要考虑、检测器在Retinanet思路上强调速度。
并没有使用retinanet的focal loss,而是用的OHEM