CVPR 2021的文章,论文链接:SwiftNet: Real-time Video Object Segmentation
文章目录
abstract
-
one-shot VOS: semi-supervised video object segmentation
给定第一帧的标注,像素级定位被标注的物体
-
PAM: Pixel-Adaptive Memory,压缩了基于匹配的VOS的时空冗余
- 时间上:当物体表现出值得注意的帧内变化时,就自适应更新memory
- 空间上:选择性的进行memory的更新,在动态像素上做匹配,忽略静态的像素,极大的减少浪费在无关分割的像素上的冗余计算
-
light-aggregation encoder,deploying reversed sub-pixel
intro
-
one-shot VOS通常采用基于匹配的策略,目标物体首先从历史参考帧中建模,然后在incoming query上做精确匹配
-
real-time VOS要求非常好的物体建模(特征抽取)和匹配计算
作为一种妥协,目前的方法都单独追求高精确度而忽略了速度
-
memory-based method在对物体变化建模的过程中使用所有的历史帧和非局部的reference-query matching
调度这些参考帧,应用复杂的匹配策略不可避免的会降低分割速度
-
通过减少参考帧数量,使用轻量级匹配策略,加速分割
- mask-propagation strategy,只使用第一帧和最后一参考帧来对当前帧做分割
- 高效的pixel-wise matching,region-wise distance measuring和correlation filtering用以减少计算量
这些方法虽然加快了分割速度,但是准确率又下降了非常多
-
本文作者认为:
- accurate methods,由于时空冗余,无法很高效的进行
- fast methods,不加区别的减少这种冗余,所以精确度不行
处理时间 T \mathcal{T} T 与reference frames’ pixels N r \mathcal{N}_r Nr 和query frames’ pixels N q \mathcal{N}_q Nq 的数量呈正相关
-
The spatiotemporal redundancy denotes that Nr is populated with pixels not beneficial for accurate segmentation
- 时间上:将所有参考帧都用作参考建模,无物体变化的静态帧被重复建模,包含了物体变化信息的动态帧受到的关注不够
- 空间上,整幅图都用于匹配,大多数静态的像素对分割来说都是冗余的
因此高效的压缩pixel-wise redundancy就可以做到精确度和速度兼顾
-
SwiftNet用encoder-decoder结构实例化基于匹配的分割,时空冗余在本文提出的PAM(Pixel-Adaptive Memory)中被压缩
- 在时间上:variance-aware trigger module,计算帧间差异,自适应激活memory update,只更新具有差异的帧,而忽略静态帧
- 在空间上:
- pixel-wise memory update,衡量帧间相似性,判断一个像素子集是否有利于memory,然后递增式的将它的特征表达加进memory,忽略冗余的
- pixel-wise memory match,压缩了耗时的非局部计算
为了进一步加速,PAM配备一个新提出的LAE(light-aggregation encoder),抛弃冗余特征提取,enables multi-scale mask-frame aggregation leveraging reversed sub-pixel operations
相关工作
one-shot VOS
-
建立一种时空匹配问题,在第一帧中被标记的物体需要在后续的query frames中被定位,定位方式为寻找能与reference frames建模的物体模板最佳匹配的像素
根据上述的思路,将one-shot VOS分为两个阶段:
- Reference modeling,探索物体在历史帧当中的演进过程,建立object template,已有的方法主要分为两种:
- 只利用第一帧或最后一帧作为参考,这种方式在速度上非常有优势,但是由于没有充分利用历史帧的物体变化,所以在精确度上并不尽如人意
- 利用所有帧作为参考,精确度很高,但是随着帧数的增加,计算开销就越来越大,所以速度很慢
- reference-query matching,即将分割的帧作为query,与上一步中建模的reference进行像素级匹配,选择最佳匹配像素,根据是否利用了RoI将已有的方法主要有两种:two-stage和one-stage
- Reference modeling,探索物体在历史帧当中的演进过程,建立object template,已有的方法主要分为两种:
-
匹配的核心就是相似性的计算(similarity measuring),现有的方法主要采用卷积网络convolutional networks、互相关cross correlation和非局部计算non-local computation三种,其中non-local computation是精确度最高的,它能捕获每一对像素之间的依赖性,但是计算开销大
-
除了memory-based VOS(基于匹配的方法),还有propagation-based VOS(基于传播的方法),它利用时序运动一致性来增强分割结果,当大幅度变化导致appearance matching失败时,它的效果会非常好
-
online fine-tuning可以优化分割结果,但是没法用于real-time场景
Fast VOS
- 为了提高效率,大多数的fast vos都采用单帧参考策略
- 还有一些方法采用segmentation by tracking策略,跟踪一个bounding-box,然后将pixel-wise matching限定在bounding-box中,避免全图计算,减少计算量
- 为了加速pixel-wise matching,RGMP用卷积计算相似度,AGAME使用probabilistic generative appearance model从背景中区分物体,RANet在ranked pixel-wise features上采用互信息来进行匹配,OSNM proposes to spur VOS with network modulation
memory-based VOS
- 这种方法用一个额外的memory来进行object modeling利用历史帧,一种替代方式是使用循环神经网络RNN来建模所有帧的演化
- STM是这种方法的开创性鼻祖,极大的增加了分割准确性,之后的工作在此基础上做了改进,例如使用Siamese-based semantic similarity和motion-guided attention
- 为了避免繁重的计算,GCNet使用attention设计了一个global context module(全局上下文模块),减少了memory中计算的时间复杂度
SwiftNet
两大模块:PAM(包括variation-aware trigger、pixel-wise memory update和match module)和LAE
问题定义
视频序列 V = { x 1 , x 2 , ⋯ , x T } V=\{x_1,x_2,\cdots,x_T\} V={x1,x2,⋯,xT},其中第一帧 x 1 x_1 x1 的标注mask为 y 1 y_1 y1,one-shot VOS的目标是对每一帧 t t t 都生成物体的mask y t y_t yt,从背景中分辨物体
在相关工作中提到,VOS方法的实施主要分为两个阶段:
-
对第 t t t 帧做object modeling
历史信息包含在reference frames( { x 1 , x 2 , ⋯ , x t − 1 } \{x_1,x_2,\cdots,x_{t-1}\} {x1,x2,⋯,xt−1} 和 { y 1 , y 2 , ⋯ , y t − 1 } \{y_1,y_2,\cdots,y_{t-1}\} {y1,y2,⋯,yt−1})中,需要从中建立object model M t − 1 M_{t-1} Mt−1:
M t − 1 = ϕ ( I ( 1 ) ⋅ E n R ( x 1 , m 1 ) , I ( 2 ) ⋅ E n R ( x 2 , m 2 ) , ⋯ , I ( t − 1 ) ⋅ E n R ( x t − 1 , m t − 1 ) ) M_{t-1}=\phi\bigl(I(1)\cdot EnR(x_1,m_1),I(2)\cdot EnR(x_2,m_2),\cdots,I(t-1)\cdot EnR(x_{t-1},m_{t-1})\bigr) Mt−1=ϕ(I(1)⋅EnR(x1,m1),I(2)⋅EnR(x2,m2),⋯,I(t−1)⋅EnR(xt−1,mt−1))
其中 ϕ ( t ) \phi(t) ϕ(t) 是indicator function,用于标识第 t t t 帧是否参与了建模; E n R ( ⋅ ) EnR(\cdot) EnR(⋅) 是用于特征提取的reference encoder; ϕ ( ⋅ ) \phi(\cdot) ϕ(⋅) 用于表示物体建模过程
-
reference-query matching,即在 x t x_t xt 中以像素级方式搜索 M t − 1 M_{t-1} Mt−1,生成物体对象关系映射 A t A_t At
A t = γ ( M t − 1 , E n Q ( x t ) ) A_t=\gamma\bigl(M_{t-1},EnQ(x_t)\bigr) At=γ(Mt−1,EnQ(xt))
其中 γ \gamma γ 是像素级匹配运算, E n Q ( ⋅ ) EnQ(\cdot) EnQ(⋅) 是query encoder
最终的分割结果mask由一个decoder产生,这个decoder综合了编码后的feature和 A t A_t At
分割的过程:
顺着上图的顺序,先执行实黑线表示的操作生成分割掩码,然后用虚线进行内存更新。对于将要分割的query frame x t x_t xt
- 通过query encoder得到query key feature K Q , t K_{Q,t} KQ,t 和query value feature K R , t K_{R,t} KR,t
- query feature通过pixel-wise memory match module得到object affinity map A t A_t At
- 将query feature和object affinity map一起通过decoder得到分割结果 y t y_t yt
- 将 x t − 1 , y t − 1 , x t , y t x_{t-1},y_{t-1},x_t,y_t xt−1,yt−1,xt,yt(即相邻两帧的rgb图像和分割mask)通过variation-aware trigger module来判断是否需要更新memory,如果需要,则由LAE完成memory update
这里其实我有一个想法,因为SwiftNet进行memory update之前需要经过reference encoder再进行一次编码(不同于query encoder),而STCN中只需要通过一次encoder,显然更优。同时STCN并没有考虑到对memory更新的取舍问题,二者的结合应该会有不错的效果
当然还需要对两种方法的encoder结构进行一定的分析,看看上述方法是否可行
PAM (Pixel-Adaptive Memory)
这部分是SwiftNet的核心,对物体运动进行建模,进行物体匹配,同时压缩了时空冗余,PAM主要由三个部分构成:variation-aware trigger,pixel-wise memory update,match modules
variation-aware trigger
利用所有帧的信息作为参考来建立时序一致性的物体变化显然是很好的,但是会造成难以容忍的计算冗余,先前的工作利用了一种简单的解决方式:从reference frames中以一个预定义的步长进行采样,但是这种方法会不加区分的去除一些信息,导致精确度大减
为了准确有效的压缩冗余,variation-aware trigger计算了帧间变化幅度,一旦积累的变化幅度超过了预设的阈值 P t h P_{th} Pth,就激活memory update
具体来说,SwiftNet的帧间变化幅度包括图像差异 D f D_f Df 和maks差异 D m D_m Dm,对每个像素 i i i 都需要计算:
D f i = ∑ c ∈ { R , G , B } ∣ x t i , c − x t − 1 i , c ∣ 255 D_f^i=\sum_{c\in\{R,G,B\}}\frac{|x_t^{i,c}-x_{t-1}^{i,c}|}{255} Dfi=c∈{R,G,B}∑255∣xti,c−xt−1i,c∣
D m i = ∣ y t i − y t − 1 i ∣ D_m^i=|y_t^i-y_{t-1}^i| Dmi=∣yti−yt−1i∣
D f D_f Df 是各通道值的差异的总和,有点直方图的感觉
D m D_m Dm就只是衡量mask的差异
二者都用了曼哈顿距离作为衡量,是否欧式距离会是一个更好的选择?
总的运动变化程度为 P P P:
P = { P + 1 , if D f i > t h f and D m i > t h m P , otherwise P=\begin{cases}P+1,&\text{if $D_f^i>th_f$ and $D_m^i>th_m$}\\P,&\text{otherwise}\end{cases} P={P+1,P,if Dfi>thf and Dmi>thmotherwise
如果 P > P t h P>P_{th} P>Pth,PAM则进行一次memory update,在实验中, P t h , t h f , t h m P_{th},th_f,th_m Pth,thf,thm分别设置为200,1,0
这里这个手动设置的阈值显然对数据集有依赖作用,还有更好的解决方式,比如重投影误差之类的
pixel-wise memory update
如果variation-aware trigger激活,则会对memory进行一次更新,按照现有方法的策略,在memory中更新参考帧时会将整张图像添加进memory,但是图像中大部分像素点并不会对分割提供帮助,因此存入整张图像免不了带来极大的存储空间浪费和计算冗余
-
在流程图①所示的过程中已经得到了query key feature $K_{Q,t}\in \mathbb{R}^{H\times W\times \frac{C}{8}} $和query value feature V Q , t ∈ R H × W × C 2 V_{Q,t}\in \mathbb{R}^{H\times W\times \frac{C}{2}} VQ,t∈RH×W×2C,在此过程中会产生不同尺度的特征图,当图像通过EnQ时,这些特征图都会暂存起来,如果不需要进行memory update则将这些特征图丢弃即可,如果需要进行memory update,则需要结合LAE结构(EnR)进一步进行编码得到 K R , t K_{R,t} KR,t 和 V R , t V_{R,t} VR,t
-
t − 1 t-1 t−1 时刻的memory表示为 M t − 1 M_{t-1} Mt−1,其中共有 k t − 1 k_{t-1} kt−1 个像素的信息,表示为 K R , t − 1 ∈ R ( k − 1 ) × C 8 K_{R,t-1}\in \mathbb{R}^{(k-1)\times\frac{C}{8}} KR,t−1∈R(k−1)×8C
为了去掉冗余像素的影响,pixel-wise memory update使用余弦相似度衡量 K Q , t K_{Q,t} KQ,t 和 K R , t − 1 K_{R,t-1} KR,t−1 之间的稠密图 S ∈ R H W × ( k − 1 ) S\in \mathbb{R}^{HW\times (k-1)} S∈RHW×(k−1)
具体来说:
-
我们将 H × W × C 8 H\times W\times \frac{C}{8} H×W×8C 的 K Q , t K_{Q,t} KQ,t 展开(flatten)为 H W × C 8 HW\times \frac{C}{8} HW×8C 大小,然后计算cosine similarity matrix:
S i , j = K Q , t i ⋅ K R , t − 1 j ∣ ∣ K Q , t i ∣ ∣ ⋅ ∣ ∣ K R , t − 1 j ∣ ∣ S^{i,j}=\frac{K^i_{Q,t}\cdot K^j_{R,t-1}}{||K^i_{Q,t}||\cdot||K^j_{R,t-1}||} Si,j=∣∣KQ,ti∣∣⋅∣∣KR,t−1j∣∣KQ,ti⋅KR,t−1j
-
得到该稠密相似图之后,为每个像素选择相似度最大的memory中的向量,即:
s i = arg max j S [ i , : ] s_i=\underset{j}{\arg \max} S[i,:] si=jargmaxS[i,:]
-
步骤2中得到的向量 s s s 的长度是 H W × 1 HW\times1 HW×1,然后将 s s s 按照相似度值进行排序,选择相似度最大的 β % \beta \% β% 个像素,这些像素表示了severe feature variations
-
按3中选择出的像素,将这些像素位置所对应的 K R , t K_{R,t} KR,t 和 V R , t V_{R,t} VR,t 加入memory中,完成更新
pixel-wise memory match
(图中没有标 t t t 和 t − 1 t-1 t−1,要注意区分)
这个过程就是query和reference的特征匹配过程,SwiftNet中使用 K K K 进行匹配,使用 V V V 进行mask的生成,所以affinity map的计算方式为:
I i , j = exp ( K Q , t i ⊙ K R , t − 1 j ) I^{i,j}=\exp(K^i_{Q,t}\odot K^j_{R,t-1}) Ii,j=exp(KQ,ti⊙KR,t−1j)
然后将 I t I_t It 通过softmax层得到像素级权重图 A t A_t At,权重图与reference value相乘后拼接上query value一同送往Decoder进行解码,得到当前帧的mask,具体形式是:
V o = [ A t × V R , t − 1 , V Q , t ] V_o=[A_t\times V_{R,t-1},V_{Q,t}] Vo=[At×VR,t−1,VQ,t]
在这个过程中,affinity map的大小为 H W × k HW\times k HW×k,相较于现有方法的 H W × H W T HW\times HWT HW×HWT,计算效率得到显著提升
LAE (Light-Aggregation Encoder)
蓝色部分是一开始通过EnQ提取图像特征时暂存的,绿色部分是确定需要对该帧进行memory更新后对mask的编码过程,LAE和EnR我认为是同一个东西,就是综合图像和mask的特征,进行features alignment和multi-scale aggregation
这里没什么可讲的,说白了LAE(也就是EnR)就是一个特征的融合机制
本文的主要贡献还是在消除计算冗余上(PAM部分),论文写的很烂
最后简单说一下自己认为可以改进的地方:
- 相似度的计算方式
- 过了两次encoder显然不是最优的,而且key value众多,消除冗余消除的还不够干净
- memory update不考虑位置信息感觉有点不妥,是否可以在图像特征编码时就考虑到位置信息