【导读】本文是专栏《计算机视觉40例简介》的第36个案例《调用CNN实现人脸检测》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。 目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。 大家可以在公众号“计算机视觉之光”回复关键字【案例36】获取本文案例的源代码及使用的测试图片等资料。 针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。 本文简要介绍了本案例的一些基础知识,更详细的理论介绍、代码实现等内容请参考《计算机视觉40例简介》第27章《dlib库》以获取更详细信息。 |
Dlib是一个现代工具包,包含机器学习算法和工具,用于在程序中构造软件来解决复杂的现实世界问题。它被工业界和学术界广泛应用于机器人、嵌入式设备、移动电话和大型高性能计算环境等领域。Dlib的开源许可允许用户在任何应用程序中免费使用它。
Dlib官网提供了非常翔实的资料,对它的函数有非常具体的使用说明。除此以外,Dlib官网还提供了大量的案例帮助我们快速掌握该工具的使用。
本章中,我们使用Dlib实现几个跟人脸识别相关的具有代表性的案例,具体如下:
- 定位人脸
- 绘制关键点
- 勾勒五官轮廓
- 人脸对齐
- 调用CNN实现人脸检测
本章中所使用的模型均可在Dlib官网下载。
Dlib中提供了调用CNN人脸检测器的方式。调用CNN模型比基于HOG的模型要更加精准,但是也要花费更多的算力。通常情况下,我们使用Dlib的HOG定位人脸时感觉不到任何的时延,而调用CNN时能够感觉到非常明显的时延。
在Dlib中调用CNN实现人脸检测的步骤如下:
步骤1:载入模型。通过模型装载函数,将CNN模型载入。
步骤2:使用检测器检测人脸。函数函数cnn_face_detector,完成人脸检测。
步骤3:遍历步骤2得到的每一张人脸,将其输出。
使用Dlib调用CNN的人脸检测器代码如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Dec 9 19:57:51 2021
@author: 李立宗 lilizong@gmail.com
微信公众号:计算机视觉之光(微信号cvlight)
计算机视觉40例——从入门到深度学习(OpenCV-Python)
李立宗 著 电子工业出版社
"""
import dlib
import cv2
# 载入模型
cnn_face_detector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")
# 读取图像
img = cv2.imread("people.jpg", cv2.IMREAD_COLOR)
# 检测
faces = cnn_face_detector(img, 1)
# 返回的结果faces是一个mmod_rectangles对象,有2个成员变量:
# dlib.rect类,表示对象的位置
# dlib.confidence,表示置信度。
for i, d in enumerate(faces):
# 计算每个人脸的位置
rect = d.rect
left = rect.left()
top = rect.top()
right = rect.right()
bottom = rect.bottom()
# 绘制人脸对应的矩形框
cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)
cv2.imshow("result", img)
k = cv2.waitKey()
cv2.destroyAllWindows()
运行程序,运行结果如图1所示,程序准确地识别出了每一张人脸。本程序运行较慢,请耐心等待。
图1 检测结果
在《计算机视觉40例——从入门到深度学习(OpenCV-Python)》第27章《dlib库》中详细介绍了定位人脸、绘制关键点、勾勒五官轮廓、人脸对齐、调用CNN实现人脸检测等案例。
《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。