凡亿教育-柚子
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | 如何用Python来实现人脸识别?来看这篇文
如何用Python来实现人脸识别?来看这篇文

一直以来,人脸检测与识别是计算机视觉的研究热点之一,随着时代发展,逐渐出现在人们的日常生活中,如身份验证、门禁卡、人脸解锁等。今天将分享如何用Python来实现人脸识别的方法,并附上源代码。

首先,若是要用Python来人脸识别,需要先建立一个机器学习模型,该模型可以从图像中识别人,所用到的技术是人脸识别API和OpenCV。

1、提前准备工具

Python-3.x、CV2-4.5.2、矮胖-1.20.3、人脸识别-1.3.0

我们可通过Linux终端来安装上述软件包,命令如下:

pip install numpy opencv-python

pip install dlib  //安装FaceRecognition前的准备

pip install face_recognition

2、下载人脸识别Python代码

点击右侧链接:>>人脸识别工程文件

或者我们也可通过使用自己的数据来完成项目,我选用的是美国《老友记》数据集,该数据集资料包含在上方的人脸识别工程项目代码中。

3、建立人脸识别模型

人脸识别的定义是从照片视频中识别或验证一个人脸的国产,而人脸检测是在图像中定位提取人脸以供算法使用的过程。一般来说,人脸识别方法是用于定位图像中唯一制定的特征,在大多数情况下,面部图片已被移除、裁剪、缩放和转换为灰度,人脸识别主要分为三个步骤,分别是人脸检测、特征提取、人脸识别。我们可通过使用OpenCV来实现,它是一个用C++编写的开源库,内含用于计算机视觉任务的各种算法和深度神经网络的实现。

①准备数据集

创建两个目录,分别是训练和测试,从网上中寻找每个演员的突破,下载带名为“火车”的目录,确保算法进行识别分类。为了更好地测试模型,我们可通过拍摄一张包含所有强制转换的图片,将其放在“test”目录中。

②训练模型

导入模块代码:

import face_recognition as fr

import cv2

import numpy as np

import os

创建两个列表存储图像的名字和编码:

path = "./train/"

known_names = []

known_name_encodings = []

images = os.listdir(path)

循环遍历“火车”目录中的图像,提取图像中的人的名字,计算其脸编码向量,将信息存储在相应的列表中。

for _ in images:

image = fr.load_image_file(path + _)

image_path = path + _

encoding = fr.face_encodings(image)[0]

known_name_encodings.append(encoding)

known_names.append(os.path.splitext(os.path.basename(image_path))[0].capitalize())

③在测试数据集中测试模型

test_image = "./test/test.jpg"

image = cv2.imread(test_image)

使用Face_Locations()定位图像检测到的每个人脸的坐标,寻找脸编码

face_locations = fr.face_locations(image)

face_encodings = fr.face_encodings(image, face_locations)

我们循环遍历每个面部位置及其在图像中的编码。然后,我们将这种编码与“列车”数据集中的人脸编码进行比较。

然后计算人脸距离,即计算测试图像编码和训练图像编码之间的相似性。现在,我们从它选取最小值距离,表示测试图像的这张脸是训练数据集中的人之一。

现在,使用CV2模块中的方法绘制一个带有面部位置坐标的矩形。

for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):

   matches = fr.compare_faces(known_name_encodings, face_encoding)

   name = ""

   face_distances = fr.face_distance(known_name_encodings, face_encoding)

   best_match = np.argmin(face_distances)

   if matches[best_match]:

       name = known_names[best_match]

   cv2.rectangle(image, (left, top), (right, bottom), (0, 0, 255), 2)

   cv2.rectangle(image, (left, bottom - 15), (right, bottom), (0, 0, 255), cv2.FILLED)

   font = cv2.FONT_HERSHEY_DUPLEX

   cv2.putText(image, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

显示图像:

cv2.imshow("Result", image)

将图像保存到当前工作目录中:

cv2.imwrite("./output.jpg", image)

释放未被释放的资源:

cv2.waitKey(0)

cv2.destroyAllWindows()

4、输出

结果如下:

cb47e042b5e7328861a9de3f683a5d.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论