Open CV在嵌入式系统中的移植研究

2012-09-11 10:17赵建军朱继珍
微处理机 2012年6期
关键词:人脸分类器内存

赵建军,朱继珍

(昆明理工大学理学院,昆明 650500)

1 引言

随着信息需求和人民生活水平的提高,人们对电子产品的需求日益增高,快速的将产品推向市场是提高市场占有率的关键。嵌入式产品开发周期的缩短带来的巨大压力,迫使嵌入式开发人员必须不断创新开发理念。Open CV以其强大的图像和矩阵运算能力以及良好的移植性使得在视觉应用领域的嵌入式产品有着很大的应用潜力,目前英特尔已经有部分Open CV视觉算法库是针对嵌入式系统而开发的,它的开源性大大减少了开发者的编程工作量,进而有效提高了开发效率和程序运行的可靠性以及缩短了产品的开发周期,它是目前作为PC软件进入嵌入式开发领域的一个较为成功的案例。

2 Open CV简介

Open CV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上。实现了图像处理和计算机视觉方面的很多通用算法。它的目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂的与计算机视觉相关的应用程序,以促进视觉研究的发展,更有效的避免“闭门造车”。Open CV包含的函数有500多个,覆盖了计算机视觉的许多应用领域,如工厂产品检测、医学成像、信息安全、用户界面、摄像头标定、立体视觉和机器人等。开发者可以自由地调用函数库中的相关处理函数。作为一个基本的计算机视觉、图像处理和模式识别的开源项目,Open CV可以直接应用于很多领域,作为二次开发的理想工具。不过在利用Open CV做商业开发应用前,还应该仔细阅读Open CV包所附带的 PUBLIC LICENSE。由于Open CV中提供的开源代码针对PC平台,在移植过程中需要针对特定平台进行代码优化。

Open CV主要分为五个模块,其中主要的四个模块结构如图1所示。

图1 Open CV结构图

CV模块:包含基本的图像处理函数和高级的计算机视觉算法。

ML:是机器学习库,包含一些基于统计的分类和聚类工具。

HighGUI:包含图像和视频的输入/输出函数。

CXCORE:包含了Open CV的一些基本数据结构和相关函数。

CVAUX:该模块一般用于存放即将被淘汰的算法和函数,同时也包含一些新出现的实验性的函数和算法。

3 Open CV人脸检测在裸Power PC上的移植

(1)硬件平台

Xilinx的XUP Virtex-II Pro Development Board平台提供给用户一种类似ARM的32位处理器——PowerPC处理器(硬核)。

(2)软件开发环境

Xilinx的嵌入式开发套件(Embedded Development Kit,EDK)是基于eclipse平台而设计开发的工具,EDK带有许多的工具和IP,可以用来设计完整的嵌入式处理器系统,主要包括Xilinx平台工作室XPS和软件开发套件SDK。

Open CV提供实现基于PC平台Adaboost人脸检测算法的一些精简代码,这里设计的目标是将其移植到XUP Virtex-II Pro Development Board平台上的POWER PC处理器上实现检测功能。

首先在EDK开发环境下配置针对Open CV人脸检测的Power PC硬件平台,包括PowerPC处理器、PLB总线、RS232串口、DDR存储器等各种外设IP。并且编译生成BIT流文件。建立后的硬件平台如图2所示。

图2 Open CV人脸检测的Power PC硬件平台

硬件开发完成后,接下来就是在SDK中开发软 件工程,硬件设计只是建立起一个可运行人脸检测算法的平台,给定一个样本集,里面包含了两个样本集:人脸(正样本)和非人脸(负样本),可以从一系列的弱分类器中构造出一个强分类器,这就是所谓的boosting过程。本课题采用的就是类似boost算法的基于类Haar特征的Adaboost人脸检测算法。Adaboost算法,就是一种级联分类器算法,它把大量的分类能力一般的弱分类串联起来,构成一个分类能力很强的强分类器,再将若干个强分类器串联起来用来作为检测人脸的层级级联分类器。根据Adaboost算法,一幅图像中的一个子区域被分类为人脸区域当且仅当该子区域能通过算法中所有的级联分类器;而一个子区域能通过一个分类器仅当该子区域在该分类器所有特征上的特征值之和大于该分类器的阈值。

人脸检测的功能描述主要在软件工程中完成,这里以Open CV人脸检测库作为工程链接库,通过对人脸检测代码的分析,发现其只使用到了Open CV的三个库:CV库、cxcore库和highgui库。所以直接将这三个库放到设计的工程目录下以便进行编译链接,需要指出的是并不是直接完全复制这些库,不同的算法在不同的嵌入式平台上移植所需要对库函数的裁剪是不同的,这里在Open CV提供的人脸检测代码基础上进行修改优化,主要是根据VC与SDK编译环境的差别进行修改,这里不详细介绍SDK开发流程,重点是通过以人脸检测移植这个例子来探索Open CV的许多视觉应用在嵌入式平台上的移植方法。在SDK环境下修改和优化Open CV提供的人脸检测代码如图3所示。

图3 SDK下编写人脸检测代码

编译工程并且正确生成elf文件。

4 基于PPC的分类器和图片的生成

在Open CV的人脸检测模块中,CVHaarClassifierCascade是存储人脸信息的 knowledge base;IplImage是一种存储了图像数据的内部格式。在人脸检测中,它们是整个程序的输入。

目标是把Open CV的代码移植到Xilinx Virtex II Pro上,考虑到性能和专用的特点,不使用操作系统。这样做引发了一个问题:不能使用OS提供的文件系统,可供操作的是线性的内存地址;无法使用highgui中的图形功能,这说明程序的输入将是原始图片格式,输出是监测区域的坐标值。

在Open CV的PC实现中,CVHaarClassifierCascade通过调用CVLoad对cascade的xml文件进行解析之后得到;这个解析的过程是复杂的,没有必要把这部分逻辑拿到嵌入式设备上。一个好的办法是把CVHaarClassifierCascade的内存镜像搬到FPGA的DRAM当中,这样CVHaarDetectObjects直接使用其即可。

同样,图片的道理也是一样的,在PC开发当中,Open CV支持多种图片文件的输入,然后通过解析,最后变成统一的格式IplImage结构。这里把IplImage结构搬到FPGA的DRAM当中,就省去了图片的格式解析过程。把CVHaarClassifierCascade和IplImage这两个结构的镜像写到文件中;然后由于FPGA上的PPC是Big-endian的,而X86 PC是little endian的,再使用网络字节序转换工具将其转换为big-endian的镜像,这个镜像直接下载到FPGA的DRAM当中,就可以用强制类型转换为相应的结构体。

CVHaarClassifierCascade内存镜像的生成:

结构体定义如下:

结构当中有指针,这使得映射的过程变得复杂,具体就是在实现的时候,把外层的struct写到file里之后,需要调用内层struct的写出函数,直到最后到没有指针的一个结构。在读入过程中也采用同样的过程即可。读入的时候用同样的顺序调用即可(几乎是把write改成read就可以了)。

5 IplImage内存镜像的生成

这个过程比较简单,把IplImage的指针里的数据dump到文件中即可:

以int为单位进行转换经过以上过程生成的image.big和cascade.big就可以直接下载到内存当中。

软硬件开发完成后,将BIT文件、elf文件、被转换后的图片和分类器文件下载到FPGA中,利用XMP(调试POWER PC处理器命令行工具)通过命令行运行这个系统。最后在超级终端上输出人脸检测信息即人脸的坐标信息(见图4)。

图4 输出人脸坐标信息

6 结束语

Open CV在嵌入式平台上的移植要点

(1)使用低版本的Open CV。高版本的Open CV很大程度上依赖于C++的标准模板库(STL)容器以及GCC和C99的扩展,不能很方便的对嵌入式进行扩展,所以有必要用Open CV1.1版本或者之前的版本,这些几乎是用纯C写的。

(2)精简Open CV,使用内联函数。在Open CV里面有很多针对X86的低级别优化,可以使用嵌入式平台支持的库以及内联函数替换来进行优化,OPEN CV的API接口支持多种数据存储格式,可以采用一种来编译出更简单高效的代码。

(3)去除不合理的浮点运算。Open CV移植的另一个挑战就是浮点运算。它包含了一些专门的图像处理功能,很依赖浮点运算,但是许多Open CV的图像处理功能,从来没有使用浮点运算,而一些特别的函数涉及到 Eigen values,feature spaces,image transformation and image statistics时往往使用的是浮点运算。

(4)合理安排处理结构。低层次的预处理,比如说 color space conversions,noise reduction and statistical computation更适合FPGA或者ASIC来实现。

(5)对Open CV函数的内存进行管理。例如,一些Open CV的API经营单位,是最初分配一个固定大小的,后来的扩大是为防止溢出的必要措施,其内容的增长模式为“记忆存储”。在程序开始时分配合理足够大的内存来减少内存碎片和不必要的调用。

(6)直接把VC里的检测代码放到SDK中编译一般会出现3种错误,一是long long类型编译器似乎不支持,改成long类型;二是有些包含的头文件找不到,编译器无法处理嵌套的头文件包含关系,改成包含所有头文件;三是某些空函数未定义,将空函数删除。

论文的意义是通过研究源自Open CV人脸检测算法在FPGA的移植,为探索Open CV的多种视觉应用在嵌入式处理器上的移植提供启示。如果可以将Open CV的所有视觉应用功能移植在目前的嵌入式产品中去,将大大拓展嵌入式开发人员的设计思路。将更快速、更低成本地开发出具有突破性性能的产品。而Open CV本身的功能也还在不断发展完善当中,这将预示Open CV在嵌入式产品中将有着极大的应用潜力。

[1]Gary Bradski Adrian Kaehler.学习 Open CV(中文版)[M].于仕琪,刘瑞祯,译.北京:清华大学出版社,2009-10.

[2]华清远见嵌入式培训中心.FPGA应用开发入门与典型案例[M].北京:人民邮电出版社.2008-07.

[3]田耘徐,文波.Xilinx FPGA开发实用教程[M].北京:清华大学出版社,2008-11.

[4]杨强浩.基于EDK的FPGA嵌入式系统开发[M].北京:机械工业出版社,2008-01.

[5]田耕,胡彬,许文波,等.Xilinx_ISE_Design_Suite_10.x_FPGA开发指南.DSP、嵌入式与高速传输篇[M].北京:人民邮电出版社,2008-11.

[6]齐金山.基于Open CV的人脸检测算法研究[J].淮阴师范学院学报(自然科学版),2009,8(3):218-220.

[7]汤锋,王进.基于分层约束的人脸局部特征检测[C].西安:第五届中国计算机图形学大会,2004.

[8]张国斌.FPGA开发全攻略—工程师创新设计宝典电子书(上册)[M/OL].2009.2,http://icode.csdn.net/source/3051760.

[9]于仕琪,张兆翔,译.Open CV中文参考手册[M/OL].2010.10,http://download.csdn.net/detail/ealingwang/2995991.

猜你喜欢
人脸分类器内存
有特点的人脸
一起学画人脸
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
三国漫——人脸解锁
基于实例的强分类器快速集成方法
加权空-谱与最近邻分类器相结合的高光谱图像分类
结合模糊(C+P)均值聚类和SP-V-支持向量机的TSK分类器
内存搭配DDR4、DDR3L还是DDR3?
长得象人脸的十种动物