博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gabor变换人脸识别的python实现,att_faces数据集平均识别率99%
阅读量:4678 次
发布时间:2019-06-09

本文共 2683 字,大约阅读时间需要 8 分钟。

    大家都说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-8import numpy as npimport cv2, os, math, os.path, glob, randomfrom ctypes import *from sklearn.svm import LinearSVCdll = np.ctypeslib.load_library('zmGabor', '.') 				#调用C++动态链接库print dll.gabordll.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()

  

转载于:https://www.cnblogs.com/zmshy2128/p/6180756.html

你可能感兴趣的文章
oracle 11g r2安装
查看>>
关于自关联1
查看>>
存储控制器、MMU、flash控制器介绍
查看>>
hdu-1814(2-sat)
查看>>
自我反省
查看>>
反射,得到Type引用的三种方式
查看>>
pl sql练习(2)
查看>>
Problem B: 判断回文字符串
查看>>
谷歌浏览器,添加默认搜索引擎的搜索地址
查看>>
数据结构化与保存
查看>>
C# .net 获取程序运行的路径的几种方法
查看>>
为什么需要Docker?
查看>>
国内5家云服务厂商 HTTPS 安全性测试横向对比
查看>>
how to control project
查看>>
转 python新手容易犯的6个错误
查看>>
第四节 -- 列表
查看>>
Python入门学习笔记4:他人的博客及他人的学习思路
查看>>
webstorm里直接调用命令行
查看>>
关联规则算法之FP growth算法
查看>>
对数组序列进行洗牌
查看>>