作者:lucas du | 已授权转载(源:知乎)
https://zhuanlan.zhihu.com/p/422929082
这次带队参加了ICCV2021的UVO(Unidentified Video Objects) Challenge,本次比赛共有两个赛道,分别为基于图片的开放世界实例分割和基于视频的开放世界实例分割。我们运气不错,拿下了本次比赛两个赛道的冠军。以下为本次比赛介绍和我们的方法简介。
细节报告请参见:
Track 1 :
https://arxiv.org/abs/2110.10239
Track 2 :
https://arxiv.org/abs/2110.11661
Code&Models:
https://github.com/dulucas/UVO_Challenge
比赛简介:
- 动机 --- 现有的实例分割方法在一些benchmarks上已经达到了很高的精度。但这些方法常常局限于封闭世界,例如实例分割中常用到的COCO数据集,只标注了来自80个类别的物体,对不属于这80个类的物体均不予标注。而我们生活中往往面临的问题是开放的,物体会来自于成千上万种类别。人类在面对新物体(unseen classes)时,虽然不一定能准确地对其分类,但基本可以准确地定位它并能够将其与背景区分开来。而机器则不同,当遇到大量没有被包含在其训练集的新物体时(这里的新主要指在类别层面),机器能否找到并分割这些物体,便成了问题。
- 现有数据集的问题 --- 由于现有数据集只标注属于某些类别的物体,导致现今所有实例分割数据集均为部分标注(partially annotated),来自未定义类别的物体均未标注。这样导致的问题是,如果想要测量实例分割算法的在新类别物体上的表现,在这些数据集上测出来的结果是不准确的,可能存在检测出来的物体因为没有标注而被当作False Positive的情况。
- UVO(Unidentified Video Objects) 数据集 --- 针对以上的问题,Facebook提出了UVO数据集。此数据集以Kinetics400为基础,对视频中的所有物体进行标注(exhaustively annotated),而对物体的类别并不加以区分,所有被标注的物体均属于"object"类别(作者最新消息:下一步会给所有物体打上具体的类别标签)。数据集详细介绍请参看论文:https://arxiv.org/abs/2104.04691
基于这个数据集,Facebook于ICCV 2021举办了UVO Challenge,比赛分为两个赛道,第一个为基于图片的开放世界实例分割(可以理解为image instance segmentation),第二个为基于视频的开放世界实例分割(可以理解为video instances segmentation)。比赛对训练集不设限制,只要是开源数据集就行,同时主办方提供了UVO v0.5数据集,包含训练集,验证集和测试集,可以用于模型训练与微调。数据集采用COCO的metric,同时以AR@100作为主要metric。
方法介绍:
以下详细介绍我们参加本次比赛所用方法
- Track1 : 基于图片的开放世界实例分割
框架简介:
本次比赛我们没有采用常用的end-to-end实例分割算法,相反地,我们采用了两阶段实例分割框架,第一阶段将图片输入目标检测网络,由目标检测网络预测图片中可能包含物体的边界框;第二阶段先将上阶段预测的边界框包含的图片内容抠出,调整到固定大小之后再输入分割网络,由分割网络预测边界框中物体的mask。
这样做的好处主要有三:
- 将目标检测网络的训练与分割网络的训练分开,从而各自可以使用不同的数据集进行训练
- 分割网络的输入尺寸更大,输出的mask质量更高更精细
- 根据最近一篇ICCV文章,增加分割网络的复杂度更有利于生成更高质量的新类别物体(unseen classes)的mask
同时这样的缺点也十分明显,方法的推理时间(inference time)相比end-to-end算法会加长很多,非常不适用于有实时要求的任务。
目标检测基线模型选取:
我们比较了三种模型:
- Faster R-CNN 双阶段目标检测器
- Cascade RPN(可以认为是)单阶段目标检测器
- OLN 来自Google Brain最新的一篇论文(Learning Open-World Object Proposals without Learning to Classify)
我们采用全量COCO train2017为训练集,COCO val2017和UVO sparse val作为测试集,COCO val2017的结果可以被认为是模型在seen classes上的表现,UVO sparse val的结果可以被认为是模型在unseen classes上的表现,以下为测试结果:
可以看出,不同于Goolge Brain这篇文章中的结果,Cascade RPN的表现最好,我们因此选择Cascade RPN作为我们的比赛的基线模型。我们在比赛刚开始的前两周着力于采用Google Brain这篇文章的算法,但经过各种调试,效果都不好。
目标检测模型其他改进:
如上图所示,我们将目标检测网络简化为4个模块,backbone-neck-head- label assignment mechanism。(注意,我们在这里省去了RPN部分)
- Backbone网络,我们采用了Swin-Large Transformer作为我们的backbone网络
- Neck部分,我们在原有的FPN网络中加入了CARAFE blocks
- Head部分,我们采用了与YOLOX 相同的操作,将原有的coupled head替换为decoupled head
- Label Assignment部分,我们基于YOLOX中所提出的SimOTA sampler做了一点改进,使得sampler对分类(classification)和边界框回归(bbox regression)采取了不同的策略,我们发现分类与边界框回归的正负样本并不一定需要完全一致,边界框回归(bbox regression)时,更多的正样本可以进一步提升模型性能
消融实验:
以上为我们的消融实验示意图,所有模型均在COCO train2017上训练并在val2017上测试。从一个Res50-FPN RPN出发,我们最终的模型可以在AR@100上提高26.1个点。
分割网络:
我们的分割网络相比而言比较简单暴力,我们采用了Upernet网络结构并将backbone替换为了Swin-Large Transformer。
分割网络训练方式:
我们的分割网络为二分类分割网络。图片中的物体被视为前景(foreground),其余部分视为背景(background)。训练时,我们首先于输入图片的实例masks中随机选取一个mask,然后利用此mask生成的边界框裁出框内的一个图片块(patch),将图片块调整到固定大小之后输入分割网络,对应的ground truth即为调整大小之后的实例mask。
训练数据集:
目标检测网络训练所用数据集:ImageNet22k,COCO
分割网络训练所用数据集:ImageNet22k,OpenImage,COCO,Pascal VOC
所有网络在训练时均采用了class-agnostic的方式,即,训练时不区分物体的具体类别,将所有物体类别标签合为一个标签训练。
成果展示:
以下为当给定一个预测边界框时,我们分割网络的输出:
可以看出在有极端角度,遮挡严重,运动模糊等情况下时,我们的方法依然可以得到很好的结果。
最终结果:
我们队(Aples_runner)最终排名:
Track2 : 基于视频的开放世界实例分割
基于我们Track1的方法,我们已经能够得到很多高质量的mask。所以我们进而想到,在mask质量够高的情况下,是否一个简单的跟踪算法就能得到不错的结果?从我们的结果来看,答案是肯定的。
跟踪算法:
我们采用了一个极简的跟踪算法(embarrassing simple),算法核心思想跟IoU-tracker基本一致,大体思路为:我们利用光流一帧一帧地将实例分割结果穿起来,从而得到video instance segmentation结果。算法示意图如下:
由于算法过于简单,细节此处便不多累述。
每个tracker的分数计算流程如下:
即每个tracker存活的帧数与每个帧上tracker对应的检测框分数和的乘积。
我们RAFT模型来预测帧与帧之间的光流。
题外话:我们还曾经试过利用帧与帧之间的相似度来wrap mask,相关任务的文章如 [Space-Time Correspondence as a Contrastive Random Walk, Joint-task Self-supervised Learning for Temporal Correspondence, Rethinking Self-supervised Correspondence Learning: A Video Frame-level Similarity Perspective, Learning Correspondence from the Cycle-Consistency of Time],但是最终效果均不如光流的效果好(换成这些方法之后AR@100大概掉6个点)。原因在于这些方法需要对图片进行下采样来提取特征,但是UVO数据集中存在大量的小物体和细物体(如下图中的网),而通过下采样得到的糙特征(coarse feature)不适用于此类物体,导致在wrapping的过程中mask丢失。
成果展示:
最终结果:
可改进之处:
- 我们的目标检测模型训练时只用了最简单的数据增广方式,且只用了COCO训练,也许增加一些数据增广,增大训练集的数量,延长训练时间,可能会进一步提升最终结果
- Track2中我们采用的跟踪算法过于简单,我们在deadline前4天看到我们track1的可视化结果之后才决定打track2,所以仅仅将其作为一个simple baseline,我们的方法在面对物体出现/消失时仍不够稳定,我们也没有设计相应的解决策略,所以这里能够提升的空间非常大
一些感想:
- 前人栽树,后人乘凉。我们都是站在巨人的肩膀上。在这里也非常感谢MMDetection团队和MMSegmentation团队提供的目标检测库和分割库,同时旷视Base Detection团队的过往比赛报告也让我受益良多
- 非常感谢UVO团队提供标注如此精良的数据集。我在之前做相关的工作时总是苦于没有合适的数据集,而且我们这种小lab也没有足够的资金进行大数据集标注(比如我上篇文章里面的测试集都是我们几个博士生花了好久用labelme打点标出来的),所以这个数据集对我们来说无异于雪中送炭
- 开放世界分割(Open-world Segmentation)是未来!未来!未来!希望这篇文章可以帮助大家更好的认识理解这个任务,同时也希望更多人一起来做相关的工作,把这个领域推起来