人脸识别(三) 摄像头中的人脸识别+LFW数据集测试

本文介绍了如何使用face_recognition库加载LFW数据集,并通过摄像头进行实时人脸识别。在LFW数据集上,该方法识别率为99.57%,并在摄像头中检测到人脸后,能显示最相似的人。尽管加载大量图片耗时长,但可以通过存储人脸编码以提高效率。实际应用中,人脸识别常与其他验证方式结合,注重快速识别而非绝对准确性。
摘要由CSDN通过智能技术生成
  1. 实现功能: 载入LFW数据集的每张图片,作为比对数据库。采集摄像头中的人脸进行比对,计算出与你最像的人

LFW (LFW(Labeled Faces in the Wild Home)
lfw数据集是为了研究 非限制环境下的人脸识别问题而建立。LFW 数据库主要是从互联网上搜集图像,而不是实验室,一共含有13000 多张人脸图像,每张图像都被标识出对应的人的名字。
LFW数据集主要测试人脸识别的准确率,该数据库从中随机选择了6000对人脸组成了人脸辨识图片对,其中3000对属于同一个人2张人脸照片,3000对属于不同的人每人1张人脸照片。测试过程LFW给出一对照片,询问测试中的系统两张照片是不是同一个人,系统给出“是”或“否”的答案。通过6000对人脸测试结果的系统答案与真实答案的比值可以得到人脸识别准确率。 这个集合被广泛应用于评价 face verification算法的性能。

  1. 代码实现
# LFW数据集加载识别人脸
import face_recognition 
import cv2
import os
import numpy as np

def face(path):
    #存储知道人名列表
    known_names=[] 
    #存储知道的特征值
    known_encodings=[]
    cnt = 0
    cnt_error = 0
    for image_name in os.listdir(path):
        for real_image in os.listdir(path+image_name):   
            cnt = cnt + 1 
            load_image = face_recognition.load_image_file(path+image_name+'/'+real_image) #加载图片
            if not len(face_recognition.face_encodings(load_image)): 
                cnt_error = cnt_error+1
                print(cnt_error,"pictures can't be recognized")
            else:
                image_face_encoding = face_recognition.face_encodings(load_image)[0] #获得128维特征值
                known_names.append(image_name)
                known_encodings.append(image_face_encoding)
        if cnt%10 ==0: print(cnt,'pictures loaded')  
    
    print(cnt,'pictures succesfully loaded.')
    #打开摄像头,0表示内置摄像头
    video_capture = cv2.VideoCapture(0) 
    process_this_frame = True
    while True:
        ret, frame = video_capture.read()
        # opencv的图像是BGR格式的,而我们需要是的RGB格式的,因此需要进行一个转换。
        rgb_frame = frame[:, :, ::-1]
        if process_this_frame:
            face_locations = face_recognition.face_locations(rgb_frame)#获得所有人脸位置
            face_encodings = face_recognition.face_encodings(rgb_frame, face_locations) #获得人脸特征值
            face_names = [] #存储出现在画面中人脸的名字
            for face_encoding in face_encodings:         
                distance_list = face_recognition.face_distance(known_encodings,face_encoding)
                idx=np.argmin(distance_list)
                name = known_names[idx]
                face_names.append(name)

        process_this_frame = not process_this_frame

        # 将捕捉到的人脸显示出来
        for (top, right, bottom, left), name in zip(face_locations, face_names):
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) # 画人脸矩形框
            # 加上人名标签
            cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
            font = cv2.FONT_HERSHEY_DUPLEX 
            cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
        
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    video_capture.release()
    cv2.destroyAllWindows()

if __name__=='__main__':
    face("F:/traindata/lfw/") #存放已知图像路径
  1. 结果与分析

(1) face_recognition对IFW数据集的人脸识别情况
在这里插入图片描述
LFW数据集包含5749个人物,每个人物有多张图片,共有13233张图片
从结果来看,57张人物不能识别到人脸,face_recognition对LFW数据集的人脸识别率99.57%(不是识别准确率)

(2)摄像头中的我和谁最像
在这里插入图片描述
识别到我和Zaini_Abdullah最像,再使用我的文章人脸识别(二)中的人脸比对程序看一下,相似度达到79%

  1. 讨论
    (1)最大的问题是,加载1万多张图片时间长达数小时,然而IFW还是一个较小的数据集

后续可考虑将人脸编码的128维特征值存入数据库,直接读出人脸数据,应该会快一些

(2)科研与工业中的人脸识别不同,准确率基本上难以做到100%,而目前应用的人脸识别应用只是起到一个筛选的作用,常常需要配合其他方式进行双重或多重认证 ,或者局限于某些场景中较少的人多环境(不同的光线、角度等)的识别,工业应用更加注重快速落地

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值