所谓“嵌入式视觉”, 是指一种通过视觉方法去理解周边环境的机器,主要涉及到两种技术:嵌入式系统和计算机视觉(有时也称为机器视觉)。
然而,由于缺乏共通的标准,致使嵌入式视觉技术发展受阻,唯有采用兼容各层面功能的标准,以及对处理器类别选取的严格把控,才能真正开启并普及嵌入式视觉应用。
实际上,我们中的很多人每天就携着一个嵌入式机器视觉系统,比如在我们的智能手机中。这些智能设备不仅能够捕获图像和录制视频,而且还能执行增强现实的应用,嵌入式视觉在消费类、产业和政府领域被广泛接受。
我们要根据时间限制,重点弄清楚开发过程中的哪部分活动能实现附加价值,然后做出正确选择,分清哪部分应该自己开发(增值活动),哪部分可以购买商用现成产品 (COTS) 或者分包出去。重点关注增值活动并利用硬件、软件和 FPGA 层面的 IP 模块,是满足上市时间要求的重要促成因素之一。
大部分视觉系统都遵循可预测的流水线
大部分视觉系统都遵循可预测的流水线
除了上市时间要求,嵌入式视觉系统开发过程中还要经常考虑尺寸、重量、功耗和成本 (SWAP-C) 要求。究竟哪种要求占主导,取决于具体应用领域,例如手持设备在功耗方面就要比驾驶员辅助系统更为严格。然而,对于高级驾驶员辅助系统来说,由于要生产几百万台,因此方案成本就成了主导因素。
要在尺寸、重量、功耗和成本方面获得很好的效果,应该在传感器和处理系统中实现更为紧密的系统集成,即使用数量更少但功能更强的集成组件。
每种应用领域都具有不同增值点以及不同的尺寸、重量、功耗和成本考量,因此几乎所有嵌入式视觉系统都需要我们实现所谓的图像处理流水线。这种流水线可与所选的传感器建立接口连接,并且执行所需的操作以生成适合进一步加工或直接在网络上传输的图像。基本的图像处理流水线包含:
照相机接口 — 接收来自传感器的原始图像;
颜色滤波阵列 — 重建像素颜色;
色彩空间转换 — 转换成针对编解码器的正确色彩空间;
输出格式化 — 与输出介质进行接口连接。
在图像处理流水线中对接收的图像执行和应用算法。所实现应用不同,算法也会不同;不过,有一些常用的图像处理算法可用来提高对比度,检测图像中的特性、目标或运动,或者校正模糊图像。
应该在一个框架中开发这些算法,以便我们以最短时间将产品推向市场,并鼓励重复使用,降低非重复性和重复性工程成本。有几种现成的框架我们可以考虑使用。
OpenVX — 用于开发图像处理应用的开源应用程序;
OpenCV — 开源计算机视觉,多个面向实时计算机视觉的库,基于 C/C++;
OpenCL — 基于 C++ 的开源计算机语言,用于开发 GPU、FPGA 等器件中常见的并行处理应用;
SDSoC — 赛灵思的一款设计环境,借助该环境开发人员可在 Zynq 或 UltraScale+ MPSoC 器件的 ARM 处理系统中最初实现用 C/C++ 编写的算法,分析代码库特性以找出性能瓶颈,然后利用赛灵思高层次综合功能将这些瓶颈转换到硬件支持的 IP 核,并在器件的可编程逻辑 (PL) 部分运行。
采用 FPGA 或 All Programmable SoC 方案时,将这些框架与 HLS 结合使用,能够高效开发出嵌入式视觉应用,并通过硬件在闭环中快速演示。
图像经过处理流水线后,数据从系统的输出方式也很重要,我们有三种选择。
利用视频图形阵列 (VGA)、高清多媒体接口 (HDMI)、串行数字接口 (SDI) 或 DisplayPort 等标准将图像输出到显示器。很多电动车采用触摸式显示屏对系统进行控制和配置。
将图像或从图像中提取的信息传送到另一个系统,该系统像云处理应用那样使用图像或提取出的信息。
将图像存储在非易失存储介质中,供以后访问。
对于绝大多数方式而言,在完成成像链后,我们都需要确定图像格式化方式,以便使用。此时,我们需要决定是否使用诸如 H.264(MPEG-4 Part 10 高级视频编码)或 H.265(高效率视频编码)等行业标准图像/视频压缩算法对图像进行编码,这些实现方案通常称为编解码器。编解码器能提高通信和网络带宽的使用效率,或降低实现高保真度所需的存储空间,因为编码通常存在较大失真 。如果因使用编解码器导致失真度无法接受,还可以按原始格式发送和存储图像,或者以无损格式进行编码。
大多数编解码器所使用的色彩空间都与图像传感器输出的色彩空间(前提是系统使用彩色器件)不同。嵌入式视觉中常用的色彩空间是:
红、绿、蓝 — 包含 RGB 信息作为图像传感器的输出,常用作 VGA 等简单接口的输出;
YUV — 包含亮度 (Y) 和色度 (U 和 V),该色彩空间用于大多数编解码器和一些显示标准。常用的 YUV 格式为 YUV4:4:4 和 YUV4:2:2。两种格式的区别在于:4:4:4 格式下,每像素由 8 位表示,得到 24 位像素。在 4:2:2 格式下,U 值和 V 值在像素之间共享,得到 16 位像素,可节省存储空间。
另一个对图像处理链和 SWAP-C 具有很大影响的决策是:大部分图像处理链应该在哪实现:
在边缘,即在嵌入式视觉系统之内。这样会提高系统的功耗和处理/存储要求,但能够实现更快的响应。在边缘处理将在大部分嵌入式应用(例如高级驾驶员辅助、机器视觉等)中成为主导。
在云中,这需要嵌入式视觉系统捕获图像,并且利用网络技术将图像发送到云。可在云中处理的典型应用包括医疗成像或科研应用。这类应用中,处理非常密集,且不需要实时结果。
为实现处理链,处于嵌入式视觉系统核心的处理内核不仅要能控制所选的图像传感器,还要能接收和实现图像处理流水线,并通过指定网络基础设施传送图像或发送到选定的显示器。考虑到这些严苛要求,因此经常要选择 FPGA,或者越来越多的情况下需要使用 All Programmable 片上系统,例如 Zynq 器件。
Zynq 器件将两个高性能 ARM A9 处理器与 FPGA 架构相结合。这样使得处理系统 (PS) 可用来通过 GigE、PCIe 或 CAN 等接口与主机系统通信,同时执行系统的一般管理和日常事务。器件的另一半,即可编程逻辑 (PL) 可用来接收和处理图像,充分利用 FPGA 架构的并行处理特性。如果要求通过网络基础设施传送图像,那么可使用 Zynq 中的直接存储器访问 (DMA) 控制器高效地将图像数据从 PL 移动到 PS DDR 存储器。图像到了 PS DDR 存储器内,可利用所选传输介质的 DMA 控制器进一步访问。
当然,一旦图像处在 PS DDR,高性能 A9 处理器也可提供进一步的处理操作。Zynq 架构的特点在于还可将处理后的图像从 PS DDR 移回 PL 中的图像流水线。
很多情况下,需要将嵌入式视觉应用的输出与其他传感器数据进行融合,使产生的图像包含多个不同传感器的信息。最简单的传感器融合应用是将不同频谱的图像相结合,例如可见光与红外线融合以实现更好的夜视效果。
传感器融合的另一个更为复杂的用途是将成像系统、全球导航卫星系统 (GNSS)、数字地图信息以及不同波长下运行的其他传感器(例如雷达)进行融合,以确定另一辆汽车的相对位置,从而实现避碰功能。
十多年来,在嵌入式系统业界中已经开发了许多图像采集卡和相机接口板卡,以支持PMC夹层卡。随着所谓的“交换结构”接口的出现,许多这些相机接口板卡已经迁移到XMC设计。像较早的基于PMC的设计一样,它们支持多种类型的相机接口。虽然许多公司支持PCIe标准、允许具有不同输出的相机与主机连接,但是希望降低系统成本和尺寸的嵌入式视觉系统设计人员,现在可以利用多种小尺寸PCIExpress迷你卡的功能执行此任务。