用SVM hog进行行人检测,给出代码(用正负样本进行训练并进行注释)
时间: 2024-05-09 10:20:19 浏览: 7
以下是使用SVM hog进行行人检测的代码,其中包括训练和测试。
训练部分:
```python
import cv2
import numpy as np
# 加载正样本和负样本图像
pos_img = cv2.imread('pos_img.jpg')
neg_img = cv2.imread('neg_img.jpg')
# 设置 HOG 参数
win_size = (64, 128)
block_size = (16, 16)
block_stride = (8, 8)
cell_size = (8, 8)
nbins = 9
# 创建 HOG 描述符
hog = cv2.HOGDescriptor(win_size, block_size, block_stride, cell_size, nbins)
# 提取正样本和负样本的 HOG 特征
pos_hog = hog.compute(pos_img)
neg_hog = hog.compute(neg_img)
# 将正样本和负样本的 HOG 特征合并成一个训练集
train_data = np.vstack((pos_hog, neg_hog))
# 创建标签,正样本标签为 1,负样本标签为 -1
train_labels = np.hstack((np.ones(len(pos_hog)), -1*np.ones(len(neg_hog))))
# 训练 SVM 分类器
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.trainAuto(train_data, cv2.ml.ROW_SAMPLE, train_labels)
```
测试部分:
```python
# 加载测试图像
test_img = cv2.imread('test_img.jpg')
# 设置滑动窗口参数
win_stride = (8, 8)
padding = (8, 8)
scale = 1.05
# 在测试图像上使用滑动窗口,提取 HOG 特征并进行行人检测
found, _ = hog.detectMultiScale(test_img, winStride=win_stride, padding=padding, scale=scale)
# 在检测到的行人上绘制矩形框,并显示结果
for (x, y, w, h) in found:
cv2.rectangle(test_img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Pedestrian Detection', test_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
注释:
1. 首先加载正样本和负样本图像,这些图像应该是包含行人和不包含行人的图像。
2. 然后设置 HOG 参数,包括窗口大小、块大小、块步幅、单元格大小和直方图的数量。
3. 创建 HOG 描述符对象,用于提取图像的 HOG 特征。
4. 使用 `hog.compute()` 函数提取正样本和负样本的 HOG 特征,并将其合并成一个训练集。同时,为每个训练样本创建标签,正样本标签为 1,负样本标签为 -1。这些标签将用于训练 SVM 分类器。
5. 创建 SVM 分类器,并设置其类型和核函数。然后使用 `trainAuto()` 函数训练分类器。
6. 加载测试图像,并设置滑动窗口参数,包括步长、填充和缩放因子。
7. 使用 `hog.detectMultiScale()` 函数在测试图像上使用滑动窗口,提取 HOG 特征并进行行人检测。
8. 在检测到的行人上绘制矩形框,并显示结果。