人脸检测通常是人脸识别等复杂任务的第一步操作,目前主流的人脸检测算法:https://zhuanlan.zhihu.com/p/24816781。这里主要记录一些常用的算法实践,目前只有OpenCV提供的Haar级联检测和调用Face++的人脸检测接口,后续实践后会补充,相当于做个小小的积累。
我们将使用 OpenCV 中的 Haar feature-based cascade classifiers 来检测图像中的人脸。OpenCV 提供了很多预训练的人 脸检测模型,它们以XML文件保存在 github。我们已经下载了其中一个检测模型,并且把它存储在 haarcascades
的目录中。
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
# 提取预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_alt.xml')
# 加载彩色(通道顺序为BGR)图像
img = cv2.imread('images/9f510fb30f2442a70a9add3dd143ad4bd0130295.jpg')
# 将BGR图像进行灰度处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 在图像中找出脸
faces = face_cascade.detectMultiScale(gray)
# 打印图像中检测到的脸的个数
print('Number of faces detected:', len(faces))
print(type(faces))
# 获取每一个所检测到的脸的识别框
for (x,y,w,h) in faces:
# 在人脸图像中绘制出识别框
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 将BGR图像转变为RGB图像以打印
cv_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 展示含有识别框的图像
plt.imshow(cv_rgb)
plt.show()
解释:
在使用任何一个检测模型之前,将图像转换为灰度图是常用过程。 在上方的代码中, |
Haar 级联检测是一种合适的人脸检测技术,但是通过上面例子可以看出,它的准确率不够高,我们可以使用其他算法来提高检测的准确率,可以尝试HOG(Histograms of Oriented Gradients)或一些基于深度学习的算法,如YOLO(Real-Time Object Detection algorithm)、FaceNet、MTCNN等。此外,你可以使用[imgaug]来对训练集进行增强、扩充,以增加训练集中的多样性。
地址:https://www.faceplusplus.com.cn/,注册账号之后,在应用管理处添加API KEY:
import requests
from json import JSONDecoder
http_url = "https://api-cn.faceplusplus.com/facepp/v3/detect"
key = "vsrZW9RPfVDo0L9n2uXUH718YBvIJcT-"
secret = "gHiWjCD9yh0XQjI7r2SEcdY8JBn14y9v"
filepath = "images/9f510fb30f2442a70a9add3dd143ad4bd0130295.jpg"
data = {"api_key": key, "api_secret": secret, "return_landmark": "1"}
files = {"image_file": open(filepath, "rb")}
response = requests.post(http_url, data=data, files=files)
req_con = response.content.decode('utf-8')
req_dict = JSONDecoder().decode(req_con)
faces = req_dict['faces']
print('Number of faces detected:', len(faces))
faceNum = len(faces)
print("识别到了%d个人脸"%(faceNum))
for i in range(faceNum):
face_rectangle = faces[i]['face_rectangle']
width = face_rectangle['width']
top = face_rectangle['top']
left = face_rectangle['left']
height = face_rectangle['height']
start = (left, top)
end = (left+width, top+height)
color = (55,255,155)
thickness = 3
cv2.rectangle(img, start, end, color, thickness)
# 将BGR图像转变为RGB图像以打印
cv_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 展示含有识别框的图像
plt.imshow(cv_rgb)
plt.show()