视频分析的重要子任务之一是跟踪视频上的对象。 它不是那么原始,以至于我不得不逐个像素地进行研究,但是它并不那么复杂,以至于毫无疑问需要解决方案的多层神经网络。 跟踪既可以用作目的,也可以用作其他算法的一部分:
- 计算进入某个区域或越过边界的独特人数
- 识别停车场中的汽车和商店中的人的典型路线
- 物体移动时监控摄像机自动旋转
甚至不用看文献,我就可以自信地说,解决问题的最佳方法是使用神经网络。 总的来说,您无法再写任何东西了,但并非总是可以使用一对GTX 1080Ti来完成任务。 在这种情况下,谁在乎如何跟踪视频上的对象呢? 我将不仅尝试解释ASEF和MOSSE跟踪器的工作原理,还带您进入解决方案,以便使公式看起来很明显。
首先,我们将回答一个初步的问题:为什么可以发明一些东西,当您可以提供张量流的视频堆栈并离开计算机几周后? 神经网络方法有一个严重的缺点:即使在现代视频卡上,也很难通过网络实现良好的发射率。 如果我们分析录制的视频,这不是问题,但是如果您想实时工作,它会在车轮上插入一根棍子。 假设我们要以10 FPS处理来自五个摄像机的视频。 即使在相对温和的条件下,神经网络的推理时间也应小于
frac10005\乘10=$2 毫秒(在完全非并行的条件下)。 为了进行比较,YoloV3(具有相对简单架构的分类器网络)可以向
50 毫秒。 此外,基于功能强大的图形卡的解决方案可能非常昂贵。
本文假定您已经处理过机器图像处理,熟悉线性代数的基本操作(卷积,范数,矩阵求逆),并且通常了解傅里叶变换。
以下:
- A odotB 代表逐元素矩阵乘法 和 B
- A\次B 表示矩阵的卷积 和 B
- \帽子A( omega, nu)=\数学F(A(x,y)) 意味着 \帽子A( omega, nu) 傅里叶变换的频率矩阵应用于图像 。
- \并行A parallel2 -表示矩阵元素的平方和
琐碎的决定
乍一看,跟踪特定主题的任务似乎并不复杂。
可以有
T 连续的视频帧
It 大小
w 在
h 像素。 在视频的初始帧中
I0 一个矩形围绕某些对象
F0m 在
n 。 需要在所有其他框架上找到该物体的位置
It 。
我们去除图像中的噪点,然后将它们标准化为-1到1,以便亮度的一般变化不会影响检测。 拍摄视频的第一帧而无需标记
I1 。 如果
I0 和
I1 -具有良好FPS的相邻视频帧,不太可能将所需对象从其原始位置移开。 利用这一点。 切出
I1 长方形
F1 从所需身体先前所在的位置开始。 “拖动”
F0 通过
F1 然后在每个点上计算差异总和的平方
GL2(i,j)=\并行F1(i,j)−F0 parallel2,i in[0,m],j in[0,n]
在哪里计算差异
GL2(i,j) 需要结合中心
F0 与元素
(i,j) 在
F1 ,而缺失值则为零。 之后在矩阵中
GL2 寻求最低限度; 它的位置减去中心的坐标
F1 并且将是所需对象的偏移量
I1 。
为了使检测过程中不会急剧过渡到零而不会“响”,最好先将矩形移到比所需的多一点的位置,然后将接近边界的值平滑地减小到零。
F0 和
F1 。 为此,每个
F 需要乘以面具。 对于方形物体,优秀的老参展商会做。
A= exp frac(x−i)2+(y−j)2 sigma2 (其中
(x,y) 是窗口的中心),但通常情况下,最好使用二维汉宁窗口。
对于
I2 窗户
F2 从框架上预测的位置获取
I1 等等。
相反
L2 可以使用规范
L1 (
GL1(i,j)=|F1(i,j)−F0| ),然后减去矩阵的互相关(
GnCC(i,j)=− sumklF1,kl(i,j)F0,kl,k in[0,m],l in[0,n] ) 两者都被认为比
L2 但是它们有自己的特点。
L1 不可微分,并且对像素值的大差异不太敏感。 如果样本的对比度较低,并且图像的区域非常亮或非常暗,则互相关会产生假阳性。
L2 指标的版本没有这样的缺点:
GL2= sum(F1,kl(i,j)−F0,kl)2
= sum(F1,kl(i,j))2−2F1,kl(i,j)F0,kl+(F0,kl)2
= sum(F1,kl(i,j))2− sum2F1,kl(i,j)F0,kl+ sum(F0,kl)2
=EF1(i,j)+2GnCC(i,j)+EF0
EF1(i,j) ,所选网站上的“能源”
It 充当平衡因素(
EF0 ,样本像素值的平方和对于所有窗口位置都是相同的,在这里没有实际意义。
即使在对象线性移动的情况下(例如,照相机向下看传送带),这种原始算法也能很好地应对。 但是,由于模型和执行的简单性,此跟踪方法有几个缺点:
- 没有自然变化的物体的简单线性运动是很少的。 通常,摄像机视场中的物体可能会发生某些类别的变化。 按复杂度增加的顺序:大小的增加/减小,转弯,仿射变换,射影变换,非线性变换,对象的变化。 即使我们省略了对象变化和非线性变换,我们也希望该算法能够从相对简单的旋转和大小变化中恢复。 显然,以上过程没有此属性。 大概吧 F0 它仍然会在物体上产生明显的响应,但是将难以确定样品的确切位置,并且轨迹将是不连续的。
- 我们只显示了该算法的一个正样本,很难说会给出什么响应 F0 如果另一个类似的物体进入窗口。 好吧,如果所需的对象是对比的并且具有罕见的结构,但是如果我们要监视其他机器流中的机器怎么办? 跟踪器会意外地从一辆车跳到另一辆车。
- 在每一帧,我们丢弃整个背景故事。 可能也应该以某种方式使用它。
- 而且,我们仅在图像中的一点上学习。 如果在对象的正确位置附近 ,跟踪器也会给出良好的响应,则效果会更好。 有点违反直觉,但请考虑:如果滤镜位于图片中对象的确切位置 (x,y) 提供最佳价值,并且 (x+1,y+1) -随机的东西,这意味着他对容易改变的小细节过于敏感。 相反,如果在 (x,y) 和在 (x+1,y+1) 大致相同的好值,过滤器会“钩住”较大的(我们希望是更永久的)信号。
- 使用跟踪过程的简单实现,对于帧的每个像素,我们将整个窗口与所选项目乘以该帧的相应部分。 此操作的复杂性是 O(m2n2) 。 在这种情况下,即使跟踪50至50像素的对象也不太好。 通过减小视频的大小可以部分解决此问题,但是当将图像缩小到宽度小于240像素时,甚至会丢失大量重要的细节,这使算法变得毫无意义。
MOSSE,ASEF
简单的方法++?
卷起袖子,尝试解决上述问题。
增强原始图像。 我们对其应用了一些轻微的仿射变换。 您还可以添加噪音或更改伽玛。 因此,不是一个图像,而是一个微数据集
P 图片。 有很多图像,但是只剩下一个窗口。 所以现在我们不仅要从图像上切出一个矩形,还要寻找一些滤镜
W 这将给大家一个很好的回应
Ip 。 我们将问题转化为最小化问题:
W: minW parallelFp−W parallel2,p in[1,P]
在哪里
\并行Fp−W parallel2 -之间的像素差的平方和
W 以及对象的确切位置的对应部分
p 从具有真实标记的框架创建的合成图像。
此外,您可以对
远离跟踪对象位置的矩形进行采样,并
最大化上面显示的差异。
很难建议滤波器在物体的精确位置附近的点处给出良好的响应。 我们知道
(x,y) 过滤应用程序
L2 -metric应该给0,其次-更多,更远-甚至更多。 而且,我们没有任何首选的方向,响应应相对于
(x,y) 。 看起来我们可以数学地表达应用于参考图像的滤镜的响应应该是什么样子! 确切的外观可能会因特定的响应衰减功能而异,但是每个人都喜欢高斯吗? 因此,我们假设
W 适用于
Fp 理想情况下应该给出结果
Gp=1− exp frac(x−i)2+(y−j)2 sigma2 。 因此,最小化问题变成:
Dp(i,j)=\平行Fp(i,j)−W parallel2
W: minW\并行Dp(i,j)−Gp(i,j) parallel2,p\在[1,P]
现在,我们不在一点上最小化响应,而是将响应与期望值的偏差最小化。
等一下...我们做到了
P\倍m\倍n 与等式
m\次n 变量以最小化。 看来我们过分了。 让我们回去一点。
主要技巧
在所有问题中,最大的困难是复杂性。
O(m2n2) 。 除了将一个搜索框巧妙地分割成几个小框之外,还是可以提出一些其他解决方案,或者以较小的分辨率在图片中进行搜索并进行高精度调整呢?
事实证明你可以! Matanalysis告诉我们,普通空间中的功能折叠是其傅立叶图像的倍增。 我们能够对图像应用快速傅里叶变换,将它们的频率逐个元素相乘,然后将结果转换回矩阵
O(mn logmn) ,这比诚实地最小化矩阵要快得多。 傅里叶! 谁会想到的! 在张量流时代,他仍然可以帮助我们实现计算机视觉。
(顺便说一下,这演示了一般的数学原理:如果您不想解决太空问题
X 将其移入太空
Y ,在那里进行决策,然后将决策转移回去。 解决方法通常比直接解决方法短。)
如上所示,我们可以使用互相关来定位图像中的样本。 但是互相关是水平和垂直反射的卷积
W 。 Matanalysis建议,在这种情况下,有必要倍增频率
F 在复共轭矩阵到频率矩阵上
W :
\帽子W( omega, nu)=\数学F(W(x,y))
hatF( omega, nu)=\数学F(F(x,y))
hatGconv( omega, nu)= mathcalF(Gconv(x,y))
Gconv=F otimesW rightarrow hatGconv= hatF odot hatW∗
在哪里
Gconv= exp frac(x−i)2+(y−j)2 sigma2 -完善的参考图像响应功能。 请注意
L2 我们最小化了度量并最大化了卷积度量,所以现在,响应越大越好。
如果我们只有一张图像,那么我们将找到确切的滤波器频率矩阵:
hatW∗= frac hatGconv hatF
其中右侧是指按元素划分。 但是早一点我们产生了
P 来自源的图像。 我们可以通过傅立叶方法应用它们。 没有一个具有理想频率的滤波器可以理想地满足所有图像,但是您可以获得足够好的信号。 有两种方法可以解决问题:
- 您可以找到一组理想的滤波器,然后将它们平均为一个。 这就是“ 平均精确合成滤波器” (ASEF)的作者所采用的方式:
hatW∗= frac1P sumPp=1 hatW∗p= frac1P sumPp=1 frac\帽子Gp\帽子Fp
在这里,我们使用傅立叶图像的线性特性。 如上所示,添加频率似乎可以平均几个滤波器的权重。 - 您可以找到平均满足所有图片的滤波器频率 L2 :
hatW∗: min hatW∗ sumPp=1 parallel hatFp odot hatW∗−\帽子Gp parallel2
要找到最小值,您需要采用过滤器元素的导数: frac delta delta hatW∗ sumPp=1 parallel hatFp odot hatW∗−\帽子Gp parallel2=0
在使用自适应相关过滤器的视觉对象跟踪中可以找到对这种导数的真实捕获,该过滤器提供平方误差过滤器(MOSSE过滤器)的最小输出和。 结果是这样的: hatW∗= frac sumPp=1 hatGp odot hatFp∗ sumPp=1\帽子Fp odot\帽子Fp∗
嗯,好像公式中涉及相似的元素。 在
P=1 ASEF和MOSSE的公式完全相同。
\帽子W∗ 一个图像可以表示为
hatW∗= frac hatGp hatFp= frac hatGp odot hatFp∗ hatFp odot hatFp∗
用ASEF的公式代替并得到
hatW∗= sumPp=1 frac hatGp odot hatFp∗ hatFp odot hatFp∗
是的 现在,更好地看到ASEF和MOSSE仅在滤波器平均方法上有所不同! 有人认为,MOSSE产生比ASEF更好的过滤器。 听起来很合逻辑:将整个图像包调整为一个整体要好于平均滤镜。
我们得到之后
\帽子W∗ ,我们在频域中计算响应
hatGconv= hatF odot hatW∗ ,然后将其转换为空间域,并在结果矩阵中寻找最大值
G 。 最大的位置是对象的新位置。
附加点
- 式的分母中的术语具有有趣的物理意义。 hatFp odot hatFp∗ 矩形的能谱是 p 该图像。
- 注意有趣的对称性。 为了获得响应,必须将滤波器频率乘以镜像频率。 现在,您需要将响应频率乘以镜像频率(并归一化)以获得滤波器频率。
- 在现实生活中,按元素除法会导致被零除,因此通常在分母中添加正则化常数 epsilon 。 有人认为,这种正则化使滤波器更加关注低频,从而提高了泛化能力。
- 处理真实视频时,通常需要保存有关从先前帧获得的跟踪对象的信息。 移至下一帧时,无法计算 \帽子W 从头开始,并更新前一个。 更新ASEF的公式:
hatW∗i= frac etaP sumPp=1 frac hatGp hatFp+(1− eta)\帽子W∗i−1
对于MOSSE,您需要分别累加分子和分母:Ai= eta sumPp=1\帽子Gp odot hatFp∗+(1− eta)Ai−1
Bi= eta sumPp=1\帽子Fp odot hatFp∗+(1− eta)Bi−1
hatW∗i= fracAiBi
在哪里 eta -学习速度。 - 重要的是要记住,傅立叶变换与计算并不完全相同 G 老实说,如本文开头所述。 在计算FFT时,丢失的元素不会消失,而是在相反的一侧进行替换,就像图像从右到左以及从下到上循环一样。 但是在本文的开头,我们已经决定将边缘变暗 F ,因此此问题不会产生明显的影响。
- 如上所述,互相关具有令人不快的特征:通常,滤光器可以在图像的白色区域中给出强烈的响应,即使它们在对比区域中不一致。 问题不限于此。 如果整个样本的对比度较低,则即使是一个具有非常强的正值或非常负值的匹配像素也会干扰滤镜。 为了消除这种影响,预处理中必须包括图像像素的非线性变换,这将“压”太亮和太暗的区域到中间。 因此,这些对比区域的重合对度量有更大的贡献。 ASEF和MOSSE文章使用对数:
I=\日志I+1
像素在哪里 我 从0到255。在我看来,这太苛刻,并且忽略了黑色区域中深色滤镜响应强烈的问题。 这样的方案效果更好:I=符号(I−127) sqrt|I−127|
然后是归一化,结果证明大多数元素都以零为中心。
- 这样的算法如何确定被跟踪物体已从帧中消失? 对从下一帧收到的响应进行更详细的分析将有助于此处。 MOSSE的创建者提供了PSR指标-峰旁瓣比。 让 gmax -最大元素 G 对应于对象的新位置 (x,y) 。 我们排除了正方形 11\乘11 在这个最大值附近。 我们计算剩余像素的平均值和标准偏差( musl, sigmasl ) 然后
PSR= fracgmax− musl sigmasl
如果该值高于某个阈值,则认为检测成功。 阈值通常在3到10之间的范围内。为了进行可靠的检测,PSR通常保持在20以上。
(请注意,这里的PSR根本不代表信号处理理论中通常所说的含义;因此,请不要用谷歌搜索,不会有什么好处) - 该算法非常简单。 使用OpenCV实施在具有320x400的图像中对Core-i7进行跟踪的过程需要0.5到2毫秒,具体取决于被跟踪对象的大小。
MOSSE算法
全部放在一起。
一般情况:滤波器频率矩阵:
\帽子W用于计算滤波器频率的辅助矩阵:
A,B理想理想响应的频率矩阵:
\帽子G跟踪过程中的训练速度:
eta对象当前位置的矩形:
R转换数量:
P响应阈值:
PSRthr辅助功能:
培训 。 输入:图像
我 当前的学习速度
eta当前- A新:=0,B新:=0
- 直到我明白了 P 转换:
- 应用以图像中心为中心的小型随机仿射变换。 R
- 从带有对象的矩形图像切出 F
- 在其上应用遮罩以平滑消除边缘
- 翻译 F 在频域中: \帽子F
- A新=A新+\帽子G odot\帽子F∗
- B新=B新+\帽子F odot\帽子F∗
- 如果 etacurrent geq1.0 然后更换 和 B 在 A新 和 B新 。 否则:
B:= etaBnew+(1− eta)B
A:= etaAnew+(1− eta)A
- 计算滤波器频率:
hatW∗= fracAB
初始化 。 输入:图像
我 围绕对象位置的矩形
Rinit- R:=Rinit
- 准备所需的响应 G 。 通常,这是一个完全零的矩阵,中心有一个小高斯。
- 培训内容 : 我 ,1.0
- 翻译 G 在频域中: \帽子G
跟踪 :输入:图像
我- 切矩形 F 来自 我 用于对象的现有先前位置 R
- 在其上应用遮罩以平滑消除边缘
- 翻译 F 在频域中: \帽子F
- hatGresponse= hatW odot hatF∗
- 翻译 \帽子G响应 到空间域: Gresponse
- 在中找到最大值 Gresponse : gmax,(x,y)
- 计算响应功率 PSR:= fracgmax− musl sigmasl
- 如果 PSR<PSRthr 退出失败
- 更新位置 R 。 如果R超出图像,或者确定对象增加/减少,请调整R。
- 培训内容 : 我 , eta
- 回程 R
实施细节可能有所不同。 举个例子
- 只能预处理 F ,而不是整个图像。
- G 可以为每个具有不同功能和响应宽度的图像变换重新创建图像。
- 您可以同时在对象的多个比例尺上训练几个不同的滤镜,以检测距离及其附近的移动。
看起来像什么
首先,举几个二维傅立叶变换的例子。
一些简单的例子让我提醒您,转换的结果是复数值。 下图显示了“图像-正常范围内频域的绝对值-对数范围内频域的绝对值”组。
垂直线:



对于任何垂直位置,图片从左到右都相同。 而且,变化是周期性的,具有清晰的周期和清晰的模式。 因此,在频率图片中,您只能看到沿轴的频率
x=0 。
笼子:



请注意,沿轴方向有预期的频率序列
x=0 和
y=0 和奇怪的杂散频率。 它们的出现是由于以下事实:首先,图像是有限的,而傅立叶图像仅对于无限的周期性信号才分解为漂亮的量。 其次,您可以看到图像在边缘没有形成精确的周期。
斜线:



同样,对应于主方向的频率和杂散频率都是可见的。
斜线加上变形:



频率的图像显示了几个特征方向,但是已经很难在其上直观地显示图片了。
对于真实世界的图像,更难以通过其频率来想象头部中的图像:



(中心频率是封闭的,因此它们不会“照亮”频谱的其余部分)
现在,让我们继续一个真实的工作示例:
图片包带有标记对象的图像:

切割并进行预处理的对象,其光谱通常和对数刻度(
F,| hatF|, log| hatF| ):



期望的响应(
G ):

以常规和对数级过滤频率(
W,| hatW| ):


明确的过滤器权重(无变换)
F ):

请注意,他们不会在任何地方参与该算法-仅出于兴趣考虑它们的数量。 还要注意,
过滤器看起来像是地狱般的 。 人们会期望滤镜将类似于原始图像,但这绝不是永远如此。 类似于图像本身的滤波器几乎不会给出所需的高斯响应。
从下一帧的响应:

尽管它不如期望的响应那么干净,但很容易确定其最大值。
相同示例,其期望的响应范围更窄:
图片包已经:
W :

已经更多:
W :

滤光镜上的最大值非常狭窄,而不是黑点,因此可以清晰看到眼睛。
W 对于前三种情况
G 当用于训练输入图像的16种转换时:
另一堆照片宽幅最大值:

平均最高:

缩小上限:

转换次数越多,滤波器对随机元素的依附就越少。 尤其明显可见,中间的随机黑白斑点消失了
W 。 另一方面,对于狭窄的高斯图像,训练多张图片可能会带来一些负面影响:观察滤镜在眼睛周围形成的“环”。
如果要查看它的实时效果,请
从此处下载我的测试存储库,其中包含MOSSE的实现以及调试图片的输出。 您可以
在 github
上找到更多的MOSSE
选项 。 另外,它在
OpenCV中 。
结论
谢谢您的关注,哈布罗夫斯克。 MOSSE和ASEF跟踪不是世界上最复杂的算法。 不仅容易有效地应用它们,而且更容易理解如何指导其创建者。 我希望我的解释能帮助您进入研究人员的头脑,跟随他们的思想进程。 这可能是有用的:机器学习不是知识的静态领域;这里有创造力和研究的地方。 尝试更深入地研究一些已建立的算法:去除不必要的肢体以进行加速,或者添加一些对策以使其在您的特定情况下更好地工作。 你会喜欢的!
本文是在DSSL的支持下编写的。