Python 中的人脸检测项目 [只需 5 个简单步骤]

已发表: 2020-09-01

对象识别和人脸检测可能是计算机视觉最流行的应用。 该技术在安全和社交媒体等各个行业中都有应用。 所以我们正在通过 Python 构建一个人脸检测项目。

请注意,您应该熟悉 Python、OpenCV 和 NumPy 编程。 它将确保您在处理此项目时不会感到困惑。 让我们开始吧。

我们分享了两种执行人脸识别的方法。 第一个使用 Python 的人脸识别库,而另一个使用 OpenCV 和 NumPy。 查看我们的数据科学计划以了解更多信息。

目录

使用 Python 的“人脸识别”进行人脸识别

检测人脸的最简单方法可能是使用Python 中的人脸识别库 它在 LFW 数据库中的准确率为 99.38%。 使用它非常简单,不需要太多努力。 此外,该库有一个专用的“face_recognition”命令,用于识别图像中的人脸。

如何使用人脸识别

您可以使用“face_locations”命令区分图像中的人脸:

导入人脸识别

image = face_recognition.load_image_file(“your_file.jpg”)

face_locations = face_recognition.face_locations(图像)

它还可以识别面孔并将其与姓名相关联:

导入人脸识别

known_image = face_recognition.load_image_file(“modi.jpg”)

unknown_image = face_recognition.load_image_file(“unknown.jpg”)

modi_encoding = face_recognition.face_encodings(known_image)[0]

unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

结果 = face_recognition.compare_faces([modi_encoding], unknown_encoding)

图片包含“纳伦德拉·莫迪”

通过将它与其他库组合,您可以使用此库执行许多其他操作。 我们现在将讨论使用 Python 中的其他著名库执行人脸识别,特别是 OpenCV 和 NumPy。

阅读更多: Python NumPy 教程:通过示例学习 Python Numpy

Python中的人脸检测项目

在这个项目中,我们使用 OpenCV 和 NumPy 进行了人脸检测和识别。 我们使用过 Raspberry Pi,但您也可以将它与其他系统一起使用。 您只需稍微修改代码即可在其他设备(例如 Mac 或 Windows PC)上使用它。

这个项目的一些功劳归功于Marcelo Rovai

第 1 步:安装库

首先,您应该安装所需的库、OpenCV 和 NumPy。 您可以通过以下方式轻松安装它:

点安装 opencv-python

点安装 opencv-contrib-python

要在您的系统中安装 NumPy,请使用与上述相同的命令并将 'opencv-python' 替换为 'numpy':

点安装 numpy

第 2 步:检测人脸

现在,您必须配置您的相机并将其连接到您的系统。 相机应正常工作以避免人脸检测出现任何问题。

在我们的相机识别我们之前,它首先必须检测面部。 我们将使用 Haar Cascade 分类器进行人脸检测。 它主要是一种对象检测方法,您可以通过负片和正片图像训练级联函数,之后它就能够检测其他照片中的对象。

在我们的例子中,我们希望我们的模型能够检测人脸。 OpenCV 带有一个训练器和一个检测器,因此使用 Haar Cascade 分类器相对更适合这个库。 您也可以创建分类器来检测其他图像。

这是代码:

将 numpy 导入为 np

导入简历2

faceCascade = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml')

上限 = cv2.VideoCapture(0)

cap.set(3,640) # 设置宽度

cap.set(4,480) # 设置高度

而真:

ret, img = cap.read()

img = cv2.flip(img, -1)

灰色 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = faceCascade.detectMultiScale(

灰色的,

比例因子=1.2,

minNeighbors=5,

minSize=(20, 20)

)

对于面中的 (x,y,w,h):

cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

roi_gray = 灰色[y:y+h, x:x+w]

roi_color = img[y:y+h, x:x+w]

cv2.imshow('视频',img)

k = cv2.waitKey(30) & 0xff

if k == 27: # 按 'ESC' 退出

休息

帽释放()

cv2.destroyAllWindows()

第 3 步:收集数据

现在您的模型可以识别人脸,您可以对其进行训练,使其开始识别图片中的人脸。 为此,您必须为其提供多张您希望它记住的面孔的照片。

这就是为什么我们将从收集照片开始创建数据集的原因。 在收集到必要的图像后,为每个人添加 ID,这样模型就知道将什么脸与什么 ID 相关联。 从一个人的图像开始,至少添加 10-20 个。 使用不同的表达方式来获得最有效的结果。

创建一个用于将用户 ID 添加到图像的脚本,这样您就不必每次都手动执行此操作。 如果您想将模型用于多个面,该脚本至关重要。

向世界顶尖大学学习机器学习课程获得硕士、Executive PGP 或高级证书课程以加快您的职业生涯。

第 4 步:训练

创建人物图像数据集后,您必须训练模型。 您将图片提供给您的 OpenCV 识别器,它最终会创建一个名为“trainer.yml”的文件。

在此阶段,您只需向模型提供图像及其 ID,以便模型熟悉每个图像的 ID。 完成模型训练后,我们可以对其进行测试。

这是代码:

导入简历2

将 numpy 导入为 np

从 PIL 导入图像

导入操作系统

# 人脸图像数据库路径

路径 = '数据集'

识别器 = cv2.face.LBPHFaceRecognizer_create()

检测器 = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”);

# 获取图像和标签数据的函数

def getImagesAndLabels(路径):

imagePaths = [os.path.join(path,f) for f in os.listdir(path)]

faceSamples=[]

身份证= []

对于 imagePaths 中的 imagePath:

PIL_img = Image.open(imagePath).convert('L') # 灰度

img_numpy = np.array(PIL_img,'uint8')

id = int(os.path.split(imagePath)[-1].split(“.”)[1])

面孔=检测器.detectMultiScale(img_numpy)

对于面中的 (x,y,w,h):

faceSamples.append(img_numpy[y:y+h,x:x+w])

ids.append(id)

返回 faceSamples,ids

print (“\n [INFO] 训练面孔。这需要几秒钟。等待......”)

面孔,ids = getImagesAndLabels(路径)

识别器.train(面孔,np.array(ids))

# 将模型保存到 trainer/trainer.yml

识别器.write('trainer/trainer.yml')

# 打印训练的人脸数量并结束程序

print(“\n [INFO] {0} 人脸训练。退出程序”.format(len(np.unique(ids))))

学习:人脸识别中的 MATLAB 应用:代码、描述和语法

步骤#5:开始识别

现在您已经训练了模型,我们可以开始测试模型了。 在本节中,我们为 ID 添加了名称,以便模型可以显示它识别的各个用户的名称。

该模型无法识别人。 它预测它检测到的人脸是否与其数据库中存在的人脸匹配。 我们的模型显示了人脸与其数据库中存在的人脸匹配程度的百分比。 它的准确性在很大程度上取决于您正在测试的图像和您添加到数据库中的图片(您训练模型的图像)。

这是代码:

导入简历2

将 numpy 导入为 np

导入操作系统

识别器 = cv2.face.LBPHFaceRecognizer_create()

识别器.read('trainer/trainer.yml')

cascadePath = “haarcascade_frontalface_default.xml”

faceCascade = cv2.CascadeClassifier(cascadePath);

字体 = cv2.FONT_HERSHEY_SIMPLEX

#启动id计数器

编号 = 0

# 与 id 相关的名称:例如 ==> upGrad: id=1 等

名称= ['无',upGrad',我','朋友','Y','X']

# 初始化并开始实时视频捕获

cam = cv2.VideoCapture(0)

cam.set(3, 640) # 设置视频宽度

cam.set(4, 480) # 设置视频高度

# 定义被识别为人脸的最小窗口大小

minW = 0.1*cam.get(3)

minH = 0.1*cam.get(4)

而真:

ret, img =cam.read()

img = cv2.flip(img, -1) # 垂直翻转

灰色 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

faces = faceCascade.detectMultiScale(

灰色的,

比例因子 = 1.2,

minNeighbors = 5,

minSize = (int(minW), int(minH)),

)

for(x,y,w,h) 在面中:

cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)

id,置信度=recognizer.predict(灰色[y:y+h,x:x+w])

# 如果置信度小于 100 ==> “0” : 完美匹配

如果(置信度 < 100):

id = 名称[id]

信心=“{0}%”。格式(轮(100 - 信心))

别的:

id = “未知”

信心=“{0}%”。格式(轮(100 - 信心))

cv2.putText(

图像,

字符串(id),

(x+5,y-5),

字体,

1、

(255,255,255),

2

)

cv2.putText(

图像,

str(信心),

(x+5,y+h-5),

字体,

1、

(255,255,0),

1

)

cv2.imshow('相机',img)

k = cv2.waitKey(10) & 0xff # 按 'ESC' 退出视频

如果 k == 27:

休息

# 进行清理

print(“\n [INFO] 退出程序并进行清理”)

cam.release()

cv2.destroyAllWindows()

我们已经用 Python 完成了人脸检测项目。 您现在知道如何创建检测和识别人脸的机器学习模型。 请务必与我们分享您的结果!

学习:面向初学者的 TensorFlow 对象检测教程

了解有关机器学习的更多信息

我们希望您喜欢这个人脸检测项目。 如果您想让它更具挑战性,您可以在数据集中添加多个面孔并相应地训练您的模型。 您还可以将它与其他库结合起来,并将项目扩展为其他东西,例如程序的人脸检测安全系统!

如果您有兴趣了解有关机器学习的更多信息,请查看 IIIT-B 和 upGrad 的机器学习和 AI 执行 PG 计划,该计划专为工作专业人士设计,提供 450 多个小时的严格培训、30 多个案例研究和作业、IIIT -B 校友身份,5 个以上实用的实践顶点项目和顶级公司的工作协助。

哪种数学方法用于人脸识别?

人脸识别计算量大,经常被用作机器学习算法和目标检测方法的准确性测试。 一般来说,在大多数情况下,都遵循经典的数学方法——欧几里得距离。 应用几何变换以找到两组之间最接近的欧几里得距离。 欧几里得距离需要将代表两个图像的点的两个向量之间的差的平方相加。 有关欧几里德距离算法的更多详细信息,请参阅这篇研究论文。

人脸检测是如何工作的?

人脸检测是在数字图像或视频中检测人脸或多个人脸的过程。 人脸检测是人脸识别的一个子过程,但该术语通常是指基于图像的人脸识别,其中仅使用图像中人脸的位置来识别或验证一个人,而人脸识别还创建了他们独特的模型人脸,然后与目标人脸匹配。 人脸检测不同于人脸识别,因为人脸识别是从数字图像或视频源中识别或验证人的自动化过程。

人脸识别面临哪些挑战?

这里讨论了面部识别的一些挑战。 面部识别系统中涉及的算法非常复杂,这使得它们高度不一致。 面部识别系统很容易被环境和光照变化、不同的姿势,甚至长相相似的人所欺骗。 面部识别系统需要非常高的计算能力,这就是面部识别系统主要用于高端智能手机和笔记本电脑的原因。 面部识别系统可能会在单个帧中检测到多个错误匹配。 软件必须确定用户打算做什么,这对软件来说不是一件容易的事。