计算机视觉实验3,4——人脸识别

1. 读入数据

使用了att_faces数据集, 存储格式为/att_faces/s1/1.pgm, 因此需要写个读入函数读取主文件夹下所有文件夹下的所有文件:

os.walk(path) 遍历path路径返回信息:
  • root: path根路径
  • dirs: path下的所有文件夹, 不递归
  • files: path下的所有文件, 不递归
#%%
from cv2 import cv2
import matplotlib.pyplot as plt
import os
import numpy as np
import re
def readimgs(path):#读取所有文件
    imgs=[]
    labels=[]
    for root,dirnames,f, in os.walk(path):#取得所有文件夹
        for dir in dirnames:#遍历子文件夹
            path2=os.path.join(path,dir)
            for r,d,files, in os.walk(path2):#对文件夹取所有文件
                for onefile in files:#对每个文件添加到列表中
                    path3=os.path.join(path2,onefile)
                    img=cv2.imread(path3)
                    img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转灰度
                    imgs.append(img)#添加到图片集
                    labels.append(int(re.sub("\\D","",dir)))#文件夹名作为标签

    return imgs,labels

2. cv2.Eigenfaces训练

也可以换成Fisherface, 用法一样, 不过Eigen原理是PCA, Fisher原理是LDA

分割好训练集和测试集, att_faces数据中每个人有10张图片, 因此我每个人留了第一张作为测试集.

EigenFaceRecognizer_create(num_components = 0, threshold = DBL_MAX ):
  • num_components, 保留的主成分数
  • threshold, 预测时的阈值设置
  • 返回一个识别模型
model.train(src, labels):
  • src: 数据组, 具体到图像就是图像顺序容器, 例如vector<Mat>, [img1,img2,....]
  • labels: 给定标签, 标签顺序不重要, 只要保证图像和标签对应即可. 顺序容器如Vector, 或者Mat (虽然我的list一定要转换为array才行...)
#%%主函数训练
if __name__ == "__main__":
    #读取全部文件
    imgs,labels=readimgs("./att_faces")
    #划分训练集 测试集
    testimgs=[]
    testlabels=[]
    trainimgs=[]
    trainlabels=[]
    for i in range(len(labels)):
        if(i%10==0):#每10张, 即每一组留一张作为测试集
            testimgs.append(imgs[i])
            testlabels.append(labels[i])
        else:
            trainimgs.append(imgs[i])
            trainlabels.append(labels[i])

    trainlabels=np.asarray(trainlabels)
    
    model = cv2.face.EigenFaceRecognizer_create()
    model.train(trainimgs,trainlabels)

3. Eigenfaces预测

预测就是对之前保留的测试集, 一一预测并且检验正确率.

model.predict(data): 模型对data进行预测, 返回output[2]
  • output[0], label, 即预测的标签.
  • output[1], confidence, 即置信度, 注意confidence是越高越不相似
#%% 验证
    count=0
    for i in range(0,len(testlabels)):
        test_img=testimgs[i]
        output=model.predict(test_img)#对测试集每个图片进行预测
        if(output[0]==testlabels[i]):#结果和真实标签比较
            count+=1
    
    print(count/len(testlabels))#输出成功率

输出效果如下: 准确率达到0.975


准确率

存在一个错误样例:


唯一一个错判样例, 左为原图, 右为预测标签所属图
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351