无人车行人识别---opencv
无人车行人识别---opencv行人检测具有极其广泛的应用:智能辅助驾驶,智能监控,行人分析以及智能机器人等领域。从2005年以来行人检测进入了一个快速的发展阶段,但是也存在很多问题还有待解决,主要还是在性能和速度方面还不能达到一个权衡。近年,以谷歌为首的自动驾驶技术的研发正如火如荼的进行,这也迫切需要能对行人进行快速有效的检测,以保证自动驾驶期间对行人的安全不会产生威胁。
本文使用 HOG + SVM 并通过NMS在Python环境下实现识别
HOG: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。HOG特征通过计算和统计图像局部区域的梯度方向直方图来构成特征.
SVM: (Support Vector Machine)指的是支持向量机,是常见的一种判别方法。在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别、分类以及回归分析, 在行人检测中可以用作区分行人和非行人的分类器。
from __future__ import print_function ##兼容python2.x,python2.x同样可以加括号 from imutils.object_detection import non_max_suppression##非极大值抑制,控制多个重叠的边框(bounding box),并且将他们减少至仅有一个边框。 from imutils import paths import numpy as np import imutils import argparse import cv2 capture = cv2.VideoCapture(0) while(True): # 调用hog = cv2.HOGDescriptor()来初始化方向梯度hog hog = cv2.HOGDescriptor() #调用setSVMDetector来设置支持向量机(Support Vector Machine)使得它成为一个预先训练好了的行人检测器。 hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) # 获取一帧 ret, image = capture.read() # 调整大小,以减少检测时间,并能够整体提高行人检测的精度。 image = imutils.resize(image, width=min(400, image.shape[1])) orig = image.copy() #构造了一个尺度scale=1.05的图像金字塔,以及一个分别在x方向和y方向步长为(4,4)像素大小的滑窗。 #返回一个二元组的rects,或者是图像中每一个行人的边框坐标(x,y),以及由SVM在每一次检测中返回的weights置信值 (rects, weights) = hog.detectMultiScale(image, winStride=(4,4), padding=(8,8),scale=1.05) #绘制长方形 for (x, y, w, h) in rects: cv2.rectangle(orig,(x,y),(x + w, y + h), (0,0,255), 2) #对边界框应用非最大值抑制,使用相当大的重叠阈值,以尝试保持重叠的人框 rects = np.array([[x,y, x + w, y + h] for (x, y, w, h) in rects]) pick = non_max_suppression(rects, probs=None, overlapThresh=0.65)#0.65的nms #绘制矩形 for (xA, yA, xB, yB) in pick: cv2.rectangle(image, (xA, yA), (xB, yB), (0,255,0),2) #打印信息 print("[INFO]: {} original boxes, {} after suppression".format(len(rects), len(pick))) cv2.imshow("After NMS",image) if cv2.waitKey(1) == ord('q'): break