基于OpenCV+HOG+SVM的真假人脸二分类实战(附完整代码)

一、项目背景与目标

本文通过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即可运行)
  • 无需深度学习框架依赖
  • 对光照变化具有一定鲁棒性

 局限:

  • 依赖准确的人脸检测
  • 特征表达能力有限
  • 难以处理高保真假脸

 

六、改进方向

  1. 特征融合 :结合颜色直方图+HOG+LBP多特征
  2. 分类器优化 :使用随机森林、XGBoost提升性能
  3. 数据增强 :对训练集进行旋转/缩放扩充
  4. 迁移学习 :引入预训练CNN提取特征

七、总结

本文通过传统图像处理技术实现了真假人脸分类系统,验证了OpenCV+HOG+SVM方案的有效性。虽然准确率不及深度学习方法,但其轻量化优势在边缘设备部署场景中具有重要价值。后续可通过特征工程优化进一步提升性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值