frederickszk / LRNet

Landmark Recurrent Network: An efficient and robust framework for Deepfakes detection
MIT License
90 stars 13 forks source link

About Kalman Filter #19

Open A1ron5 opened 2 years ago

A1ron5 commented 2 years ago

学长您好,首先非常感谢您(们)的工作,我从中学到了很多。卡尔曼滤波器部分我有几个问题,希望得到您的指点。 Q1:LK操作的固有方差Q = 0.3 是如何得到的。

Q2:为什么近似相对方差approximate relative variance 能够用来大致描述探测点的方差?

Q3: 我看论文及代码中的式子,更像是我看网上教程时刚开始的一维向量的例子。但是这里一个点的坐标应该时一个二维的,方程的形式应该不一样吧?

Q4:为什么会想到用Kalman Filter 来做这项工作,灵感来自哪里?

image

A1ron5 commented 2 years ago

看到您论文中说Q = 0.3是根据实验的经验得到的,是一个个试吗?根据什么指标来评估效果?

frederickszk commented 2 years ago

您好,感谢提问~我分别回答下这几个问题:

A1:通过实验的效果得到的。从文中的关键式子(5)可以看出,卡尔曼滤波算法其实是在做追踪信号(pred)和检测信号(det)两者之间的加权平均,而det的方差我们用了一个启发性的相对值(也就是你Q2提到的这个D),pred部分方差计算的机理来自于式(6),意思是每次使用LK追踪操作都会固定引入一点Q的方差。因此这个Q的值应该需要和D基本上在同一个量级,过大过小都不好。考虑到D是一个基本上预期在1附近的相对值,我们这里测试了一系列的取值,最后根据实验效果选定了0.3。这里选择这个值是根据标定出来视频中特征点的稳定程度判定的,就是设置在0.3左右,视觉效果来看稳定性有肉眼可见的提升,其它的取值则几乎看不到稳定效果,因此这样选择。目前对【landmark稳定程度】还很难有一个好的量化指标,不过您的建议很好,我会考虑增加点这块儿的评估和实验~

A2:这个公式是一个启发性的公式,因为如文中所说,探测器的方差是一个没办法直接从模型参数得出数值解的量,因此用一个相对值来模拟。原理是,如果前后两点检测的差值大大高于追踪的差值,则认为这点很可能探测器出现了很高的方差,从而抑制检测的结果在最终加权式子中的权重(尽可能的相信追踪的结果)。这个从视频中也能看到效果,有的视频中前后两个同一位置特征点可能受到干扰发生了剧烈的跳动,而LK追踪的部分更加贴近真实位置,用这个算法能够得到一个比较适合的权值来融合两者的结果。

A3:论文及代码中的式子都是二维的,即所有表述的点都是(x,y)的二维向量。可以试着在代码中相应的位置打断点debug,看一下各个point的具体值。我记得这个公式是不限制维度数的,即向高维也能推广,不过一般是一维和二维的应用见得多。至少从实验的效果(视觉效果,以及后续对检测性能的效果)可以证明是work的。

A4:灵感来自于信号处理里边一些相关工作,因为这里很明显涉及到两种信号的融合问题,所以才会想到用这个算法。

A1ron5 commented 2 years ago

晚上好,非常感谢您的快速回复。我在网上看的视频如下,第一张图是一维的简单例子,第二张图是在一个系统状态空间方程中的形式,在这两个式子中他都没有引入Q的,所以我觉得很奇怪,刚才又仔细看了下代码。我刚开始以为是因为:视频教程中没有Q,是因为他的估计误差是设了初值(方差或协方差)的。而我们这里没有,我debug发现第一帧的P_predict[0-67]的初值是零,那么就自然需要人为设定一个方差,否则【卡尔曼增益 K】 的值将永远为0。但后来我又想如果是这样的话,只需要给第一帧的所有P_predict[ipt] 设一个初值(例如0.3)即可,这样不就没有必要在之后的每一帧都加一个Q了吗。 因此我纠结的点在于,论文中的公式似乎并不是卡拉曼滤波算法的原始公式。那么这个Q的存在是否类似于一个补偿的概念呢?

image image

frederickszk commented 2 years ago

是的,可以这样理解。Q其实指的是,每次进行predict(也就是我们算法中的LK追踪)的时候,其实会引入误差,这部分误差就是Q。在卡尔曼滤波里边,两种信号分别是观测值和利用状态转移建模的预测值,分别对应到我们算法中的检测器检测结果,和LK算法追踪结果。可以结合看看会不会更好理解一些。 但我记得原始公式里边,对于P的更新是要加上Q的,也就是你图中下面那个版本。可能要再check一下吧:smile: 。我这个算法基本上思路是按照卡尔曼滤波器来的,只不过针对协方差矩阵这些在该问题下不好量化的值做了替代,所以可能和原来的公式略有出入。不过主要思路还是两路信号的融合及时序平滑。

A1ron5 commented 2 years ago

谢谢您的回答,非常有帮助。我又确认了一下,Kalman滤波器的原始公式更新协方差P的时候确认要加上Q,图中的公式可能有误,之前没接触过信号处理方面的知识,理解起来有些吃力。 作为准研一,这是我认真阅读的第一篇论文,反复阅读了文章和代码以及Github上的【Issues】,学长的科研态度、学习态度给我留下了非常深刻的印象,以您为榜样。不断更新完善的代码和耐心的答疑解惑对于学习者来说一种非常愉快的体验,再次感谢您,祝您身体健康,学业进步。

frederickszk commented 2 years ago

感谢您的支持与鼓励:pray: 你的提问也对我后续改善工作很有帮助~ 因为这是我第一个自己维护的开源库,一开始也有很多不完善的地方,多亏大家的意见才能不断优化。我也会继续保持更新,让它使用起来更方便,效果更好。如果有其它疑问也欢迎随时留言~谢谢!

A1ron5 commented 2 years ago

image image

学长,我看论文中网络结构是一个dr = 0.25 的dropout layer,三个 dr = 0.5的dropout layer,但是看tensorflow的代码里面貌似只有两个dr = 0.5的dropout layer,而不是三个。

frederickszk commented 2 years ago

:joy: 应该是笔误,这里应该只有两个dropout层,因为RNN输出后只接了2层fc层。感谢指出~

A1ron5 commented 2 years ago

hhhh好的谢谢~