NVIDIA Jetson Nano 2GB 系列文章(5):体验视觉功能库
在本系列上一篇文章里,我们带领大家体验了 Jetson Nano 2GB 的并行计算性能。在本篇文章中,我们将带领大家体验视觉功能库。
本文会为大家介绍 NVIDIA 在 JetPack 开发环境中,提供的两套非常完整的与视觉技术相关的开发工具包,分别是 VisionWorks 与 MultiMedai API,这两个开发工具包不仅在电脑视觉(Computer Vision)中占据非常重要的分量,也在深度学习的视觉应用中扮演十分重要的角色。在一个完整的视觉应用中,包括摄像头/视频这些输入源的格式转换处理,以及计算结果的输出叠加处理,都非常复杂并且需要消耗大量计算资源。
NVIDIA 设备不仅能够在计算性能上取得绝对的优势(这在上一篇文章中就能从 CUDA 范例中得到验证),另外,在 Jetson Nano 2GB 设备中,还可以提供硬件编解码器以提高 IO 性能,以及 VisionWorks 与 MultiMedia API 这两套高层(high level)与底层(low level)开发界面,在性能上做最大程度优化,同时大幅度减少开发时间,因此这两套工具对于发挥 Jetson Nano 2GB 的总体效益非常关键。
由于 MultiMedai API 属于非常底层的开发接口,需要一定技术基础,因此本文不多做说明,在这里我们聚焦于 VisionWorks 的案例与体验。
VisionWorks 高阶视觉整合应用开发包
在执行范例之前,首先看一下 VisionWorks 的框架示意图:
从上往下数第二层“VisionWorks Source Samples”就是本文要带着大家执行的范例,里面包括特征追踪(Feature Tracking)、霍夫转换(Hough Transform)、方向预测(Motion Estimation)、视频防抖(Video Stabilizer)等范例,这些是属于图像/视频处理中的经典项目,而且计算量都相当大,接下来我们在 Jetson Nano 2GB 上执行,感受一下这款嵌入式设备的惊人计算能力。
编译 VisionWorks 范例
VisionWorks 范例都是用 C/C++ 撰写,执行前需要先进行编译。范例文件存放在 /usr/share/visionworks/sources/ 下面,请执行以下指令进入:
进到这里之后,还不能马上执行编译,目录里有个 install-samples.sh 脚本,需要先执行这个脚本,将完整的环境设定好。install-samples.sh 脚本后面需要跟随一个目标路径,以便将 samples 安装在指定目录中。
假如我们准备将 samples 安装到主目录(~/)下,请执行以下指令:
会看到如下截屏的执行信息。
这个脚本会在目的目录(这里是 ~/)下建立 <VisionWorks-1.6-Samples> 目录,作为 VisionWorks 范例的工作目录。接下去就切换到 ~/VisionWorks-1.6-Samples 目录,并查看一下内容:
会看到如下截屏的内容,里面里面有个 Makefile 表示可以在这边执行编译任务,另外有个 user_guide_linux.md 使用说明,可以进去看一看。
后面要执行的范例代码,其实是放在<demos>目录下,而<samples>目录下存放一些演示过程所需要的一些工具,都是底层接口的调用,因此本文不多做说明。在这里直接执行以下指令,一次将所有范例都编译好。
编译好的执行文件存放在 bin/aarch64/linux/release/ 下面,执行以下指令进入:
这里可以看到里面有 6 个“nvx_demo”开头的执行文件,就是接下去要执行的范例,其中 nvx_demo_feature_tracker 与 nvx_demo_feature_tracker_nvxcu 是相同的功能,这里就执行 nvx_demo_feature_tracker_nvxcu 做说明即可。
1. 特征追踪器(feature tracker)
原理说明:
nvx_demo_feature_tracker_nvxcu
是一个简单的局部特征跟踪演示,它使用 Harris 或 FAST 特征检测器获取特征的初始列表,并使用稀疏的金字塔光学流方法(Lucas-Kanade)对其进行跟踪。
在第一帧中,将创建高斯金字塔并检测初始点,以便可以在低分辨率下快速找到要素,并且在沿着金字塔走时也可以更精确地定位它们。
初始点使用哈里斯拐角检测器检测。NVIDIA 扩展的 Harris 和 FAST 转角功能将图像划分为相同大小的单元,并在每个单元中独立查找角。这样可以在整个图像上均匀地检测到拐角。这些角是在下一帧中跟踪的关键点。
在随后的帧中,使用 Lucas-Kanade 方法在两个金字塔图像之间跟踪点。然后,执行角点检测以恢复丢失的点。
执行指令:
执行结果:
2. Hough 转换(边缘检测)(feature tracker)
原理说明:
通过霍夫变换进行直线和圆的检测。输入帧将转换为灰度,缩小比例,使用中值滤镜模糊并进行均衡。然后,由 Canny Edge Detector 和 Sobel 运算符处理均衡后的帧,并将生成的边缘图像和导数传递到 Hough Circle 节点,以获取带有检测到的圆的最终数组。
边缘图像还将传递到“霍夫线段”节点,以获取带有检测到的线的最终阵列。在随后的帧中,使用 Lucas-Kanade 方法在两个金字塔图像之间跟踪点。然后,执行角点检测以恢复丢失的点。
执行指令:
过程中使用“M”键进行切换。执行结果:
3. 运动估算(Motion Estimation)
原理说明:
这是实现 NVIDIA 迭代运动估计(IME)算法的代码示例。IME 是一种基于块的运动估计算法,该算法结合了迭代优化步骤以改善输出运动场。这里的样本管线说明了从当前帧到前一帧的后向运动矢量的单向运动估计,样本管线每隔 2x2 块以 Q14.2 格式生成运动矢量。
执行结果:
画面上可以看到移动物体上出现很多“方向”符号,如右小角物体的动向预测有“向左上”与“向左”两种,就是预测不同物件的行进方向。
4. 立体声匹配(Stereo Matching)
原理说明:
一个简单的立体声匹配演示,使用半全局匹配算法评估视差。在评估立体声以获得更好的质量和性能之前,它会执行颜色转换和缩小比例。预期输入图像不会失真和校正。
通过将视差值从 [0..ndisp] 间隔线性转换为 HSV 颜色空间来创建颜色输出,其中最小视差(远物体)对应于 [H = 240,S = 1,V = 1](蓝色),最大视差(附近物体)对应于 [H = 0,S = 1,V = 1](红色)。然后将生成的 HSV 值转换为 RGB 颜色空间以进行可视化。
执行指令:
执行结果:使用“s”键进行切换
5. 视频稳定器(Video Stabilizer)
原理说明:
演示了基于图像的视频稳定算法。使用哈里斯特征检测器和稀疏金字塔光学流方法(Lucas-Kanade)估计帧的运动。
执行指令:
执行结果:
视频左边是原始的抖动视频,右边是防抖处理后的视频,可以很明显体验这个防抖处理的效果。这个应用的实用性很高,而且计算量很大,必须对每一帧图形与前后 n 帧图形进行比对,然后找到合适位置进行位移处理。
6. 简单的对象跟踪器(Simple Object Tracker)
原理说明:
这是基于传统对象跟踪器的范例,并未使用到深度学习技术,基于金字塔形光学流的简单跟踪方法,并具有针对非刚性物体的高级跟踪器。
跟踪器使用 FAST 算法查找转角,并将其通过“光流”传递到下一帧。通过运动距离、方向和光流精度对找到的角进行过滤,以消除异常值。对于下面称为“关键点”的其余角,该算法尝试将每个关键点与从先前帧跟踪的关键点进行映射,以设置新关键点的权重。然后将这些关键点用于每个对象,找到边界框中心,然后估算边界框比例。
执行指令:
执行结果:
执行时,请用鼠标自行标出一个要追踪的物件,如上图的绿色框,系统会追踪所标定的物件的移动状态。
以上就是 VisionWorks 的 6 个范例,如果要从头开发,需要耗费非常多时间,但是 Jetson Nano 2GB 的 JetPack 能够提供非常完整的开发生态,可以让开发者节省大量开发时间与学习成本。