基于SVM的行人检测系统的设计与实现
1.1主要研究内容
(1)工作的主要描述
使用OpenCv进行行人检测的主要思想: HOG + SVM
在使用HOG + SVM进行行人检测时, 采集HOG特征的主要思想是通过对一幅图像进行分析, 局部目标的表象和形状可以被剃度或者边缘密度方向分布很好的好的描述. 我们对图像的各个像素点采集土堆或者边缘的方向直方图, 根据直方图的信息就可以描述图片的特征. 好在OpenCv 中已经提供了计算HOG 特征的方法, 根据采集到的HOG特征向量, 供SVM分类使用. SVM简单来说就是一个分类器, 在行人检测中就可以转化为行人与非行人的两类分类问题, 在OpenCv中运用到的是基于网格法的SVM.使用采集到的正样本(行人)和负样本(非行人, 可以是汽车, 树木, 路灯等等)的HOG特征, 然后使用SVM分类器进行训练, 得到行人检测模型, 进行行人检测。
(2)系统流程图
1.2 题目研究的工作基础或实验条件
(1)硬件环境:windows10
(2)软件环境:pycharm平台,python编程语言。
1.3 数据集描述
本实验使用的数据集使用的是百度飞浆平台公开的数据集,选用的数据分为两类,一类是行人行走的照片ppm文件,另一类是环境的照片jpg文件,一共1000张。如图1、图2所示。
图1 行人数据集
图2 环境数据集
1.4 特征提取过程描述
HOG特征(方向梯度直方图特征)是一种在计算机视觉领域广泛用于物体检测的技术。局部图像区域特征可以通过图像局部区域的梯度方向表达,即特征可以由梯度方向表达。HOG特征技术将图像分为小的区域,然后采集区域中各像素点的梯度方向直方图,把这些直方图组合起来就可以构成特征的描述。
计算过程:
(1)将线性颜空间经过Gamma校正转化为非线性空间
(2)计算图像梯度
(3)为每个区域构建梯度方向直方图
(4)把区域合并成大的区间,区间内归一化梯度直方图
(5)合并HOG特征
1.5 分类过程描述
支持向量机SVM是从线性可分情况下的最优分类面提出的。所谓最优分类,就是要求分类线不但能够将两类无错误的分开,而且两类之间的分类间隔最大,前者是保证经验风险最小(为0),而通过后面的讨论我们看到,使分类间隔最大实际上就是使得推广性中的置信范围最小。推广到高维空间,最优分类线就成为最优分类面。
1.6 主要程序代码(要求必须有注释)
#导入一些包
import matplotlib.pyplot as plt
import os
import cv2
from sklearn import svm
del_selection import train_test_split
import numpy as np
#定义一个HOG描述方法
winSize = (64, 128) #窗口大小
blockSize = (16, 16) #块大小
blockStride = (8, 8) #扫描步长
cellSize = (8, 8) #胞元大小
nbins = 9 #梯度方向数
hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins) #分类器
'''数据预处理
1.导入数据集
2.转为HOG向量
3.划分测试集和训练集'''
pos_path = []
neg_path = []
for i in os.listdir('E:\\pedestrians128x64'):
if i[0] != '.':
pos_path.append('E:\\pedestrians128x64/' + i)
for i in os.listdir('E:\\pedestrians_neg'):
if i[0] != '.':
neg_path.append('E:\\pedestrians_neg/' + i)
pos_images = []
for pos_image_path in pos_path: #行人
pos_image = cv2.imread(pos_image_path) #读取图像
hog_array = hogpute(pos_image) #调用函数,特征提取
pos_images.append(hog_array) #叠加元素
pos_images = np.resize(pos_images, (len(pos_images), 3780)) #改变形状,列表pos_images,改变后的形状是(len(pos_images), 3780)
pos_labels = np.ones(shape=pos_images.shape[0], dtype=np.int32) #参数为1列表
neg_images = []
python新手代码大全pdffor neg_image_path in neg_path: #场景
neg_image = cv2.imread(neg_image_path)
for i in range(2):
for j in range(4):
sub_image = neg_image[i * 128:(i + 1) * 128, j * 64:(j + 1) * 64]
hog_array = hogpute(sub_image)
neg_images.append(hog_array)
neg_images = np.resize(neg_images, (len(neg_images), 3780))
neg_labels = np.ones(shape=neg_images.shape[0], dtype=np.int32)
X = np.concatenate((pos_images, neg_images)) #数组拼接,结构相同可以拼接逐行拼接
y = np.concatenate((pos_labels, neg_labels))
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8) #划分测试集和训练集#使用SVM支持向量机训练
svc = svm.SVC(kernel='linear', degree=2, C=1, max_iter=-1)
#kernel核函数,线性核函数,degree维度,c惩罚参数,最大迭代次数无限
svc.fit(X_train, y_train) #训练
#在图像中检测行人
'''1.导入测试图片并resize为1024*768
2.定义stride大小
3.以64*128、128*256、192*384和256*512四种大小的窗口进行滑动检测
4.获得predict为1的窗口的坐标'''
test_image = cv2.imread('E:\\test1.jpg')
test_image = size(test_image, (1024, 768)) #修改大小
h, w, _ = test_image.shape #读取维度
stride = 16
find_window = []
find_coordinate = []
for windowsize in range(1, 5):
for ystart in range(0, h, stride * windowsize):
for xstart in range(0, w, stride * windowsize):
if ystart + windowsize * 128 > h or xstart + windowsize * 64 > w:
continue
window = test_image[ystart:ystart + windowsize * 128, xstart:xstart + windowsize * 64]
s_window = size(window, (64, 128))
hog_array = hogpute(s_window).T

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。