使用HOG+SVM进行人脸检测

本文介绍了一个使用HOG特征和SVM进行人脸检测的实验。实验包括构建负例数据集、提取HOG特征、训练SVM分类器以及进行非极大值抑制(NMS)以检测人脸。实验分析了NMS和置信度最大值两种策略的结果,对于单个人脸识别,NMS可能不尽如人意,但适合多人脸识别;而置信度最大值策略在单个人脸识别上效果好,但在多人脸场景下可能出现遗漏。

一、实验内容

  1. 利用特征训练一个分类器(SVM)
  2. 按照sliding window思想编写代码,提取HOG并生成候选框;
  3. 使用分类器进行分类(Scoring each proposal)
  4. 编写非极大值抑制算法,去除一些置信度较低的候选框, 得到预测结果,实现人脸检测。
  5. 对实验结果进行分析。

二、实验原理

2.1 图片的HOG特征

概念:HOG,方向梯度直方图,是常用的一种目标检测的特征描述子。

提取流程:检测窗口、归一化图像、计算梯度、统计直方图、梯度直方图归一化、得到HOG特征向量。

检测窗口:HOG的检测窗口称为window,每个window包括几个块block,每个块是由细胞cell组成的,具体如下图所示:

图 1 HOG检测窗口的划分

黑色表示窗口的划分,蓝色表示块的划分,黄色表示细胞的划分。其中每个cell静止不动计算每个像素的方向梯度,block和window滑窗移动,实现不同区域的检测。

归一化图像:这一步的目的是减少光照因素影响,将整个图像进行一个归一化,分为Gamma空间和颜色空间归一化,可以避免在图像的纹理强度中,局部的表层曝光贡献度的比重较大的情况。其中gamma值可以根据效果修改,代码中默认为0.5。

计算梯度:计算图像的水平和竖直方向的梯度,并根据横纵坐标的梯度,计算整体梯度方向,可以参考平面直角坐标系中斜率的计算。代码中可以使用Sobel算子进行卷积计算,再得到tan值。

构建梯度直方图:梯度直方图是在cell层级进行构建的,横坐标的区间称为bins,若bins为9,则将180°等分为9个区间,每个区间横跨20°,先判断像素点梯度方向所属的区间,再根据像素点的梯度值和方向大小进行加权统计,可用线性加权、平方根等各种加权方法。

直方图归一化:在block一层,对每个cell进行颜色、亮度的归一化,去掉光影、阴影的影响。

得到特征向量:通过滑窗,将提取到的HOG特征首尾相连,形成一个大的一维向量,就是最后得到的特征向量。

2.2 非极大值抑制(NMS)

概念:NMS,非极大值抑制,原理是找到所有局部最大值,并抑制非局部最大值。

目标检测推理的过程中会产生很多的候选检测框,很多检测框都是检测同一个目标,导致候选框之间的重叠部分过多,这时使用非极大值抑制可以找出局部最优的框,去掉重复部分。

算法流程:根据置信度得分进行排序、选择置信度最高的候选框加入到最终结果列表,并在候选框中删除、计算所有边界框的面积、计算置信度边界框与其余边界框的IoU、删除大于阈值的候选框,直至候选集为空。

IoU:交并比,计算两个边框交集和并集的比值,可参考下图:

 

图 2 IoU计算示意图

PS:图片来自博客:目标检测之 IoU_黑暗星球的博客-CSDN博客_目标检测iou

三、实验结果与分析

3.1 实验流程与结果数据

使用HOG特征+SVM分类器进行人脸检测。

流程为:构建负例数据集、提取图像HOG特征、训练SVM分类器、人脸检测。

3.1.1 构建负例数据集

实验使用的数据集是RAF-DB的子集,有原图、人脸裁剪图、检测边界框,但无负例图片,需要使用原图和边界框log文件构建非人脸图片,核心代码如下:

  1. def build_neg_img(original_folder, box_folder, output_folder):
  2.     mkdir(output_folder)
  3.     for filename in tqdm(os.listdir(original_folder)):
  4.         original_img = cv2.imread(original_folder + "\\" + filename)
  5.         axis_list = get_box(box_folder, filename)
  6.         # 设边界框的左上角为M点,右下角为N点,图片的原点位于左上角,x轴向右为正方向,y轴向下为正方向
  7.         Mx = axis_list[0]
  8.         My = axis_list[1]
  9.         Nx = axis_list[2]
  10.         Ny = axis_list[3]
  11.         box_width = Nx - Mx
  12.         box_height = Ny - My
  13.         # 与人脸边界框错开构建负例图像,左上角起始点为K
  14.         if Mx - box_width >= 0:
  15.             # 在边界框左侧框选同样大小的负例框
  16.             Kx = Mx - box_width
  17.             Ky = My
  18.         elif My - box_height >= 0:
  19.             # 在边界框上方选同样大小的负例框
  20.             Kx = Mx
  21.             Ky = My - box_height
  22.         else:
  23.           
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值