手机相机验钞真假(智能相机检验钞票真伪)

利用开源软件和模块化嵌入式硬件,快速开发验钞系统。

文/Ricardo Ribalda博士;Qtechnology公司首席固件工程师

传统上,许多视觉系统构建者开发定制的视觉系统,都是使用现成的基于Windows的PC硬件和供应商提供的软件库。然而最新的一种发展趋势是:使用较便宜的嵌入式系统硬件、开源操作系统软件(如Linux)以及开源图像处理库(如OpenCV)。

丹麦相机供应商Qtechnology公司最近与美国AMD公司和美国Mentor Graphics公司合作,展示了如何使用嵌入式系统和开源软件快速而有效地构建这样的工业机器视觉应用。

在这项展示中,Qtechnology公司使用的工业相机,采用的是AMD公司的R系列片上系统(SoC,此前代号为“Merlin Falcon”),其上运行Mentor嵌入式Linux操作系统。Qtechnology公司已经用这款相机开发出了一套执行纸币高速扫描和验证的视觉系统。

该应用突出显示了如何通过使用具有特定光谱范围的光源扫描纸币、并使用Qtechnology相机捕获纸币的图像,然后通过检查生成的图像来识别纸币真伪(见图1)。为了实现实时性能,该软件使用Mentor EmbeddedSourcery CodeBench和Integrated SourceryAnalyzer进行分析和优化,以识别和解决功能和性能问题。

手机相机验钞真假(智能相机检验钞票真伪)(1)

图1:展示中使用的工业相机,采用AMD R系列SoC,运行Mentor嵌入式Linux操作系统。Qtechnology已经利用该相机创建了一套执行纸币高速扫描和验证的视觉系统。

相机和软件

Qtechnology相机为模块化产品,并且包含可以安装各种CMOS、CCD、InGaAs和微测辐射热计传感器的多种机头。还有各种相机机身,从纯FPGA系统(QT5012)到包含两个主要计算单元(QT5122)的全新系统:FPGA和AMD的R系列SoC,其具有四个Excavator x86CPU内核,并且在单个芯片上具有Radeon图形GPU和I/O控制器。该系统的模块化特性使开发人员可以将机头与机身混合和匹配,以满足其应用需求(见图2a和2b)。

手机相机验钞真假(智能相机检验钞票真伪)(2)

图2a:Qtechnology相机包括多个机头,可以安装各种CMOS、CCD、InGaAs和微测辐射热计传感器;图中还显示了一个机身(QT5122)。

相机内的FPGA控制传感器的设置,处理图像并通过PCIe接口传输捕获的图像。几项操作由FPGA执行,如图像、白平衡、透视和照明校正,从而将这些任务从CPU中分离出来。

一旦图像经过FPGA的预处理,就将通过PCI ExpressGen2 x4接口传输到R系列SOC。如果需要进一步的计算能力,则可以在相机主体内添加额外的GPU。但对于大多数应用来说,R系列SOC的计算能力就足够了。

手机相机验钞真假(智能相机检验钞票真伪)(3)

图2b:主体包含两个主要的计算单元:FPGA和AMD的R系列SOC,该SOC在单个芯片上具有全部四个Excavator x86CPU内核、Radeon图形GPU和I/O控制器。

访问系统中GPU计算单元的功能,是通过开放式计算语言(OpenCL)来实现的,OpenCL语言是由非营利技术联盟美国Khronos Group维护的开放标准,用于编程并在诸如FPGA、CPU和GPU之类的设备上执行程序。类似地,图像传感器的功能可以通过Video4Linux访问,这是一组设备驱动程序和用于在Linux系统上支持视频捕获的API。这样能够控制诸如图像分辨率和帧率等参数,使用户无需使用专有库。

由于Qtechnology平台的开放架构,开发人员有许多编程选项可供选择(见图3)。首先,可以使用C或C 创建应用程序。其次,可以通过连接一些专有的或第三方图像处理插件部署开源软件,如GStreamer来处理图像数据,创建自定义的流程化软件。第三,可以使用Open CV或Python编写的图像处理函数库,或通过重新使用美国MathWorks公司的MATLAB,或德国MVTec公司的HALCON的第三方库函数来开发程序软件,进而开发程序。

手机相机验钞真假(智能相机检验钞票真伪)(4)

图3:应用程序可以使用C或C 开发。或者,可以通过连接一些专有的或第三方图像处理插件,采用诸如GStreamer之类的免费开源软件来处理图像数据,进而创建自定义流程化软件。此外,可以使用已经以Open CV、Python或第三方库编写的图像处理功能库来开发程序。

钞票特征

然而,在编写任何应用软件之前,开发人员必须了解被检查产品的特性,这将决定相机和光源技术的选择。由于Qtechnology相机的模块化特性,因此用Qtechnology相机来实现这些任务较为简单。视觉研究人员将开发单个应用程序,然后对不同的机头/传感器进行实验,这将大大缩短探索解决方案空间的时间。

为了辨别实际和伪造的纸币,确定在红外(IR)光照射下,只有翡翠色数字、主图像的右侧和银色条纹在钞票的正面可见。在反面,只有数值和水平序列号是可见的(见图4)。

手机相机验钞真假(智能相机检验钞票真伪)(5)

图4a和b:通过用红外光照射钞票的正面,只有翡翠色数字、主图像的右侧和银色条纹是可见的。在背面,只有数值和水平序列号可见。

因此,决定使用卤素灯作为IR光源来照亮纸币,并使用Qtechnology公司的单色CMOS相机拍摄图像:使用配备比利时CMOSIS公司的单色红外增强200万像素成像器的Qtec QT5122机身,加上红外滤光片。对欧元真钞拍摄的图像将丢失所有左侧的细节;而在伪钞中,细节将仍然清楚。这是因为欧元纸币使用吸收红外光的墨水,而伪钞(可能影印)反射IR波长。

一旦选择了系统的硬件,就可以用相机拍摄纸币的图像,并且可以开发图像处理软件。为了方便相机的编程,Qtechnology公司已开发了一种基于Web的界面,可以通过远程方式对相机编程(见图5)。基于Web的工具通过Video4Linux接口访问相机硬件,可以轻松在数十种设置中导航,例如传感器的位模式、响应曲线、触发模式和颜色映射。

手机相机验钞真假(智能相机检验钞票真伪)(6)

图5:一旦选择了系统硬件,就可以用相机拍摄纸币的图像,并且可以开发图像处理软件。为了方便相机的编程,Qtechnology公司已开发了一种基于Web的界面,可以通过远程方式对相机编程。

通过使用基于网络的工具,可以选择欧元纸币图像中的感兴趣区域(ROI),当用红外光照亮欧元时,真钞的细节应不可见。这些工具还可以在软件中设置系统的帧率。当然,也可以在软件中分析纸币的整体图像。然而,通过使用较小的ROI,可以实现系统的最大帧率(高达超过1000fps)。得益于PCIe Gen2 x4与APU的连接,机身可以接收高达2GB/s的数据。

一旦图像被采样,它们便能以JPEG格式或无损格式保存。为了分析图像,开发人员可以使用JupyterNotebook。这使得程序员能够创建和共享包含实时代码、方程式、可视化和说明文本的文档。使用Notebook,开发人员可以使用Python编程语言对嵌入式系统进行编程,从而可以访问Open CV和NumPy/SciPy图像处理库,使它们可以组合在单个程序中。

钞票识别

对于钞票识别,使用Jupyter Notebook接口可轻松实现该算法。图像处理链的第一阶段涉及通过将Canny滤波应用于欧元纸币的图像,来定位纸币的边缘。使用静态交互式小部件或滑块来校准上限和下限阈值的数值。

在执行边缘检测时,选择并应用填充算法来填充图像中的所有封闭区域,之后检测到纸币的轮廓,以确定图像内纸币的特定位置(见图6)。

手机相机验钞真假(智能相机检验钞票真伪)(7)

图6:图像处理的第一阶段包括在每个图像中定位纸币。为完成此任务,应用Canny滤镜来检测纸币的边缘。在执行边缘检测时,应用填充算法来填充图像中的所有封闭区域,之后可以检测纸币的轮廓,以确定图像内纸币的特定位置。

一旦确定了纸币的位置,则图像内的ROI对应真钞的特征位置。当用红外光源照射纸币时,这些特征将不可见(见图7)。

因为真钞上的特征在ROI中实际上是不可见的,所以分析该区域可以确定纸币的真伪。为此,应用简单的阈值分类器来确定ROI中的像素数。通过在软件中设置分类器的阈值,可以确定ROI下的像素强度值,然后确定货币的真实性。这样做后,纸币就会被标记,以表明它们是真钞还是假钞。

该系统依赖于照明光源,所以重要的是要确保钞票样本被充分照亮。因此,可能需要调整分类器的阈值,以适应用于照亮钞票的不同亮度水平。

使用Jupiter Notebook接口,可以轻松调整和调试算法,以数字和图形方式显示任何中间结果。

手机相机验钞真假(智能相机检验钞票真伪)(8)

图7:一旦确定了纸币的位置,则图像内的ROI对应真钞的特征位置。当红外光源照射纸币时,这些特征将不可见。

代码优化

一旦开发出了正确的视觉算法,重要的是实现可以期望的吞吐量运行。它被优化以在嵌入式AMD R系列SoC上有效运行,以确保最佳地利用设备上的四个Excavator x86CPU内核。

在这种情况下,使用Gstreamer来实施,这是一种多媒体框架,将各种定制或现成的称为插件的媒体处理元素链接到软件流程中。因此,分析过程的第一步涉及将图像处理软件转换成标记为“Euronote”的GStreamer插件。

使用Gstreamer,现有的Video4Linux插件用于从200万像素相机将图像提取到流程中,并将帧率设置为100fps。然后,使用另一个Gstreamer插件将图像发送到Euronote插件,之后可以将其缩放为1024×768的I420格式,在这里图像以YUV显示。

一旦写入应用程序,Mentor的源分析器被用来确定执行速度。为此,复制代码到Mentor EmbeddedSourcery CodeBench中,从而可以将二进制代码传输到目标AMD处理器、并在此执行二进制代码。然后SourceryAnalyzer以图形方式突出显示CPU统计信息,显示每个核心在给定状态下花费的时间,调度统计数据,突出显示每个核心上运行的软件线程和线程迁移速率,或系统调度程序在内核之间移动软件线程的频率。

吞吐量分析

Sourcery Analyzer可以在Euronote Gstreamer应用程序上执行吞吐量分析。如果系统不符合应用程序要求的图像捕获速率,可以从SourceryAnalyzer环境访问Euronote软件程序。这样可以将所获取的图像的尺寸在应用于Euronote应用程序之前进行缩放以进行处理,从而提高可以获取的每秒帧数。

然而,如果缩放图像尺寸仍然不能有效地提高系统的速度,则可以通过确保嵌入式处理器中的所有四个ALU全部被利用,来进一步提高性能。通过在Mentor EmbeddedSourcery Analyzer上使用缩放跟踪器,可以确定使用的SoC上的ALU数量。

如果正在使用处理能力,则可以优化程序的执行,使得可以并行运行多个线程或Euronote应用程序的组件。为此,可以从分析器和软件中创建的队列再次访问Gstreamer代码,以优化流程。一旦实现,可以使用SourceryAnalyzer再次执行和分析结果代码(见图8)。

手机相机验钞真假(智能相机检验钞票真伪)(9)

图8:通过在Mentor Embedded Sourcery Analyzer上使用缩放追踪器,可以确定使用的SoC上的ALU数量。如果处理能力未得到充分利用,则可以优化程序的执行,使得可以调度多个线程或Euronote应用程序的组件并行运行。

然而,使用这种技术并不是没有限制的。将代码并行化以在多个CPU上运行,系统的性能可能仍然不到最佳。图像不是通过流水线,而是被复制到队列中,这个过程本身引入了一些耗费。这可以通过使用SourceryAnalyzer中的内存分配器追踪器进行验证,并查看分配给进程的内存量。

然而,通过Sourcery Analyzer返回到Euronote代码,并确保在执行Euronote应用程序期间,没有图像数据存储在队列中,可以轻松解决此问题。一旦已实现,程序可以保存、再次执行,并使用SourceryAnalyzer查看执行结果。

优化系统

通过使用Mentor嵌入式工具优化系统性能实现的结果总结在图9中。在优化之前,系统只能以20fps的速率捕获图像,而图像采集和处理输出之间的延迟为45ms。调整了图像数据的大小后,图像捕获速率提高到50fps,延迟20ms。通过在进程中引入队列,可以将系统吞吐量进一步提高到60fps,延迟400ms。最后,通过限制缓冲区的最大大小,系统以100fps的速率、35ms的延迟拍摄图像。

手机相机验钞真假(智能相机检验钞票真伪)(10)

图9:在优化之前,系统能以20fps的速率捕获图像,而图像采集和处理输出之间的延迟为45ms。调整了图像数据的大小后,图像捕获速率提高到50fps,延迟20ms。通过在进程中引入队列,系统吞吐量提高到60fps,延迟400ms。最后,通过限制缓冲区的最大大小,系统以100fps的帧率、35ms的延迟拍摄图像。

毫无疑问,使用开源操作系统软件,免费提供的图像处理软件库,加上使用先进的系统诊断工具和便宜的模块化相机硬件,将继续为开发人员提供经济的方式来开发机器视觉应用。事实上,这种硬件和软件的扩散,可能最终为依赖于专有架构的许多现有软件-硬件供应商提出了重大挑战。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页