一、项目背景与目标
本文通过OpenCV传统图像处理技术,结合HOG特征提取与SVM分类器,实现了一个轻量级真假人脸二分类系统,最终达到58.91%的准确率 ,适用于嵌入式设备或低算力场景。
二、方法原理与流程
1. 核心技术栈
- OpenCV :人脸检测与图像预处理
- HOG特征 :提取纹理方向信息
- SVM分类器 :线性分类决策
2. 整体流程图解
原始图像 → 人脸检测 → 图像归一化 → HOG特征提取 → SVM分类 → 输出结果
三、关键技术详解
1. 人脸检测(OpenCV Haar级联)
作用:
定位图像中人脸区域,排除背景干扰
关键代码:
def detect_face(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
return img[y:y+h, x:x+w] if len(faces) > 0 else None
参数说明:
minNeighbors=5
:控制检测框保留阈值scaleFactor=1.1
:图像缩放比例
2. HOG特征提取
作用:
捕捉人脸局部纹理方向特征,对光照变化具有鲁棒性
关键代码:
from skimage.feature import hog
def extract_hog_features(face_img):
face_resized = cv2.resize(face_img, (128,128))
gray = cv2.cvtColor(face_resized, cv2.COLOR_BGR2GRAY)
return hog(gray, pixels_per_cell=(8,8), cells_per_block=(2,2))
特征维度:
- 图像尺寸:128×128
- Cell大小:8×8 → 16×16 cells
- Block大小:2×2 cells
- 每个block的特征维度:(8×8/8×8)×9=1024维
3. SVM分类器
作用:
构建线性分类边界,区分真伪人脸特征
关键代码:
from sklearn.svm import SVC
clf = SVC(kernel='linear')
clf.fit(X_train_hog, y_train_hog)
preds = clf.predict(X_test_hog)
print(f'准确率:{accuracy_score(y_test_hog, preds):.2%}')
参数优化:
C=1.0
:正则化参数(默认值)class_weight='balanced'
:可选,处理类别不平衡
四、完整代码实现
# 必要库导入
import cv2
import numpy as np
import os
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from skimage.feature import hog
# 修改这里:使用 tensorflow.keras 而非原生 keras
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import layers, models, optimizers
# 数据加载函数
def load_images(path):
images = []
for file in os.listdir(path):
if file.endswith('.jpg'):
img = cv2.imread(os.path.join(path, file))
if img is not None:
images.append(img)
return images
# 数据路径
real_path = r'd:\Users\Administrator\Desktop\real_and_fake_face\training_fake' # 真人脸
fake_path = r'd:\Users\Administrator\Desktop\real_and_fake_face\training_real' # 假人脸
# 数据加载
real_images = load_images(real_path)
fake_images = load_images(fake_path)
# 数据合并与标签分配
X = real_images + fake_images
y = [1]*len(real_images) + [0]*len(fake_images)
# 数据划分
X_train_raw, X_test_raw, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 方法一:OpenCV人脸检测 + HOG特征 + SVM分类
def detect_face(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
if len(faces) == 0:
return None
x, y, w, h = faces[0]
return img[y:y+h, x:x+w]
# 特征提取
def extract_hog_features(face_img):
face_resized = cv2.resize(face_img, (128, 128))
gray = cv2.cvtColor(face_resized, cv2.COLOR_BGR2GRAY)
features, hog_image = hog(gray, pixels_per_cell=(8, 8), cells_per_block=(2, 2), visualize=True)
return features, hog_image # 返回特征和可视化图像
# 数据处理
X_train_hog, y_train_hog = [], []
for img, label in zip(X_train_raw, y_train):
face = detect_face(img)
if face is not None:
features, _ = extract_hog_features(face)
X_train_hog.append(features)
y_train_hog.append(label)
X_test_hog, y_test_hog = [], []
for img, label in zip(X_test_raw, y_test):
face = detect_face(img)
if face is not None:
features, _ = extract_hog_features(face)
X_test_hog.append(features)
y_test_hog.append(label)
# SVM分类器训练
clf = SVC(kernel='linear')
clf.fit(X_train_hog, y_train_hog)
preds = clf.predict(X_test_hog)
acc1 = accuracy_score(y_test_hog, preds)
print(f'方法一准确率:{acc1:.2%}')
# 方法一可视化
test_face = detect_face(X_test_raw[0])
if test_face is not None:
_, hog_image = extract_hog_features(test_face)
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.imshow(cv2.cvtColor(test_face, cv2.COLOR_BGR2RGB))
plt.title('Detected Face')
plt.subplot(122)
plt.imshow(hog_image, cmap='gray')
plt.title('HOG Features')
plt.show()
五、实验结果分析
1. 可视化效果
2. 方法优劣
优势:
- 计算开销小(CPU即可运行)
- 无需深度学习框架依赖
- 对光照变化具有一定鲁棒性
局限:
- 依赖准确的人脸检测
- 特征表达能力有限
- 难以处理高保真假脸
六、改进方向
- 特征融合 :结合颜色直方图+HOG+LBP多特征
- 分类器优化 :使用随机森林、XGBoost提升性能
- 数据增强 :对训练集进行旋转/缩放扩充
- 迁移学习 :引入预训练CNN提取特征
七、总结
本文通过传统图像处理技术实现了真假人脸分类系统,验证了OpenCV+HOG+SVM方案的有效性。虽然准确率不及深度学习方法,但其轻量化优势在边缘设备部署场景中具有重要价值。后续可通过特征工程优化进一步提升性能。