利用hog和svm识别图片有无人脸的代码
时间: 2024-12-30 17:37:54 浏览: 7
利用霍夫关键点检测(Histogram of Oriented Gradients, HOG)和支持向量机(Support Vector Machine, SVM)进行人脸识别的基本步骤可以分为以下几个部分:
1. **图像预处理**:
- 转换为灰度图像,减少颜色信息对HOG的影响。
- 分割出感兴趣区域,比如人脸可能所在的区域。
2. **提取HOG特征**:
- 计算每个小窗口(cell)内像素的梯度方向直方图。
- 将相邻窗口的直方图串联起来形成描述子(Descriptor),通常使用block-wise normalization(归一化块)来增强对比度。
3. **计算描述符池**:
- 对整个图像或感兴趣区域内所有窗口应用HOG计算,得到一组描述符。
4. **创建训练集**:
- 使用已标记的人脸数据集,每张包含人脸的图片生成对应的HOG特征描述子作为正样本。
- 同样地,对于无脸图片,可以选择随机位置填充噪声或空白,然后提取特征作为负样本。
5. **训练SVM**:
- 将正样本和负样本特征输入到SVM分类器中进行训练,选择合适的核函数(如线性、多项式或高斯径向基函数RBF)。
6. **人脸检测**:
- 在新的待识别图片上,同样使用HOG进行窗口滑动,每窗口提取特征。
- 然后将这些特征传递给训练好的SVM,判断是否为人脸。
7. **决策与反馈**:
- 如果SVM输出的概率超过某个阈值,认为存在人脸;反之则认为是背景或其他物体。
以下是Python(OpenCV库)的一个简要示例代码片段:
```python
import cv2
from skimage.feature import hog
from sklearn import svm
# ... (假设已经读取并预处理了图片)
# HOG 参数设置
win_size = (64, 64)
block_size = (16, 16)
orientations = 9
pixels_per_cell = (8, 8)
cells_per_block = (2, 2)
# 提取HOG特征
def extract_hog_features(img):
return hog(img, orientations=orientations,
pixels_per_cell=pixels_per_cell,
cells_per_block=cells_per_block)
# 训练SVM
hog_features = [] # 存储特征
labels = [0] * len(noface_samples) + [1] * len(face_samples) # 0代表无脸,1代表人脸
clf = svm.LinearSVC()
clf.fit(hog_features, labels)
# 新图片识别
test_img = ... # 加载一张待识别图片
features = extract_hog_features(test_img)
prediction = clf.predict([features])
if prediction[0] == 1:
print("检测到人脸")
else:
print("未检测到人脸")
阅读全文