- 实现功能: 载入LFW数据集的每张图片,作为比对数据库。采集摄像头中的人脸进行比对,计算出与你最像的人
LFW (LFW(Labeled Faces in the Wild Home)
lfw数据集是为了研究 非限制环境下的人脸识别问题而建立。LFW 数据库主要是从互联网上搜集图像,而不是实验室,一共含有13000 多张人脸图像,每张图像都被标识出对应的人的名字。
LFW数据集主要测试人脸识别的准确率,该数据库从中随机选择了6000对人脸组成了人脸辨识图片对,其中3000对属于同一个人2张人脸照片,3000对属于不同的人每人1张人脸照片。测试过程LFW给出一对照片,询问测试中的系统两张照片是不是同一个人,系统给出“是”或“否”的答案。通过6000对人脸测试结果的系统答案与真实答案的比值可以得到人脸识别准确率。 这个集合被广泛应用于评价 face verification算法的性能。
- 代码实现
# 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) face_recognition对IFW数据集的人脸识别情况
LFW数据集包含5749个人物,每个人物有多张图片,共有13233张图片
从结果来看,57张人物不能识别到人脸,face_recognition对LFW数据集的人脸识别率99.57%(不是识别准确率)
(2)摄像头中的我和谁最像
识别到我和Zaini_Abdullah最像,再使用我的文章人脸识别(二)中的人脸比对程序看一下,相似度达到79%
- 讨论
(1)最大的问题是,加载1万多张图片时间长达数小时,然而IFW还是一个较小的数据集
后续可考虑将人脸编码的128维特征值存入数据库,直接读出人脸数据,应该会快一些
(2)科研与工业中的人脸识别不同,准确率基本上难以做到100%,而目前应用的人脸识别应用只是起到一个筛选的作用,常常需要配合其他方式进行双重或多重认证 ,或者局限于某些场景中较少的人多环境(不同的光线、角度等)的识别,工业应用更加注重快速落地