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等语言的接口,实现了图像处理和计算机视 ...
随机推荐
- 用UITextView模拟UITextField的placeHolder
用UITextView模拟UITextField的placeHolder 效果: 源码: // // ViewController.m // TextView // // Created by You ...
- Linux 系统的/var目录
/var目录主要针对常态性变动的文件,包括缓存(cache).登录档(log file)以及某些软件运作所产生的文件 /var目录下的重要目录 目录 应放置文件内容 /var/cache/ 应用程序本 ...
- Linux 正则表达式详解
正则表达式(REGULAR):为处理大量的字符串而定义的一套规则和方法,为了处理大量字符串而生 常见命令参数 基础正则表达式 . :有且只有任意一个字符(包括空格) * :重复前面任意0或者多个字符 ...
- 以太坊系列之一: 以太坊RLP用法-以太坊源码学习
RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...
- [转]IE9.0或者360下js(JavaScript、jQuery)不能正确执行(加载),按F12后执行正常;Firefox下ajax的success返回数据data(json、string)无法获取
兼容问题1: 页面的分享等插件加载不全,并无法点击. 兼容问题2: IE下页面选择器(#id..class.etc.)绑定click事件无法访问到,后台springmvc方法,也无法获取ajax的su ...
- 洛谷 P4011 孤岛营救问题【最短路+分层图】
题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...
- Spring AbstractApplicationContext抽象类的refresh()方法--笔记
Spring中AbstractApplicationContext抽象类的refresh()方法是用来刷新Spring的应用上下文的.下面Spring的应用上下文我都叫作context @Overri ...
- Kubernetes-dns 域名解析问题
问题描述:nginx不能解析域名,但是使用nslookup却可以解析域名 ./sbin/nginx -t nginx: [emerg] host not found in upstream " ...
- 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)
[题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...
- Hive学习之路 (十三)Hive分析窗口函数(一) SUM,AVG,MIN,MAX
数据准备 数据格式 cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, 创建数据库及表 create datab ...