自监督深度学习用于多目标跟踪。
在深入理解自监督注意力(self-supervised attention)的含义之前,让我们先来了解一下光流估计(optical flow estimation)的直觉,以及它为何被人类和计算机视觉系统共同采用作为一种目标跟踪方法。
人们一致认为,目标跟踪作为一种基本能力,是人类婴儿在两到三个月大时就发展出来的。然而,在神经生理学的层面上,人类视觉系统的实际工作机制仍然不够明确。类似于人类的视觉系统,计算机视觉系统也应用广泛,如视频监控和自动驾驶。跟踪算法的目的是在给定的视频序列中重新定位一组特定的目标,这些目标在初始帧中已经被识别。在有关跟踪的研究文献中,主要分为两大类: 视觉目标跟踪(Visual Object Tracking/VOT)和半监督视频目标分割(Semisupervised Video Object Segmentation/Semi-VOS)。第一个(VOT)的目的是通过在整个视频序列中重新定位目标边界框来跟踪目标。而后者(Semi-VOS)通过像素级的分割掩码在更细粒度的水平上跟踪目标。在本文中,我们将讨论后一种方法背后的原始思想,即密集光流估计(Dense Optical Flow Estimation),以及这种密集跟踪方法是如何通过自监督注意力机制实现的。
密集光流是光流概念的范畴之一。光流可以定义为物体在视频序列的连续帧之间的运动,这是物体和摄像机之间相对运动的结果。用科学的语言来解释这个问题,我们可以说光流是由物体和观察者的相对运动引起的图像中亮度模式的可视运动速度分布。光流分为稀疏光流(Sparse optical flow)和密集光流(Dense optical flow)。稀疏光流只从帧中少数有意义的像素中提取流向量(flow vectors),这些像素不是描述目标的边缘就是角落。另一方面,稠密光流从给定的帧中导出所有像素的流向量,以较高的计算量和较慢的速度获得更高的精度。
网球运动员的密集光流估计
密集光流在视频序列的每帧中每像素计算一个光流矢量。与稀疏光流方法不同,该方法为视频分割和运动结构学习等应用提供了更加合适的输出。密集光流可以通过多种方法实现。其中最简单的算法之一是 Farneback 方法。该算法基于 Gunner Farneback 在2003年发表的论文“Two-Frame Motion Estimation Based on Polynomial Expansion”中提出的算法。OpenCV 有该算法的代码函数实现。想快速做个实验了解 Farneback 算法是什么,请运行以下代码段。
import cv2import numpy as npfrom glob import globimport requests import os
def get_video(video_url): r = requests.get(video_url, stream = True) with open('./vid.mp4', 'wb') as f: for chunk in r.iter_content(chunk_size = 1024*1024): if chunk: f.write(chunk)
def estimate_optical_flow(video, frame_dir): ret, frame1 = video.read() prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY) hsv = np.zeros_like(frame1) hsv[...,1] = 255 seq = 1 while(1): ret, frame2 = video.read() next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) hsv[...,0] = ang*180/np.pi/2 hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX) rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
cv2.imwrite(f"{frame_dir}/{seq}.png",rgb) seq+=1 if seq==200: break video.release()
def generate_output(frame_dir): img_array = [] for filename in sorted(glob(f"{frame_dir}/*.png")): img = cv2.imread(filename) height, width, layers = img.shape size = (width,height) img_array.append(img) fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('./Dense-optical-flow.mp4', fourcc, 20.0, size) for i in range(len(img_array)): out.write(img_array[i]) out.release()
def main(): video_url = "https://viratdata.org/video/VIRAT_S_010204_05_000856_000890.mp4" get_video(video_url) video = cv2.VideoCapture("./vid.mp4") if not os.path.exists('./frames'): os.mkdir('./frames') estimate_optical_flow(video, './frames') generate_output('./frames')
if __name__ == "__main__": main()
在运行上面的代码后,你将从视频(Dense-optical-flow.mp4)中获得以下输出(右侧)
右边是左边视频的光流可视化。(这个gif有点大,可能载入会比较慢)
Farneback算法是一种通过比较一个视频序列中的两帧连续帧来估计特定图像特征运动的技术。该算法首先利用多项式展开变换通过二次多项式逼近图像帧的窗口。多项式展开变换是一种专门设计在空间域的信号变换,可用于任意维数的信号。该方法通过观察多项式变换的平移,从多项式展开系数估计位移场。经过一系列迭代优化后,计算密集光流。代码实现时,该算法从双通道流向量数组(dx/dt,dy/dt)计算光流的方向和大小。然后计算出的方向和大小通过 HSV 颜色表示值可视化,该值被设置为最大值255代表最佳能见度。
从历史上看,光流问题是一个最优化问题。随着深度学习技术的发展,许多研究人员已经应用深度学习来解决这个问题,他们通过将连续的视频帧作为输入来计算运动中物体的光流最优化问题。虽然这些方法一次只处理两个连续的帧,但视频的本质仍然可以在这两帧中捕捉到。视频与图像的主要区别在于,视频除了具有图像的空间结构外,还具有时间结构。然而,视频也有其它形式,如声音,但它们在这种情况下是没用的。因此,连续的帧流可以被解释为在特定时间分辨率(fps)中运行的图像的集合。这意味着视频中的数据不仅是按空间编码,而且是按顺序编码的,这使得视频分类变得非常有趣,同时也具有挑战性。
一般来说,深层神经网络需要大量的训练数据来学习和优化逼近函数。但在光流估计中,训练数据特别难以获得。这背后的主要原因是难以准确标注,视频镜头图像的精确运动的每一个点的亚像素的准确性很难保证。因此,为了解决标注视频数据的问题,计算机图形学被用来通过指令模拟大量的真实世界场景。因为指令已知,视频帧序列中每个像素的运动也已知。一些试图解决光流问题的最新研究是 PWC-Nets, ADLAB-PRFlow 和 FlowNet。光流应用广泛,例如车辆跟踪和交通分析,就是使用了目标检测和基于特征的光流技术的多目标跟踪。
如上所述,在视频分析领域中,视觉跟踪对于识别、交互和几何学等许多任务是必不可少的。但同时,由于必须大量的视频标注数据,深度学习在这些任务中的应用变得不可行。而为了实现高性能,大规模的跟踪数据集成为必要,这反过来又需要大量的努力,从而使深度学习方法更加不切实际和昂贵。最近的研究人员相信一种很有前途的方法,利用大量未标注的原始视频数据,让机器在没有人类监督(标注数据)的情况下进行学习。这种自监督式学习始于谷歌研究团队的一项研究提案,该提案建议通过训练一个模型来实现视觉跟踪系统,该模型的代理任务是视频彩色化,不需要任何额外的标注数据(自监督)。然而,研究表明,与其让模型预测输入灰度帧的颜色,它必须学会从一组参考帧中复制颜色,从而导致一种能够在时间设定中跟踪视频序列的空间特征的指向机制的出现。这些自监督方法的可视化和实验表明,尽管网络在没有任何人工监督的情况下进行训练,但网络中自动出现了一种视觉特征跟踪机制。该模型通过对网络上采集的未标注视频进行大量的训练,能够跟踪视频帧序列初始帧中指定的任意分割区域。然而,自监督的深度学习训练方法假定了帧序列的颜色是暂时稳定的。显然,也有例外,比如视频中的彩灯可以打开或关闭。
用视频着色代理任务训练指针机制
跟踪的自监督学习的目标是学习适合于视频帧序列匹配的特征嵌入(feature embedding )。通过利用帧序列中自然的时空一致性来学习对应流(correspondence flow)。对应流可以理解为连续帧之间存在的特征相似流。简单的说,这种方法学习了一种指针机制,该机制可以通过从一组参考帧复制像素信息来重建目标图像。因此,要建立这样一个模型,研究人员在架构设计时必须记住一些注意事项。首先,我们必须防止模型学习这个任务的平凡解(trivial solution)(例如基于底层颜色特征匹配连续帧)。其次,我们必须使跟踪器漂移(Tracker drifting/TD)不那么严重。跟踪器漂移主要是由于目标遮挡、复杂目标变形和光照变化引起的。跟踪器漂移通常通过训练具有周期一致性(cycle consistency)和定时抽样(scheduled sampling)的长时间窗口的递归模型来处理。
视频帧间的对应流匹配
最后,在我们研究这个指针机制之前,让我们讨论一下在设计这些模型时必须考虑的上述一些问题。首先,必须记住,对应匹配(correspondence matching)是这些模型的基石构件。因此,在用像素匹配进行帧重建时,模型学习平凡解的概率很高。为了防止模型过拟合平凡解,重要的是添加颜色抖动(jittering)和通道dropout,使模型被迫依赖于底层的颜色信息,同时任何类型的颜色抖动保持鲁棒。最后,为了处理跟踪器漂移问题,正如前面提到的那样,带有前后一致性和定时抽样的长时间窗口递归训练是解决跟踪器漂移问题的最佳方法。如果我们采用上述方法,我们可以确信模型的鲁棒性将得到提高,并且能够利用到视频和颜色的时空一致性,这将为学习对应性提供一个可靠的监督信号。
如果你深入研究这里学到的指针机制,你会得出结论,它实际上是一种注意力机制。是的,它最终是著名的三重奏 QKV (查询-键-值,大多数注意力机制的基础)。
众所周知,自监督模型的目标是通过对特征表示的有效编码来学习鲁棒的对应匹配。简单的说,有效复制的能力是通过在代理任务上的训练来实现的,模型通过线性组合参考帧中的像素数据来学习重建目标帧,而权重则衡量像素之间的对应强度。而分解这个过程,我们发现处理的每一个输入帧都有一个三元组(Q,K,V)。Q、 K、 V 分别表示查询、键和值。为了在 T¹帧中重建像素I¹ ,使用注意力机制从原始序列中先前帧的子集中复制像素。这样,查询向量(Q)是当前帧( I¹ )的特征嵌入(目标帧) ,键向量是前一帧(I⁰)的特征嵌入(参考帧)。现在如果我们在查询和键(Q.K)之间计算一个点积(.),然后对积算softmax,我们可以得到当前帧(I¹ )和之前的参考帧(I⁰)之间的相似度。在推理过程中,将计算得到的相似度矩阵与参考实例分割掩码(V)相乘,可以得到目标帧的指针,从而实现密集光流估计。因此,这个由 Q、 K 和 V 组成的指针就是这个自监督系统下实际工作的注意力机制。
每个人都渴望注意(attention),嗯,猫咪也不例外~
建立合适的信息瓶颈是注意力机制训练的一个关键环节。为了避免注意力机制可能采用任何学习捷径,我们使用了前面提到的故意丢弃输入颜色信息和通道dropout技术。然而,通过自监督训练注意力机制时,色彩空间的选择仍然有着重要作用。大量的研究工作验证了这种猜想,即利用去相关的(decorrelated)颜色空间可以获得更好的自监督密集光流估计特征表示。简单来说,使用 LAB 格式的图像比 RGB 格式的效果更好。这是因为所有的 RGB 通道都包含亮度表示,其与LAB中的亮度高度相关,因此成为一个弱信息瓶颈。
上述提出的注意力机制通常伴随着高物理内存开销。因此,处理高分辨率的信息进行对应匹配可能会导致很大的内存需求和较慢的速度。
为了避免过大内存开销,使用 ROI 定位从内存库中非本地地估计候选窗口。直观上,我们可以说,对于时间相近的帧,时空一致性自然地存在于帧序列中。这种 ROI 定位导致注意力得到限制,因为目标帧中的像素仅与参考帧的空间相邻像素进行比较。可比像素的数量由限制注意力的扩张窗口的大小决定。窗口的膨胀率与内存库中现在帧和过去帧之间的时间距离成正比。通过计算受限注意力区域的亲和矩阵(affinity matrix ),可以非局部地计算细粒度匹配得分。因此,利用所提出的内存增强受限注意力机制,该模型可以有效地处理高分辨率信息,而不会产生巨大的物理内存开销。
在本文中,我们首先介绍了光流的概念,并研究了它在目标跟踪中的应用。我们还研究了这一概念是如何启发深度学习跟踪系统的,以及自监督和视觉注意力是如何在这些系统中发挥关键作用的。对于需要深入的视频场景理解的应用,计算好的光流向量打开了无限可能。所讨论的技术主要应用于行人跟踪、无人机导航和许多新颖的应用。光流还可以如何应用只有设计者的创意能限制。 在我个人看来,由于自监督的通用性和灵活性,它将很快成为有监督的一个强劲竞争对手。在未知目标类别上,自监督性能超过绝大多数有监督方法。这展现了在解决人类智能问题的路途中,自监督的重要性和力量。
[1] [1981-AI, Horn-Schunck method] Determining optical flow
[2] [2003-SCIA, Farneback flow] Two-frame Motion Estimation Based on Polynomial Expansion
[3] [2007-DAGM, TVL1 method] A duality based approach for realtime tv-l1 optical flow
[4] Lai, Zihang, and Weidi Xie. “Self-supervised Learning for Video Correspondence Flow.” ArXiv abs/1905.00875 (2019): n. pag.
[5] Lai, Z., Lu, E., & Xie, W. (2020). MAST: A Memory-Augmented Self-supervised Tracker. ArXiv, abs/2002.07793.
[6] Vondrick, C., Shrivastava, A., Fathi, A., Guadarrama, S., & Murphy, K. (2018). Tracking Emerges by Colorizing Videos. ArXiv, abs/1806.09594.
原文:https://towardsdatascience.com/self-supervised-attention-mechanism-for-dense-optical-flow-estimation-b7709af48efd