gabor变换人脸识别的python实现,att_faces数据集平均识别率99%
大家都说gabor做人脸识别是传统方法中效果最好的,这几天就折腾实现了下,网上的python实现实在太少,github上的某个版本还误导了我好几天,后来采用将C++代码封装成dll供python调用的方式,成功解决。
图像经多尺度多方向的gabor变换后,gabor系数的数目成倍上升,所以对gabor系数必须进行降维才能送至后续的SVM分类器。测试图像使用att_faces数据集(40种类型,每种随机选5张训练,5张识别),降维方式我测试了DCT、PCA两种变换方式,说实话,dct不怎么靠谱,居然准确率不到70%,所以我有点怀疑网页http://blog.csdn.net/bxyill/article/details/7937850的实现效果,PCA方式也一般,平均识别率95%左右吧;同时测试了直接下采样、均值滤波后采样、最大值滤波后采样三种方式,它们的平均识别率分别为98.6%、98.5%、99%左右。可见,最大值滤波后再下采样的方式是最好的,其他的非线性降维方法没试过,我也不太懂
下面是python实现代码,不到50行哦
#coding:utf-8
import numpy as np
import cv2, os, math, os.path, glob, random
from ctypes import *
from sklearn.svm import LinearSVC dll = np.ctypeslib.load_library('zmGabor', '.') #调用C++动态链接库
print dll.gabor
dll.gabor.argtypes = [POINTER(c_uint8), POINTER(c_uint8), c_int32, c_int32, c_double, c_int32, c_double, c_double] def loadImageSet(folder, sampleCount=5):
trainData = []; testData = []; yTrain=[]; yTest = [];
for k in range(1,41):
folder2 = os.path.join(folder, 's%d' %k)
data = [cv2.imread(d.encode('gbk'),0) for d in glob.glob(os.path.join(folder2, '*.pgm'))]
sample = random.sample(range(10), sampleCount)
trainData.extend([data[i] for i in range(10) if i in sample])
testData.extend([data[i] for i in range(10) if i not in sample])
yTest.extend([k]* (10-sampleCount))
yTrain.extend([k]* sampleCount)
return trainData, testData, np.array(yTrain), np.array(yTest) def getGaborFeature(m):
res = []
for i in range(6):
for j in range(4):
g = np.zeros(m.shape, dtype = np.uint8)
dll.gabor(m.ctypes.data_as(POINTER(c_uint8)), g.ctypes.data_as(POINTER(c_uint8)),
m.shape[0], m.shape[1],
i*np.pi/6, j, 2*np.pi, np.sqrt(2))
#res.append(cv2.dct(g[:10,:10].astype(np.float))) #先DCT变换再取低频系数
#res.append(g[::10,::10]) #直接子采样
#res.append(cv2.blur(g, (10,10))[5::10, 5::10]) #先均值滤波再子采样
res.append(255-cv2.erode(255-g, np.ones((10,10)))[5::10, 5::10]) #先最大值滤波再子采样
return np.array(res)
def main(folder=u'D:/gabor/att_faces'):
trainImg, testImg, yTrain, yTest = loadImageSet(folder) xTrain = np.array([getGaborFeature(d).ravel() for d in trainImg])
xTest = np.array([getGaborFeature(d).ravel() for d in testImg]) lsvc = LinearSVC() #支持向量机方法
lsvc.fit(xTrain, yTrain)
lsvc_y_predict = lsvc.predict(xTest)
print u'支持向量机识别率: %.2f%%' % (lsvc_y_predict == np.array(yTest)).mean() if __name__ == '__main__':
main()
gabor变换人脸识别的python实现,att_faces数据集平均识别率99%的更多相关文章
- LBP人脸识别的python实现
这几天看了看LBP及其人脸识别的流程,并在网络上搜相应的python代码,有,但代码质量不好,于是自己就重新写了下,对于att_faces数据集的识别率能达到95.0%~99.0%(40种类型,每种随 ...
- PCA人脸识别的python实现
这几天看了看PCA及其人脸识别的流程,并在网络上搜相应的python代码,有,但代码质量不好,于是自己就重新写了下,对于att_faces数据集的识别率能达到92.5%~98.0%(40种类型,每种随 ...
- Python的开源人脸识别库:离线识别率高达99.38%
Python的开源人脸识别库:离线识别率高达99.38% github源码:https://github.com/ageitgey/face_recognition#face-recognitio ...
- openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)
原理:使用GT人脸库做样本,VS2010下使用openCV2.44自带的Haar算法检測人脸区域,ASM Library特征检測,然后使用YCrCb颜色空间做肤色检測,再用LBP+Gabor小波提取特 ...
- Python的开源人脸识别库:离线识别率高达99.38%(附源码)
Python的开源人脸识别库:离线识别率高达99.38%(附源码) 转https://cloud.tencent.com/developer/article/1359073 11.11 智慧上云 ...
- dennis gabor 从傅里叶(Fourier)变换到伽柏(Gabor)变换再到小波(Wavelet)变换(转载)
dennis gabor 题目:从傅里叶(Fourier)变换到伽柏(Gabor)变换再到小波(Wavelet)变换 本文是边学习边总结和摘抄各参考文献内容而成的,是一篇综述性入门文档,重点在于梳理傅 ...
- Gabor变换
Gabor变换 Gabor变换属于加窗傅立叶变换,Gabor函数可以在频域不同尺度.不同方向上提取相关的特征.另外Gabor函数与人眼的生物作用相仿,所以经常用作纹理识别上,并取得了较好的效果.Gab ...
- Gabor变换、Gabor滤波器
D.Gabor 1946年提出 窗口Fourier变换,为了由信号的Fourier变换提取局部信息,引入了时间局部化的窗函数. 由于窗口Fourier变换只依赖于部分时间的信号,所以,现在窗口Four ...
- Python 实现的猫脸识别、人脸识别器。
代码地址如下:http://www.demodashi.com/demo/13071.html 前言: OpenCV是开源的跨平台计算机视觉库,提供了Python等语言的接口,实现了图像处理和计算机视 ...
随机推荐
- PowerShell管理SCOM_批量设置维护模式(下)
#定义存储需要置为维护模式的计算机名称列表$serverlist = "C:\scomm\servers.txt"#定义RMS服务器名称$rmsServerName=”scomw. ...
- pandas模块安装问题笔记
1. # pip install pandas 引用 pandas 时,没有模块 ,进行模块安装,出现一推英文提示 结果 Collecting pandas Could not fetch URL ...
- Unity调用安卓中的方法遇到的问题
最近在用U3D做一个简单的迷宫游戏,在项目中利用Unity制作游戏场景,在android中调用游戏场景,并在游戏结束后调用安卓方法,传递参数,退出游戏场景 查找网上资料,基本上Unity调用安卓的写法 ...
- LinkedHashSet 元素唯一,存储取出有序
package cn.itcast_04; import java.util.LinkedHashSet; /* * LinkedHashSet:底层数据结构由哈希表和链表组成. * 哈希表保证元 ...
- Scala编程之访问修饰符
private ,protected,public,在不加前两者声明时为public为公共式访问: private为私有式访问:protected为家族式访问,与Java一致. object Oute ...
- 设计模式之——单例模式(Singleton)的常见应用场景(转):
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- Java Classloader机制解析
做Java开发,对于ClassLoader的机制是必须要熟悉的基础知识,本文针对Java ClassLoader的机制做一个简要的总结.因为不同的JVM的实现不同,本文所描述的内容均只限于Hotspo ...
- 虚拟内存(VirtualAlloc),堆(HeapAlloc/malloc/new)和Memory Mapped File
http://blog.csdn.net/zj510/article/details/39400087 内存管理有三种方式: 1. 虚拟内存,VirtualAlloc之类的函数 2. 堆,Heapxx ...
- oracle删除用户及其表空间
oracle删除用户及其表空间 删除表空间:可以先将其offlinealter tablespace xx offline;将磁盘上的数据文件一同删除drop tablespace xxx inclu ...
- CentOS 7.4 yum安装LAMP环境
配置防火墙,开启80.3306端口.CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. #停止firewall服务 systemctl stop firewa ...