如果你对人工智能感兴趣,又不想理解复杂的理论知识和数学推导,那就和我一起直接动手,抛去理论体验乐趣。
1.开发环境准备
- python 的开发环境(pycharm / VS code都可以)
- 安装 Anaconda 3(官方下载软件安装)
- 安装 openCV (python 库里是cv2,即openCV 2.0+版本)
- 安装 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
下一期会介绍,如何在视频中检测人脸(不定时更新),喜欢的点个赞。