22. 三种特征分类器-Harr、LBP、HOG
通常涉及的三种类型为Haar、LBP和HOG,并且这些方法涵盖了不同局部区域的特性
Haar描述的是图像在局部范围内像素值明暗变换信息;
LBP描述的是图像在局部范围内对应的纹理信息;
HOG描述的则是图像在局部范围内对应的形状边缘梯度信息。
1. Harr
基于级联的 Haar 检测器,在 OpenCV 平台中被广泛应用于面部识别系统中。该系统不仅能够执行人脸探测、面部表情识别(如微笑)以及眼唇区域的探测等功能,并且可以通过导入这些预先训练好的 Haar 模型数据来实现对目标物体的精确识别过程。Haar 特征值则表征了图像的空间对比度和梯度变化特性,并根据其空间分布特点将其划分为边缘特徵、线性特徵、中心特徵以及对角线特徵四种类型。
级联的相关概念:
- 将级联分类器视为决策树结构更为直观。
- 在训练过程中通常采用25×25像素的小图像作为样本,在实际应用中则需要处理不同尺寸的对象。
- 因此,在识别较大尺寸的人脸时需要采用多尺度检测策略。
- 该策略可分为两种实现方式:
- 针对第一种方法(固定大小的搜索窗口无法满足复杂场景的需求),可以通过逐步缩放图像来适应不同尺寸的人脸。
- 第二种方法则通过初始化固定大小的搜索窗口并不断将其扩展来实现目标检测。
- HAAR特征具备以下关键特性:
- 高类间变异性:能够有效区分不同类别的人脸区域
- 低类内变异性:在同类别的区域内变化较小
- 局部强度差异:能够捕捉到区域内的明暗对比
- 多尺度适应性:能够处理不同分辨率的人脸图像
- HAAR特征在人脸识别领域具有重要应用价值
- OpenCV内置了现成的人脸HAAR特征分类器(结合Adaboost算法)
- 具体来说:
- OpenCV数据目录下的haarcascades子目录中包含了多个预训练好的HAAR分类器文件
- 值得一提的是haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是高效的通用人脸检测模型
- 这些模型不仅适用于脸部检测还可以用于识别眼睛部位或其他人体部位
- 相关函数推荐使用cvHaarDetectObjects来进行HAAR特征物体检测操作
2. LBP
LBP(Local Binary Pattern)是一种经典的数字图像处理工具;用于分析图像中的纹理细节,并具备旋转对称性和灰度均匀性的突出优势。
基于LBP特征提取的方法的核心在于:图像中的每一个物体必然包含多个像素,并且这些像素必须具备连续的空间位置关系;也就是说,在这些具有关联性的空间位置上存在的相邻区域内的像素信息也具有关联性;从而使得我们可以利用相邻区域内的这些相邻的空间区域内的 pixels 来对当前 pixel 进行二进制编码。
在OpenCV框架中,基于LBP特征的人脸检测速度显著快于Haaris方法。其主要原因在于LBP特征避免了小数运算带来的计算负担。
LBP的函数调用和HAAR级联一样,只是加载的xml不同。
3. HOG
该方向梯度直方图(Histogram of Oriented Gradient, HOG)是一种广泛应用于计算机视觉和图像处理领域的特征描述子。该方法通过计算并统计图像局部区域的梯度方向分布来生成特征。将HOG与SVM结合的方法已被广泛应用于图像识别领域,并在行人检测方面取得了显著成效。值得注意的是,在2005年的CVPR会议上,法国研究人员Dalal首次提出了基于HOG与SVM的人行 Detection方法。
函数如下:
cv2.cascadeclassifier是一个用于 facial detection 的级联分类器。
face_detector.detectMultiScale(image, scaleFactor, minNeighbors, flag, minSize, maxSize) 用于在给定图像中检测多个人脸。
该函数返回人脸位置坐标 (x, y) 和尺寸 (w, h)。
关于 flags 参数:
CV_HAAR_DO_CANNY_PRUNING:通过Canny边缘检测去除边缘不足或过多的区域;CV_HAAR_SCALE_IMAGE:按比例执行精确检测;CV_HAAR_FIND_BIGGEST_OBJECT:仅搜索并返回最大尺寸的目标;CV_HAAR_DO_ROUGH_SEARCH:仅进行粗略搜索以快速定位目标。
4. 人脸检测代码
import cv2 as cv
"""
使用Haar分类器进行面部检测
6. 1. 简单介绍Haar特征分类器对象检测技术
它是基于机器学习的,通过使用大量的正负样本图像训练得到一个cascade_function,最后再用它来做对象检测。
如果你想实现自己的面部检测分类器,需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。
可参考https://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html,这里不做介绍,现在我们利用
OpenCV已经训练好的分类器,直接利用它来实现面部和眼部检测。
2. 主要步骤:
1)加载xml分类器,并将图像或者视频处理成灰度格式 cv.CascadeClassifier()
2)对灰度图像进行面部检测,返回若干个包含面部的矩形区域 Rect(x,y,w,h)face_detector.detectMultiScale()
3)创建一个包含面部的ROI,并在其中进行眼部检测
3. 重要方法分析:def detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, minSize=None, maxSize=None)
原理:检测输入图像在不同尺寸下可能含有的目标对象
#minSize – Minimum possible object size. Objects smaller than that are ignored.
#maxSize – Maximum possible object size. Objects larger than that are ignored.
入参:
1)image:输入的图像
2)scaleFactor:比例因子,图像尺寸每次减少的比例,要大于1,这个需要自己手动调参以便获得想要的结果
3)minNeighbors:最小附近像素值,在每个候选框边缘最小应该保留多少个附近像素
4)minSize,maxSize:最小可能对象尺寸,所检测的结果小于该值会被忽略。最大可能对象尺寸,所检测的结果大于该值会被忽略
返回:若干个包含对象的矩形区域
"""
def face_detection(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
face_detector = cv.CascadeClassifier("../images/haarcascade_frontalface_alt_tree.xml")
eyes_detector = cv.CascadeClassifier("../images/haarcascade_eye.xml")
faces = face_detector.detectMultiScale(gray, 1.01, 5)
for x, y, w, h in faces:
img = cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eyes_detector.detectMultiScale(roi_gray, 1.3, 5)
for ex, ey, ew, eh in eyes:
cv.rectangle(roi_color, (ex, ey), (ex + ew, ey + ey), (0, 255, 0), 2)
cv.imshow("result", image)
def main():
src = cv.imread("../images/CrystalLiu1.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
face_detection(src)
# 打开摄像头进行视频检测
# capture = cv.VideoCapture(0)
# cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
# while True:
# ret, frame = capture.read()
# # frame = cv.flip(frame, 0)
# face_detection(frame)
# c = cv.waitKey(10)
# if c == 27:
# break
cv.waitKey(0)
cv.destroyAllWindows() # 关闭所有窗口
if __name__ == '__main__':
main()
代码解读
