基于python的行人与车辆检测和跟踪实现(HOG+SVM/HAAR)

这篇博客介绍了基于Python的行人和车辆检测及跟踪技术,使用HOG+SVM进行行人检测,Haar特征+Adaboost进行车辆检测,以及dlib库的correlation_tracker进行单目标跟踪。作者分享了学习历程,提供了参考代码和流程图,并计划上传自己的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于python的行人与车辆检测和跟踪实现(HOG+SVM/HAAR)

前言

身在国外正在做毕设,期间看到了很多国内外人士写的代码。由衷的感谢各位开源大神提供的资源,让我能自学入门Computer Vistion领域。此文不仅仅是为了记录自己的学习过程,同时也想将自己更改后的代码分享出去,希望能帮助到更多对计算机视觉,机器学习感兴趣的人。同时也欢迎各位大神对我进行指导与指正!

实现思想

行人检测:

HOG特征子 + 线性SVM (支持向量机 Support Vector Machine)分类器:

基本实现思路遵循2005年Dala 在CVPR上发表的文章, 链接如下: 2005 Dalal CVPR.

本人是在大三下学期开始自学SVM原理的,当时从网上,书籍中找了很多资料,这篇博文讲的算是很详细了,能够满足我对SVM数学原理的好奇心。当然,SVM和神经网络系统中简单的PLA感知机(Perceptrons Learning Algorithm)算法之间的相通与不通之处,并不是本文的重点。我将在后续的学习中写出来作为学习的记录。
有关HOG特征子的原理详解博客上有很多,在这里本人就不再赘述;有关SVM的数学推导,感兴趣的同学可以看一看这篇博文:理解SVM的三层境界

车辆检测

Haar-like特征 + Adaboost分类器做级联检测
原本我是想用HOG +SVM 来实现,但是发现一个问题就是,HOG + SVM 貌似不能很好的解决车辆遮挡问题,所以导致效果并没有想象中的那么好。而网上有人用Haar做出的效果反而比HOG特征好很多。

有关Haar级联分类器的原理现在还没弄清楚,我将在后续进行整理。

目标跟踪

用的是python 工具库dlib中带有的correlation_tracker.这个跟踪方法属于单目标跟踪, 原理为Danelljan等人的2014年论文《Accurate Scale Estimation for Robust Visual Tracking》实现。关联跟踪器

流程图

Created with Raphaël 2.2.0 打开视频 行人/车辆检测(包括一些错误处理) 视频帧数%10 != 0?(%:取余) 目标跟踪 存储视频 yes no

参考代码

车辆检测Haar链接 github
HOG + SVM的车辆训练方式我在 github 上找到了一个.xml文件,调用起来方便很多。链接暂时找不到了,稍后我上传一波文件。总之经过比较后发现还是Haar-like的效果好。

我的代码

speed_check.py

import cv2
import dlib
import time
import threading
import numpy as np
# from imutils.object_detection import non_max_suppression
import math

carCascade = cv2.CascadeClassifier('myhaar.xml')
video = cv2.VideoCapture('project.mp4')
#(H, W) = frame.shape[:2]
# WIDTH = 1280
# HEIGHT = 720

def estimateSpeed(location1, location2):
   d_pixels = math.sqrt(math.pow(location2[0] - location1[0], 2) + math.pow(location2[1] - location1[1], 2))
   # ppm = location2[2] / carWidht
   ppm = 8.8
   d_meters = d_pixels / ppm
   #print("d_pixels=" + str(d_pixels), "d_meters=" + str(d_meters))
   fps = 18
   speed = d_meters * fps * 3.6
   return speed
   

def trackMultipleObjects():
   # out = None
   counter_down = []
   counter_up = []
   line_down = np.array([[100, 360], [800, 360]])
   line_up = np.array([[965, 425], [1280, 310]])
   line_pass_left = np.array([[115, 200], [115, 320]])
   line_pass_right = np.array([[930, 200], [930, 320]])
   mask_vehicle_and_people = np.array([[line_down[0],line_down[1],[940,720],[0,720]],
   						 [line_up[0], line_up[1], [1280, 720], [1260, 720]],
   						 [line_pass_left[0], line_pass_left[1], line_pass_right[1], line_pass_right[0]]])

   rectangleColor = (0, 255, 0)
   frameCounter = 0
   currentCarID = 0
   fps = 0
   
   carTracker = {
   
   }
   carNumbers = {
   
   }
   carLocation1 = {
   
   }
   carLocation2 = {
   
   }
   speed = [None] * 1000

   HEIGHT = 720
   WIDTH = 1280

   EXIT_COLOR0 = (6, 43, 42)
   # Write output to video file
   out = cv2.VideoWriter('project_output_haar1.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 10, (WIDTH, HEIGHT))


   while True:
   	start_time = time.time()
   	rc, image = video.read()

   	if type(image) == type(None):
   		break
   	
   	image = cv2.resize(image, (WIDTH, HEIGHT))
   	resultImage = image.copy()
   	frameCounter = frameCounter + 1
   	
   	carIDtoDelete = []

   	for carID in carTracker.keys():
   		trackingQuality = carTracker[carID].update(image)
   		
   		if trackingQuality < 7:
   			carIDtoDelete.append(carID)
   			
   	for carID in carIDtoDelete:
   		print ('Removing carID ' + str(carID) + ' from list of trackers.')
   		print ('Removing carID ' + str(carID) + ' previous location.')
   		print ('Removing carID ' + str(carID) + ' current location.')
   		carTracker.pop(carID, None)
   		carLocation1.pop(carID, None)
   		carLocation2.pop(carID, None)
   	# detecting
   	if not (frameCounter % 10):
   		gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY
评论 116
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值