图像识别本科毕业设计.doc_第1页
图像识别本科毕业设计.doc_第2页
图像识别本科毕业设计.doc_第3页
图像识别本科毕业设计.doc_第4页
图像识别本科毕业设计.doc_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编 号: 审定成绩: 重庆邮电大学毕业设计(论文)设计(论文)题目:基于C+/MATLAB的图像识别技术的仿真研究学 院 名 称 :通信与信息学院学 生 姓 名 :周易德专 业 :电子信息工程班 级 :0121208学 号 :2012214709指 导 教 师 :余艳英答辩组 负责人 :填表时间:2016年 5 月重庆邮电大学教务处制摘 要图像识别是一种针对图像的模式识别。图像识别的目的是使得计算机拥有像人类一样能从图片中认识事物分析事物的能力。本文对图像识别的技术进行了调研,并列举出了图像识别核心技术。图像识别系统分为三个部分:预处理、特征提取和模式识别。MATLAB是算法设计和仿真实验的有力工具,而C/C+语言是最常见的编程语言。本文简单地介绍了MATLAB与C/C+混合编程方法,并举例说明了如何进行混编。最后还开展了两组有代表性的图形识别仿真实验人脸识别和手写数字识别。在两组实验中,应用了不同的特征提取技术和模式识别技术,并对不同方法进行了对比,对不同实现方式进行了优劣进行了讨论。仿真中主要用到的技术有概率神经网络、SVD降维和深度神经网络等。【关键词】图像识别 人脸识别 手写数字识别 pnn svd dnnABSTRACTImage recognition is a pattern recognition for an image. The purpose is to make image recognition computer, like humans have the ability to understand things from the picture analysis of things. In this paper, the image recognition technology research, and outlines the core image recognition technology. Image recognition system is divided into three parts: preprocessing, feature extraction and pattern recognition. MATLAB is a powerful tool for algorithm design and simulation, and C / C + programming language is the most common language. This article briefly introduces the MATLAB and C / C + mixed programming, and illustrates how mixed. The last two groups have also carried out a representative simulation of pattern recognition - recognition and handwriting digit recognition. In two experiments, the application of different feature extraction and pattern recognition technology, and the different methods were compared for different ways to achieve the advantages and disadvantages are discussed. Simulation technology is mainly used in probabilistic neural network, SVD depth dimension reduction and neural networks.【Key words】Image Recognition Face Recognition Handwritten Digital Recognition pnn dnn目 录前 言1第一章 图像识别技术概述2第一节 图像处理和分析技术介绍2一、图像处理核心工具列举2二、图像分析核心技术简介4第二节 模式识别技术介绍5一、模式与特征概念简介5二、分类器设计简介6第三节 本章小结8第二章 MATLAB与C/C+混合编程简介9第一节 MATLAB与C/C+混合编程特点9一、MATLAB M 语言特点9二、C/C+语言特点9三、MATLAB与C/C+混合编程优点10第二节 MATLAB与C/C+混合编程优点的主要方式10一、通过MEX文件实现混合编程10二、通过dll实现混合编程10三、MATLAB Coder实现混合编程11四、调用C/C+程序生成可执行文件11五、一些次要混编方法Active X、COM 、NET11第三节 MATLAB与C/C+混编开发环境介绍12第四节 mx-API介绍及混合编程举例12一、接口数据类型及接口函数介绍12二.举例介绍13第五节 本章小结14第三章 图像识别仿真与结果15第一节 手写数字识别仿真研究15一、意义和难点15二、实验内容简介15三、实验步骤17四、实验结果18五、讨论与分析19第二节 人脸识别仿真研究19一、研究意义与难点19二、实验内容介绍19三、实验步骤20四、实验结果20五、讨论与分析21第三节 本章小结21结 论22致 谢23参考文献24附 录25一、英文原文:25前 言人类通过眼、耳、喉、鼻和舌等各种感官接受外界的刺激和信息,其中超过83%的信息来自于眼睛。俗话说“百闻不如一见”,就是在说语言描述不如视觉的一目了然。随着数字图像处理技术的发展和实际应用的需求,许多问题不再要求计算机只输出处理后的图片,而是将经处理的图片再进行分割和描述,并提取主要特征,进而加以判决分类,这种技术就是基于图像的模式识别即图像识别。图像识别技术是利用计算机对图片数据的处理,以模仿人类视觉系统,达到人类所具有的对图片内容进行认识的能力,以代替人去完成某些信息分别和辨别的能力。图像识别属于当代计算机科学研究的重要领域,已经发展成为一个独立的学科。这学科发展相当迅猛,应用范围越来越广泛,几乎涵盖了所有生产部门。目前,光学字符识别OCR,以及生物特征识别(指纹、人脸和虹膜等)已经在日常生活中广泛应用。光学字符识别(Optical Character Recognition,OCR)的目标是在复杂环境下识别机器读取的字符信息。OCR处理的信息可分为三大类:文字信息识别、数据识别信息和条形码识别信息。生物特征识别则是采用某种技术和手段对人的身份进行标识,从而依据标识对人进行身份识别的技术。最常见的生物特征识别是人脸识别、指纹识别和虹膜识别,这些身份识别方式都是通过人的生物特征实现的,这些特征有不易丢失、不易伪造、易携带、不易破解等优点。本文即使要对这两类图像识别进行深入调研,并寻找解决方法。本文组织形式如下:第一章:定义图像识别,并介绍图像识别系统需要的技术种类。第二章:具体的介绍了几种图像识别技术,并介绍这些技术在图像识别中的作用。第三章:介绍了MATLAB与C/C+混合编程方法,并距离说明了如何实现混编。第四章:介绍了实验软硬件平台,进行并讨论了两组实验。结 论 :最后总结了仿真实验过程中获得的经验和遇见的难题。第一章 图像识别技术概述图像识别是一种针对图像的模式识别。人类具有对各种事物和现象进行分析、描述和判断的能力,而图像识别就是通过输入图像使计算机拥有类似自动分析事物的能力。图像识别贯穿了图像处理、图像分析和模式识别三个不同层次。本章将从这三个方面来简单介绍这些技术。总的来讲,图像处理是从原始图像到处理后图像的处理过程;图像分析是从图片到目标表达的过程,这些目标最终是以特征的形式提取表现出来的;模式识别是从目标表达到分类和辨别的过程。第一节 图像处理和分析技术介绍图像识别的过程中少不了运用图像处理和分析的很多知识。图像处理的目的就是将输入图像处理成输出图像,从而达到图像增强、图像恢复等目的。图像识别需要对样本图片进行一定的图像处理,为之后的图像分割、特征提取做准备。一、图像处理核心工具列举1.灰度变化(1)灰度映射(图像求反、对比度增强和动态范围压扩)(2)直方图变化(直方图均衡化和直方图规定化)图1.1: 从左到右分别是原图、动态范围扩展结果和直方图均衡化结果2.模板操作模版操作把局部信息为依据,二维卷积(模版卷积)为工具,实现图像处理的多种目标。它可以实现线性滤波与锐化、非线性滤波与锐化、局部直方图增强等。其中基于梯度算子的锐化还可用于边缘检测。图1.2左图为原始图像cameraman;右图为利用正交梯度算子进行边缘检测。3.变换域操作变化域操作就是将图像从最开始的空间域变换到另一个域比后,进行一定操作后实现图像处理的目的。比如最常见的例子就是频域滤波。图1.3频域滤波过程示意图图1.4从左至右依次是原始图像、原始图像频谱图、滤波函数空域图和滤波后图片4.图像消噪与恢复与模板操作和频域操作相比,消噪与恢复更像是一种目的。模板操作和频域操都是消噪与恢复的重要工具。5.放射变换放射变化是一种分别对每个像素重新计算坐标的几何变化,主要包含放缩、旋转、剪切和平移。二、图像分析核心技术简介1.图像分割在图像分析和理解中,很多时候我们只关心图像中的一部分目标。目标一般对应图像特定的具有独特特性的区域。区别不同目标以及区别目标和背景是进一步分析图像和特征提取的前提。图像分割就是指把图像分成各具特色的区域并提取出感兴趣的目标区域的技术和过程。边缘检测是所有基于边界的图像分割方法的第一步。最基础的边缘检测算法有正交梯度算子、二阶导数算子、阀值化等。常用典型的分割技术有SUSAN检测算子法、分水岭分割法、聚类法等。图2.1就是利用正交梯度算子进行边缘检测的2.图像表达图像表达就是要对图像中的目标采取合适的数据结构来进行表达。根据不同的目标图像选择不同的方式表达才能构建出合理的特征空间,最终才能使模式识别发挥作用。常见的图像表达主要有基于轮廓的方式和基于区域的方式。图1.5 图像表达距离:横竖线交点法上图就是一个手写数字目标表达的例子,图中每个数字与三个横线相交,又与两个竖线相交。形成的焦点数量就是每个目标特征,例如对于0来说特征可以表达为交点数量(2,2,2,2,2)。这是一种基于目标像素空间分布的表达方式。3.数学形态学工具数学形态学是以形态为基础对图像进行分析的工具,是图像处理和分析的重要工具。它的基本思想是用具有一定形态的结构元素,去量度和提取图像中的对应形状,来实现图像分析和识别的目的。按照处理对象不同,形态学又分成二值形态学和灰度形态学。我们这里主要介绍二值形态学的一些基本工具和典型应用。二值形态学的基本工具有膨胀和腐蚀,这两个基本工具的反复组合和迭代就构筑了形态学的高楼大厦。由膨胀和腐蚀组合起来的工具有开启、闭合和击中-击不中变化等。数学形态学的基本应用有区域凸包、细化、粗化和剪切等,复杂的典型应用有消噪、角点检测和骨架计算等。图1.6 从左至右分别是原图像,腐蚀后图像、开启后图像、细化后图像和骨架化图像第二节 模式识别技术介绍模式识别是图像识别的主要工具和核心难点。人类具有对各种事物和现象进行分析、描述和判断的能力,而模式识别就是使计算机拥有类似自动识别事物的能力。人类对模式的识别在生活中很常见,比如人类能对同类脸上的表情做出判断,像是炒股的人们凭借着市场各种指数和累计的经验能预测未来走势,又或是下棋的两个人对棋局形势的优劣能做出判断。模式识别对人来说是如此的直观、如此的无所不在,对人来说这就是与生俱来的一种能力,然而对于计算机来说却不是那么容易实现。如何让计算机能像人一样具有识别、分类的能力就是模式识别所要研究的。一、模式与特征概念简介模式(Pattern)广义的来讲就是一种完美的概念,通常是从某类事物中归纳总结出来的一种认识。举个例子我们要在一群人中找到威猛的壮汉们,这就要求我们之前对壮汉有一定的认识,也就是我们具有壮汉的概念。有了这样的概念我们就有了判断一个人是不是壮汉的工具和切入点。但这对于计算机可并不容易,计算机可不能像我们一样形成一个壮汉的概念。这就涉及到了模式的描述问题了。计算机不懂壮汉甚至不懂人是什么,于是我们就要对观察目标进行描述。我们要描述一个人而且要能让计算机理解就需要使用矩阵的知识。表1.1 特征空间举例说明样品编号性别年龄血型握力800米成绩实心球是否单身高数成绩1男18O39kg32010是662女21AB25kg35011是773女23A23kg3309是884男34B31kg4108否995女31O33kg4058否33上表中样本的性别、年龄、血型等8个属性就是我们用来描述一个人的特征。这样我们就能用上表中每一行信息来描述每一个样本。这就是样本描述方法,通过样本的不同属性,也就特征来描述一个样本。我们的目的是要区别一个人是否是壮汉,这就要求我们设计出来的计算机系统能根据对一个样本的描述来判断一个样本是属于壮汉还是非壮汉。如果将上表中的用来描述人的一行行信息看作是一个向量。这个向量的维数则由我们选取的特征数确定,这个向量所属空间就叫特征空间。同时,每个人即每个样本就是空间中的某个点。要描述一个的特征的数量非常多,远不止上表中列出的8个特征,不可能全部都利用起来,更何况有些特征与我们的目标找到壮汉完全没有任何关系,例如上表中的高数成绩。这就要求我们通过对目标的认识,选择出一套合理的特征。这个找出合适特征的过程叫做特征选择与优化,这是实现模式识别的关键一步。通常情况下我们需要降低特征数量,也就是降低特征空间维数。二、分类器设计简介在选取好合适的特征后,我们要解决的问题就好似将特征空间中的每个点分成两类壮汉和非壮汉。我们设计分类算法的过程又叫做分类器设计。在分类器设计设计过程中我们需要一些已经分好类的样品集合来使计算机认识到不同类别的区别,这个样品集合就叫训练集。分类器设计的基本做法就是在训练集的基础上确定分类的判断方法,并通过对未知的测试样本分类情况不断修正或优化分类判断方法。图1.7分类器设计过程示意图下面介绍下模式识别的常见方法。1.模板匹配模板匹配的基本原理很简单,就是使用已知的样本作为模板,与测试样本进行比较,从而识别目标。将待分类的样品与每类的一个或者多个标准模板进行比较,看跟哪个类的模板匹配程度好,这样就能为测试样本分类了。匹配识别需要计算测试样品与各个模板的相似程度,并寻找最相似模板。假如是人脸识别,对于每一个测试样本,都需要计算这个测试样本到每个模板的距离。在模板数量很大时,这个缺点越明显。因此,虽说近邻法判决在原理上很简单,但是计算量很大。模板匹配主要应用于对图像中对物像位置的检测,运动物体跟踪等。模版匹配的另一个缺点是由于匹配的点很多,虽然理论上可以达到最优解,但在实际中却很难做到。2.判别函数设计判别函数的形式有两种:基于概率统计的分类法和几何分类法。(1)基于概率统计的分类法这种方法需要使用到贝叶斯决,策决策者虽不能控制客观因素的变化,但却掌握其变化的可能状况及各状况的分布概率,并利用期望值即未来可能出现的平均状况作为决策准则。要使用贝叶斯决策就需要得到关于样本的总体分布,包括各类的先验概率以及各类条件概率函数,计算的出样品的后验概率,并以此作为产生判别函数的必要数据,设计出相应的判别函数与决策面。这种分类器对特征空间的各类样品分布已经很清楚,一旦测试样本特征向量已知,就可以确定样品X对各类的后验概率,也就可以按照一定准则进行分类了。(2)基于几何的分类法在完成特征选取后,每个模式的特征全部量化为每一维的坐标值,这就使得每个特征变为了特征空间上的一个点。几何分类法就是要在不同的模式点之间找到一些分界面,以分离不同类的点集。几何分类的分类函数即是分开不同类的点集合。3.神经网络人工神经网络是种对生物神经系统的模拟的算法。它将若干个神经元(处理单元)通过一定互连模型连接成一个网络,这个网络通过一定的机制可以模仿神经系统的动作过程,已达到分类的目的。这种分类法最大的特点是对带识别目标不需要进行深入的了解和分析,具有一定智能化处理的特点,特别适用于处理需要考虑多种因素和条件的、不精确和模糊信息处理问题。神经网络可以看作是输入空间到输出空间的一个非线性映射,它通过调整权重和阀值来“学习”或者发现输入输出之间的关系。优点是可以处理一些环境信息非常复杂,背景知识还不完备,推理规则还不明确的问题,允许样品有较大的缺损和畸变。缺点是目前能识别的模式类还不够多,模型在不断丰富和完善中。4.聚类法上述分类方法都是利用了已分类的样本来构造分类器。聚类法则不然,不需要了解一批样本中的模式和概率分布,唯一的分类根据就是测试样品本身。利用样品本身的特性区别来构造分类器,这种分类也被称作无监督分类。在不了解每类模式特征的情况下,仅仅利用某种相似性量度和归类准则,把特征相似的测试样品归为一类。第三节 本章小结本章对图像识别的技术做了简要的介绍,图像识别的技术可以简单的分成三个层次:图像处理,图像分析和模式识别。一个完整的图像识别系统包含三个部分:图像预处理、特征提取和模式匹配。本章对着三个层次和三个组成部分做了简要介绍。 第二章 所用核心技术介绍本章对主要介绍几种将在仿真中用到的核心技术,包括三个部分概率神经网络(Probabilistic Neural Network,PNN)和深度神经网络(Deep Neural Network)以及SVD降维。第一节 概率神经网络一、神经元模型1.神经元模型人工神经元(Artificial Neural Network,ANN)是对哺乳动物神经细胞的模型,每个人工神经元主要包含树突、轴突、突触和细胞体。单个的神经元相当于多输入单输出的非线性阀值器件。图2.1 最典型的人工神经元模型图2.1的X1、X2和X3是输入,有时是其他神经元的轴突,X是输入矢量;o表示输出,输出只有一个;W是一个权矢量决定着每个输入的权重;XW是输入的加权和;是激活阀值,只有在输入加权和大于阀值时神经元才有效输出。输出形式由激活函数f决定。常见的激活函数f有单位阶跃函数、符号函数、Sigmoid函数等。神经元的可塑性主要反映在加权向量和门限的变化,当一个输入对应的权重为0时就相当于没有这个树突连接,当一个输入对应的权重从0变为非零值时就相当于增加了一个输入树突。经过不断的学习,整个网络中的每个神经元的加权向量都在不断改变,知道达到已经的目的才结束学习。图2.1的输出函数基本可以表示成:(2.1)等式(2.1)中o表示输出;x表示输入向量;w表示输入的权重向量;wx为输入的加权求和;b为一个偏差值。对于b=0,w的每个元素为1,且f(x)=x时的神经元的输出函数为o=x。这种神经元叫做纯线性神经元(pure line neuron),在神经网络中常常被作为输入层和输出层。下面我们介绍另一种神经元模型:径向基神经元(Radial Basis Neuron,radbas neuron)。图2.2径向基神经元激活函数Gaussian为高数函数;激活函数的输入为 ,其中b为偏差值,W为加权向量;X为输入向量;为X到W的距离。其输出函数为:(2.2)二、概率神经网络概率神经网络(PNN)是一种用贝叶斯决策规则,即错误分类的期望风险最小,在多维输入空间内分离决策空间的人工神经网络。PNN由四层结构组成,如图2.3所示。l 输入层为多个纯线性神经元组成,本层神经元之间不进行任何连接,输出与下一层每个神经元单向连接。输出函数为。l 样本层中包含多个径向基神经元,且每个径向基神经元分别包含训练样本信息X1、X2、X3和X4。其输出函数为式2.3。 (2.3)样本层的径向基神经元数量是由监督学习提供的样本数量决定的。l 求和层的目的是对同一类的样本的输出进行求平均,求和层的神经元数量由样本分为多少类决定。像图2.3中样本只分作三类红、蓝和黄。因此,求和层输出只有三个值。求和层不是求和而是求平均。l 输出层:在图2.3中,输出层以三个和作为输入,三个和值相互竞争,最大值作为竞争胜利者输出1,其余输出0。这在神经网络中称作竞争层。图2.3 PNN拓扑结构图我们就以图2.3举一个例子。假设输入为二维点,利用分层三类的四个样值来将二维泡面划分为三个类。表2.1样本点坐标(2,1)(1,2)(3,3)(4,4)类别标签1233这四个样点在图2.4中标为红色。图2.3中的未知数为Xi就是四个样本点值,而求和层的未知数Wi由标签信息决定。图2.4 二维平面分割图图2.4的黑色部分为第1类,深灰色范围为第2类,浅灰色部分为第3类。PNN通过输入训练样本和对应的标签从而确定神经网络内的所有参数,建立起一种以神经网络为基础的分类器。第二节 深度神经网络深度神经网络,即含有多个隐藏层的神经网络。与深度神经网络相比较 “浅”的网络只使用一层计算单元(隐藏层)。需要注意的是深度神经网络的多个隐藏层的激活函数f都必须使用非线性函数,如果都是使用线性激活函这再多的隐藏层也可以被一层代替。通过引入深度网络,我们可以计算更多复杂的输入特征。因为每一个隐藏层可以对上一层的输出进行非线性变换,因此深度神经网络拥有比“浅层”网络更加优异的表达能力(例如可以学习到更加复杂的函数关系)1。一、AutoEncoder 自动编码器自动编码器又叫做autoassociator(自动关联器)是一种MLP(multilayer perceptron,多层感知器)的典型应用2。自动编码器神经网络是一种无监督学习的算法,主要使用了反向传播技术,目的是让输出如输入相等。如图2.5所示,图中的Layer1输入层使用不是计算单元;Layer 2和Layer 3使用非线性函数作为激励函数,最常见的非线性激励函数为sigmoid 函数。其中Layer 2的神经元数量上少于输入层,Layer 3的神经元数量与输入完全相同。通过无监督训练的目的是使Later 3的输出与输入完全相同。这个网络是要逼近函数f(x)=x这个函数。图2.5 Autoencoder with 6-3-6 architecture.来自于 1如果能实现Layer 3的输出等于Layer 1的输入。图2.5中去掉Layer 3则网络变成了一个输入为高维数据,输出为低维数据的编码器。而只看Layer 3则是这种编码器的解码器。在图像识别中引入自动编码器是因为它具有和PCA很类似的数据降维的作用。如果自动编码器的输入是随机数,比如高数随机变量,这很难控制输出与输入相等。而如果输入数据内部有各种隐藏的相关性和结构,则自动编码器会利用这些相关性进行降维,从而达到较好的准确率。AutoEncoder学习算法在这里不做介绍,代价函数都是以错误率为基础的各种参数。学习算法就是不断无监督学习优化代价函数。二、Softmax 回归网络Softmax 回归网络的目的是找到输入x是某类Ci的后验概率。也就是说不同于PNN所使用的竞争网络只有一个winner,Softmax回归网络能给出输入x属于某一类的概率P(Ci|x)。假设有K类,所有的类别为Ci,i=1,2K。这Softmax网络由K个神经元组成,且每个神经元输出为每类的后验概率。每个神经元输出为:,i=1,2K(2.4)式 (2.4)中需要学习的参数有K个权重向量Wi和K个偏移值bi。Softmax学习的代价函数为:,i=1,2K(2.5)第三节 本章小结本章主要介绍了三种技术PNN和DNN。其中PNN能在图像识别系统中发挥模式识别分类器的作用;DNN的AutoEncoder算法能发挥降维并起特征提取的作用;DNN的Softmax回归算法能起到分类器的作用。第三章 MATLAB与C/C+混合编程简介MATLAB是科研工作者和工程师的好伙伴,具有强大的科学计算能力以及数据可视化功能,是用来完成算法设计和实验仿真的利器,应用领域已经涵盖科学研究和工程开发的各个领域,甚至包含技术难度极大的天线仿真。而C/C+是家喻户晓的编程语言,可用于几乎所有场景。C语言是MCU开发、嵌入式开发和驱动开发等领域,具有极佳的运行效率,而C+和C#在顶层应用程序设计中发挥着不可代替的作用。如果能将两者结合起来一定能发挥出两者的有事,然而MATLAB与C/C+混合编程因为涉及到不同开发语言、不同开发环境以及多种接口,仍然存在一定难度。随着MATLAB7.0之后的版本更新,混合编程的稳定性和兼容性具有越来越强的兼容性和稳定性。第一节 MATLAB与C/C+混合编程特点一、MATLAB M 语言特点MATLAB所使用的M语言是一种基于矩阵的脚本语言,其核心是高效率的数值计算。矩阵是MATLAB核心变量类型,既有简单的数值矩阵,也有复杂的元组矩阵以及结构矩阵。MATLAB还有一个主要优点是具有数据可视化功能。与C/C+不同,M语言是一种解释性语言,其循环语句执行效率低下,MATLAB的数值计算函数对矩阵运算进行了优化,因此在进行M语言设计时,一定要注意尽量减少循环语句的使用量,尽量使用库函数代替大量循环实现矩阵和向量计算。在M语言中,各种类型的矩阵都不需要声明且不同类型矩阵操作方式类似。MATLAB中的矩阵与C/C+中的多位数组差不多,然而两者的储存方式不同,C/C+语言的多维数组元素在内部存储器中是按行排列的顺序储存的(也就是“按行储存”),而在M语言中则与之相反,各类型矩阵的元素是按列存储的。这就造成了在混合编程时,需要在混合编程时,两种不同语言中的同一数组元素的线性引索各不同。据了解,MATLAB的核心数值计算库大部分是由C/C+语言以及另一种科学计算语言Fortran语言实现的。因此如果不调用数值计算库函数而使用M语言循环语句时,二、C/C+语言特点C语言的流行程度和应用范围之广,这里就不再冗述。从工商管理专业学生到计算机专业学生,都在本科阶段接触过C语言。C+语言是在C语言基础上引入了类与对象的概念,因此C+语言是一种面向对象的程序设计语言,而C语言是面向过程的语言。在以C语言为代表的面向过程的程序设计语言中,程序就是分开的算法和数据结构。而对于C+这种面对对象的程序设计来说,通过类和对象可以将算法和数据结构通过类的形式集成在一起。引用混编三、MATLAB与C/C+混合编程优点由于上述MATLAB M语言和C/C+语言的不同特点,让混合编程变得有用武之地,成为了程集成两者的优点的编程方式。通过MATLAB M语言与C/C+混合编程的方式,一来可以发挥两种语言的优势,二来可以整合MATLAB开发社区和C/C+开发社区各自所拥有的程序资源。第二节 MATLAB与C/C+混合编程优点的主要方式一、通过MEX文件实现混合编程在MATLAB中调用C/C+代码程序最常见最方便的方法就是使用MEX文件。MEX文件是C/C+程序编译后生产一种动态连接库。这种方法需要要求在MATLAB使用mex命令调用C/C+编译器将C/C+源文件编译为mexw32或者mexw64动态链接库文件。这种方式需要用到mx API(包含在mex.h的头文件中)。MEX文件中既包含了动态链接裤又包含MATLAB动态装载模块,这使得用户可以在MATLAB中像调用M语言函数一样调用MEX文件。在MATLAB环境下,通过MEX文件调用C/C+文件可以实现一下目的; 提高程序的执行效率。用来代替执行效率很低的某一段包含大量循环语句的M程序代码的; 利用MATLAB的数据可视化功能,来对C/C+代码进行调试; 拓展MATLAB的硬件接口操作和图形化程序设计的能力;二、通过dll实现混合编程dll动态链接库是另一种能实现MATLAB与C/C+混合编程的途径。相对来讲,采用dll动态链接库的方法要比MEX文件的方法要复杂一些。但在Windows平台下,有大量的第三方开发的C/C+程序以dll动态链接库的形式存在。dll动态链接库可以提高软件的模块化程度;利用动态加载可以实现插件功能;在多个软件同时调用同一个dll动态运行库可以节省内存资源。dll动态运行库本身只提供一组可供外部程序调用的函数,因此在使用动态链接库时,一般需要一些说明文件,以说明动态链接库提供的函数声明和参数类型等信息混编。在MATLAB加载dll动态链接库时,不仅需要.dll文件还需要.h头文件。同时MATLAB M语言代码可以通过“mcc”命令编译为.dll文件,供C/C+可执行文件调用。而反之由C/C+程序编写的程序也可以以dll形式被MATLAB以加载动态库的形式调用。三、MATLAB Coder实现混合编程MATLAB Coder是一种能将MATLAB M代码转换为C/C+代码的强大工具。常见的用法是在MATLAB中使用M语言设计好需要的算法代码段,再通过MATLAB Coder转化成C/C+代码,再嵌入到需要的C/C+程序中。这个过程就相当于在MATLAB中设计和调试好了一种算法的核心代码,再嵌入到C/C+代码中去。MATLAB Coder 也不是万能,它对M语言代码段有其特殊的约束条件。而且在从M语言代码向C/C+代码转换的过程中,是需要用户自己逐步优化的。实现同一算法的不同M语言代码因为使用了不同数据类型和不同控制结构,则会导致转化为C/C+代码后的运行效率差异很大。这就需要用户反复修改M语言程序或者是输出的C/C+代码。四、调用C/C+程序生成可执行文件在MATLAB M语言中可以直接使用“! executablefilename”的方式调用外部可执行程序(也就是调用.exe)。虽然此法可以最大限度的利用现有的程序资源,但是也有很大弊端。其一,每次调用可执行文件的调用开销很大,也就是说如果大量调用一些计算时间较短的可执行文件会使得调用开销大于计算开销,造成程序运行效率极大地减少;其二,可执行文件参数输入和结果输出都需要通过外部存储器的文件进行,有一定局限性。最常见的混合编程方式是使用mat API让可执行文件的输入输出用.mat矩阵存储文件实现。五、一些次要混编方法Active X、COM 、NET除了上面的混编方式外,还有MATLAB通过Active X调用C/C+程序的方式。这种方式主要是利用MATLAB来调用Windows平台中存在的大量Active X控件来完成特定的功能。而C+是Active X的主流开发语言。MATLAB M语言可以通过deploytool工具实现COM组件的编译。在Visual C+中调用由deploytool工具生成的COM组件时,客户与COM组件可以通过VARIANT接口进行数据交换,从而实现混合编程。但是此法编程复杂,使用接口多。与COM组件类似,MATLAB M语言可以通过deploytool工具实现.NET组件的开发。上述几种方式在应用开发中使用较多,但在数值计算、科学仿真和算法实现中显得过于复杂。第三节 MATLAB与C/C+混编开发环境介绍本文的全部仿真和实验都是通过Visual Studio Community 2015 和MATLAB 2015b实现的。在混编过程中经常要求MATLAB调用C/C+编译器,这就需要一定配置。具体来说,在安装Visual Studio Community 2015时一定要附带安装Visual C+ 2015 Professional。还需要在MATLAB命令行中通过“mex setup”和“mbuild -setup”命令进行配置,选择合适的C/C+编译器。第四节 mx-API介绍及混合编程举例在安装完成好开发环境后就可以开始混合编程了。我们这里使用一个简单的mex开发过程作为例子来说明如何实现混合编程。首先我们要了解关于在mex.h中声明的mx-API相关函数、数据类型和接口的用法,只有借此才能使用C/C+程序操作MATLAB矩阵。一、接口数据类型及接口函数介绍下面简单介绍几个接口函数和数据类型l 数据类型:mxArray 矩阵是M语言的核心数据类型。在C/C+语言中,通过mxArray来访问、创建和操作MATLAB矩阵。混合编程时的l 接口函数:void mexFunction(int nlhs,mxArray * plhs,int nrhs,const mxArray *prhs)函数功能:在showmatrix.c中的mexFunction函数就是整个程序的入口和数据交换的接口,其功能与C/C+中的main函数功能类似。mexFunction的输入包含了两个mxArray *和两个int型变量的作用就是MATLAB与C/C+子函数的数据交换接口。参数说明:int nlhs是程序输出矩阵个数。在mex文件调用完成后会返回一个和多个矩阵;mxArray * plhs是程序输出的返回值,其本质上是一个mxArray的指针数组,每个指针指向一个输出矩阵。nt nrhs 是程序输入矩阵个数const mxArray *prhs是程序输入矩阵,其本质上是一个mxArray的指针数组,每个指针指向一个输入矩阵。l 接口函数:double * mxGetPr(const mxArray *array_ptr)函数功能:将一个指向MATLAB double类型矩阵的mxArray指针转化为一个C/C+中double型数组指针参数列表:array_ptr输入的MATLAB double类型矩阵;返回值为一个double指针。需要注意的是返回值的double指针是按列储存的。l 接口函数:mwIndex mxCalcSingleSubscript(const mxArray * array_ptr, mwSize nsubs, mwIndex * subs)函数功能:线性引索转换函数,计算一个按列储存的矩阵array_ptr中的某个元素(x,y,z)的线性引索。参数列表:array_ptr输入的MATLAB矩阵的mxArray指针;subs就是一个整型数组表示某个元素的坐标某个元素(x,y,z);而nsubs是矩阵的维数;返回值为对应的线性引索。l 接口函数int mexPrintf(const char * format,.)函数功能:类似于C语言的printf函数,功能基本一样。参数列表:具体参考C语言的printf函数。二、举例介绍将附录三中的showmatrix.c源文件放在MATLAB的工作目录下,再通过命令行使用“mex showmatrix.c”命令编译生成showmatrix.mexw64文件。在调用showmatrix时,可以像M语言函数一样直接调用。表3.1 MATLAB命令行中调用showmatrix函数 mex showmatrix.cBuilding with Microsoft Visual C+ 2015 Professional (C).MEX completed successfully. showmatrix(magic(4),1:6)第1个变量: 16.00, 2.00, 3.00, 13.00, 5.00, 11.00, 10.00, 8.00, 9.00, 7.00, 6.00, 12.00, 4.00, 14.00, 15.00, 1.00,第2个变量: 1.00, 2.00, 3.00, 4.00, 5.00, 6.00,第五节 本章小结本章对MATLAB与C/C+混合编程做了简要介绍和举例,主要总结了多种混合编程的方式,在本章最后举了混合编程的例子进行说明如何实现混合编程。第四章 图像识别仿真与结果本毕业设计仿真中做了两组图像识别仿真手写数字识别和人脸识别。其中手写数字分成两个部分实验,其一主要是针对MNIST手写数字数据库上做的一系列仿真,其二是在第一部分基础上做的一个完整的手写图像识别系统仿真。而第二组人脸识别主要完成了对人脸数据库进行仿真。两组仿真相比较而言,前者完全的实现了一个识别系统,能从包含多个数字的图片中分割和提取出每个数字,再进行识别,而人脸识别则专注于特征提取和模式识别,直接从人脸库中得到人脸图片。第一节 实验环境平台介绍本文所有图像识别仿真实验都是以相同平台进行。本文所提到的所有时间复杂度信息都是在本平台上的数据。表4.1 试验平台信息CPU型号Intel 志强 E3-1230内存8GB 1600Mhz显卡HD6850系统Win7 Ultimate软件平台MATLAB2015b需要注意的是本实验都是在MATLAB2015b上进行的,代码中用到了2015b才引入最新的Neural Network Toolbox。本文使用的神经网络部分代码不能在低于MATLAB 2015b的任何版本下运行。注意高计算量的深度神经网络的计算MATLAB用GPU进行并行计算来做优化,在使用Intel核心显卡时可能出现不支持。本文用到了三个数据库:l 手写数字数据库MNIST /exdb/mnist/l 人脸数据库ORL cam-orl.co.uk/facedatabase.htmll 人脸数据库AR /aleix/ARdatabase.html第二节 手写数字识别仿真研究一、意义和难点数字是人类日常生活进行信息交流的重要方式。在财会和邮政等领域,从业者每天都和手写数字打着交道。手写数字识别在邮件分捻、财务票据和大规模数据统计中发挥着巨大作用。OCR(光学字符识别)技术在日常生活中的应用越来越多。手写数字识别是OCR技术的子集。手写数字识别系统具有以下组成部分:1.获取数组图像;2.图像预处理;3.数字特征提取;4.数字识别;数字的种类虽然很少只有10种,且比划简单。但实际上,由于不同的人书写习惯不同,写出来的数字风格迥异,千差万别。也就是说人类在书写数字时随意性较大书,因此写不规范导致的歧义也很常见。若要将OCR系统应用于财务方面,识别系统的正确率就的达到很高的要求。一般来讲,英文字符中一个字符出错还可以通过上下文猜测其内涵,而阿拉伯数字则不行。找出识别难度大的原因在于一下三点。(1)笔画简单,某些数字的字型差距不大。(2)书写过于随意,单个数字的变化可能很大。(3)数字之间没有语义上的相关性,要通过后续处理消除和纠错就很困难了。二、实验内容及结果1.第一组实验D1图4.1横竖线交点法表4.2手写数字识别第一组实验实验编号D1.1D1.2训练集900张64x64900张64x64测试集100张64x64100张64x64特征提取横竖线交点(横竖各8条交线外加两根对角线)SVD降维法压缩到10维模式识别概率神经网络分类器spread=0.60概率神经网络分类器spread=0.24正确率80%91%计算时间1.60s1.82s第一组实验包含两个实验D1.1和D1.2。需要注意的是这两个实验所用到的训练集和测试集都来自于MNIST数据库。MNIST数据库本身是28x28的黑白图片,我们实验里经过调整为64x64定格且保存原数据长宽比。讨论:本次实验在于比较两种特征提取方案,实验中我们发现SVD数据压缩法有一定优势。SVD降维方法可以参看附录五。思考:对于手写识别来讲,图片本身并不复杂,且我们采用的都是二值图片,或许对于原始数据量本来就不大的情况直接使用降维算法对原始数据进行压缩或许是较好的方法。2.第二组实验D2表4.3手写数字识别第二组实验实验编号D2.1D2.2D2.3训练集60000张28x28MNIST的训练集部分10000张28x28MNIST的训练集部分60000张28x28MNIST的训练集部分测试集10000张28x28MNIST的测试集部分10000张28x28MNIST的测试集部分10000张28x28MNIST的测试集部分特征提取SVD降维法压缩到10维SVD降维法压缩到30维AutoEncoder训练参数模式识别概率神经网络分类器概率神经网络分类器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论