嵌入式视觉系统的构建模块

作者:Aaron Behman,Adam Taylor

传统嵌入式视觉系统采用FPGA/处理器组合来实现,也有越来越多地使用将高性能处理器与FPGA相结合的片上系统来实现。在本文中我们将会介绍嵌入式视觉系统的高级元素;如何简便快捷地使用软件 API 和 IP 库构建嵌入式视觉系统,如何把算法开发的增值部分添加到图像处理链中。

从监控摄像头等简单监控系统到更高级的应用,例如当今最新款汽车配备的高级驾驶员辅助系统 (ADAS)和先进生产设施及工厂里使用的机器视觉,嵌入式视觉系统已在一系列应用中得到使用。不论何种应用,嵌入式视觉系统都具备一些共同之处,总体来讲它们可以分为下列三大类:

• 设备接口 — 提供到所选成像设备的接口。根据选择的设备类型,提供所需的时钟、偏置和配置数据。这样还可以从设备接收图像数据,根据需要进行解码和格式化,以供图像处理链做进一步处理。

• 图像处理链 — 通过设备接口接收图像数据并进行彩色滤波器阵列内插和色域转换(即从彩色转换到灰度)等操作。这部分仍处于我们对接收到的图像使用大量算法的图像处理链内。这些可以是降噪或边缘增强等简单算法,也可以是对象识别或光流等复杂得多的算法。常见情况是在图像处理链的上游部分调用算法实现方案。当然图像处理链上游的实现复杂性取决于要实现的应用。而输出格式化部分(即将处理后的图像数据转换为正确格式,以输出到显示器或是通过通信接口输出)被称为下游部分。

• 系统监视与控制 – 这是一项独立于设备接口和图像处理链的类别,它从两个方面提供系统监视和控制。第一个位于设备内部,它提供:
o 图像处理链的配置
o 图像分析功能
o 在算法执行过程中根据要求更新图像处理链

第二个是更广泛的嵌入式视觉系统的控制与管理,它提供:

o 电源管理和图像设备上电排序
o 执行自检及其他系统管理功能
o 网络支持通信或点对点通信
o 在首次成像操作前通过 I2C 或 SPI 配置图像设备

部分应用允许系统监视功能访问帧存储器并在其中的帧上执行算法。在这种情况下系统监视能够构成图像处理链的一部分。

这三大类别因为每个阶段内在的难点不同,需要不同的实现方法。设备接口和图像处理链都要求有能力处理带宽高数据,从而在内部实现图像处理链,在外部从系统传输图像数据。而系统监视与控制要求能够处理和响应通过通信接口接收到的命令并为外部通信提供支持。如果系统监视也要构成图像处理链的组成部分,就需要一个高性能处理器。

照此,传统嵌入式视觉系统采用FPGA/处理器组合来实现,也有越来越多地使用将高性能处理器与FPGA相结合的片上系统来实现。在我们演示上述几个方面如何结合在一起之前,我们先来了解一下这三个类别中每一个的不同难点。

设备接口

传感器接口由应用所选择的设备决定,大多数嵌入式视觉应用使用 CMOS 图像传感器 (CIS)。一般情况下这些传感器使用 CMOS 并行输出总线,用控制信号提示行和帧的有效顺序,或者使用速率更高的串行通信,实现较简单的系统接口,但会导致 FPGA 实现方案略显复杂。与并行总线相比,这些串行数据流能通过更少数量的通道传输图像,因为它们以快得多的数据速率运行,因此相比并行接口而言,能让成像器支持更高的帧速率。为实现同步,常见的做法是让包含图像及其它数据字的数据通道与包含用于定义数据通道上的内容的代码字的同步通道相结合。与数据通道和同步通道结合的还有一个时钟通道,因为该接口采用源同步。这些高速串行通道一般实现为 LVDS 或微摆幅差分信号 (Reduced Swing LVDS),以降低系统噪声和功耗。

不论输出图像格式如何,通常是 CIS 设备在获取任何图像之前需要由嵌入式视觉系统加以配置。这是由 CIS 设备的多功能性造成的。这种多功能性在提供强大的片上处理功能的同时,也需要在输出图像前使用正确的设置进行配置。这些接口对带宽的要求没有图像传输要求的那么高,因此常常使用 I2C 或 SPI 接口标准。

因为所需的图像数据带宽较高,经常把该接口实现在 FPGA 中,这样更便于与图像处理链集成。该 CIS 设备的配置接口一般使用 I2C 或 SPI,它们既可以用 FPGA 实现,也可以用支持这种接口的系统监视与控制处理器实现。

图像处理链

图像处理链由上下游元件和接口组成,像素数据通过设备接口输出。但是接收到的像素的格式可能不能用于正确显示图像。我们可能需要进行图像校正,尤其是在使用彩色成像器的情况下。 为维持所需数据率下的吞吐量,图像处理链常实现在 FPGA 中,以发挥其并行优势。这样可以生成图像处理流水线,使得处理链的每一步都将并行实现,从而获得更高的帧速率。但是对部分应用我们必须考虑时延,尤其是对高级驾驶员辅助系统 (ADAS) 这样的系统而言。为有效建立图像处理链,我们需要使用通用互联协议作为图像处理内核的基础,从而方便处理 IP 的互联。这样可以带来两重好处:一是可以重复使用的库;二是由于每个 IP 核旨在根据定义的标准接收和发送数据,从而方便流水线的建立。这里有多种常用的协议可供选用,其中最常见的是 AXI,因其具有同时支持内存映射接口和流接口的灵活性。

图像处理链内的典型处理阶段包括:

• 彩色滤波器阵列 – 在CIS设备上用贝尔 (Bayer) 滤色片生成每个像素的彩色
• 色域转换 – 从RGB转换为YUV
• 色度重采样 – 将 YUV 像素转换为更高效的像素编码
• 应用图像校正算法,比如色彩校正或伽马校正,或是进行图像增强或降噪
• 在下游侧我们可以配置视频输出时序,然后在输出到指定的目标前转换回本机并行输出视频格式

部分系统也使用外部内存,例如DDR 的内存作为帧存储,在 SoC 内部 DDR 内存也往往提供给 SoC 的处理器侧。共享内存空间的能力让系统监视侧能通过千兆位以太网或 USB 传输数据,或成为图像处理链的延伸。

系统监视

传统上该功能实现在处理器内部,能够处理相关命令,以按应用需求对图像处理链进行配置。为接收和处理命令,系统监视功能必须能够支持从简单的 RS232、千兆位以太网、USB、PCIe 到 CAN 汽车专用接口等一系列不同的通信接口。

只要嵌入式视觉系统的架构能够支持,我们就能使用处理器来生成图像叠加信息,可供叠加在输出图像上。在能够访问图像数据的条件下,我们也能够使用处理器对图像开展进一步处理,或是收集统计数据(像素值分布柱状图等)。这样系统监视就成为图像处理链的一部分,让开发人员能利用各种开源图像处理库,如OpenCV、OpenCL 和 OpenVX。

EVK使用实例

在阐明嵌入式视觉系统的基本元素后,下文将示范这些概念,展现如何综合运用它们创建出可工作的系统。该实例将展示我们如何使用安富利 MicroZed 嵌入式视觉套件 (EVK)创建嵌入式视觉系统。

该套件使用安森美 Python 1300C 成像设备和赛灵思 Zynq 7020。 Python 1300C 是一个 1280 像素×1024行的色彩图像传感器,通过 SPI 接口配置。此型号传感器使用串行输出实现高帧率,同时EVK 支持通过 HDMI 接口输出图像到显示器。

Zynq 7020 为嵌入式视觉系统的实现提供了一个极好的平台,因为我们能使用 FPGA 架构中的可编程逻辑 (PL) 实现该设备的接口和图像处理链。而 FPGA 架构中的 ARM A9双核处理器(即处理系统 (PS))可用于根据我们的需要实现系统监视功能和图像处理链延伸。

为开发该应用,我们将用到两个 SoC 开发工具。一个是赛灵思 Vivado 2015.4,另一个是赛灵思SDK 2015.4。在 Vivado 中我们将实现设备的接口、图像处理链,在 Zynq 内配置 PS,建立 PS 到 PL 存储器映射以完成下列操作:

• 根据图像大小和帧速率所要求的参数以及所需操作在图像处理链内配置 IP。为此我们将在 PS和 PL 间使用通用 AXI 互联,以 PS 为主设备。使用该接口我们能在 PS 和 PL 间实现 高达 1,200Mbps 的传输速率。

• 如有必要,将处理器的 DDR 内存置于图像处理链中,以便处理器访问。为此我们将在 PL 和 PS 间使用高性能 AXI 互联,以 PL 为主设备。使用该接口我们能在 PL 和 PS DDR 内存间实现高达 2,400Mbps 的传输速率。

该演示将使用 HDMI 展示如何将图像输出到显示器上。相当有用的是,EVK 制造商安富利为Python 1300C 提供了一个设备接口 IP 模块,并为在 EVK 上接口输出到 HDMI 设备提供了一个 HDMI 输出 IP 模块。我们将本实例中使用所有这些模块。在 Vivado 中我们可以使用 IPXact 格式把这些 IP 模块添加到 Vivado IP 目录中。

图像处理链将与安森美设备接口并执行下列处理阶段,除了 Python 1300C 和 HDMI IP 核,所有使用的 IP 核均来自 Vivado 中的标准赛灵思图像处理 IP 库(实际 IP 核的名称在下面显示):

图1:图像处理流程

• 将来自 Python 接口 IP 的并行视频和水平及垂直同步转换为 AXIS Stream,以便我们能够将其与后续的图像处理IP核接口。 视频输入到 AXIS (Video in to AXIS)

• 彩色滤波器阵列使用贝尔滤色片为每个输出像素赋予一个 RGB 值(仅以 R、G 或 B 表示)。彩色滤波器阵列插值 (Color Filter Array interpolation)

• RGB 到 YUV色域转换,将 RGB 色域转换为 HDMI 驱动器优选的 YUV 色域输出格式。RGB 到 YCRCB色域转换器 (RGB to YCRCB Color-Space Convertor)

• 将 YUV 从 4:4:4 格式重新缩放为 4:2:2 格式。 色度重采样 (Chroma Resampler)

• 配置视频 DMA 以传输图像帧到 PS DDR。 AXI VDMA

• 配置同一视频 DMA,以从 PS DDR 读取图像帧。 AXI VDMA

• 将 AXI Stream 转换回并行格式。 AXIS 到视频输出

• 为输出视频时序提供时序参考生成器。 视频时序控制器

除了确保系统正常运行,我们还需要两个 AXI 互联。一个是高性能 AXI 互联,另一个是通用AXI 互联,以及每个时钟域所需的复位模块。

图像处理应用需要一系列的时钟域,大部分时钟域我们可以使用 Zynq 内部的 PS 提供给 PL的时钟。就该应用而言,我们需要下列时钟:

• 108 MHz – 这是以 1280x1024 分辨率和 60 Hz帧速率输出图像所需的像素时钟速率。

• 75 MHz – 用于存储器映射的 AXI 和 AXI Lite 接口。

• 150 MHz – 用于图像处理链,也称为AXI Streaming时钟。AXI Stream 时钟的速率必须至少与像素速率相同。但是我们必须考虑处理链中的所有 IP 核的吞吐量。虽然大多数模块能够每时钟周期处理一个像素,留出部分裕度并减少所需的缓存是明智的做法。

• 200 MHz – 提供给 Python 1300C CIS 设备作为基准。

为实现像素时钟,我们需要使用时钟向导来生成该 108MHz 像素时钟,因为该时钟需要极为准确的设置。虽然在用 PL 架构时钟设置时,75MHz和150MHz时钟允许部分容差,但 200MHz时钟也要求精确。与 108MHz 时钟不同的是该时钟可由 PL 架构时钟精确生成。

所使用的 IP 模块的时钟结构如下表所示:

所使用的 IP 模块的时钟结构

在 Vivavdo 方框图编辑器中的整个实现方案如下面两个图所示。这两个图分别显示的是图像处理链的上游和下游。您还能够看到使用通用 AXI 互联和高性能 AXI 互联实现的 ARM 内核处理器的互联情况。

图2:EVK实例设计 — 突出显示的是上游图像处理链

图3:EVK实例设计 — 突出显示的是下游图像处理链

一旦我们完成设计验证,并为AXI外设分配地址(可自动完成)后,我们就能在 Vivado 2015.4 中构建硬件并将其导入到 SDK 2015.4 软件开发环境中。我们需要在该环境中编写一些简单软件,让系统启动并运行。

在 SDK 内部,我们不仅需要在 Zynq 内配置设计,还需要在使用设计之前在 EVK 上配置部分元素。记住在本实例中 PS 起着系统监视和控制功能,因此必须对整个嵌入式视觉系统进行配置,而不仅仅是在 Zynq 中配置 Vivado 设计。

我们需要开发用于配置下列内容的软件:

• 使用SPI 接口的 Python 1300C 摄像头
• AXI Python 1300C 接口模块
• AXI VDMA,从 DDR 内存读取和向 DDR 内存写入帧
• AXI 彩色滤波器阵列
• 用于 AD7511 的 HDMI 输出设备。该设备使用 I2C 进行配置
• I2C 多路复用器及其连接的相关外设
• 用于控制 Python 1300C 设备电源轨的 I2C IO 扩展器

该 EVK 使用 Zynq PS I2C 控制器对 HDMI 输出设备进行配置,来对 Python 设备供电。安富利还向我们提供了能用来控制 I2C 并进行如下配置的 API:

• ADV7511 – 用于 HDMI 输出的 API
• CAT9554 – 用于位于摄像头模块上的 I2C I/O 扩展器的 API
• TCA9548 – 用于位于 EVCC 上的 I2C 多路复用器的 API
• PCA9534 – 用于位于 EVCC 上的 I2C IO 扩展器的 API
• OnSemi_Python_SW – 用于 Python 1300C 的 API
• XAXIVDMA_EXT – 用于配置 VDMA 的 API
• XIICPS_EXT – 用于驱动外部 I2C 的 API

我们所需做的就是将这些 API 与赛灵思软件 API 耦合,用于图像处理链中的 IP,这样我们就能快速创建软件可执行文件。要创建软件应用,我们需要将硬件设计导入到 SDK 中,为硬件创建板级支持包 (BSP)。该 BSP 内置所有所需的赛灵思 API,在与安富利的 API 耦合后,就能够驱动图像处理链中的硬件和 Zynq。

软件本身需要执行下列步骤:

• 初始化所有的 AXI 外设

• 为图像传感器轨加电

• 对安森美 Python 1300C、彩色滤波器阵列和 VDMA 进行配置

完成这些步骤后,当软件运行在 EVK 上您将看到图像正被输出到您所选定的 HDMI 监控器上,如下图所示。

图4:使用演示系统抓取的居民区场景的一帧图像

结论

在本文中我们介绍了嵌入式视觉系统的高级元素;如何简便快捷地使用软件 API 和 IP 库构建嵌入式视觉系统,如何把算法开发的增值部分添加到图像处理链中。