基于Haar小波变换和KNN算法的DSP人脸识别

  这学期上了一门课叫DSP实验,学会了使用C5509A芯片,并且做了一系列实验,最后一个大PJ是使用DSP进行人脸识别。
  基本思想是首先对人脸照片进行变换提取特征,最后在利用某种分类器对特征分类,用以决定属于哪一个人,最后再进行识别,计算准确度,这个项目主要是为了训练我们对于DSP的熟练情况和使用情况,同时了解一些小波变换和分类方法,仅用来学习,对于正确率没有要求,所以最后做好后准确率大概70%左右,也不算高。
  首先我们小组利用的是harr小波变换进行特征提取
  先简单说一下harr小波变换的原理:
  小波变换(wavelettransform,WT)是一种新的变换分析方法,它继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一个随频率改变的“时间-频率”窗口,是进行信号时频分析和处理的理想工具。它的主要特点是通过变换能够充分突出问题某些方面的特征,能对时间(空间)频率的局部化分析,通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节,解决了Fourier变换的困难问题
  哈尔函数是由Haar提出的一种正交完备函数系;是一种既反映整体又反映局部的函数;它是小波变换中的典型小波,;
  哈尔变换和小波变换适用非平稳信号的分析与处理。
  哈尔变换的特点:
    (1) 具有尺度和位移两个特性;
    (2) 变换范围窄;
    (3) 其变换特性与图像中的边界或线条的特性十分接近,因此图像中的边缘和线条经哈尔变换后,会产生较大的变换系数,而其它区划的变换系数小。

20160112235731728 - 基于Haar小波变换和KNN算法的DSP人脸识别


  因为DSP上直接进行小波变换的源码比较少,因此我们先从matlab入手,找到了部分matlab的harr变换源码
  先了解harr变换的一维代码:

  利用这个函数可以得到对二维图像进行harr变换的代码:

  调试的过程中要修改imdwt1.m文件中的第二行的图像名,图像放在与源码相同的目录下。

  而分类器我们想要用的是KNN分类器,KNN分类器的原理和实现都非常简单,原理如下:

  邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。

  kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

  下图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

20160113001508475 - 基于Haar小波变换和KNN算法的DSP人脸识别

  K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

  KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成反比。

  确定了算法之后,主要由三个工作,第一是把matlab的harr变换代码改成C语言代码,第二是写出KNN分类器,第三是把这两个结合起来。中间过程不说了,代码贴出来供大家学习。

  这个是主函数,首先的宏代表的是不同的图片,MODEPHOTO的40张是训练的图片,TRAINPHOTO的15张是测试的图片,所以最后只要看这15张有几张是满足要求的即可。下方是一些函数的声明,InitImage用来读取图片,conv是卷积运算,harrone是一维harr百年换,FloatImage将unsigned char型的图片数组转化为Float型,UcharImage将float型转化为unsigned char型,AddImage是对图像的像素值做放大,CopyImage将一个图像数组复制到另一个数组中,MinImage和MaxImage分别限定图像的像素最大值和最小值。

  要注意所有全局变量的定义要放在main函数外,否则DSP会报错

  全局变量中imageIndex代表训练的图像的标签,5组,每组8张正好40张,trainIndex代表测试的图片的标签,5组每组3张正好15张,进入main函数后,首先让训练的40张图分别对应1-40这40个数字,然后分别对没张图片做harr变换,提取出特征值存入三维数组中。接着对测试的15张图片进行同样的操作。最后利用KNN的函数得出结果存在result数组中,按理说result的结果应该为111,222,333,444,555则是完全正确的,若不对可以计算正确率。

  所有的函数定义如下:

  最后的项目文件可以到这个地址下载:

  http://download.csdn.net/detail/shenda123/9401703