目录
一、HOG特征提取原理
HOG特征提取流程可分为5个部分:
检测窗口
、归一化图像
、计算梯度
、统计直方图
、梯度直方图归一化
、得到HOG特征向量
。
流程:
1.先构建一个HOG特征提取器,到时候图片处理完之后就可以直接提取特征了
2用opencv来读取数据集,但有些照片是检测不出脸的,可以直接删掉
3.如果对一整张照片进行特征提取的话维数就太多了,不仅影响提取和训练速度,进行了图片截取,截取的是嘴巴那一部分的
4.图片处理好了,就是提取图片的特征值了,提取了特征值之后就是筛掉检测不到脸的图片,后面就是训练和保存图像
1.检测窗口:
HOG通过窗口(window)和块(block)将图像进行分割。通过以细胞(cell)为单位,对图像某一区域的像素值进行数学计算处理。在此先介绍窗口(window)、块(block)和细胞(cell)的概念及之间的联系。
窗口(window):将图像按一定大小分割成多个相同的窗口,滑动。
块(block):将每个窗口按一定大小分割成多个相同的块,滑动。
细胞(cell):将每个窗口按一定大小分割成多个相同的细胞,属于特征提取的单元,静止不动。
图像(image)->检测窗口(win)->图像块(block)->细胞单元(cell)
2.归一化图像
归一化分为gamma空间和颜色空间归一化。为减少光照因素影响,将整个图像进行规范化(归一化)。(归一化公式:y=(x-MinValue)/(MaxValue-MinValue))。归一化同时可以避免在图像的纹理强度中,局部的表层曝光贡献度的比重较大的情况。标准化Gamma压缩公式:I(x,y)=I(x,y)^gamma. gamma根据自己效果取值,如1/2.
3.计算梯度
计算图像横坐标和纵坐标方向的梯度,并根据横坐标和纵坐标的梯度,计算梯度方向。
4.构建梯度直方图
HOG构建方向梯度直方图在细胞(cell)中完成:bins(可理解为划分的个数)决定方向的划分。一般bins取9,将梯度方向划分为9个区间。例如,假设一个细胞尺寸为6*6,则对这个细胞内的36个像素点,先判断像素点梯度方向所属的区间,后根据像素点的梯度幅值大小和梯度方向的大小进行加权于对应的梯度方向区间。
5.块内进行细胞归一化梯度直方图
局部光照的变化及前景-背景对比度的变化,使梯度强度的变化范围很大,在此需要进行归一化。
6.生成HOG特征向量
最后组合所有的块,生成特征向量:例对于一个64128的窗口而言,每88的像素组成一个cell,每22个cell组成一个块,每个块有94个特征,以8个像素为步长,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。所以,一个64128的窗口共367*15=3780个特征,代码中一个hog描述子针对一个检测窗口。
二、代码实现
1.导导入依赖包
# 导入包
import numpy as np
import cv2
import dlib
import random#构建随机测试集和训练集
from sklearn.svm import SVC #导入svm
from sklearn.svm import LinearSVC #导入线性svm
from sklearn.pipeline import Pipeline #导入python里的管道
import os
import joblib#保存模型
from sklearn.preprocessing import StandardScaler,PolynomialFeatures #导入多项式回归和标准化
import tqdm
2. 图片路径:
folder_path='D:\photos\genki4k/'
label='labels.txt'#标签文件
pic_folder='files/'#图片文件路径