本章介绍以下主题:
- 人脸识别系统简介
- 构建人脸检测应用程序
- 构建人脸识别应用程序
- 人脸识别系统的应用
近年来,人脸识别已经成为最热门的研究领域之一。人脸识别系统是一种能够检测和识别人脸的计算机程序。为了识别一个人,它会考虑他们独特的面部特征。最近,它已被用于若干安全和监视装置,以确保高风险区域、住宅区、私人和公共建筑等的安全。
在本节中,我们将讨论如何从网络摄像头图像中检测人脸。USB 网络摄像头需要连接到 Raspberry Pi 3 以实现实时人脸检测。
- 导入必要的软件包:
import cv2
import numpy as np
- 加载面级联文件:
frontalface_cascade= cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
- 检查是否已加载面级联文件:
if frontalface_cascade.empty():
raiseIOError('Unable to load the face cascade classifier xml file')
- 初始化视频捕获对象:
capture = cv2.VideoCapture(0)
- 定义比例因子:
scale_factor = 0.5
- 执行此操作直到按下Esc键:
# Loop until you hit the Esc key
while True:
- 捕获当前帧并调整其大小:
ret, frame = capture.read()
frame = cv2.resize(frame, None, fx=scale_factor, fy=scale_factor,
interpolation=cv2.INTER_AREA)
- 将图像帧转换为灰度:
gray_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
- 在灰度图像上运行人脸检测器:
face_rectangle = frontalface_cascade.detectMultiScale(gray_image, 1.3, 5)
- 绘制矩形框:
for (x,y,w,h) in face_rectangle:
cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 3)
- 显示输出图像:
cv2.imshow('Face Detector', frame)
- 检查是否已按下Esc键终止操作:
a = cv2.waitKey(1)
if a == 10:
break
- 停止视频捕获并终止操作:
capture.release()
cv2.destroyAllWindows()
在人脸检测系统中获得的结果如下所示:
人脸识别是在人脸检测之后进行的一种技术。将检测到的人脸与数据库中存储的图像进行比较。它从输入图像中提取特征,并将其与数据库中存储的人体特征相匹配。
- 导入必要的软件包:
import cv2
import numpy as np
from sklearn import preprocessing
- 加载编码和解码任务运算符:
class LabelEncoding(object):
# Method to encode labels from words to numbers
def encoding_labels(self, label_wordings):
self.le = preprocessing.LabelEncoder()
self.le.fit(label_wordings)
- 实现输入标签的字到数转换:
def word_to_number(self, label_wordings):
return int(self.le.transform([label_wordings])[0])
- 将输入标签从数字转换为文字:
def number_to_word(self, label_number):
return self.le.inverse_transform([label_number])[0]
- 从输入路径提取图像和标签:
def getting_images_and_labels(path_input):
label_wordings = []
- 迭代输入路径的过程并附加文件:
for roots, dirs, files in os.walk(path_input):
for fname in (x for x in files if x.endswith('.jpg')):
fpath = os.path.join(roots, fname)
label_wordings.append(fpath.split('/')[-2])
- 初始化变量并解析输入寄存器:
images = []
le = LabelEncoding()
le.encoding_labels(label_wordings)
labels = []
# Parse the input directory
for roots, dirs, files in os.walk(path_input):
for fname in (x for x in files if x.endswith('.jpg')):
fpath = os.path.join(roots, fname)
- 读取灰度图像:
img = cv2.imread(fpath, 0)
- 提取标签:
names = fpath.split('/')[-2]
- 执行人脸检测:
face = faceCascade.detectMultiScale(img, 1.1, 2, minSize=(100,100))
- 使用面矩形重复此过程:
for (x, y, w, h) in face:
images.append(img[y:y+h, x:x+w])
labels.append(le.word_to_number(names))
return images, labels, le
if __name__=='__main__':
path_cascade = "haarcascade_frontalface_alt.xml"
train_img_path = 'faces_dataset/train'
path_img_test = 'faces_dataset/test'
- 加载面级联文件:
faceCascade = cv2.CascadeClassifier(path_cascade)
- 使用本地二进制模式初始化人脸检测:
face_recognizer = cv2.createLBPHFaceRecognizer()
- 从训练人脸数据集中提取人脸特征:
imgs, labels, le = getting_images_and_labels(train_img_path)
- 培训人脸检测系统:
print "nTraining..."
face_recognizer.train(imgs, np.array(labels))
- 测试人脸检测系统:
print 'nPerforming prediction on test images...'
flag_stop = False
for roots, dirs, files in os.walk(path_img_test):
for fname in (x for x in files if x.endswith('.jpg')):
fpath = os.path.join(roots, fname)
- 验证人脸识别系统:
predicting_img = cv2.imread(fpath, 0)
# Detect faces
face = faceCascade.detectMultiScale(predicting_img, 1.1,
2, minSize=(100,100))
# Iterate through face rectangles
for (x, y, w, h) in face:
# Predict the output
index_predicted, config = face_recognizer.predict(
predicting_img[y:y+h, x:x+w])
# Convert to word label
person_predicted = le.number_to_word(index_predicted)
# Overlay text on the output image and display it
cv2.putText(predicting_img, 'Prediction: ' + person_predicted,
(10,60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,255,255), 6)
cv2.imshow("Recognizing face", predicting_img)
a = cv2.waitKey(0)
if a == 27:
flag = True
break
if flag_stop:
break
获得的人脸识别输出如下所示:
人脸识别系统广泛用于实现个人安全系统。读者可以参考文章基于 OpenCV的人脸检测系统http://ieeexplore.ieee.org/document/6242980/ 。
另见实时人脸检测系统人脸检测算法研究中的http://ieeexplore.ieee.org/document/5209668 。
请参阅以下文章:
- http://www.ex-sight.com/technology.htm
- https://www.eurotech.com/en/products/devices/face+识别+系统
- https://arxiv.org/ftp/arxiv/papers/1403/1403.0485.pdf
人脸识别广泛应用于安全、医疗和营销领域。各行业正在开发新的人脸识别系统,利用深度学习识别欺诈行为,识别人脸和照片之间的差异,等等。在医疗保健领域,人脸识别与其他计算机视觉算法相结合,用于检测面部皮肤疾病。