基于深度学习的无监督光流算法
UnFlow: Unsupervised Learning of Optical Flow with a Bidirectional Census Loss
论文:https://arxiv.org/pdf/1711.07837.pdf
无监督的主要思路:向前遍历光流向量再向后遍历应该回到同一个位置,根据亮度不变假设设计loss。
网络结构:输入为2帧,分别计算前向光流和方向光流。
存在遮挡问题:即在下一帧里观测不到对应pixel(比如人往前走,被其他物体挡住了)
判断有无遮挡的基本解决思路:前向后再反向,回不到原位置,则判断为被遮挡。具体如下式:
∣
w
f
(
x
)
+
w
b
(
x
+
w
f
(
x
)
)
∣
2
<
α
1
(
∣
w
f
(
x
)
∣
2
+
∣
w
b
(
x
+
w
f
(
x
)
)
∣
2
)
+
α
2
(1)
|w^f(x) + w^b(x+w^f(x))|^2 < \alpha_1(|w^f(x)|^2+|w^b(x+w^f(x))|^2)+\alpha_2 \tag1
∣wf(x)+wb(x+wf(x))∣2<α1(∣wf(x)∣2+∣wb(x+wf(x))∣2)+α2(1)
其中
x
x
x表示坐标,
w
f
(
x
)
w^f(x)
wf(x)表示根据前向光流进行warp操作。对应的
w
b
(
x
)
w^b(x)
wb(x)为根据反向光流进行操作。
α
1
,
α
2
\alpha_1,\alpha_2
α1,α2为调节参数(调节误差允许范围),文中
α
1
=
0.01
,
α
2
=
0.5
\alpha_1=0.01,\alpha_2=0.5
α1=0.01,α2=0.5
即在无遮挡情况下,左边那项和应该趋近于0。若不满足条件则认为存在遮挡,这部分则不计算loss。(因为loss根据亮度不变假设,若pixel被遮挡了,通过计算亮度恒定来设计loss就不合理了)。
根据式(1),得到有无遮挡的mask
O
x
O_x
Ox,当对应pixel被遮挡时,对应的
O
=
1
O=1
O=1,否则
O
=
0
O=0
O=0。
loss:
总的loss:
- 亮度一致性loss
E
D
E_D
ED:
f D ( I 1 , I 2 ) f_D(I_1,I2) fD(I1,I2)为measures the photometric difference,如 f D ( I 1 , I 2 ) = I 1 ( x ) − I 2 ( x ) f_D(I_1,I2)=I_1(x)-I_2(x) fD(I1,I2)=I1(x)−I2(x)
ρ ( x ) = ∣ x 2 + ϵ ∣ γ \rho(x)=|x^2 +\epsilon|^\gamma ρ(x)=∣x2+ϵ∣γ, ( 1 − o x ) (1-o_x) (1−ox)即只计算无遮挡的部分。后面一串则是根据亮度一致性计算loss, o x f λ p o_x^f\lambda_p oxfλp这一项是为了防止 o x o_x ox机智的全为1。
- Smoothness loss
E
S
E_S
ES:
光流平滑loss,即防止相邻像素的光流值相差太大 s , r s,r s,r为 x x x的相邻坐标,包括4个方向(左右,上下,加2个对角方向)
- forward-backward一致性损失
E
C
E_C
EC
和亮度一致性损失类似,只是直接作用于光流。而亮度一致性损失是计算灰度值的差值。
小结:总感觉估计遮挡部分会很难收敛,但实际效果还可以。后续的无监督论文也挺多遵照这个思路去估算遮挡部分。
DDFlow: Learning Optical Flow with Unlabeled Data Distillation
论文:https://arxiv.org/pdf/1902.09145.pdf
代码:https://github.com/ppliuboy/DDFlow
网络结构:
Main idea:其中Teacher Model和Student Model是2个结构相同的网络。Teacher Model为正常的2张图输入,训练⽅式也是Photometric Loss(亮度一致)。Student Model的输⼊为Teacher Model输⼊图的crop。即边缘部分像素在teacher中有输⼊,而在student中无。如上图中(x1,y1)。其在student model中的
I
2
I_2
I2输⼊⾥没有与之对应的像素。这部分可视为被遮挡部分。而在teacher model中同时存在。即可作为 guider。 这样子应该可以学习到一些被遮挡部分的光流。
SelFLow:Self-Supervised Learning of Optical Flow
https://cloud.tencent.com/developer/article/1458068
论⽂:http://openaccess.thecvf.com/content_CVPR_2019/papers/Liu_SelFlow_Self-Supervised_ Learning_of_Optical_Flow_CVPR_2019_paper.pdf
代码:https://github.com/ppliuboy/SelFlow
网络结构如上,
−
w
t
−
>
t
−
1
-w_{t->t-1}
−wt−>t−1即对光流取反,因为光流为矢量,所以
−
w
t
−
>
t
−
1
-w_{t->t-1}
−wt−>t−1的光流能很好的辅助
w
t
−
>
t
+
1
w_{t->t+1}
wt−>t+1去生成光流。
感觉和DDF挺像的,selFlow通过在图像中添加随机噪声(盖住某些区域),来达到遮挡的效果。也可以实现对有遮挡部分的光流预测。也是类似于一个能看到全景的网络(NOC-Model)去guide一个输入有部分被遮挡的网络(OCC-Model)。
NOC-Model类似于DDF中的teacher模型,利用亮度一致性loss训练出来的模型。
OCC-Model类似于DDF中的student模型,只是DDF中student的输入为crop出来的较小的图,而SelFlow是通过在图像中加入一些遮挡去盖住一部分区域。
小结:SelFlow效果优于DDF的原因应该就是
- SelFlow的模型复杂一些,基于PWC-Net。
- DDF制造的遮挡区域是在图像边缘部分,在训练时可能会有趋向。而SelFlow是在图中随机添加的(好像用了什么方法生成的遮挡区域,忘记了),就不会趋向于边缘。但是这种覆盖人为痕迹也挺明显的。
Learning Correspondence from the Cycle-consistency of Time
论文:https://arxiv.org/pdf/1903.07593.pdf
代码:https://github.com/xiaolonw/TimeCycle
知乎:https://zhuanlan.zhihu.com/p/61607755
提出一种学习视觉一致性的无监督方法。可运用于与视频相关的一致性跟踪。如视频实例分割,关键点,跟踪,光流等。
Main idea:与跟踪和光流中的无监督学习方法类似,通过Forward-Backward and Cycle Consistency。以跟踪为例,即反向跟踪后再前向跟踪后应该回到原来的位置。同样的思路可以应用于光流,视频实例分割等(学习pixel上的一致性)。(就是将光流无监督方法用到多个领域)
为了防止在cycle中,中间某些帧不合适(模糊,遮挡,或者object离开视野等)。设计了multiple cycles。即设计了多条路线。如左图中,除了到t-4帧才前向的 蓝色+灰色 的cycle之外,还有到t-2帧就开始前向的棕色cycle。右图则是跳帧cycle
小结:
光流数据很难获得,在有监督的光流方式中,基本都是用合成数据来进行训练,但合成数据和真实世界的分布还是差距比较大的。
无监督的光流训练方式基本就是UnFlow中的亮度一致性,也就是一个cycle,前向和反向之间的关系。但是如何处理遮挡部分也是一个问题。DDF和SelFlow则是通过不同的方式来解决如何去预测被遮挡区域(或离开画面区域)的光流。同时这种Cycle-consistency可以应用于视频中的其他任务的无监督训练。