欢迎来到网际学院,让您的头脑满载而归!

构建人脸检测和识别模型

发布日期:2019-01-14 11:03:32 作者:管理员 阅读:256

问题陈述首先,我们必须从数字图像中检测人脸第二,认识到检测到的脸部属于谁。文件夹结构最初,你应该有这些文件/文件夹(可以私信我获取)环境安装最新版本的Anaconda 。只需下载并安装它(在提示时添加环境变量)。可选步骤 - 创建除基础/根

问题陈述

  1. 首先,我们必须从数字图像中检测人脸

  2. 第二,认识到检测到的脸部属于谁。

文件夹结构

最初,你应该有这些文件/文件夹(可以私信我获取)

构建人脸检测和识别模型


环境

  • 安装最新版本的Anaconda 。只需下载并安装它(在提示时添加环境变量)。

可选步骤 - 创建除基础/根环境(anaconda的默认安装附带)之外的另一个环境。

  • 一旦anaconda被安装,它的包管理器conda可以用来安装pillow,opencv, likeconda安装 pillow。使用conda的步骤如下。

构建人脸检测和识别模型


  • 使用命令提示符(& conda)安装jupyter-lab,或者您可以使用任何python编辑器

构建人脸检测和识别模型


  • 全部数据集中在这里(https://drive.google.com/drive/folders/0B5G8pYUQMNZnLTBVaENWUWdzR0E)(172 GB),如果无法处理整个数据集的话,可以使用上传整个数据集的一个子集(https://drive.google.com/file/d/1bLzzWsRoW3f9cfkjZZzgGTRgawcTXwSH/view)。在test_file上完成预测。

构建人脸检测和识别模型


基本组件

我们先了解一些基础知识

播放视频文件-首先我们创建VideoCapture对象并给出视频文件的位置。cap.isOpened()检查相机捕获是否已初始化,它返回值True 。cap.read()一直为True,直到摄像机帧被正确读取。frame从视频文件中获取下一帧,ret从摄像机中获取返回值,可以为true,也可以为false。。cv2.waitKey(1)表示延迟,像1这样的较小值会使视频运行得非常快。接下来,我发现cv2.waitKey(30)的值没有问题。cvtcolor()将捕获的帧转换为灰度(为什么?...如下所述)。cv2.imshow()显示灰度视频。

cap = cv2.VideoCapture('test_file.avi')
while(cap.isOpened()):
 ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
 if cv2.waitKey(1) & 0xFF == ord('q'):
 break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

构建人脸检测和识别模型


Haar Cascades-对象检测是指检测来自特定类的实例,如人脸、自行车、动物、汽车或风筝等。使用基于Haar特征的级联分类器的进行对象检测最初由Paul viola和Michael Jones于2001年提出。我们在这里使用它来检测面孔。另一种检测面部的方法是使用HOG分类器。

OpenCV提供了许多预先训练的分类器,用于检测人脸、眼睛、微笑等。首先,我们需要加载所需的XML分类器。我已经将XML文件(haarcascade_frontalface_alt2.xml)从OpenCV安装中的默认位置移动到srcproject文件夹中的一个文件夹中。

#load haar classifier
cv.CascadeClassifier('haarcascadeshaarcascade_frontalface_alt2.xml')

构建人脸检测和识别模型


感兴趣的区域---ROI允许我们在不改变整个图像的情况下处理图像的矩形子集。

构建人脸检测和识别模型


参数ROI的坐标从左上角开始。detectMultiScale()检测输入图像中不同大小的对象,如果找到人脸,它返回检测到的人脸的位置(x,y,w,h)。比例因子1.5表示每个比例下的图像尺寸缩减。最小邻域5参数指定每个候选矩形应该保留多少个邻域,值越大检测越少,但质量越高。detectMultiScale()中的x、y、w、h的值用于创建感兴趣的区域。

faces = face_cascade.detectMultiScale(gray, 1.5, 5)
 for(x, y, w, h) in faces:
 #print(x,y,w,h)
 roi_gray = gray[y:y+h, x:x+w] 
 #roi_color = frame[y:y+h, x:x+w]

构建人脸检测和识别模型


使用训练数据-训练数据在一个名为图像的文件夹中,图像的标签是像Alexandra Daddario这样的文件夹的名称。我们使用os.walk()遍历Image文件夹或目录中的所有图像,找到以png和jpg扩展名结尾的文件。此外,我们提取和转换文件夹名称为小写,并取代空格" ",下划线与破折号-。在计算机图形学中,反锯齿是一种减少锯齿的软件技术,为了减少锯齿-阶梯状的线条应该是平滑的。我们调整图像大小(提高模型的可信度),使用np.array()将图像加载到一个numpy数组中……计算机只理解数字。

for root, dirs, files in os.walk(image_dir):
 for file in files:
 if file.endswith("png") or file.endswith("jpg"):
 path = os.path.join(root, file)
 label = os.path.basename(root).replace(" ", "-").replace("_", "-").lower()
 #print(label, path)
 if not label in label_ids:
 label_ids[label] = current_id
 current_id += 1
 id_ = label_ids[label] 
 #print(label_ids) 
 #print(id_)
 
 pil_image = Image.open(path).convert("L") # Using Pillow mode "L" to convert image into Grayscale
 size = (550, 550)
 final_image = pil_image.resize(size, Image.ANTIALIAS)
 image_array = np.array(final_image, "uint8")

构建人脸检测和识别模型


识别器 - 我们使用局部二元模型直方图(LBPH)算法进行面部识别。LBPH是纹理分类领域的强大算法。

# Creating LBPH object 
recognizer = cv.face.LBPHFaceRecognizer_create()
# Training it on data(x_train) & labels y_labels
recognizer.train(x_train, np.array(y_labels))
recognizer.save("trained_model.yml")

构建人脸检测和识别模型


在这里,我们预测从视频文件中捕获的ROI,然后在识别的面部上放置一个矩形框。putText()将在识别的面部上显示预测的名称。

# Predict on the captured video 
id_, conf = recognizer.predict(roi_gray)
 if conf >= 45 and conf <= 85:
 #print(id_)
 #print(labels[id_])
 font = cv.FONT_HERSHEY_SIMPLEX # Display name font
 name = labels[id_]
 color = (255, 255, 255) 
 stroke = 2 # Thickness
cv.putText(frame, name, (x,y), font, 1, color, stroke, cv.LINE_AA)

构建人脸检测和识别模型


用检测到的面部显示矩形 cv.rectangle()

color = (0, 255, 0) #BGR
 stroke = 2
 end_cord_x = x + w 
 end_cord_y = y + h
 cv.rectangle(frame, (x,y),( end_cord_x, end_cord_y), color, stroke)

构建人脸检测和识别模型


测试一下

通过运行训练模型face_recognition.py

构建人脸检测和识别模型


接下来是人脸检测 test_file.avi

构建人脸检测和识别模型


如果一切正确到位,人脸识别和检测应如下所示。

构建人脸检测和识别模型


Copyright oneie ©2014-2017 All Rights Reserved. 所有资料来源于互联网对相关版权责任概不负责。如发现侵犯了您的版权请与我们联系。 网际学院 版权所有
免责声明  商务合作及投稿请联系 QQ:86662817