顔認識経典アルゴリズム実現(一)——特徴顔法
5327 ワード
最近、顔認識に関する内容を作りたいと思っています.主にシステムを統合したいと思っています.opencvには3つの性能の良いアルゴリズムが統合されているのを見ていますが、自分でやってみたいと思っています.結局、アルゴリズムは初級です.
操作環境:python 2.7
サードパーティライブラリ:opencv for python、numpy
第1種の比較的に経典のアルゴリズムは特徴の顔法で、本質的に実はPCAが次元を下げて、このアルゴリズムの基本的な構想は、2次元の画像を先に階調化して、1つの通路の画像に転化して、それからそれの首尾をつなぎ合わせて1つの列のベクトルに転化して、画像の大きさが20*20であると仮定して、それではこのベクトルは400次元で、理論的には1つのベクトルに組織して、任意の機械学習アルゴリズムを適用することができるが,次元が高すぎるとアルゴリズムの複雑さも高まるので,PCAアルゴリズムを用いて次元を下げ,簡単なソートやKNNを用いてもよい.
運搬業者として、リンクを送ります.
PCAさん、このブログはとてもよく話しています.原理から実現まで基本的に見ると、これはできます.http://blog.codinglabs.org/articles/pca-tutorial.html
特徴顔法:PCAは顔認識に応用する:http://blog.csdn.net/smartempire/article/details/21406005ここで,PCAと異なる操作が特徴値分解の場合,画像組成の列ベクトル次元が高すぎるため,PCAアルゴリズムに従って解くのが遅いため,ここでは特殊な処理方法がある.
データの組織形式は、いくつかのサンプル画像を分類して対応するフォルダに入れ、faceフォルダの下に統一的に保存し、画像をテストして1枚の画像だけでよい.
また、PCAでは次元が面倒なので、プログラムでは多くの次元情報を印刷し、PCAの作業過程とデバッグを理解するのに役立ちます.
コードは次のとおりです.
操作環境:python 2.7
サードパーティライブラリ:opencv for python、numpy
第1種の比較的に経典のアルゴリズムは特徴の顔法で、本質的に実はPCAが次元を下げて、このアルゴリズムの基本的な構想は、2次元の画像を先に階調化して、1つの通路の画像に転化して、それからそれの首尾をつなぎ合わせて1つの列のベクトルに転化して、画像の大きさが20*20であると仮定して、それではこのベクトルは400次元で、理論的には1つのベクトルに組織して、任意の機械学習アルゴリズムを適用することができるが,次元が高すぎるとアルゴリズムの複雑さも高まるので,PCAアルゴリズムを用いて次元を下げ,簡単なソートやKNNを用いてもよい.
運搬業者として、リンクを送ります.
PCAさん、このブログはとてもよく話しています.原理から実現まで基本的に見ると、これはできます.http://blog.codinglabs.org/articles/pca-tutorial.html
特徴顔法:PCAは顔認識に応用する:http://blog.csdn.net/smartempire/article/details/21406005ここで,PCAと異なる操作が特徴値分解の場合,画像組成の列ベクトル次元が高すぎるため,PCAアルゴリズムに従って解くのが遅いため,ここでは特殊な処理方法がある.
データの組織形式は、いくつかのサンプル画像を分類して対応するフォルダに入れ、faceフォルダの下に統一的に保存し、画像をテストして1枚の画像だけでよい.
また、PCAでは次元が面倒なので、プログラムでは多くの次元情報を印刷し、PCAの作業過程とデバッグを理解するのに役立ちます.
コードは次のとおりです.
#encoding=utf-8
import numpy as np
import cv2
import os
class EigenFace(object):
def __init__(self,threshold,dimNum,dsize):
self.threshold = threshold #
self.dimNum = dimNum
self.dsize = dsize
def loadImg(self,fileName,dsize):
'''
, , ,
:param fileName:
:param dsize: 。
:return:
'''
img = cv2.imread(fileName)
retImg = cv2.resize(img,dsize)
retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
retImg = cv2.equalizeHist(retImg)
# cv2.imshow('img',retImg)
# cv2.waitKey()
return retImg
def createImgMat(self,dirName):
'''
, ,
:param dirName:
:return: ,
'''
dataMat = np.zeros((10,1))
label = []
for parent,dirnames,filenames in os.walk(dirName):
# print parent
# print dirnames
# print filenames
index = 0
for dirname in dirnames:
for subParent,subDirName,subFilenames in os.walk(parent+'/'+dirname):
for filename in subFilenames:
img = self.loadImg(subParent+'/'+filename,self.dsize)
tempImg = np.reshape(img,(-1,1))
if index == 0 :
dataMat = tempImg
else:
dataMat = np.column_stack((dataMat,tempImg))
label.append(subParent+'/'+filename)
index += 1
return dataMat,label
def PCA(self,dataMat,dimNum):
'''
PCA ,
:param dataMat:
:param dimNum:
:return:
'''
#
meanMat = np.mat(np.mean(dataMat,1)).T
print ' ',meanMat.shape
diffMat = dataMat-meanMat
# , , ,
covMat = (diffMat.T*diffMat)/float(diffMat.shape[1]) #
#covMat2 = np.cov(dataMat,bias=True)
#print ' ',covMat2
print ' ',covMat.shape
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
print ' ',eigVects.shape
print ' ',eigVals
eigVects = diffMat*eigVects
eigValInd = np.argsort(eigVals)
eigValInd = eigValInd[::-1]
eigValInd = eigValInd[:dimNum] # n
print ' ',eigValInd
eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #
redEigVects = eigVects[:,eigValInd]
print ' ',redEigVects.shape
print ' ',diffMat.shape
lowMat = redEigVects.T*diffMat
print ' ',lowMat.shape
return lowMat,redEigVects
def compare(self,dataMat,testImg,label):
'''
, , KNN ,
:param dataMat:
:param testImg: ,
:param label:
:return:
'''
testImg = cv2.resize(testImg,self.dsize)
testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY)
testImg = np.reshape(testImg,(-1,1))
lowMat,redVects = self.PCA(dataMat,self.dimNum)
testImg = redVects.T*testImg
print ' ',testImg.shape
disList = []
testVec = np.reshape(testImg,(1,-1))
for sample in lowMat.T:
disList.append(np.linalg.norm(testVec-sample))
print disList
sortIndex = np.argsort(disList)
return label[sortIndex[0]]
def predict(self,dirName,testFileName):
'''
:param dirName:
:param testFileName:
:return:
'''
testImg = cv2.imread(testFileName)
dataMat,label = self.createImgMat(dirName)
print ' ',label
ans = self.compare(dataMat,testImg,label)
return ans
if __name__ == '__main__':
eigenface = EigenFace(20,50,(50,50))
print eigenface.predict('d:/face','D:/face_test/1.bmp')