【辅助驾驶】Python OpenCV实现行人检测

一、功能

车辆前方的行人进行检测,效果如图:

二、算法

1、传统检测方法

常规的机器学习方法,包括训练应用两个过程。

训练:需要构建训练集(包括正负样本),使用HOG、SIFT等特征描述获取特征,使用SVM(支持向量机)、决策树等对上一步获取的特征和对应的标签(标签指:正样本或者负样本)进行训练(训练指:自动生成SVM或者决策树等的参数,使其可以用来分类)。

应用:提取需要识别的图片的HOG、SIFT等特征,使用训练好的SVM或者决策树对提取的特征进行分类。

可以使用OpenCV自带的库进行上述过程(也可以使用机器学习框架sklearn实现特征提取和分类)。

2、神经网络

keras等神经网络库可以直接用来训练正负样本,并通过神经网络进行识别。(附:keras作为前端交互语言,实际上调用了TensorFlow或者Theano等神经网络后端,也可以直接使用TensorFlow或者Thean搭建神经网络,或者使用其他的神经网络和深度学习框架)

考虑到应用场景为辅助驾驶,神经网络有两个缺陷,第一、神经网络需要大量的并行计算,占用大量的空间,在FPGA、ARM等硬件上运行速度很慢;第二、神经网络本身相当于黑盒,中间数据无法获取、调试起来无从入手,增加了不确定性。所以,这里使用OpenCV进行图像处理。

三、代码

1、自己写HOG和SVM实现

  1. 分析训练数据,提取图片HOG特征。
  2. 训练分类器
  3. 应用滑动窗口(sliding windows)实现检测
  4. 应用热力图(heatMap)过滤错误检测(false positive)

OpenCV自带的有函数,重新造轮子的人不多,可以参考这个github车辆检测:CarND-Vehicle-Detection

2、调用OpenCV自带的行人检测库实现

import cv2
from imutils.object_detection import non_max_suppression
import numpy as np

img=cv2.imread("img2.jpg")
orig = img.copy()

# 定义HOG对象,采用默认参数,或者按照下面的格式自己设置
defaultHog=cv2.HOGDescriptor()
# 设置SVM分类器,用默认分类器
defaultHog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

#这里对整张图片进行裁剪
# # detect people in the image
# (rects, weights) = defaultHog.detectMultiScale(img, 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)
# for (xA, yA, xB, yB) in pick:
#     cv2.rectangle(img, (xA, yA), (xB, yB), (0, 255, 0), 2)
# cv2.imshow("Before NMS", orig)
# cv2.imshow("After NMS", img)

#只对ROI进行裁剪,img[height_begin:height_end,width_begin:width_end]
roi=img[0:200,800:1600]
cv2.imshow("roi",roi)
cv2.imwrite("roi.jpg",roi)
(rects, weights) = defaultHog.detectMultiScale(roi, winStride=(4, 4),padding=(8, 8), scale=1.05)
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)
for (xA, yA, xB, yB) in pick:
    cv2.rectangle(roi, (xA, yA), (xB, yB), (0, 255, 0), 2)

cv2.imshow("roi",roi)
cv2.imwrite("roi_out.jpg",roi)
cv2.waitKey(0)

 

  • 13
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值