朴素贝叶斯人脸识别

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()

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值