Python 基于欧氏距离的人脸识别
我有一个用Python做人脸识别的项目。我想在我的代码中加入欧几里德距离,以了解实时视频和数据集(图像)之间的距离 我很困惑,因为它是实时的。例如,许多项目只是解释图像“X”和图像“Y”之间的欧几里德距离。有人能帮我理解如何在实时视频中做到这一点吗 代码如下:Python 基于欧氏距离的人脸识别,python,opencv,raspberry-pi,raspbian,Python,Opencv,Raspberry Pi,Raspbian,我有一个用Python做人脸识别的项目。我想在我的代码中加入欧几里德距离,以了解实时视频和数据集(图像)之间的距离 我很困惑,因为它是实时的。例如,许多项目只是解释图像“X”和图像“Y”之间的欧几里德距离。有人能帮我理解如何在实时视频中做到这一点吗 代码如下: import sys import os impo rt numpy as np from face_recognition_system.videocamera import VideoCamera from face_recognit
import sys
import os
impo rt numpy as np
from face_recognition_system.videocamera import VideoCamera
from face_recognition_system.detectors import FaceDetector
import face_recognition_system.operations as op
import cv2
from cv2 import __version__
def get_images(frame, faces_coord, shape):
if shape == "rectangle":
faces_img = op.cut_face_rectangle(frame, faces_coord)
frame = op.draw_face_rectangle(frame, faces_coord)
elif shape == "ellipse":
faces_img = op.cut_face_ellipse(frame, faces_coord)
frame = op.draw_face_ellipse(frame, faces_coord)
faces_img = op.normalize_intensity(faces_img)
faces_img = op.resize(faces_img)
return (frame, faces_img)
def add_person(people_folder, shape):
person_name = raw_input('What is the name of the new person: ').lower()
folder = people_folder + person_name
if not os.path.exists(folder):
raw_input("I will now take 20 pictures. Press ENTER when ready.")
os.mkdir(folder)
video = VideoCamera()
detector = FaceDetector('face_recognition_system/frontal_face.xml')
counter = 1
timer = 0
cv2.namedWindow('Video Feed', cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('Saved Face', cv2.WINDOW_NORMAL)
while counter < 21:
frame = video.get_frame()
face_coord = detector.detect(frame)
if len(face_coord):
frame, face_img = get_images(frame, face_coord, shape)
# save a face every second, we start from an offset '5' because
# the first frame of the camera gets very high intensity
# readings.
if timer % 100 == 5:
cv2.imwrite(folder + '/' + str(counter) + '.jpg',
face_img[0])
print 'Images Saved:' + str(counter)
counter += 1
cv2.imshow('Saved Face', face_img[0])
cv2.imshow('Video Feed', frame)
cv2.waitKey(50)
timer += 5
else:
print "This name already exists."
sys.exit()
def recognize_people(people_folder, shape):
try:
people = [person for person in os.listdir(people_folder)]
except:
print "Have you added at least one person to the system?"
sys.exit()
print "This are the people in the Recognition System:"
for person in people:
print "-" + person
print 30 * '-'
print " POSSIBLE RECOGNIZERS TO USE"
print 30 * '-'
print "1. EigenFaces"
print "2. FisherFaces"
print "3. LBPHFaces"
print 30 * '-'
choice = check_choice()
detector = FaceDetector('face_recognition_system/frontal_face.xml')
if choice == 1:
recognizer = cv2.face.createEigenFaceRecognizer()
threshold = 4000
elif choice == 2:
recognizer = cv2.face.createFisherFaceRecognizer()
threshold = 300
elif choice == 3:
recognizer = cv2.face.createLBPHFaceRecognizer()
threshold = 105
images = []
labels = []
labels_people = {}
for i, person in enumerate(people):
labels_people[i] = person
for image in os.listdir(people_folder + person):
images.append(cv2.imread(people_folder + person + '/' + image, 0))
labels.append(i)
try:
recognizer.train(images, np.array(labels))
except:
print "\nOpenCV Error: Do you have at least two people in the database?\n"
sys.exit()
video = VideoCamera()
while True:
frame = video.get_frame()
faces_coord = detector.detect(frame, False)
if len(faces_coord):
frame, faces_img = get_images(frame, faces_coord, shape)
for i, face_img in enumerate(faces_img):
if __version__ == "3.1.0":
collector = cv2.face.MinDistancePredictCollector()
recognizer.predict(face_img, collector)
conf = collector.getDist()
pred = collector.getLabel()
else:
pred, conf = recognizer.predict(face_img)
print "Prediction: " + str(pred)
print 'Confidence: ' + str(round(conf))
print 'Threshold: ' + str(threshold)
if conf < threshold:
cv2.putText(frame, labels_people[pred].capitalize(),
(faces_coord[i][0], faces_coord[i][1] - 2),
cv2.FONT_HERSHEY_PLAIN, 1.7, (206, 0, 209), 2,
cv2.LINE_AA)
else:
cv2.putText(frame, "Unknown",
(faces_coord[i][0], faces_coord[i][1]),
cv2.FONT_HERSHEY_PLAIN, 1.7, (206, 0, 209), 2,
cv2.LINE_AA)
cv2.putText(frame, "ESC to exit", (5, frame.shape[0] - 5),
cv2.FONT_HERSHEY_PLAIN, 1.2, (206, 0, 209), 2, cv2.LINE_AA)
cv2.imshow('Video', frame)
if cv2.waitKey(100) & 0xFF == 27:
sys.exit()
def check_choice():
""" Check if choice is good
"""
is_valid = 0
while not is_valid:
try:
choice = int(raw_input('Enter your choice [1-3] : '))
if choice in [1, 2, 3]:
is_valid = 1
else:
print "'%d' is not an option.\n" % choice
except ValueError, error:
print "%s is not an option.\n" % str(error).split(": ")[1]
return choice
if __name__ == '__main__':
print 30 * '-'
print " POSSIBLE ACTIONS"
print 30 * '-'
print "1. Add person to the recognizer system"
print "2. Start recognizer"
print "3. Exit"
print 30 * '-'
CHOICE = check_choice()
PEOPLE_FOLDER = "face_recognition_system/people/"
SHAPE = "ellipse"
if CHOICE == 1:
if not os.path.exists(PEOPLE_FOLDER):
os.makedirs(PEOPLE_FOLDER)
add_person(PEOPLE_FOLDER, SHAPE)
elif CHOICE == 2:
recognize_people(PEOPLE_FOLDER, SHAPE)
elif CHOICE == 3:
sys.exit()
导入系统
导入操作系统
将numpy作为np导入
从人脸识别系统。摄像机导入摄像机
从face_recognition_system.Detector导入face Detector
导入人脸识别系统。操作为op
进口cv2
从cv2导入版本__
def获取图像(帧、面坐标、形状):
如果形状=“矩形”:
面\u img=op.cut\u面\u矩形(框架、面\u坐标)
框架=操作绘制面矩形(框架、面坐标)
elif形状==“椭圆”:
面\u img=op.cut\u面\u椭圆(框架、面\u坐标)
框架=操作绘制面椭圆(框架、面坐标)
面\u img=op.normalize\u强度(面\u img)
面\u img=op.resize(面\u img)
返回(帧、面和图像)
def添加人物(人物文件夹,形状):
person_name=raw_input('新人员的姓名:')。lower()
文件夹=人员文件夹+人员名称
如果不存在os.path.exists(文件夹):
原始输入(“我现在将拍摄20张照片。准备好后按ENTER键。”)
os.mkdir(文件夹)
摄像机
检测器=人脸检测器('face\u recognition\u system/frontial\u face.xml')
计数器=1
计时器=0
cv2.namedWindow(“视频馈送”,cv2.WINDOW\u自动调整大小)
cv2.namedWindow(“保存的面”,cv2.WINDOW\u正常)
当计数器<21时:
frame=video.get_frame()
面坐标=检测器。检测(帧)
如果len(面对面协调):
帧,面\u img=获取图像(帧,面\u坐标,形状)
#每秒钟保存一张脸,我们从偏移量“5”开始,因为
#相机的第一帧强度非常高
#阅读资料。
如果计时器%100==5:
cv2.imwrite(文件夹+'/'+str(计数器)+'.jpg',
面(图[0])
打印“已保存图像:”+str(计数器)
计数器+=1
cv2.imshow('保存的脸',脸\u img[0])
cv2.imshow(“视频馈送”,帧)
cv2.等待键(50)
定时器+=5
其他:
打印“此名称已存在。”
sys.exit()
def识别人物(人物文件夹、形状):
尝试:
people=[os.listdir(people\u文件夹)中的人员对应人员]
除:
打印“您是否至少向系统添加了一个人?”
sys.exit()
打印“这是识别系统中的人员:”
对于人与人之间的关系:
打印“-”+人
打印30*'-'
打印“可能使用的识别器”
打印30*'-'
打印“1.特征面”
打印“2.鱼面”
打印“3.LBPHFaces”
打印30*'-'
choice=检查选项()
检测器=人脸检测器('face\u recognition\u system/frontial\u face.xml')
如果选项==1:
识别器=cv2.face.CreateEigenFaceRecognitor()
阈值=4000
elif选项==2:
识别器=cv2.face.createFisherFaceRecognizer()
阈值=300
elif选项==3:
recognizer=cv2.face.createLBPHFaceRecognizer()
阈值=105
图像=[]
标签=[]
标签_人={}
对于i,枚举中的人(人):
标签(人)(i)=人
对于os.listdir(人员文件夹+人员)中的图像:
images.append(cv2.imread(people_folder+person+'/'+image,0))
标签.附加(i)
尝试:
识别器.序列(图像,np.数组(标签))
除:
打印“\n密码错误:数据库中至少有两个人吗?\n”
sys.exit()
摄像机
尽管如此:
frame=video.get_frame()
面坐标=检测器。检测(帧,假)
如果len(面对合作):
帧,面\u img=获取图像(帧,面\u坐标,形状)
对于i,枚举中的faces\u img(faces\u img):
如果版本为3.1.0:
收集器=cv2.face.MindDistancePredictCollector()
识别器。预测(面部图像、收集器)
conf=collector.getDist()
pred=collector.getLabel()
其他:
pred,conf=recognizer.predict(面部表情)
打印“预测:”+str(pred)
打印“信心:”+str(圆形(形态))
打印“阈值:”+str(阈值)
如果conf<阈值:
cv2.putText(框架,标签为人[pred]。大写(),
(faces_coord[i][0],faces_coord[i][1]-2),
cv2.FONT_HERSHEY_PLAIN,1.7,(206,0209),2,
cv2.线路(AA)
其他:
cv2.putText(框架,“未知”,
(faces_coord[i][0],faces_coord[i][1]),
cv2.FONT_HERSHEY_PLAIN,1.7,(206,0209),2,
cv2.线路(AA)
cv2.putText(框架,“ESC退出”,(5,框架形状[0]-5),
cv2.FONT_HERSHEY_平原,1.2,(206,0209),2,cv2.LINE_AA)
cv2.imshow(“视频”,帧)
如果cv2.waitKey(100)&0xFF==27:
sys.exit()
def check_choice():
“检查选择是否正确
"""
_是否有效=0
虽然无效,但:
尝试:
choice=int(原始输入('输入您的选项[1-3]:'))
如果在[1,2,3]中选择:
_是否有效=1
其他:
打印“%d”不是选项。\n“%d”选项
除ValueError外,错误:
打印“%s”不是选项。\n“%str(错误)。拆分(“:”[1]
返回选择
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
打印30*'-'
打印“可能的操作”
打印30*'-'
打印“1.将人员添加到识别器系统”
打印“2.启动识别器”
打印“3.退出”
打印30*'-'
CHOICE=检查选项()
PEOPLE\u FOLDER=“人脸识别系统/PEOPLE/”
SHAPE=“椭圆”
如果选项==1:
如果不存在os.path.exists(人员文件夹):
os.makedirs(人员文件夹)
添加人物(人物文件夹、形状)
elif选项==2:
识别人物(人物文件夹,SH)