acm-header
登录

ACM通信

实践

OpenCV的实时计算机视觉


计算机视觉、插图

信贷:Feldgrau.info

计算机视觉是一个快速发展的领域,致力于分析、修改和对图像的高级理解。它的目标是确定摄像机前发生了什么,并利用这种理解来控制计算机或机器人系统,或为人们提供比原始相机图像更有信息或更美观的新图像。计算机视觉技术的应用领域包括视频监控、生物识别、汽车、摄影、电影制作、网络搜索、医学、增强现实游戏、新用户界面等等。

现代相机能够自动聚焦在人们的脸上,并在他们微笑时触发快门。光学文本识别系统有助于将扫描文档转换为可以由语音合成器分析或大声朗读的文本。汽车可能包括自动驾驶辅助系统,帮助用户停车或警告他们潜在的危险情况。智能视频监控在公共场所安全监控中发挥着越来越重要的作用。

随着智能手机和平板电脑等移动设备配备了摄像头和更强大的计算能力,对计算机视觉应用程序的需求正在增加。这些设备已经变得足够智能,可以将几张照片合并成高分辨率全景图,或者读取二维码,识别它,并从互联网上检索有关产品的信息。用不了多久,移动计算机视觉技术就会像触摸界面一样无处不在。

然而,计算机视觉在计算上是昂贵的。即使是专门解决一个非常具体的问题的算法,如全景拼接或人脸和微笑检测,也需要很大的能力。许多计算机视觉场景必须实时执行,这意味着单个帧的处理应该在3040毫秒内完成。这是一个非常具有挑战性的需求,特别是对于移动和嵌入式计算架构。通常情况下,用质量来换取速度是可能的。例如,全景拼接算法可以在源图像中找到更多的匹配点,合成出更高质量的图像,并给予更多的计算时间。为了满足时间和计算预算的限制,开发人员要么在质量上妥协,要么为特定的硬件架构投入更多时间来优化代码。

回到顶部

视觉与异构并行计算

在过去,提高计算设备性能的一个简单方法是等待半导体过程的改进,这导致了设备时钟速度的提高。当速度提高时,所有的应用程序都变得更快,而无需修改它们所依赖的库。不幸的是,这样的日子已经过去了。

随着晶体管密度的增大,它们也会漏出更多的电流,因此能效就会降低。提高能源效率已成为当务之急。工艺改进现在允许每个区域有更多的晶体管,有两种主要的方法使它们得到很好的利用。第一种是通过并行化:创建更多相同的处理单元,而不是使单个单元更快更强大。第二种是通过专门化:构建特定领域的硬件加速器,以更有效地执行特定类型的功能。将这两种思想结合起来的概念,即将一个或多个CPU与各种加速器一起运行,称为异构并行计算。

高级计算机视觉任务通常包含在特殊硬件架构上比在CPU上运行更快的子任务,而其他子任务则在CPU上计算。例如,GPU(图形处理器)是一种加速器,现在可以在每台台式电脑上使用,也可以在智能手机和平板电脑等移动设备上使用。

第一个图形处理器是固定功能的管道,专门用于在计算机显示器上加速绘制形状,如图1.随着gpu获得了使用彩色图像作为纹理映射输入的能力,并且它们的结果可以与CPU共享,而不仅仅是发送到显示器,使用gpu完成简单的图像处理任务成为可能。

通过添加着色器使固定功能gpu部分可编程是向前迈出的一大步。这使程序员能够编写特殊的程序,由GPU在表面的每个三维点上运行,并在输出画布上渲染的每个像素上运行。这极大地扩展了GPU的处理能力,聪明的程序员开始尝试在GPU (GPGPU)上进行通用计算,利用图形加速器完成最初没有设计的任务。GPU成为图像处理和计算机视觉任务的有用工具。

然而,图形着色器没有提供对许多有用的硬件功能的访问,例如同步和原子内存操作。现代的GPU计算语言,如CUDA、OpenCL和DirectCompute,都明确地设计用于支持图形硬件上的通用计算。GPU仍然不像cpu那样灵活,但它们执行并行流处理的效率要高得多,而且越来越多的非图形应用程序正在使用GPU计算语言进行重写。

计算机视觉是经常自然映射到gpu的任务之一。这并非巧合,因为计算机视觉确实解决了与计算机图形学问题相反的问题。图像将场景或物体描述转换为像素,而视觉则将像素转换为更高层次的信息。gpu包含许多类似的处理单元,在执行简单的、类似的子任务(如渲染或过滤像素)时非常高效。这样的任务通常被称为“令人尴尬的并行”,因为它们很容易在GPU上高效地并行化。

然而,许多任务不容易并行化,因为它们包含串行段,其中后阶段的结果依赖于前阶段的结果。这些串行算法在gpu上运行效率不高,而在cpu上编程要容易得多,通常运行得更快。许多迭代数值优化算法和基于栈的树搜索算法都属于这一类。

由于许多高级任务同时包含并行和串行子任务,整个任务可以通过在CPU上运行部分组件和在GPU上运行其他组件来加速。不幸的是,这带来了两个低效率的来源。一个是同步:当一个子任务依赖于另一个子任务的结果时,后一个阶段需要等待前一个阶段完成。另一个低效率是在GPU和CPU内存之间来回移动数据的开销,因为计算机视觉任务需要处理大量像素,这可能意味着来回移动大量数据块。这些都是在同时拥有CPU和GPU的系统上加速计算机视觉任务的关键挑战。

回到顶部

OpenCV图书馆

开源计算机视觉库OpenCV始于1998年英特尔的一个研究项目。5自2000年以来,它已经在BSD开放源码许可下可用。OpenCV旨在提供解决计算机视觉问题所需的工具。它混合了低级图像处理功能和高级算法,如人脸检测、行人检测、特征匹配和跟踪。该图书馆已被下载超过300万次。

2010年,OpenCV中增加了一个提供GPU加速的新模块。GPU模块涵盖了该库的重要部分功能,目前仍在积极开发中。它是使用CUDA实现的,因此受益于CUDA生态系统,包括NVIDIA Performance primitive (NPP)等库。

GPU模块允许用户在不需要GPU编程培训的情况下受益于GPU加速。该模块与OpenCV的CPU版本一致,这使得采用很容易。然而,两者之间存在差异,其中最重要的是内存模型。OpenCV实现了一个名为简历:垫这就暴露了对图像原始数据的访问。GPU模块中的容器简历:gpu:: GpuMat将图像数据存储在GPU内存中,不提供对数据的直接访问。如果用户想修改运行在GPU上的主程序中的像素数据,首先需要从GpuMat

ins01.gif

在本例中,从文件中读取图像,然后上传到GPU内存中。图像在那里被阈值化,结果被下载到CPU内存中并显示。在这个简单的例子中,只对图像执行了一个操作,但是可以在GPU上执行其他几个操作,而不需要来回传输图像。对于已经熟悉OpenCV的人来说,GPU模块的用法很简单。

这种设计为用户提供了数据如何在CPU和GPU内存之间移动的显式控制。尽管用户必须编写一些额外的代码才能开始使用GPU,但这种方法非常灵活,可以实现更高效的计算。一般来说,使用OpenCV的CPU部分研究、开发和调试计算机视觉应用程序,然后用GPU模块加速它是一个好主意。开发人员应该尝试CPU和GPU处理的不同组合,衡量它们的时间,然后选择性能最好的组合。

开发者的另一个建议是使用CUDA和GPU模块提供的异步机制。这允许数据传输、GPU处理和CPU计算的同时执行。例如,当来自相机的一帧由GPU处理时,下一帧被上传到它,最大限度地减少数据传输开销,提高整体性能。

回到顶部

OpenCV GPU模块性能

OpenCV的GPU模块包含大量的功能,其中许多已经在不同的版本中实现了,例如图像类型(char, short, float),通道数量和边界外推模式。这使得报告准确的性能数据具有挑战性。降低性能数据的另一个困难来源是同步和传输数据的开销。这意味着,当数据驻留在GPU上时,可以在大量处理的大图像上获得最佳性能。

为了帮助开发人员权衡利弊,OpenCV包含了一个性能基准测试套件,该套件可以在不同的数据集上使用不同的参数运行GPU函数。这提供了在用户硬件上加速不同数据集的详细基准。

图2是展示GPU模块优势的基准。加速是根据OpenCV的一个高度优化的CPU实现的基线来衡量的。OpenCV是用Intel的流SIMD扩展(SSE)和线程构建块(TBB)编译的,用于多核支持,但并不是所有算法都使用它们。基本的图像处理速度经过大约30个函数的平均计算。一些高级算法也有加速的报道。

对于一个GPU来说,对于低级函数显示30倍的加速是很正常的,对于高级函数显示高达10倍的加速,这包括更多的开销和许多不容易与GPU并行化的步骤。例如,颜色转换的粒度是按像素计算的,因此很容易进行并行化。另一方面,行人检测是对每个可能的行人位置并行执行的,并行处理每个窗口位置受到片上GPU内存数量的限制。

作为一个例子,我们加速了来自机器人操作系统(ROS)的两个包8立体视觉里程表和纹理物体检测最初是为CPU开发的。它们包含许多功能块和一个类层次结构。

在任何有意义的地方,我们把计算工作交给GPU。例如,OpenCV GPU实现为立体视觉里程表执行了加速鲁棒特征(SURF)关键点检测、匹配和立体对应搜索(块匹配)。加速包是CPU/GPU实现的混合。结果,视觉里程计管道加快了2.7倍,纹理物体检测从1.54倍加快,如图3.数据传输开销不是算法总时间的重要组成部分。这个例子表明,只替换几行代码就可以大大提高高级视觉应用程序的速度。

回到顶部

与GPU模块的立体对应

高分辨率视频中的立体对应搜索是一个要求很高的应用程序,它演示了如何实现CPU和GPU计算的重叠。OpenCV的GPU模块包括一个实现,可以在NVIDIA GTX580上实时处理全高清分辨率的立体声对(每秒24帧)。

在立体声系统中,两个摄像头是面向同一个方向安装的。当远处的物体投射到每个相机上相同的图像位置时,附近的物体投射到不同的位置。这叫做视差。通过定位左侧相机图像上同一表面点投射到右侧图像上的每个像素,您可以根据视差计算到该表面点的距离。寻找立体图像对中像素之间的这些对应关系是立体视觉的关键挑战。

通过校正图像,这一任务变得更加容易。校正将图像扭曲为理想的立体对,其中每个场景表面点投射到匹配的图像行。这样,只需要搜索同一扫描线上的点。通过比较小窗口像素与候选匹配像素的相似度来评估匹配的质量。然后选择窗口与左侧图像像素窗口最匹配的右侧图像像素作为对应的匹配。

随着图像大小的增加,计算需求明显增加,因为有更多的像素需要处理。在较大的图像中,用像素测量的差异范围也会增加,这需要更大的搜索半径。对于小分辨率图像,CPU可能足以计算差异;然而,对于全高清分辨率的图像,只有GPU才能提供足够的处理能力。

图4给出了一个生成视差图像d(x,y)的块匹配管道,使LeftImage(x,y)对应于RightImage(x-d(x,y),y)。如前所述,该管道首先校正图像,然后查找最佳匹配。在纹理很少的区域,例如,一个空白的墙,计算匹配是不可靠的,所以所有这些区域都被标记为在后续处理中被忽略。由于视差值预计在物体边界附近会发生显著变化,因此斑点滤波阶段消除了视差图像大连续区域内的斑点噪声。不幸的是,斑点过滤算法需要基于堆栈的深度优先搜索,很难并行化,因此它是在CPU上运行的。结果使用假彩色图像可视化。

除散斑滤波外,其余步骤均在GPU上实现。计算量最大的步骤是块匹配。NVIDIA GTX580的加速速度是四核Intel i5-760 2.8GHz处理器(SSE和TBB优化)上CPU实现的七倍。经过这种加速后,散斑滤波成为了瓶颈,消耗了50%的帧处理时间。

一个优雅的并行处理解决方案是在CPU上与GPU处理并行运行散斑滤波。当GPU处理下一帧时,CPU对当前帧进行散斑滤波。这可以通过使用异步OpenCV GPU和CUDA功能来实现。异构CPU/GPU系统现在为高分辨率立体声通信问题提供了7倍的加速,允许在全高清分辨率下的实时(24帧每秒)性能。

回到顶部

KinectFusion

微软的KinectFusion4是一个应用程序的例子,以前需要缓慢的批处理,但现在,当有gpu支持时,可以以交互的速度运行。Kinect是一款能产生彩色和深度图像的相机。只需瞄准Kinect设备,就可以以惊人的保真度将室内场景的3D几何数字化,如图所示图5.这种扫描应用程序的开源实现基于点云库,6OpenCV的一个配套库,使用3D点和体素代替2D像素作为基本基元。

实现KinectFusion不是一个简单的任务。Kinect不会返回所有像素的范围测量值,而且它只能在连续的光滑哑光表面上可靠地工作。它返回的范围测量是有噪声的,并且取决于表面形状和反射特性,噪声可能是显著的。噪声也随着与被测表面的距离增加而增加。Kinect在一秒钟内生成30次新的深度帧。如果用户移动Kinect设备太快,算法就会混淆,无法使用范围数据跟踪动作。然而,通过对优秀算法和gpu提供的处理能力的巧妙组合,KinectFusion运行稳健。

有三个关键概念使健壮的交互实现可行。首先,跟踪算法能够如此快速地处理新的扫描数据,以至于相机在连续的帧之间只有很少的时间移动。这使得仅使用距离数据跟踪相机位置和方向成为可能。

其次,深度数据的融合使用体积表面表示。该表示是一个大型体素网格,与基于表面的表示相比,它更容易合并来自不同扫描的数据。为了获得高的模型质量,网格分辨率被选择为尽可能密集(512 X 512 X 512),因此必须由GPU实时速率处理。

最后,新数据与旧数据合并的方式,随着数据收集量的增加,降低了噪声和不确定性,模型的精度不断提高。随着模型越来越好,跟踪也变得越来越容易。通过GPU进行平行光线投射,获得深度信息,用于下一帧的相机跟踪。因此,帧对帧的运动估计只在第一帧和第二帧之间执行。所有其他运动都是基于模型到帧的数据计算的,这使得相机跟踪非常可靠。

所有这些步骤都需要大量的计算。容量集成需要高的内存带宽,只有GPU才能以足够低的价格提供给普通消费者。如果没有gpu,这一系统将无法实现。然而,并不是每一步的计算都能在GPU上轻松完成。例如,跟踪相机位置是在CPU上完成的。虽然相机位置估计所需的线性方程矩阵完全在GPU上计算,但计算最终解的并行性不好,所以在CPU上完成,这导致了一些下载和API调用开销。另一个问题是,分层图像处理方法中的底层图像只有160 X 120,这不足以完全加载一个GPU。所有其他部分都是理想的GPU,但受限于可用的GPU内存和计算资源的数量。

进一步的开发需要更多的GPU能力。目前,场景的大小受到体积表示的限制。使用相同数量的体素,但使它们更大,可以让我们捕捉到更大的场景,但分辨率较粗。在扫描更大的场景时保持相同的分辨率将需要更多的体素,但体素的数量受限于GPU可用的内存数量及其计算能力。

回到顶部

移动设备

个人电脑通常是在不同的芯片上安装CPU和GPU,而智能手机和平板电脑等移动设备则将所有计算元素放在一个芯片上。这样的SoC(片上系统)包含一个或多个cpu,一个GPU,以及几个用于音频和视频处理和数据通信的信号处理器。所有现代智能手机和一些平板电脑都包含一个或多个摄像头,OpenCV在安卓和iOS操作系统上都可以使用。有了所有这些组件,就有可能创建移动视觉应用程序。下面的部分将更详细地介绍移动硬件,使用NVIDIA的Tegra 2和Tegra 3 soc作为示例,然后介绍几个有用的多媒体api。最后给出了两个移动视觉应用:全景创建和视频稳定。

回到顶部

移动计算机视觉工具

任何通用计算机的核心都是中央处理器。虽然英特尔的x86指令集支配着台式电脑,但几乎所有的手机和平板电脑都是由ARM的cpu驱动的。ARM处理器遵循RISC(简化指令集计算)方法,这可以从ARM的原始名称——高级RISC机器推导出来。x86处理器传统上是为高计算能力而设计的,而ARM处理器主要是为低功耗而设计的,这对电池驱动的设备来说是一个明显的好处。由于英特尔正在减少移动设备的Atom家族的耗电量,而最近的ARM设计正变得越来越强大,它们未来可能达到类似的设计点,至少在高端移动计算设备上是这样。Tegra 2和Tegra 3都使用ARM Cortex-A9处理器。

移动电话过去只有一个CPU,但现代移动soc开始使用多个CPU,提供对称的多处理。原因是有可能节省能源。使用运行在1GHz的两个核与运行在2GHz的一个核可以达到大致相同的性能水平。然而,由于功耗随时钟速度超线性增长,这两个较慢的核心加在一起消耗的功率比单个较快的核心要少。Tegra 2提供两个ARM核心,而Tegra 3提供四个。Tegra 3实际上包含5个核(4 + 1),其中1、2、3或4个核可以同时激活。其中一个核心被称为“影子核”或“伴生核”,它被设计成消耗特别少的能量,但只能以相对较慢的速度运行。这种模式足以用于待机、听音乐、语音通话和其他依赖于专用硬件(如音频编解码器)且只需要少量CPU周期的应用程序。当需要更多的处理能力时(例如,阅读电子邮件),较慢的内核会被更快的内核所取代,为了提高性能(浏览、游戏),额外的内核会发挥作用。

SIMD(单指令,多数据)处理对于像素数据特别有用,因为同一条指令可以同时用于多个像素。SSE是英特尔的SIMD技术,它存在于所有现代x86芯片上。ARM有一个类似的技术叫做NEON,它是Cortex A9的可选协处理器。NEON可以同时处理多达8个像素,有时甚至16个像素,而CPU一次只能处理一个元素。这对计算机视觉开发人员非常有吸引力,因为它通常很容易获得3到4倍的性能加速,并且经过仔细优化甚至超过6倍。Tegra 2不包括NEON扩展,但Tegra 3的每个ARM核心都有一个NEON协处理器。

所有现代智能手机都包含GPU。第一代移动gpu实现了OpenGL ES 1.0和1.1的固定功能图形管道。尽管这些gpu是为3D图形设计的,但它们只能用于一些有限的图像处理操作,如扭曲和混合。目前的移动gpu更加灵活,支持OpenGL阴影语言(GLSL)编程与OpenGL ES 2.0 API,允许程序员在每个像素上运行相当复杂的着色器。因此,大约10年前为桌面gpu开发的许多老式GPGPU技巧现在可以在移动设备上重用。CUDA和OpenCL等更灵活的GPU计算语言将在未来几年取代这些技巧,但目前还没有。

音频和视频内容的消费和创建是现代移动设备上的一个重要用例。为了支持它们,智能手机包含专门的音频和视频编码器和解码器。此外,许多设备都有一个特殊的ISP(图像信号处理器)来处理从相机流出的像素。这些媒体加速器在计算机视觉处理中不容易访问和使用,但OpenMAX标准有帮助。1OpenMAX定义了三个不同的层:AL(应用程序)、IL(集成)和DL(开发)。最低的DL指定了来自五个领域的一组基本函数:音频/视频/图像编码和图像/信号处理。其中一些是计算机视觉开发人员的潜在兴趣,特别是视频编码和图像处理,因为它们提供了许多简单的过滤器、颜色空间转换和算术操作。IL是为实现多媒体框架的系统程序员准备的,并提供了诸如相机控制的工具。AL是为应用程序开发人员设计的,它提供了高级抽象和对象,如Camera、Media Player和Media Recorder。OpenMAX api用于在各种加速器和OpenGL ES等其他api之间高效地传递图像数据。

传感器为计算机视觉开发人员提供了另一个有趣的机会。许多设备包含传感器,如加速计、陀螺仪、罗盘和gps。它们不能执行计算,但如果应用程序需要重建相机方向或3D轨迹,则很有用。从一组帧中提取相机运动的问题是具有挑战性的,无论是在性能方面还是在准确性方面。同步定位和映射(SLAM)、运动结构(SfM)和其他方法可以计算相机的位置甚至相机看到的物体的形状,但这些方法不容易实现、校准和优化,它们需要大量的处理能力。尽管如此,传感器仍然可以提供相当精确的设备方向估计,其成本仅为仅依赖视觉处理的一小部分。为了得到准确的结果,传感器输入只能作为一个起点,然后使用计算机视觉技术进行细化。

回到顶部

OpenCV Tegra上

OpenCV的主要设计和实现目标一直是高性能。然而,将OpenCV和应用程序移植到移动设备上需要小心,以保持足够的性能水平。OpenCV自谷歌代码之夏2010年开始在Android上使用,当时它首次构建并运行在谷歌Nexus One上。几个演示应用程序演示了几乎实时的行为,但显然OpenCV需要针对移动硬件进行优化和微调。

这就是为什么NVIDIA和Itseez决定创建一个tegra优化版本的OpenCV。这项工作受益于三个主要的优化机会:使用NEON的代码向量化、使用Intel TBB (Threading Building Blocks)库的多线程以及使用GLSL的GPGPU。

利用NEON指令集是三个选择中最吸引人的一个。图6比较了OpenCV的原始版本和neon优化版本的性能。通常,NEON需要使用简单而规则的内存访问模式进行基本算术运算。这些要求通常由图像处理原语来满足,这些原语几乎是通过NEON矢量运算来实现加速的理想方法。由于这些原语通常位于高级计算机视觉工作流的关键路径上,NEON指令可以显著加速OpenCV例程。

在最多四个对称cpu上进行多线程处理可以在更高的级别上提供帮助。TBB和其他线程技术使应用程序开发人员能够获得多个CPU内核的并行处理优势。在应用程序级别,独立的活动可以分布在不同的核心之间,操作系统将负责负载平衡。这种方法与通用的OpenCV多线程策略是一致的,以并行化整个算法管道,而在移动平台上,我们经常还必须加速原始函数。

一种方法是将低级功能拆分为几个更小的子任务,这样可以产生更快的结果。一种流行的技术是将输入图像分割为几个水平条纹并同时处理它们。另一种方法是创建一个后台线程,稍后在主程序处理问题的其他部分时获取结果。例如,在视频稳定应用程序中,一个特殊的类返回来自上一个迭代的异步计算结果。多线程通过内核的数量限制加速因子,在当前最先进的移动平台上是4个内核,而NEON支持16个元素的向量运算。当然,这两种技术可以结合使用。但是,如果算法受到内存访问速度的限制,那么多线程可能无法提供预期的性能改进。例如,NEON版本的简历:调整不会从添加新线程中获益,因为单个线程已经完全消耗了内存总线的容量。

Tegra平台OpenCV库优化过程中使用的最后一种方法是GPGPU和GLSL着色器。尽管移动GPU有前面讨论过的局限性,但在某些类型的算法上,GPU能够在消耗很少能量的情况下显示出令人印象深刻的性能提升。在移动soc上,CPU和GPU之间可以共享内存,这允许c++和GLSL交错处理相同的图像缓冲区。图7展示了OpenCV库中一些过滤器和几何变换的加速示例。

使用GPU的另一个好处是,在全速运行时,它的平均功耗比CPU低。在移动设备上,这一点尤为重要,因为对消费者来说,一个主要的可用性因素是电池充电的持续时间。与用GLSL编写的相同函数相比,我们测量了一些优化的c++函数执行10,000次迭代的平均功耗和时间消耗。因为这些功能都在GPU上运行得更快,而且GPU的峰值功率更低。我们测量的结果是显著的能源节约(见附表)。在将这些功能移植到GPU时,我们测量了315倍的节能。

回到顶部

应用程序

我们使用OpenCV开发了两个移动视觉应用程序:一个是将几张普通照片拼接成全景图像,另一个是稳定流媒体视频。性能要求具有挑战性。我们的目标是实时性能,每帧应该在大约30毫秒内处理,其中基本操作,如简单复制1280 X 720像素的帧可能需要8毫秒。因此,在很大程度上,应用程序的最终设计及其底层算法是由这个约束决定的。

在这两种情况下,我们都能够通过使用GPU优化应用程序的瓶颈来满足时间限制。将图像调整和各种类型的图像扭曲等几何变换功能移植到GPU上,从而使应用程序性能提高了一倍。当使用NEON和多线程执行相同的任务时,结果就不那么好了。其中一个原因是这两个应用程序都处理高分辨率的四通道图像。结果导致内存总线过载,CPU内核竞争缓存内存。同时,我们还需要手工编写双线性插值程序,并在GPU硬件中实现。我们了解到CPU不能很好地完成全帧几何变换,GPU的帮助是无价的。让我们更详细地考虑这两个应用程序。

全景拼接.在全景拼接应用程序中,我们的目标是将几张普通图像组合成一张全景图,其视场(FOV)要比输入图像大得多。7图8演示将几个详细的镜头拼接到整个图像的一个高分辨率图像中。

图9显示了OpenCV全景拼接应用程序的处理管道。移植到Tegra的过程从一些算法改进开始,然后是NEON和多线程优化;然而,在所有这些努力之后,应用程序仍然响应不够,不能以交互速度拼接和预览生成的全景图。其中最大的瓶颈是图像调整和扭曲。前者是必需的,因为不同的算法步骤在不同的分辨率下执行,每个输入帧的大小根据算法参数调整约三次。所需的扭曲类型取决于所需的投影模式(球形、圆柱形等),并在最后的全景图混合之前执行。

用GPU版的简历:调整我们能够将每个输入帧的缩放时间从41毫秒减少到26毫秒,这等于1.6倍的本地加速。由于图像扭曲的GPU实现,我们可以实现更好的局部改进,根据投影类型提高8-14倍的性能。结果,应用程序的总加速是1.52倍,满足了性能需求。

视频稳定.不使用三脚架录制视频的一个负面后果是相机抖动,这大大降低了观看体验。为了达到视觉上愉悦的效果,所有的动作都应该是流畅的,并且必须过滤掉相机定位和翻译中的高频变化。已经开发了许多方法,其中一些已经成为开源或商业上可用的工具。现有的离线计算密集型方法需要相当多的时间,而轻量级的在线算法更适合移动设备。高端的方法通常是重建摄像机的三维运动,并应用复杂的非刚性图像翘曲来稳定视频。2在移动设备上,使用平移、仿射翘曲或平面透视转换的轻量级方法可能更有意义。3.

我们尝试了平移和仿射模型,在这两种情况下,GPU都能够消除主要的热点,即对输入帧的补偿转换的应用。应用平移来补偿运动仅仅意味着移动输入帧沿x而且y坐标轴和切断一些边界区域,一些帧现在不包含颜色信息(参见图10).

在编程方面,应该选择一个位置合适的子矩阵,然后将其调整为与原始视频流相同分辨率的新图像,如图11.令人惊讶的是,这个简单的步骤消耗了140多毫秒。我们的GPU GLSL实现比c++快5到6倍,耗时约25毫秒。

然而,25毫秒对于实时算法来说还是太长了,这就是为什么我们接下来尝试从异步调用中获得更快的速度。创建了一个特殊的类来稳定GPU上的帧。该类立即返回存储在其图像缓冲区字段中的前一个迭代的结果,并创建一个TBB:任务用于处理下一帧。因此,GPU处理是在后台执行的,而调用者的表观成本和延迟等于只复制一个完整的帧。这个技巧也被应用到一个昂贵的颜色转换过程中,并且通过进一步优化内存访问模式,我们实现了实时处理性能。

回到顶部

未来的发展方向

gpu最初的开发是为了以交互速率加速3D场景描述到2D图像的转换,但随着它们变得更可编程和更灵活,它们也被用于处理和分析2D图像和图像流,以创建3D描述,控制一些应用程序,使其能够对用户或环境中的事件做出反应,或只是创建更高质量的图像或视频。随着计算机视觉应用变得越来越普遍,是否会创造出一种更适合图像处理的不同类型的计算机视觉处理器来与GPU一起工作,或者GPU是否仍然适合完成这项任务,这将是一个有趣的问题。目前的移动gpu还不如大型计算机上的灵活,但这种情况很快就会改变。

OpenCV(和其他相关api,如点云库)使应用程序开发人员更容易使用计算机视觉。它们都是文档翔实且充满活力的开放源码项目,不断增长,并且正在适应新的计算技术。这种演变的例子是OpenCV中从C到c++ API的过渡以及OpenCV GPU模块的出现。然而,基本的OpenCV架构在设计时主要考虑到了cpu。也许是时候设计一个明确考虑异构多处理的新API了,其中主程序可能运行在一个或多个CPU上,而视觉API的主要部分运行在不同类型的硬件上:GPU、DSP(数字信号处理器),甚至是专用的视觉处理器。事实上,Khronos最近已经开始研究这样一个API,它可以作为一个抽象层,允许在硬件端独立创新,并允许在此层之上开发OpenCV等高级API,同时在某种程度上与底层硬件架构的变化绝缘。

回到顶部

致谢

我们感谢Colin Tracey和Marina Kolpakova对功率分析的帮助;Andrey Pavlenko和Andrey Kamaev负责GLSL和NEON代码;以及Shalini Gupta, Shervin Emami和Michael Stewart的补充意见。NVIDIA提供了支持,包括实验中使用的硬件。

回到顶部

参考文献

1.Khronos OpenMAX标准;http://www.khronos.org/openmax

2.刘芳芳,格莱歇尔,王俊杰,金浩,阿加瓦拉。亚空间视频稳定。ACM图形学汇刊, 1(2011), 4:14:10。

3.Matsushita, Y., Ofek, E., Ge, W., Tang, X., Shum, h -Y。全帧视频稳定与运动嵌入。模式分析与机器智能汇刊, 7(2006), 11501163。

4.纽科姆,r.a.,伊扎迪,S.等。Kinectfusion:实时密集表面映射和跟踪。IEEE混合和增强现实国际研讨会(2011), 127136。

5.OpenCV库;http://code.opencv.org

6.点云图书馆;http://pointclouds.org

7.图像对齐和拼接:一个教程。计算机图形学与视觉基础与趋势2, 1(2006), 1104。

8.“柳树车库”。机器人操作系统;http://www.ros.org/wiki/

回到顶部

作者

Kari Pulli他是NVIDIA Research的高级总监,领导着移动视觉计算研究团队,研究与移动设备上的相机、成像和视觉相关的课题。他曾在Khronos和JCP从事移动媒体api的标准化工作,并在斯坦福大学担任数字米开朗基罗项目的技术负责人。

Anatoly Baksheev是Itseez的项目经理。他于2006年开始他的职业生涯,是多投影仪系统Argus Planetarium的主要开发者。自2010年以来,他一直是OpenCV GPU项目的负责人。自2011年以来,他一直致力于点云库的GPU加速模块。

Kirill Kornyakov他是Itseez的项目经理,在那里他领导移动设备OpenCV库的开发。他管理移动操作系统支持和计算机视觉应用开发的活动,包括NVIDIA Tegra平台的性能优化。

维克多Eruhimov是Itseez的首席技术官。在共同创立公司之前,他曾在英特尔担任项目经理和高级研究科学家,在那里他应用计算机视觉和机器学习方法实现了英特尔晶片厂的自动化,并彻底改变了半导体制造业的数据处理。

回到顶部

数据

F1图1。计算机视觉和GPU。

F2图2。CPU和GPU的性能比较。

F3图3。纹理对象检测应用:CPU和GPU。

F4图4。立体块匹配管道。

F5图5。RGB框架,深度框架,光线浇铸框架,点云。

F6图6。NEUN在Tegra 3上的性能改进。

F7图7。在Tegra 3上使用GLSL提高性能。

F8图8。输入图像和产生的全景图。

F9图9。全景拼接管道。

F10图10。视频稳定输入序列。

季图11。视频稳定管道。

回到顶部

UT1表格在Tegra 3上使用GLSL节省能源。

回到顶部


©2012 acm 0001-0782/12/0600 $10.00

允许为个人或课堂使用部分或全部作品制作数字或硬拷贝,但不得为盈利或商业利益而复制或分发,且副本在首页上附有本通知和完整的引用。除ACM外,本作品的其他组件的版权必须受到尊重。允许有信用的文摘。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,都需要事先获得特定的许可和/或费用。请求发布的权限permissions@acm.org传真(212)869-0481。

数字图书馆是由计算机协会出版的。版权所有©2012 ACM, Inc.


没有发现记录

Baidu
map