FPGA Xilinx Zynq 系列(十四)应用和机会 之 图像和视频处理,及计算机视觉

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来FPGA Xilinx Zynq 系列第十四篇,本篇内容目录简介如下:

5. 应用和机会 (“ 拿它能做什么?”)

5.5 图像和视频处理,及计算机视觉

5.5.1 图像与视频处理

5.5.2 计算机视觉

5.5.3 抽象的层级

5.5.4 图像处理系统的实现

5.5.5 Zynq 上的计算机视觉的例子:道路标识识别

本系列分享来源于《The Zynq Book》,Louise H. Crockett, Ross A. Elliot,Martin A. Enderwitz, Robert W. Stewart. L. H. Crockett, R. A. Elliot, M. A. Enderwitz and R. W. Stewart, The Zynq Book: Embedded Processing with the ARM Cortex-A9 on the Xilinx Zynq-7000 All Programmable SoC, First Edition, Strathclyde Academic Media, 2016。

应用和机会(拿它能做什么?)

5.5 图像和视频处理,及计算机视觉

图像和视频处理的领域是丰富多样的,经常出现在消费和商业产品中,也能在医药、工业、防务和安全及许多其他领域找到它的应用。

图像处理被认为是处理单个的,或者说 “ 静止 ” 的图像,而视频处理指的是一系列时序的图像 (“ 帧 ”),通常以特定的帧速率构成。计算机视觉 (或 “ 机器视觉 ” 或 “ 嵌入式视觉 ”)系统则加上了诸如能从图像或视频数据中析取出有意义的数据的智能性。然后就可能基于这样的数据来做出相应的决策。

5.5.1. 图像与视频处理

有很多图像和视频处理专用的技术,总体上可以分类为:(一)增强或调整图像;(二)从中析取数据;或(三)压缩图像和视频数据。已经出过很多关于这些主题的书了,本书没有足够的篇幅来详细描述它们,只能提几个具有代表性的例子。读者可以参考 [13] 中关于理论性的背景知识和例子,以及参考 [3] 中关于实现的前景。

图像处理的特征是它具有巨大的并行性:每个图像,或等价的视频的每个帧, 是由二维的像素点的矩阵组成的,而且在 X 和 Y 轴上可能有超过 1000 个像素点。比如,全高清 (HD)视频通常定义为 1920 x 1080 个像素点,也就是总共有 2,073, 600 个像素点。还得考虑到每个像素点是由三个通道组成的才能表达颜色。如果用8 位的通道来分别表达红色、绿色和蓝色的数据,这样每个像素点就需要 24 位,而每幅 HD 图像就需要 49,766,400 位。数码相机产生的图片可能还会更大。考虑到这么大的尺寸,因此任何对单个像素点的计算就需要大量的计算并行展开,这就是很适合在 FPGA 或是 Zynq 芯片的 PL 部分上做的事情了。当然,最好能降低要计算的数据的量,而且有些图像处理是可以在更高的抽象层级上做的,在较少的数据上执行更高级的算法,也就是可能由软件来做。在 5.5.3 节和后面的 5.5.4 节会继续讨论这个话题。

对于视频处理,更多的关注在压缩方面。单幅图片通常在空间域上压缩来缩减 文件大小,但是在视频应用中,当帧速率达到每秒 100 帧 (在某些特殊应用中更高)的时候,由于涉及到更为大量的数据,对压缩的需求尤为突出,还可能需要实时计算的约束。但是时间域给压缩提供了进一步的机会,因为连续的视频帧往往存在高度的重合。可以用算法来发送一小段时间片段内完整的、最新的帧,然后在这些帧之间,对帧与帧之间的不同进行编码。已经存在很好的视频压缩标准了,而且还在不断地发展和进步 [21][30]。

5.5.2. 计算机视觉

计算机视觉系统能够用于静止图像或视频,并且能够从图像的内容中析取出有意义的数据来。其中的一个实例就是能够在图像中识别出物体的形状、颜色或大小来。这有很多实际应用,范围从制造业到监控、交通管理、食物处理、医药、生物计量甚至空间探索。

作为一个说明性的例子,可以考虑如何在闭路电视 (Closed Circuit Television,CCTV)画面中识别出每个人,这样被拍摄的区域中出现的人数就可以确定了。不仅于此,一个计算机视觉系统可能可以识别出诸如打斗或骚乱这样的事件。基于 Zynq 的计算机视觉的商业案例已经出现,比如视觉场景理解 [46]。当然,正如前面所提到过的,还有很多常规的计算机视觉应用,比如根据水果和蔬菜的大小、形状和表皮对其质量进行分类 [47]!

5.5.3. 抽象的层级

图像处理(作为整体,也就是包括了视频处理和计算机视觉)可以按照所处理 的图像数据的数量和与图像内容有关的了解程度,被分成三个抽象层级。正如在5.5.4 节中所谈到的,这样的抽象层级的选择,以及每个层级上所施加的计算的类型,使得Zynq成为图像和视频处理——尤其是计算机视觉——的非常合适的平台。图 5.7 中所示的抽象层级详述如下 (按照从下到上的顺序):

图 5.7: 图像处理中的抽象

  • 像素点 — 像素级别的处理代表着最低层级的抽象,要处理最大数量的数据, 并对内容有很少的了解,以及很少的图像意义。像素级别的处理可以包括对图像的色彩平衡或对比度的调整,或者是邻域滤波(比如平滑操作来降低噪声,或 Sobel 滤波来高亮边缘 [3][13])。通常这些像素级别的任务本身可能具有几个阶段,而且都是在其他操作之前完成的,因此被叫做 “ 预处理 ”。
  • 特征与目标 — 作为从图像中析取数据的过程的一部分,特征与目标要被检测到。这包括线条、曲线、形状和区域的识别。有多种技术可以用来帮助实现从像素到特征和目标的转化,包括 Hough 变换、色彩识别、阈值和单一化[3][13]。
  • 描述 — 识别出图像中相关的特征或目标之后,最后的一关是获得这幅图像所表达的知识,也就是对它的内容的描述。在这个阶段,数据不再是图像了,而是文字或数字的描述。要实现描述可能会涉及到提取出已经识别出来的特征的参数并加以解释,或是根据预先确定的指标或训练集对图像做分类[3][13]。

如前所述,计算机视觉需要识别出特征和目标来,这样就能从图像中析取出含义来。这就牵涉到复杂的运算和软件算法。比如,为了判断是否有车辆,就可能必须在图像中分析识别出来的线条,然后甚至可以把车辆的类型分类为摩托车、小汽车、大巴等。这个阶段表达了向图 5.7 中所示的最高抽象层级的转化,从而能得到图像内容的描述。比如,在图 5.8 中,图像显示的是交叉路口的小车。汽车的数量可以用计算机视觉算法被检测并记录下来,然后甚至还可以根据行驶的方向做出分类来。

视频处理应用还可能进一步调用目标追踪,比如如果在 CCTV 画面中识别出感兴趣的人了,那个人在画面中的进一步的运动就可以被追踪。类似的,如果路口的画面形成了视频,那么车辆就可以被追踪。

从图像处理和计算机视觉算法中获得的数据可以用作更高层级应用的数据。比如,在车辆识别的实例中,计算机视觉系统可以提供关于车辆通过一个路口的统计数据,可以用来做交通管理和城市规划。

5.5.4. 图像处理系统的实现

考虑图像处理系统的一般实现的话,显然对于不同的类型和不同的数据量,需要不同的处理类型。回顾图 5.7,起点可能是非常大量的像素数据,对它要做简单的、重复性的操作,而在更高的抽象层级上,计算机视觉技术是对较小数据集 (可能就只表达了线条或形状)进行计算的,但是算法复杂得多。

图 5.8: 可以用计算机视觉来检测路口车辆

因此,Zynq 是适合图像处理的高度优化的平台。PL 很适合诸如像素点级别的图像处理所需的快速、并行的操作。计算机视觉功能则可以由运行在 Zynq 的 PS 上的软件来实现,然后还需要与更高层级上的软件应用做集成。这两者之间通过对图像内的特征与目标的检测而进行的转换,可以由带着与 PS之间恰当接口的 PL来实现,也可以利用 NEON 处理器的 SIMD 功能。对 NEON 的丰富的支持在第三方图像和视频处理产品中可以找到 [28]。

除了芯片的架构,我们还应该考虑在促进为 Zynq 开发图像处理系统的设计中, Xilinx 和第三方开发工具的作用。以下罗列了一些值得一提的相关说明:

  • Xilinx IP 包 — 在 IP Integrator 里有很多 IP 包是用于图像和视频处理应 用的,包括视频存储、图像增强和色彩调整功能。
  • OpenCV — 开放计算机视觉 (Open Computer Vision)是一个开源项目,实 现了一组用于图像和视频处理的 C/C++ 库 [34]。OpenCV 的工具可以用来开发运行在 PS 上的软件算法。
  • Vivado HLS 视频库 — Vivado HLS 包含一个能综合到 HDL 里去的函数库,实 现了对图像和视频处理的特殊支持。这些函数可以替代部分 OpenCV 函数,因此如有需要,对应的功能就能方便地被划分到硬件中去 [31]。
  • MATLAB / Simulink — MATLAB 和 Simulink 提供了丰富的用于图像和视频处 理以及计算机视觉的工具 [27]。不仅提供相关的函数和开发环境,还可以把开发好的算法转换成能实现在 Zynq 上的 C/C++ 代码。

5.5.5. Zynq 上的计算机视觉的例子:道路标识识别

计算机视觉在汽车和交通管理领域有一些应用,包括驾驶员安全和辅助系统、 智能运输系统、交通执法、交通流量分析、自动牌照识别等等 [7][14]。

文献 [37] 提出了一个有趣的应用,是基于 Zynq 平台的。要解决的问题是要基于捕获的图像来识别道路标识,目的是告知驾驶员辅助系统(甚至可以直接告知自动化的车辆)车辆周边的环境,以及任何强行管制。系统由三个部分组成:在 ZynqPL中的预处理 (色彩调整等),在 PS 中的进一步的处理 (形态、边缘和形状检测),以及最后经过与数据库的比对而对标识的分类(也是在 PS 中做的)。作者指出,由于 AXI 的易用性、Xilinx 工具提供的支持以及 OpenCV 库提供的功能,这个系统只用了六个星期就设计出来了。

第十四篇到此结束,下一篇将带来第十五篇,ZYNQ应用和机会 之 动态片上系统、更多的机会:Zynq 的 “ 生态系统 ”、本章回顾以及参考文献等相关内容。欢迎各位大侠一起交流学习,共同进步。

END

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!