手把手教你玩人工智能(一):人脸检测

如果你对人工智能感兴趣,又不想理解复杂的理论知识和数学推导,那就和我一起直接动手,抛去理论体验乐趣。

1.开发环境准备

  1. python 的开发环境(pycharm / VS code都可以)
  2. 安装 Anaconda 3(官方下载软件安装)
  3. 安装 openCV (python 库里是cv2,即openCV 2.0+版本)
  4. 安装 argparse(方便命令行调用)

准备好配菜就可以开火了。

2.在一张图片里找人脸

创建一个faceDetector.py文件,打开。
首先,定义一个类,来完成找人脸的操作:

1 import cv2
2 
3 class FaceDetector:
4   def __init__(self, faceCascadePath):
5       self.faceCascade = cv2.CascadeClassifier(faceCascadePath)
6

第一行,加载我们安装的 cv2 库,即openCV;

接着,第三行就定义了一个人脸检测的类;
第四行为初始化函数,内部调用了OpenCV中内置的Haar级联分类器的路径,这个分类器已经预先训练过了,可以识别人脸。

可能有很多专业知识,且不管他(想了解可以自行百度,CSDN应该有很多讲解)。无论如何,这些分类器通过从左到右,从上到下,在不同的规模大小上扫描图像。

7   def detect(self, image, scaleFactor = 1.1, minNeighbors = 5,
minSize = (30, 30)):
8       rects = self.faceCascade.detectMultiScale(image,
9           scaleFactor = scaleFactor,
10          minNeighbors = minNeighbors, minSize = minSize,
11          flags = cv2.CASCADE_SCALE_IMAGE)
12
13      return rects

第7行定义了检测方法。这个函数接受一些参数,首先是要找到的图像,然后是三个可选参数。

scaleFactor

该参数表示在每个图像扫描尺度上,图像的大小减少了多少。该值用于创建规模金字塔,以便在图像的多个尺度上检测人脸(一些面孔可能更靠前,因此更大。其他的脸在背景中可能显得更小,因此使用不同的尺度扫描),1.1的数值表明,在金字塔的每一层都缩小了10%的图像。

minNeighbors

每个窗口应该有多少个相邻部分一起来认定是否是一张脸。级联分类器将检测到一张脸周围的多个窗口。这个参数控制需要检测多少个矩形(邻居),以便将窗口扫描部分标记为一张脸。

minSize

一组宽度和高度(以像素为单位),表示窗口的最小大小,小于这个大小的边框被忽略。

第8行实际是检测人脸的主要部分,调用了分类器的detectMultiScale,传入设置的三个参数,随后返回rects,一组包含图像中faces的边框的元组列表。这些边界框仅仅是(x, y)的位置,以及框的宽度和高度。

通过上面的class,我们就可以完成找人脸的任务,接下来,我们就需要把找到的人脸可视化出来。

3. 人脸检测可视化

这次我把这些代码直接给你,实在是Python的缩进机制,可能让你在直接复制时很不方便。

创建一个faceVisual.py文件,代码如下:

1 from faceDetector import *
2 import argparse
3 import cv2 

4 ap = argparse.ArgumentParser()
5 ap.add_argument("-f", "--face", required = True,
6     help = "Path to where the face cascade resides")
7 ap.add_argument("-i","--image",required = True,
8     help = "path to where the image file resides")
9 args = vars(ap.parse_args())
10
11 image = cv2.imread(args["image"])
12 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

13 fd = FaceDetector(args["face"])
14 faceRects = fd.detect(gray, scaleFactor = 1.1, minNeighbors = 5,
15     minSize = (30, 30))
16 print("I found {} face(s)".format(len(faceRects)))
17
18 for (x, y, w, h) in faceRects:
19     cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

20 cv2.imshow("Faces", image)
21 cv2.waitKey(0)

前三行主要调用一些必要的库,包括刚刚写的找人脸的文件。

4-9行主要面向命令行的代码,可以需要在命令行内,输入 Haar级联分类器的路径,以及人脸图像的路径。

11-12行读入人脸图片,并转成灰度图。

13-16行加载 Haar级联分类器的路径,并得到返回值,输出一共检测到的人脸.

18-19行就是把检测倒的人脸信息逐一加载,以矩阵框的形式呈现在人脸图像上。

20-21行显示人脸检测结果,键盘任意键退出。

实际操作

命令行输入如下:

PS E:\codeTest> cd openCV
PS E:\codeTest\openCV> cd project
PS E:\codeTest\openCV\project> python detect_faces.py -f E:\codeTest\openCV\project\haarcascade_frontalface_default.xml -i E:\codeTest\openCV\project\face.jpg
[ INFO:0] Initialize OpenCL runtime...

这里写图片描述

I found 6 face(s)

这里写图片描述

嗯,显示结果还是很不错的。

Haar级联分类器文件的下载链接如下:
链接:https://pan.baidu.com/s/1H0HCueT7FJE4DACCmdC5Ig 密码:ync6

下一期会介绍,如何在视频中检测人脸(不定时更新),喜欢的点个赞。

猜你喜欢

转载自blog.csdn.net/hanzy88/article/details/79589833