SVM算法应用综合练习--人脸表情识别
人脸表情识别
HOG特征值提取
HOG特征提取流程可分为5个部分:检测窗口、归一化图像、计算梯度、统计直方图、梯度直方图归一化、得到HOG特征向量
1. 检测窗口
HOG通过窗口(window)和块(block)将图像进行分割。通过以细胞(cell)为单位,对图像某一区域的像素值进行数学计算处理。在此先介绍窗口(window)、块(block)和细胞(cell)的概念及之间的联系。
窗口(window):将图像按一定大小分割成多个相同的窗口,滑动。 块(block):将每个窗口按一定大小分割成多个相同的块,滑动。
细胞(cell):将每个窗口按一定大小分割成多个相同的细胞,属于特征提取的单元,静止不动。
图像(image)->检测窗口(win)->图像块(block)->细胞单元(cell)
2. 归一化图像
归一化分为gamma空间和颜色空间归一化。归一化同时可以避免在图像的纹理强度中,局部的表层曝光贡献度的比重较大的情况。
3. 计算梯度
计算图像横坐标和纵坐标方向的梯度,并根据横坐标和纵坐标的梯度,计算梯度方向。
4. 构建梯度直方图
HOG构建方向梯度直方图在细胞(cell)中完成:bins(可理解为划分的个数)决定方向的划分。一般bins取9,将梯度方向划分为9个区间。例如,假设一个细胞尺寸为66,则对这个细胞内的36个像素点,先判断像素点梯度方向所属的区间,后根据像素点的梯度幅值大小和梯度方向的大小进行加权于对应的梯度方向区间。
5. 块内进行细胞归一化梯度直方图
局部光照的变化及前景-背景对比度的变化,使梯度强度的变化范围很大,在此需要进行归一6化。
6. 生成HOG特征向量
最后组合所有的块,生成特征向量:例对于一个64128的窗口而言,每88的像素组成一个cell,每22个cell组成一个块,每个块有94个特征,以8个像素为步长,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。所以,一个64128的窗口共36715=3780个特征,代码中一个hog描述子针对一个检测窗口。
代码实现
导入依赖包
# 导入包
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
图片路径
folder_path='D:/art_intelli/art_intelligence/genki4k (1)/genki4k/'
label='labels.txt'#标签文件
pic_folder='files/'#图片文件路径
获得人脸检测器和训练好的人脸68特征点检测器
#获得默认的人脸检测器和训练好的人脸68特征点检测器
def get_detector_and_predicyor():
#使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()
"""
功能:人脸检测画框
参数:PythonFunction和in Classes
in classes表示采样次数,次数越多获取的人脸的次数越多,但更容易框错
返回值是矩形的坐标,每个矩形为一个人脸(默认的人脸检测器)
"""
#返回训练好的人脸68特征点检测器
predictor = dlib.shape_predictor('D:/shape_predictor_68_face_landmarks.dat')
return detector,predictor
#获取检测器
detector,predictor=get_detector_and_predicyor()
截取面部函数
def cut_face(img,detector,predictor):
#截取面部
img_