随着自动化程度的提高,工业成像和机器视觉应用在工业控制中变得越来越普遍,以支持提高生产率的动力。为了实现提高效率的承诺,图像处理系统需要高速运行,以确保节拍时间,即每个新单元开始生产之间的平均时间,尽可能短。
同时,市场上出现了高分辨率相机,能够进行高清晰度记录,并且可以支持生产线上组件的极细细节成像。由于使用千兆以太网,它们能够高速传输这些高质量图像。因此,图像处理软件的高性能至关重要。
这表明在硬件中实现关键算法,但工业图像处理的灵活性至关重要。不同类型的组件和组件需要特别关注某些视觉特征。组装后对PCB的检查通常是检测焊道中的断裂和挤压,指示可能的故障源。检查发动机歧管可能会寻找未对准或缺失的紧固件。虽然这些任务可能使用通用模块,例如边缘检测和模式匹配来识别感兴趣的区域,但每个模块都需要自己的一组图像处理程序来执行完整的检查任务。
灵活性将变得更加重要当调用图像处理子系统来协助设置自动化时。图像处理不仅对于检查而言是必要的,而且有助于定位机器人系统并对其进行训练。传统上机器人使用精心计算的运动轮廓进行编程,而现在他们开始使用视野内的摄像机和物体来对齐自己并确定需要拾取和处理的组件。要运行此类映像应用程序,开发人员需要一个功能工具包,可以在平台上轻松组装,具有实时运行算法所需的性能。
可视化工具包,提供一组基本功能包括工业在内的多种形式的图像处理以OpenCV库的形式提供。现在,开源OpenCV库已经成为许多领域中图像处理的流行选择,现在已达数百万行代码。到2016年,SourceForge存储库记录了超过1300万次的库下载。
OpenCV涵盖了图像处理和机器视觉应用所需的许多功能,从基本的像素级操作,如阈值处理到特征提取基于深度学习等机器学习技术进行对象识别。它的功能可以从C/C ++,Java和Python等语言中获得。
从C ++访问,OpenCV使用“cv”命名空间中的类和函数提供服务。例如,要检索存储的图像和显示,开发人员首先通过基于cv:Mat类创建对象来创建合适的图像数组。函数cv :: imread()用于赋值,将图像数据插入到使用cv :: Mat声明的数组中:
cv :: Mat图像(height,width,pixel_type);
image = cv :: imread(“image.bmp”);
镜像图像的简单操作可以通过声明一个新的Mat对象来实现 - 例如“镜像” - 并发出命令cv :: flip(image,mirrored,1)。第三个位置使用的整数决定了图像翻转的轴。
Mat数组提供对图像数据的低级别像素访问,以支持扫描区域以查找属性(例如最小值或最大值)的算法,并支持直接操作数据。但是该库还实现了在机器视觉中有用的更高级过滤功能,例如边缘检测过滤器。例如,cv :: Sobel和cv :: Laplacian调用实现了对图像的滤波器,该图像通过将图像数据与3×3或更大的矩阵进行卷积来检测像素亮度的突然变化。在源阵列上执行过滤器会生成包含可能边缘的数组。较大的内核可用于抑制高频噪声并以更高的置信度产生实际边缘。使用Canny算子等函数进行阈值处理可以提高结果的整体质量。
可以使用cv :: HoughLinesP等函数提取图像中检测到的行,并用于支持对其进行操作的算法在源图像中找到的形状。这些可用于确定是否存在预期在图像中的物体,例如发动机壳体上的紧固件。
虽然OpenCV是为计算效率而设计的,但是高分辨率的数据流量相机可以挑战纯软件实现,甚至是那些在高性能多核SoC上运行的软件。 OpenCV不仅支持在通用处理器上实现其功能,还支持在图形处理单元(GPU)甚至自定义硬件上实现其功能。保持基于软件的控制的灵活性,同时利用硬件实现下可实现的性能的一种方法是采用可编程逻辑。 Xilinx Zynq-7000提供了一种在单个SoC中访问多核CPU和可编程逻辑的便捷方式。
Zynq-7000平台将一个或两个ARM®Cortex®-A9处理器与灵活的硬件组合在一起。嵌入式现场可编程门阵列(FPGA)以及支持高速I/O的外设。 Zynq-7000器件支持两种形式的FPGA架构:一种基于Xilinx Artix-7架构,另一种基于高性能Kintex-7架构。所有这些都采用28 nm CMOS工艺实现,具有高性价比的高逻辑和存储密度。
除了基于查找表概念的灵活可编程逻辑外,Artix和Kintex架构均提供数字信号处理(DSP)资源设计用于有效处理滤波器和卷积。使用片式架构,DSP资源可以调谐到器件,Kintex提供比Artix更高的DSP引擎与位级逻辑比。超过2000条互连线将处理器复合体连接到可编程结构,有助于支持在处理模块之间传输图像数据所需的高带宽。
使用Zynq-7000平台的设计人员可以使用高级别Vivado Design Suite中的综合(HLS)技术将算法编译成可编程硬件。传统的FPGA开发是围绕硬件描述语言(HDL)构建的,例如Verily和VHDL。尽管这些HDL分别与C和Ada具有语法上的相似性,但它们的运行细节水平低于大多数软件开发人员所熟悉的程度。 Verilog和VHDL基于位级操作和组合逻辑。 HLS技术提供了将用C ++等语言表达的算法转换为硬件的能力。
HLS综合利用面向对象的C ++基础,让程序员识别并发机会,在代码中进行低级调度,为合成引擎提供如何从源代码生成硬件的方向。例如,创建用于在FPGA架构上部署的嵌套矩阵乘法运算的程序员可以识别可以在Vivado HLS实现工具中分配给硬件及其相关调度的每个循环的处理模块。在图1中,Row,Col和Product标识符表示输出块。图2显示了Row块及其包含的Col块的扩展,以及用于在块之间移动数据的两个区域。控制流循环显示合成操作的延迟。
图1:适用于FPGA实现的嵌套循环代码。
图2:在Vivado中查看的嵌套循环部分的控制流程图。
为了提高性能,设计人员可以展开循环以允许更多功能并行发生(如果可用的DSP节点和查找表)硬件可用。对于图像和视频处理工作,Vivado环境包括许多提供直接支持的库。
HLS成像库包括与OpenCV imgproc模块非常接近匹配的函数。例如,虽然软件中的OpenCV将使用cv :: Mat声明来创建在内存中保存图像所需的数组,但是有一个相应的模板类,称为hls :: Mat <>,它提供相同的核心功能。声明一个名为image的数组的等效调用将显示为:
hls :: Mat image();
而不是从磁盘读取图像,它通常使用hls :: stream <>数据类型将处理器复合体传递到FPGA架构中。在处理器空间和FPGA中处理图像之间存在关键差异。硬件结构是在假设将存在以像素流形式通过逻辑元件的加速操作流水线的情况下编程的。因此,依赖于对图像数据的随机访问的算法需要转换为可以作用于线性流的形式。
流式访问也意味着如果两个硬件映射函数需要图像,它需要重复。这通常使用hls :: Duplicate函数执行。另一个不同之处在于浮点值的处理。 OpenCV本身支持浮点运算,但这在典型FPGA的DSP资源上通常效率低下。将所有数据类型转换为定点等价物然后在将数据传递回软件例程后使用缩放转换以保持与核心OpenCV函数的兼容性是有意义的。
硬件对函数的适用性可能决定应用程序或子系统的分区。 Zynq-7000平台上与OpenCV兼容处理的参考设计之一是实现角点检测和创建覆盖图,显示图像中的所有角落。其结构如图3所示。
图3:快速应用示例的数据流结构。
与许多人一样机器视觉应用程序,实现采用管道的形式。第一个功能是灰度转换,可以通过从RGB源提取绿色通道来近似。然后进行角点检测,然后使用模块在图像上绘制角点。
应用程序在硬件使用方面的问题是在目标图像中绘制叠加层需要随机访问图像阵列,这是面向流的硬件实现不容易支持的。设计人员可以采用的方法是在FPGA和处理器复合体之间划分功能。绿色通道提取和角点检测卷积很容易在硬件中实现。一旦通过Zynq-7000的AXI4接口将图像流回处理器存储器,就可以在图像上执行角图绘制功能,这些图像的计算密集度较低。
涉及数字的更复杂的图像处理系统执行提取,识别和其他任务的协作模块可能涉及比固定延迟流水线更复杂的架构。例如,不同的情况可能需要对图像进行更密集的处理。例外情况可能会触发对部分数据的更深入分析。这些考虑使调度变得复杂。最简单的选择是在处理器复合体上运行自由选择的函数,但如果某些函数是计算密集型的,则存在整体系统性能受损并且控制例程将错过关键期限的风险。 FPGA的区域可以保留用于计算密集型功能,但除非留出大部分,否则无法保证资源在某些条件下可用。所需要的是在处理器复合体和其他加速器之间分配功能的动态方法,例如能够在FPGA架构上运行的加速器。
嵌入式多核构建模块(EMB2)库提供动态所需的支持预定的异构系统。 EMB2库可从GitHub获得,为各种嵌入式实时应用程序提供一组设计模式,这些应用程序需要在GPU,GPU和可编程硬件上实现高性能计算支持,以及支持OpenCV等环境的C ++包装器。
EMB2库符合多核任务管理应用程序编程接口(MTAPI),由多核协会定义,以确保跨异构计算平台的高可移植性。 MTAPI体系结构将工作负载组织为一组任务和队列,后者用于实现数据元素流的处理流程。任务提供了将多个工作包彼此同步所需的组织。
EMB2和MTAPI的一个关键方面是它们支持能够对同一任务使用不同实现的概念。如果构成库的一部分的调度程序确定硬件结构中有资源可用,则它将运行能够实例化必要逻辑的代码版本,并允许数据流入和流出。如果处理器上有更大的空间,则可以标记纯软件版本以备运行。开发人员只需确保两个表单都可供调度程序调用。结果是高性能应用程序的灵活执行环境和适合OpenCV架构的应用程序。
结论
由于灵活的开源库和平台的结合提供高速微处理器和可编程硬件,现在可以实现适用于工业物联网的高效机器视觉应用。
全部0条评论
快来发表一下你的评论吧 !