import cv2 as cv
import numpy as np
from collections import Counter
from os import listdir
def face2Vec(vocabList, inputSet):
returnVec = [0]*len(vocabList)
for i in vocabList:
for j in range(0,len(inputSet)):
if vocabList[i] == inputSet[j]:
returnVec[i] += 1
return returnVec
def imgVector(filename):
img = cv.imread(filename, cv.IMREAD_GRAYSCALE)
resize_img = cv.resize(img, dsize=(32, 32))
imgVector = resize_img.reshape(1024)
return imgVector
def trainNB(trainMatrix,trainCategory,vocabList):
numTrainFaces= len(trainMatrix)
pAbusive = Counter(trainCategory)[0]/float(numTrainFaces)
pBbusive = Counter(trainCategory)[1]/float(numTrainFaces)
pCbusive = Counter(trainCategory)[2]/float(numTrainFaces)
p0Num = np.ones(len(vocabList))
p1Num = np.ones(len(vocabList))
p2Num = np.ones(len(vocabList))
p0Denom = 2.0
p1Denom = 2.0
p2Denom = 2.0
for i in range(numTrainFaces):
if trainCategory[i] == 0:
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else:
p2Num += trainMatrix[i]
p2Denom += sum(trainMatrix[i])
p0Vect = np.log(p0Num/p0Denom)
p1Vect = np.log(p1Num/p1Denom)
p2Vect = np.log(p1Num/p1Denom)
return p0Vect,p1Vect,p2Vect,pAbusive,pBbusive,pCbusive
def classifyNB(vec2Classify, p0Vec, p1Vec, p2Vec, pAb, pBb, pCb):
p0 = sum(vec2Classify * p0Vec) + np.log(pAb)
p1 = sum(vec2Classify * p1Vec) + np.log(pBb)
p2 = sum(vec2Classify * p2Vec) + np.log(pCb)
list = [p0,p1,p2]
return list.index(max(list))
def faceRec():
resultList = ['许嵩', '汪苏泷', '徐良']
Labels = []
vocabList = [i for i in range(0,256)]
trainingFileList = listdir('trainingFaces')
m = len(trainingFileList)
trainingMat = []
trainMat = []
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
Labels.append(classNumStr)
trainingMat.append(imgVector('trainingFaces/%s' % fileNameStr))
for i in trainingMat:
trainMat.append(face2Vec(vocabList,i))
p0V,p1V,p2V,pAb,pBb,pCb= trainNB(np.array(trainMat), np.array(Labels), vocabList)
testFileList = listdir('testFaces')
mTest = len(testFileList)
errorCount = 0
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
faceVector = imgVector('testFaces/%s' % fileNameStr)
face2Vector = face2Vec(vocabList, faceVector)
if classifyNB(np.array(face2Vector), p0V, p1V, p2V, pAb, pBb,pCb ) != classNumStr:
errorCount += 1
print("分类结果: %s, 正确答案: %s" % (resultList[classifyNB(np.array(face2Vector), p0V, p1V, p2V, pAb, pBb,pCb )], resultList[classNumStr]))
print("\n分错总数: %d" % errorCount)
print('准确率: ', float(1-(errorCount)/mTest))
if __name__ == "__main__":
faceRec()