APP下载

实时图像识别系统PCI驱动程序设计与开发

2014-12-23冉义兵

计算机工程与设计 2014年9期
关键词:驱动程序图像识别调用

冉义兵,魏 东,王 义

(北京建筑大学 电气与信息工程学院,北京100044)

0 引 言

制约图像识别技术应用的因素之一是实时性问题[1,2]。CogniMen是一款用于模式识别的非冯·诺依曼架构的全并行硅神经网络芯片,通过硬件实现神经网络识别算法,与目前广泛使用的、软件实现的神经网络识别系统相比,提高了实时性[3,4]。本文研究的实时图像识别系统是以集成了CogniMen神经网络芯片的PCI板卡 (KN1-A)为硬件基础,以Windows系统上层应用为软件平台的图像识别系统。由于Windows操作系统是分时多任务系统,一方面“系统态”和 “用户态”空间划分使得执行在用户态的程序不能直接访问硬件设备资源 (I/O、中断、RAM)[5],另一方面Windows操作系统本质上为冯·诺依曼架构的串行指令,与KN1-A 本质上为非冯·诺依曼架构的并行神经网络计算之间存在着影响实时性的矛盾,降低了神经网络芯片的识别效率。设备驱动程序执行于内核空间模态,拥有系统资源最高访问权限,可用于为用户空间程序调用设备硬件资源提供规范化的软件接口和服务[6],因此,设备驱动程序对应用程序与硬件资源之间的通信起着至关重要的作用,是解决实时性矛盾的最佳着力点。

文献 [7-9]介绍了利用DMA 模块实现提高数据传输速率的方法,在此基础上,结合所研究的实时图像识别系统特点,提出了一种类FACADE 设计模式,采用MDL 内存描述方法在Windows平台下设计和开发了实时图像识别系统PCI设备WDM 驱动程序。实验结果表明,采用本文提出的方法可使图像识别搜索效率得到较大幅度的提高,能够解决该图像识别系统的实时性问题。

1 实时图像识别系统

KN1-A是用于模式识别、数据挖掘等相关领域科学研究与工程应用的PCI神经网络板卡。其硬件算法采用类RBF人工神经网络算法实现[10]。视频图像信号输入PC 处理器,经过简单预处理后下载到KN1-A 神经网络板卡的Memory中,由实时识别引擎提取样本特征分量,建立/利用判决空间,学习/识别特征类别。实时硬件识别系统如图1所示。

图1 实时图像识别硬件系统框架

对于硬件实现的实时图像识别系统,要进行大量的数据传输和硬件设备寄存器读写操作。假定某实时视频流的每帧图像752*480像素,若按照4*4像素步长对感兴趣的目标进行识别搜索,每次搜索进行6 次硬件寄存器读/写,那么每帧图像要进行135 360次寄存器读/写操作,为保证连续性,每秒至少需要处理20 帧,则每秒需要进行2 707 200次寄存器读/写,每秒要向硬件设备传输约8 M的图像数据。如果图像长、宽像素增大则传输的数据量呈平方增大。图像大小不变时,为了使识别更精确需将搜索步长缩小,则操作次数呈平方增大。因此,提高PCI硬件设备数据传输速率,并要避免频繁读写硬件寄存器造成延时,成为驱动程序设计所面临的挑战。

2 驱动程序设计

2.1 关键问题分析

Windows系统是多任务分时操作系统,应用程序处于Ring3层优先级最低。应用程序2次调用驱动例程会造成硬件操作之间产生时间间隔T1。而从用户空间到内核空间的驱动程序调用需要进行复杂的函数调用,这会产生调用延时T2。假设每次识别处理要进行n次操作,循环N 次,则一共产生延时为

普通设计模式是将每个功能的硬件操作封装为一个API函数,在上层应用程序中按照一定序列调用这些接口函数完成特定的应用。这种普通模式如图2所示。

图2 普通模式

2.2 类FACADE模式

基于上文内容,提出类FACADE模式,该模式是在驱动例程中开辟大空间内存,将一帧图像数据一次连续写入设备,在驱动程序中循环完成全图识别搜索处理,最后将识别结果序列通过统一的输出接口传递给上层应用程序。这种方式能够简化二次开发用户函数接口,提高识别处理速率,缩短时间N*n* (T1+T2)。类FACADE的结构如图3所示。

图3 类FACADE模式

2.3 驱动程序架构

KN1-A 面向图像识别、数据挖掘等高级应用二次开发用户,采用硬件实现复杂的数学运算功能,并为二次开发用户提供了丰富的操控硬件的API函数接口。鉴于KN1-A的特点,驱动程序整体设计思想是利用DDK 开发设备驱动程序代码,并利用动态库共享技术 (DLL)封装操控设备的API函数接口;在上层利用VC++开发Demo应用程序测试和验证驱动程序。驱动程序的架构设计和实现技术如图4所示。

2.4 用户接口

上层应用程序开发用户需要对设备进行多种操作和控制,通过对需求进行分析,得出主要涉及到神经网络、识别引擎以及PCI板级控制3个方面的接口。上述三部分每个部分有相应的寄存器,每个寄存器需要定义一个相应的接口函数,同时针对每个寄存器的位操作又能派生出若干函数接口。因此,可以定义三类基本接口函数,其它功能操作由这三类扩展,派生的用户程序接口 (API)达127个。这三类基本函数接口,分别为打开/关闭设备、读/写神经元、读/写图像内存,函数定义如下:

图4 驱动程序架构及实现技术

3 驱动程序开发

3.1 开发工具的选择

Windows设备驱动程序的开发工具选择有多种,可以直接利用微软提供的设备驱动开发包 (device driver kit,DDK),也可采用DriverWork、DriverStudio、WinDriver等第三方开发工具。利用第三方驱动开发套件有助于缩短开发周期、减少代码量、提高开发效率[11,12],但其开发灵活性、易维护性,特别是运行效率不及DDK 开发的设备驱动程序,因此对于实时性要求高的硬件设备驱动程序开发,直接利用DDK 基于Windows WDM 驱动模型进行开发是较好的选择。

3.2 WDM 驱动程序

3.2.1 WDM 驱动程程序结构

Windows 驱动程序模型 (windows driver model,WDM)是一个分层驱动程序模型[9],也是Microsoft推荐的驱动模型,其目的在于简化驱动程序的开发过程,使驱动程序开发更灵活[10]。WDM 驱动程序的层次结构中包括总线驱动程序、过滤驱动程序和功能驱动程序,总线驱动程序负责枚举总线设备和监视设备添加和删除,为每个新插入硬件设备创建一个物理设备对象 (PDO)。功能设备驱动程序分层在总线驱动程序之上,它为自己的设备创建一个功能设备对象 (FDO)放在设备堆栈中,负责处理设备的主要功能。当系统接收到用户对设备操作的请求,将其封装为I/O 请求派遣包 (IRP)的数据结构,从设备堆栈的最上层,经过层层过滤传往下层程序。每层驱动程序可以决定如何处理IRP或者直接传递给下层驱动。在WDM 模型中PDO 和FDO 是必须的,过滤驱动程序则不是必须的[9]。WDM 驱动程序的层次结构如图5所示。

图5 WDM 驱动程序层次结构

3.2.2 核心对象

驱动对象 (DriverObject)是对设备硬件操作的抽象结合,是设备驱动程序的代表,由WDM 头文件中的DRIVER_OBJECT 结构详细描述。当I/O 管理器载入驱动程序时,调用驱动程序的入口例程DriverEntry,实例化一个驱动程序对象,例程中MajorFunction []是一个指针数组,指向驱动程序中的回调例程,这些例程包括即插即用 (IRP_MJ_PNP)、创建 (IRP_MJ_CREATE)、读 (IRP_MJ_READ)、写 (IRP_MJ_WRITE)、设备控制 (IRP_MJ _DEVICE _CONTROL)、关闭 (IRP _MJ _CLOSE)等20多种IRP回调例程。

3.3 入口

每个驱动程序都必须有一个初始化的入口函数Driver-Entry,该函数向系统注册了其它例程的入口地址。驱动程序首次被装载时,I/O 管理器调用入口函数,完成各派遣函数的注册,这些例程包括AddDevice、Unload以及MajorFunction指针数组等,其中MajorFunction指针数组分别为创建 (IRP_MJ_CREATE)、关闭 (IRP_MJ_CREATE)、读 (IRP _MJ _READ)、写 (IRP _MJ _WRITE)、设备控制 (IRP_MJ_DEVICE_CONTROL)等派遣例程函数地址。

驱动程序只有在首次装载时进入DriverEntry函数,应用程序调用设备操作时驱动程序根据应用程序不同的操作发起相应的IRP请求,直接进入相应IRP派遣函数。

3.4 即插即用

即插即用函数由IRP_MJ_PNP请求消息触发,对应于入口函数中注册的回调函数KnpciPnp地址。当设备驱动装载成功后,每次插入设备,由PnP管理器发起创建添加设备,完成设备资源的枚举查询,设备I/O、RAM、中断等资源的初始化注册。对Memory资源进行内存地址映射的键代码如下:

//获取设备扩展的映射虚拟基址1

3.5 MDL读/写

读写设备数据是驱动程序的本质核心。驱动程序可以使用直接I/O 和缓冲I/O 这2种方法访问用户缓冲区。通常用户模式下的缓冲区在虚拟内存上是连续的,但是在物理内存上可能是离散的。

缓冲I/O 方式是内核与用户缓冲区通过某个非分页内存间复制实现读写。而直接I/O 使用内存描述符列表(memory descriptor list,MDL)建立用户缓冲区与内核地址间的映射。操作系统先将用户模式下的缓冲区锁定,然后再将这段缓冲区在内核模式下映射一次,内核和用户模式下的缓冲区指向同一块物理内存,这样可以避免频繁复制,提高速度。MDL方式读写关键代码:

通过示波器显示,缓冲I/O 和利用MDL技术的直接I/O 方式单个数据周期见表1,结果表明采用MDL 技术较DeviceIoControl缓冲I/O 方法使得传输速率提高8.7倍。

表1 2种方式读写对比

4 应用测试

4.1 向量识别

4.1.1 向量识别程序

应用程序和驱动程序之间可以通过guid建立连接,驱动程序在AddDevice例程中调用IoRegisterDeviceInterface注册设备接口,而在应用程序中调用GetDeviceViaInterface寻找设备接口。利用DLL动态库共享技术,可以把设备操作封装为系列接口函数。建立向量识别测试程序,调用DLL相应函数接口主要代码如下:

4.1.2 向量识别结果

学习Vector1、Vector2使用2 个神经元,建立知识样本判决空间,然后再分别输入Vector1、Vector3、Vector4进行识别,Vector1 与判决空间中Vector1 范本完全一致,因此识别结果为确定,距离为0;Vector3 与判决空间中Vector1、Vector2都很靠近,因此识别结果为不确定,距离不一样;Vector4与判决空间中Vector1、Vector2的距离都相差甚远,因此识别结果为未知,即不识别。距离是表征外部输入与网络内部储存样本相似性尺度,采用曼哈顿距离[10]。向量识别结果如图6所示。

4.2 车牌识别

图像识别的本质是对感兴趣区域的特征向量进行识别,因此向量识别的原理同样能用于图像识别。KN1-A 在底层硬件化实现感兴趣区域的特征向量提取。本文分别基于普通设计模式和类FACADE设计模式开发出的驱动程序,在Windows XP系统平台下开发了车牌识别应用程序,对752*480单帧图像的识别进行了比较,按照64*128像素大小的识别框,以4*4像素步长进行全图扫描识别搜索。比较结果表明,调用类FACADE模式开发的驱动程序可使搜索速度提高约20倍。搜索是指在一块连续的图像区域中,按照设定的识别框大小和移动步长,以识别框所选定的图像信息 (位置、大小、像素)作为输入,经过KN1A 神经网络板卡识别处理,通过调用相应的接口函数获得识别结果并报告出来这一过程。基于普通模式设计驱动程序时,上层应用程序一次识别,即图7中红色识别框移动一个步长(4像素),需要调用至少10个接口函数 (写偏移位置,读背景、距离、影响域、类别、分量等),单帧752*480 图像按照4*4步长需要循环22560 次。基于类FACADE 模式设计的驱动程序,对单帧图像进行识别只需调用3个接口函数,分别是打开设备、传递参数 (图像大小、识别框大小、步长等)、读取识别结果 (背景、距离、影响域、类别、分量等)。识别效果如图7所示。

图6 向量识别结果

图7 车牌识别结果

5 结束语

针对实时识别系统这一应用,本文分析了其驱动程序设计的关键问题,驱动程序开发需要解决大量数据传输和频繁调用驱动例程而严重降低系统实时性和识别搜索效率等问题。结合这一特点,本文提出了类FACADE 设计模式,利用MDL方法读写硬件设备,避免频繁复制,提高传输速度,以解决识别处理实时性问题。向量识别和车牌识别程序测试结果表明,所开发的驱动程序运行稳定;通过类FACADE设计模式和MDL 技术,可以使图像识别系统的识别搜索效率提高20倍,数据传输速率提高8.7倍,满足本文所研究的硬件识别系统的实时性要求。

[1]LUO Kun.The research and implementation of high perfor-mance embedded real-time image processing and recognition system [D].Jiangsu:Jiangsu University,2008:1-5 (in Chinese).[罗坤.高性能嵌入式实时图像处理和识别系统的研究与实现 [D].江苏:江苏大学,2008:1-5.]

[2]ZHOU Enming.The research of real-time and intelligent image recognition [D].Chongqing:Chongqing University,2012:2-7 (in Chinese). [周恩明.图像目标的快速智能识别研究[D].重庆:重庆大学,2012:2-7.]

[3]General Vision Inc.CogniMem manual[S].2008:5-20.

[4]General Vision Inc.CogniMem reference guide [S].2013:3-10.

[5]MAO Decao.Windows kernel scenario analysis(I)[M].Beijing:Electronic Industry Press,2009:8-15 (in Chinese).[毛徳操.Windows内核情景分析 (I)[M].北京:电子工业出版社,2009:8-15.]

[6]ZHANG Fan,SHI Caicheng.Windows driver development technical explanation [M ].Beijing: Electronic Industry Press,2008:31-36 (in Chinese).[张帆,史彩成.Windows驱动开发技术详解 [M].北京:电子工业出版社,2008:31-36.]

[7]YING Sancong,WANG Mingyin,ZHANG Xing.Key technologies of high-performance PCI driver[J].Computer Engineering and Design,2012,33 (6):2208-2212 (in Chinese).[应三丛,汪明寅,张行.高性能PCI 驱动程序的关键技术[J].计算机工程与设计,2012,33 (6):2208-2212.]

[8]FU Zhizhong,XIAN Haiying,CHEN Youlin.Device driver development of high speed data capture based on PCI bus[J].Computer Applications,2009,29 (2):577-579(in Chinese).[傅志中,鲜海滢,陈友林.基于PCI总线的高速数据采集设备驱动开发[J].计算机应用,2009,29 (2):577-579.]

[9]HOU Hangcheng, WANG Yiwen,LI Hui.A high-speed DMA transmission system base on PCI express bus [J].Microelectronics,2013,43 (3):384-386 (in Chinese). [侯杭呈,王忆文,李辉.一种基于PCI Express总线的DMA 高速传输系统 [J].微电子学,2013,43 (3):384-386.]

[10]LIU Yiqing.Improved algorithm of RBF artificial neural networks and its hardware implementation [D].Beijing:Beijing University of Civil Engineering and Architecture,2013:5-22(in Chinese).[刘亦青.类RBF人工神经网络算法研究及硬件实现 [D].北京:北京建筑大学,2013:5-22.]

[11]ZHANG Hongchao.Development of PCI device driver in windows OS [J].Information Research,2010,32 (2):41-44(in Chinese).[张宏超.Windows平台下PCI设备驱动程序的开发 [J].信息化研究,2010,32 (2):41-44.]

[12]ZHANG Peng,WANG Yongming,JIANG Jingyan,et al.Design and example of PCI driver program based on Windows2000 [J].Engineering & Test,2011,51 (2):56-59(in Chinese). [张鹏,王永明,姜婧妍,等.基于Windows2000的PCI驱动程序设计与实例 [J].工程与实验,2011,51 (2):56-59.]

猜你喜欢

驱动程序图像识别调用
核电项目物项调用管理的应用研究
基于Resnet-50的猫狗图像识别
高速公路图像识别技术应用探讨
LabWindows/CVI下基于ActiveX技术的Excel调用
图像识别在物联网上的应用
计算机硬件设备驱动程序分析
图像识别在水质检测中的应用
基于系统调用的恶意软件检测技术研究
基于MPC8280的CPU单元与内部总线驱动程序设计
利用RFC技术实现SAP系统接口通信