这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 企业专区» OpenVINO生态社区» 【原创】项目实战—人脸检测之HOG实战(四)

共2条 1/1 1 跳转至

【原创】项目实战—人脸检测之HOG实战(四)

高工
2020-08-23 21:40:04 打赏

项目实战—人脸检测之HOG实战(四)

我们在之前注意到,在计算HOG方向梯度直方图特征时,如果按照上面说的直接对每一个小块进行梯度、梯度幅值、角度的计算,然后在进行统计,这样做的话,HOG的计算复杂度将会十分大,因此,我们可以将积分图的概念引入HOG的计算,以便加速HOG的计算性能。

积分图就是:对于一幅灰度图像而言,如果每一像素点的灰度值等于该像素点左上矩形区域所有像素点的灰度值之和,那么这幅图像就是积分图像。

1)为什么要用积分图像

图像直方图的计算方法为:遍历图像中的全部像素并累加计算每个灰度强度值出现的次数。但是,有时候需要计算图像中多个特定区域的直方图的,如果按照上面的计算方法进行计算的话,这个求解过程将会变得十分的耗时。在这种情况下使用积分图像将会极大的提高统计图像子区域像素的效率。

2)积分图像的概念

积分图就是:对于一幅灰度图像而言,如果每一像素点的灰度值等于该像素点左上矩形区域所有像素点的灰度值之和,那么这幅图像就是积分图像。

现在我们开始进行实战部分。

首先我们需要安装dlib库:

conda install dlib

同时还需要安装imutils库:

pip install imutils

预处理

首先,输入图像必须尺寸相同(可通过裁剪和缩放)。图像长宽比要求为1:2,因此输入图像的尺寸可能为64x128100x200

计算梯度图像

第一步是通过以下卷积核计算图像的水平梯度和垂直梯度:

image.png

图像的梯度通常会消除非必要信息。

上面图像的梯度可以通过下面的python语句找到:

gray = cv2.imread('min.jpg', 0) im = np.float32(gray) / 255.0 # Calculate gradient gx = cv2.Sobel(im, cv2.CV_32F, 1, 0, ksize=1) gy = cv2.Sobel(im, cv2.CV_32F, 0, 1, ksize=1) mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)

绘制图片:

plt.figure(figsize=(12,8)) plt.imshow(mag) plt.show()

image.png

计算HOG

首先将图像分成8x8个单元来提供紧凑表示,使HOG对噪声更鲁棒。然后,计算每个单元的HOG

为了估计区域内的梯度方向,我们只需在每个区域内的64个梯度方向值(8x8)及其大小(另外64个值)之间构建直方图。直方图的类别对应梯度的角度,从0180°。总共9类:20°40°...... 160°

上面的代码给了我们2个信息:

·梯度方向

·梯度大小

当我们构建HOG时,有3种情况:

·角度小于160°,且不介于两类之间。在这种情况下,角度将添加到HOG的正确类中。

·角度小于160°,恰好在两类之间。在这种情况下,像素被均分到左右两侧类中。

·角度大于160°。在这种情况下,我们认为像素与160°成比例。

image.png

image.png

每个8x8单元的HOG如下所示:

image.png

模块归一化

最后,可以用16×16的模块对图像进行归一化,并使其对光照不变。这可以通过将大小为8x8HOG的每个值除以包含它的16x16模块的HOGL2范数来实现,这个模块实际上是长度为9*4 = 36的简单向量。

最后,将所有36x1向量连接成一个大向量。OK!现在有了特征向量,我们可以在上面训练一个软SVM分类器(C=0.01)。

检测图像上的人脸

代码最终实现:

import cv2 import dlib import numpy as np import matplotlib.pyplot as plt from imutils import face_utils gray = cv2.imread('min.jpg', 0) im = np.float32(gray) / 255.0 # Calculate gradient gx = cv2.Sobel(im, cv2.CV_32F, 1, 0, ksize=1) gy = cv2.Sobel(im, cv2.CV_32F, 0, 1, ksize=1) mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True) face_detect = dlib.get_frontal_face_detector() rects = face_detect(gray, 1) for (i, rect) in enumerate(rects): (x, y, w, h) = face_utils.rect_to_bb(rect) cv2.rectangle(gray, (x, y), (x + w, y + h), (255, 255, 255), 3) plt.figure(figsize=(12,8)) plt.imshow(gray, cmap='gray') plt.show()

结果:

image.png

实时人脸检测

同样的,我们可以使用摄像头进行人脸检测:

video_capture = cv2.VideoCapture(0) face_detect = dlib.get_frontal_face_detector() flag = 0 while True: ret, frame = video_capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) rects = face_detect(gray, 1) for (i, rect) in enumerate(rects): (x, y, w, h) = face_utils.rect_to_bb(rect) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('Video', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break video_capture.release() cv2.destroyAllWindows()

演示效果大家可以自行实验。


对计算机视觉感兴趣?这个社区推荐给你~

>>点击了解OpenVINO生态开发社区



助工
2020-08-28 15:19:19 打赏
2楼

厉害了


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]