西交大模式识别实验报告文档格式.docx

上传人:b****2 文档编号:3675678 上传时间:2023-05-02 格式:DOCX 页数:20 大小:937.10KB
下载 相关 举报
西交大模式识别实验报告文档格式.docx_第1页
第1页 / 共20页
西交大模式识别实验报告文档格式.docx_第2页
第2页 / 共20页
西交大模式识别实验报告文档格式.docx_第3页
第3页 / 共20页
西交大模式识别实验报告文档格式.docx_第4页
第4页 / 共20页
西交大模式识别实验报告文档格式.docx_第5页
第5页 / 共20页
西交大模式识别实验报告文档格式.docx_第6页
第6页 / 共20页
西交大模式识别实验报告文档格式.docx_第7页
第7页 / 共20页
西交大模式识别实验报告文档格式.docx_第8页
第8页 / 共20页
西交大模式识别实验报告文档格式.docx_第9页
第9页 / 共20页
西交大模式识别实验报告文档格式.docx_第10页
第10页 / 共20页
西交大模式识别实验报告文档格式.docx_第11页
第11页 / 共20页
西交大模式识别实验报告文档格式.docx_第12页
第12页 / 共20页
西交大模式识别实验报告文档格式.docx_第13页
第13页 / 共20页
西交大模式识别实验报告文档格式.docx_第14页
第14页 / 共20页
西交大模式识别实验报告文档格式.docx_第15页
第15页 / 共20页
西交大模式识别实验报告文档格式.docx_第16页
第16页 / 共20页
西交大模式识别实验报告文档格式.docx_第17页
第17页 / 共20页
西交大模式识别实验报告文档格式.docx_第18页
第18页 / 共20页
西交大模式识别实验报告文档格式.docx_第19页
第19页 / 共20页
西交大模式识别实验报告文档格式.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

西交大模式识别实验报告文档格式.docx

《西交大模式识别实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《西交大模式识别实验报告文档格式.docx(20页珍藏版)》请在冰点文库上搜索。

西交大模式识别实验报告文档格式.docx

因为

,不失一般性,可以假设

这样,二次判别函数拥有更多的系数来产生复杂的分隔面。

此时g(x)=0定义的分隔面是一个二阶曲面。

若继续加入更高次的项,就可以得到多项式判别函数,这可看作对某一判别函数g(x)做级数展开,然后取其截尾逼近,此时广义线性判别函数可写成:

或:

这里y通常被成为“增广特征向量”(augmentedfeaturevector),类似的,a被称为“增广权向量”,分别可写成:

这个从d维x空间到d+1维y空间的映射虽然在数学上几乎没有变化,但十分有用。

虽然增加了一个常量,但在x空间上的所有样本间距离在变换后保持不变,得到的y向量都在d维的自空间中,也就是x空间本身。

通过这种映射,可以将寻找权向量w和权阈值w0的问题简化为寻找一个简单的权向量a。

(3)样本线性可分

即在特征空间中可以用一个或多个线性分界面正确无误地分开若干类样本;

对于两类样本点w1和w2,其样本点集合表示为:

,使用一个判别函数

来划分w1和w2,需要用这些样本集合来确定判别函数的权向量a,可采用增广样本向量y,即存在合适的增广权向量a,使得:

则称样本是线性可分的。

所有满足条件的权向量称为解向量。

通常对解区限制:

引入余量b,要求解向量满足:

余量b的加入在一定程度上可防止优化算法收敛到解区的边界。

(4)感知器准则函数

这里考虑构造线性不等式

的准则函数的问题,令准则函数J(.)为:

其中Y是被权向量a错分的样本集。

当且仅当JP(a*)=minJP(a)=0时,a*是解向量。

这就是感知器(Perceptron)准则函数。

(5)基本的感知器设计

感知器准则函数的最小化可以使用梯度下降迭代算法求解:

其中,k为迭代次数,η为调整的步长。

即下一次迭代的权向量是把当前时刻的权向量向目标函数的负梯度方向调整一个修正量。

即在每一步迭代时把错分的样本按照某个系数叠加到权向量上。

这样就得到了感知算法。

(6)批处理感知器算法

(7)单样本感知器算法

通常情况,一次将所有错误样本进行修正不是效率最高的做法,更常用是每次只修正一个样本或一批样本的固定增量法:

(8)最小均方差算法

对于前面提出的不等式组:

在线性不可分的情况下,不等式组不可能同时满足。

一种直观的想法就是,希望求一个a*使被错分的样本尽可能少。

这种方法通过求解线性不等式组来最小化错分样本数目,通常采用搜索算法求解。

为了避免求解不等式组,通常转化为方程组:

矩阵形式为:

方程组的误差为:

,可以求解方程组的最小平方误差求解,即:

Js(a)即为最小平方误差(MinimumSquared-Error,MSE)的准则函数:

准则函数最小化通常有两种方法:

违逆法,梯度下降法。

梯度下降法

梯度下降法在每次迭代时按照梯度下降方向更新权向量:

直到满足

或者

时停止迭代,ξ是事先确定的误差灵敏度。

参照感知器算法中的单步修正法,对MSE也可以采用单样本修正法来调整权向量:

这种算法即Widrow-Hoff算法,也称作最小均方根算法或LMS(Least-mean-squarealgorithm)算法。

四、实验结果及分析

(1)单样本感知器算法

分析:

通过对分类结果的观察知,单样本感知器可以将数据1和数据2的数据进行正确的分类,达到了分类器的设计目的。

同时观察到对两组数据计算的迭代次数都是40次左右,耗时为0.6ms和0.8ms左右。

单样本感知器的算法效率高于批处理感知器的算法效率。

(2)批处理感知器算法

通过对分类结果的观察知,批处理感知器可以将数据1和数据2的数据进行正确的分类,达到了分类器的设计目的。

同时观察到对两组数据计算的迭代次数相差较大。

对数据1迭代17次,耗时1.0ms左右,相比于单样本感知器,迭代次数少但是耗时大,主要是因为批处理感知器一次迭代要对所有样本进行计算;

对于数据2迭代次数和耗时都比单样本感知器多。

(3)最小均方差算法

通过观察分类结果知,对于数据1和数据2都存在一个分错的点,主要是由于步长选择不同会导致收敛时的分类结果存在分错的点。

同时如果选择的步长不合适,会导致a不收敛,所以步长的选择非常重要。

五、源代码

function[solutioniter]=SinglePerceptron(Y,tau)

%

%solution=SinglePerceptron(Y,tau)固定增量单样本感知器算法实现

%输入:

规范化样本矩阵Y,裕量tau

%输出:

解向量solution,迭代次数iter

[y_kd]=size(Y);

a=zeros(1,d);

k_max=10000;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

k_iter=0;

whilek_iter<

k_max

count=0;

forj=1:

1:

y_k

ifa*Y(j,:

)'

<

tau

a=a+Y(j,:

);

k_iter=k_iter+1;

count=count+1;

end

ifcount==0

break;

end

k_max=k_iter;

k=k_max;

solution=a;

iter=k-1;

function[solutioniter]=BatchPerceptron(Y,tau)

%solution=BatchPerceptron(Y,tau)固定增量批处理感知器算法实现

a=zeros(d,1);

Y_temp=zeros(d,1);

ifa'

*Y(j,:

=tau

Y_temp=Y_temp+Y(j,:

;

a=a+Y_temp;

function[solutioniter]=Widrow_Hoff(Y,stepsize)

%solution=Widrow_Hoff(Y.tau)最小均方差实现算法

规范化样本矩阵Y,裕量tau,初始步长stepsize

b=ones(1,y_k);

~=b(j)

a=a+stepsize*(b(j)-a*Y(j,:

)*Y(j,:

实验二人脸检测系统的设计与实现

了解人脸检测及跟踪系统的算法原理及设计实现过程。

(1)学习和了解基于OpenCV的人脸检测算法原理;

(2)在VC++环境下基于OpenCV实现一个简单的人脸检测和跟踪程序,要求利用笔记本摄像头或者其他网络摄像头进行实时检测,最好有良好的人机交互界面(如使用MFC编程);

(3)对检测到的人脸进行识别(即能识别不同的人)或对检测到的人脸做一些有趣的处理。

(1)人脸检测原理 

人脸检测属于目标检测(object 

detection) 

的一部分,主要涉及两个方面:

1.先对要检测的目标对象进行概率统计,从而知道待检测对象的一些特征,建立起目标检测模型。

2.用得到的模型来匹配输入的图像,如果有匹配则输出匹配的区域,否则什么也不做。

(2)Harr特征级联表

OpenCV在物体检测上使用的是haar特征的级联表,这个级联表中包含的是boost的分类器。

首先,采用样本的haar特征进行分类器的训练,从而得到一个级联的boost分类器。

训练的方式包含两方面:

1.正例样本,即待检测目标样本

2.反例样本,其他任意的图片

首先将这些图片统一成相同的尺寸,这个过程被称为归一化,然后进行统计。

一旦分类器建立完成,就可以用来检测输入图片中的感兴趣区域了,一般来说,输入的图片会大于样本,那样,需要移动搜索窗口,为了检索出不同大小的目标,分类器可以按比例的改变自己的尺寸,这样可能要对输入图片进行多次的扫描。

级联分类器是由若干个简单分类器级联成的一个大的分类器,被检测的窗口依次通过每一个分类器,可以通过所有分类器的窗口即可判定为目标区域。

同时,为了考虑效率问题,可以将最严格的分类器放在整个级联分类器的最顶端,那样可以减少匹配次数。

基础分类器以haar特征为输入,以0/1为输出,0表示未匹配,1表示匹配。

(3)Haar特征

边界特征,包含四种

线性特征,包含八种

中心围绕特征,包含两种

在扫描待检测图片的时候,以边界特征中的(a)为例,正如前面提到的那样,计算机中的图片是一个数字组成的矩阵,程序先计算整个窗口中的灰度值x,然后计算矩形框中的黑色灰度值y,然后计算(x-2y)的值,得到的数值与x做比较,如果这个比值在某一个范围内,则表示待检测图片的当前扫描区域符合边界特征(a),然后继续扫描。

(4)非固定大小目标检测

因为是基于视频流的目标检测,我们事先不太可能知道要检测的目标的大小,这就要求我们的级联表中的分类器具有按比例增大(或者缩小)的能力,这样,当小的窗口移动完整个待检测图片没有发现目标时,我们可以调整分类器的大小,然后继续检测,直到检测到目标或者窗口与待检测图片的大小相当为止。

(5)算法介绍

步骤一:

图片预处理 

在从摄像头中获得一个帧(一张图片)后,我们需要先对这张图片进行一些预处理:

1. 

将图片从RGB模式转为灰度图将灰度图 

2. 

进行灰度图直方图均衡化操作。

步骤二:

检测并标记目标

OpenCV中,对于人脸检测的模型已经建立为一个haarcascade_frontalface_alt2.XML文件,其中包含了上面提到的harr特征的分类器的训练结果,我们可以通过加载这个文件而省略掉自己建立级联表的过程。

有了级联表,我们只需要将待检测图片和级联表一同传递给OpenCV的目标检测算法即可得到一个检测到的人脸的集合。

步骤三:

用highgui画出视频窗口

由于视频流是动态的,所以我们可以在程序的入口中使用一个无限循环,在循环中,每次从视频中读入一个帧,将这个帧传输给人脸检测模块,检测模块在这个帧上进行标记(如果有人脸的话),然后返回这个帧,主程序拿到这个帧后,更新显示窗口。

四、程序流程图

五、实验结果及分析

人脸检测结果:

通过实验结果知,程序基本达到了人脸检测以及跟踪人脸的要求,同时可以检测出不同的人脸。

通过此次实验了解了人脸检测及跟踪系统的算法原理及设计实现过程。

六、源代码

#include<

D:

\ProgramFiles\opencv\build\include\opencv2\opencv.hpp>

#include"

stdio.h"

iostream>

opencv2/imgproc/imgproc.hpp>

opencv2/core/core.hpp>

opencv2/highgui/highgui.hpp>

opencv2/objdetect/objdetect.hpp"

usingnamespacecv;

usingnamespacestd;

stringface_cascade_name="

haarcascade_frontalface_alt2.xml"

CascadeClassifierface_cascade;

stringwindow_name="

人脸识别"

voiddetectAndDisplay(Matframe){

std:

:

vector<

Rect>

faces;

Matframe_gray;

cvtColor(frame,frame_gray,CV_BGR2GRAY);

equalizeHist(frame_gray,frame_gray);

face_cascade.detectMultiScale(frame_gray,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));

for(inti=0;

i<

faces.size();

i++)

{

Pointcenter(faces[i].x+faces[i].width*0.5,faces[i].y+faces[i].height*0.5);

Pointpt1(faces[i].x,faces[i].y),pt2(faces[i].x+faces[i].width,faces[i].y+faces[i].height);

rectangle(frame,pt1,pt2,Scalar(255,255,255),1,8,0);

}

imshow(window_name,frame);

}

intmain()

{

VideoCapturecap(0);

if(!

cap.isOpened())return-1;

Matedges;

face_cascade.load(face_cascade_name))

printf("

[error]无法加载级联分类器文件!

\n"

return-1;

for(;

if(!

cap.isOpened()){continue;

Matframe;

cap>

>

frame;

if(frame.data==NULL){continue;

detectAndDisplay(frame);

if(waitKey(30)>

=0)break;

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2