人脸识别实战

人脸识别实战

使用Python进行人脸识别

人脸图片数据收集

Olivetti Faces人脸数据集

我以纽约大学提供的一个非常小的人脸数据集举例,每人的人脸图片为10张,清晰度还算不错,且图片为经过剪裁和对齐的灰度人脸图片,下载网址

想要收集数据,我们首先要做的就是对每个人的人脸图片进行切分。代码实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import cv2

data = cv2.imread("olivettifaces.jpg")
#转换为灰度图像
data = cv2.cvtColor(data, cv2.COLOR_BRG2GRAY)
#将人脸图片提取为{label:list}形式
faces = {}
label = 0
count = 1
pic_list = []
for row in range(20):
for column in range(20):

LFW人脸数据集

由马萨诸塞大学提供,LFW人脸数据集

YouTube Faces人脸数据集

这个一般是用来做人脸对比的,该网站包含1595个不同的人,来自于3425个在YouTube上下载的视频,网址地址:YouTube Faces

使用OpenCV的人脸检测

OpenCV的安装

在Python中直接用pip下载

pip install opencv-python

如果是在anaconda环境中安装OpenCV,可以通过以下方法:

conda install opencv

OpenCV的检测

#查看引入OpenCV库时会不会报错
import cv2
#查看安装版本
cv2.__version__

Haar级联分类器

在此之前需要先下载两个训练好的xml文件,可以在GitHub中下载将下载的文件放到和运行脚本同一个文件就可以了。

如果你没有放对xml,就会出现以下错误提示:errror:(-215)!......

获得训练好的模型之后,就可以根据这个模型进行人脸识别了,完整代码如下:

import cv2
#创建人脸检测级联分类器对象实例
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#或采用lbp特征进行检测
#face_cascade = cv2.CascadeClassifier('lbpcascade_frontalface.xml')
#创建人眼检测级联分类的实例
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
#载入图片
img = cv2.imread('lena.jpg')
#图片颜色意义不大,灰度化处理即可
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#调用级联分类器进行多尺度检测
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
#遍历检测到的结果
for (x,y,w,h) in faces:
    #检测矩形框,颜色值的顺序为BGR,即矩阵的颜色为蓝色
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    #roi即region of interest, 意思是感兴趣的领域
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    #在检测到的人脸区域内检测眼睛
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
#写出图片
cv2.imwrite('detected_face.jpg',img) 

使用Dlib的人脸检测

Dlib自带了基于Hog特征的人脸检测器,同时在较新版本的Dlib 中,也自带了基于最大边界对象检测器 (Maximum-Margin Object Detector,MMOD)的人脸检测方法。

基于Hog-SVM的人脸检测

下面示范一下使用 Dlib 自带的 Hog-SVM 人脸检测器的使用方法:
import dlib
import cv2

img = cv2 .imread('lena.jpg')

# 加载检测模型
hog_face_detector = dlib.get_frontal_face_detector()
faceRects = hog_face_detector(img,0)
for faceRect in faceRects:
    xl = faceRect.left ()
    y1 = faceRect.top()
    x2 = faceRect.right ()
    y2 = faceRect.bottom()

上述代码需要下载Dlib训练好的检测模型,[官方地址](htp://dlib. net/files/data/dlib_face_detector_training_data. tar. gz)

作者

Hau uhang

发布于

2023-03-19

更新于

2025-04-06

许可协议

评论