0
点赞
收藏
分享

微信扫一扫

KNN人脸识别

查拉图斯特拉你和他 2022-01-20 阅读 81
import numpy as np
import cv2 as cv
import operator
from os import listdir

def imgVector(filename):
    img = cv.imread(filename, cv.IMREAD_GRAYSCALE)
    resize_img = cv.resize(img, dsize=(32, 32))
    imgVector = resize_img.reshape(1,1024)
    return imgVector

def kNN(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistance = sqDiffMat.sum(axis=1)
    distances = sqDistance**0.5
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

def faceRec():
    resultList = ['许嵩', '汪苏泷', '徐良']
    Labels = []
    trainingFileList = listdir('trainingFaces')
    m = len(trainingFileList)
    trainingMat = np.zeros((m,1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        Labels.append(classNumStr)
        trainingMat[i,:] = imgVector('trainingFaces/%s' % fileNameStr)
    testFileList = listdir('testFaces')
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        vectorUnderTest = imgVector('testFaces/%s' % fileNameStr)
        classifierResult = kNN(vectorUnderTest, trainingMat, Labels, 5)
        print("分类结果: %s, 正确答案: %s" % (resultList[classifierResult], resultList[classNumStr]))
        if (classifierResult != classNumStr):
            errorCount += 1.0
    print("\n分错总数: %d" % errorCount)
    print("\n准确率: %f" % (1-errorCount/float(mTest)))

if __name__ == "__main__":
    faceRec()

 

 

 

举报

相关推荐

0 条评论