基于计算机视觉的车流量检测Python实现
文章平均质量分 66
基于计算机视觉的车流量检测Python实现
LiBiGo
工学博士在读,主要从事智能制造、工业精密检测、智能化设备研发等方向研究,已发表二区Top文章一篇、国家级竞赛二等奖一项、已授权软件著作权两项、已发表中文期刊两篇,先后参与国家自然科学基金面上项目、省重点研发计划等课题。
展开
-
智慧交通day00-项目简介
汽车的日益普及在给人们带来极大便利的同时,也导致了拥堵的交通路况,以及更为频发的交通事故。智能交通技术已成为推动现代技术交通技术发展的重要力量,智能交通不仅能够提供实时的交通路况信息,帮助交通管理者规划管理策略,而且还能优化出行者的出行策略。还可以减轻交通道路的堵塞情况,降低交通事故的发生概率,提高道路运行的安全系数。本项目分两个模块: 一个是基于视频的车辆跟踪及流量统计,是一个可跟踪路面实时车辆通行状况,并逐帧记录不同行车道车流量数目的深度学习项目,在视频中可看出每个车辆的连续帧路径,该项目可拓原创 2021-11-10 19:34:36 · 8712 阅读 · 5 评论 -
智慧交通day01-算法库01:numba
1 numba介绍numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。numba使用LLVM编译器架构将纯Python代码生成优化过的机器码,通过一些添加简单的注解,将面向数组和使用大量数学的python代码优化到与c,c++和Fortran类似的性能,而无需改变Python的解释器。numba的编译方式如下图所示:为什么选择numba?选择Numbade 原因很简单,不需要为了获得一些的加速来改变代码,我.原创 2021-11-10 19:42:43 · 5641 阅读 · 0 评论 -
智慧交通day01-算法库02:imutils
1.imutils功能简介imutils是在OPenCV基础上的一个封装,达到更为简结的调用OPenCV接口的目的,它可以轻松的实现图像的平移,旋转,缩放,骨架化等一系列的操作。安装方法:pip install imutils在安装前应确认已安装numpy,scipy,matplotlib和opencv。2.imutils的使用方法2.1 图像平移OpenCV中也提供了图像平移的实现,要先计算平移矩阵,然后利用仿射变换实现平移,在imutils中可直接进行图像的平移。t原创 2021-11-10 20:11:16 · 5989 阅读 · 0 评论 -
智慧交通day01-算法库03:cv.dnn
1.DNN模块1.1. 模块简介OpenCV中的深度学习模块(DNN)只提供了推理功能,不涉及模型的训练,支持多种深度学习框架,比如TensorFlow,Caffe,Torch和Darknet。OpenCV那为什么要实现深度学习模块? 轻量型。DNN模块只实现了推理功能,代码量及编译运行开销远小于其他深度学习模型框架。 使用方便。DNN模块提供了内建的CPU和GPU加速,无需依赖第三方库,若项目中之前使用了OpenCV,那么通过DNN模块可以很方便的为原项目添加深度学习.原创 2021-11-10 21:20:41 · 2531 阅读 · 0 评论 -
智慧交通day02-车流量检测实现01:总览
随着城市交通量的迅猛增加,车流量统计已成为智能交通系统中一项关键技术和热门研究方向。高效而精确的车流量检测可以交通管理者和决策者,以及驾驶员提供数据支撑,从而为交通调度,降低拥堵情况的发生,提高道路利用率有非常重要的意义。车流量统计主要有以下几种方式: 人工统计,需要消耗大量的人力且当工作人员在长时间计数后会因疲惫造成漏检或重复计数,统计结果具有不可验证性。 通过安装可接触式或不可接触式的传感器于路面进行车辆计数,可接触式传感器一般铺设于道路下方,当车辆经过时,传感器内部的电压,磁场或压原创 2021-11-10 22:05:14 · 9710 阅读 · 0 评论 -
智慧交通day02-车流量检测实现02:多目标追踪
1.多目标跟踪分类多目标跟踪,即MOT(Multi-Object Tracking),也就是在一段视频中同时跟踪多个目标。MOT主要应用在安防监控和自动驾驶等领域中。1.1 初始化方法多目标跟踪问题中并不是所有目标都会在第一帧出现,也并不是所有目标都会出现在每一帧。那如何对出现的目标进行初始化,可以作为跟踪算法的分类表针。常见的初始化方法分为两大类,一个是Detection-Based-Tracking(DBT),一个是Detection-Free-Tracking(DFT)..原创 2021-11-10 22:11:59 · 8619 阅读 · 0 评论 -
智慧交通day02-车流量检测实现03:辅助功能(交并比and候选框的表现形式)
学习目标能够实现两个目标框的交并比 了解候选框在多目标跟踪中的表达方式及相应转换方法IOU是交并比(Intersection-over-Union)是目标检测中使用的一个概念是产生的候选框(candidate bound)与原标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1。在多目标跟踪中,用来判别跟踪框和目标检测框之间的相似度。 1.计算交并比 IoU是两个区域的交除以两个区域的并得出的结果 def ..原创 2021-11-11 10:33:09 · 4110 阅读 · 0 评论 -
智慧交通day02-车流量检测实现04:卡尔曼滤波器
1、背景介绍卡尔曼滤波(Kalman)无论是在单目标还是多目标领域都是很常用的一种算法,我们将卡尔曼滤波看做一种运动模型,用来对目标的位置进行预测,并且利用预测结果对跟踪的目标进行修正,属于自动控制理论中的一种方法。在对视频中的目标进行跟踪时,当目标运动速度较慢时,很容易将前后两帧的目标进行关联,如下图所示:如果目标运动速度比较快,或者进行隔帧检测时,在后续帧中,目标A已运动到前一帧B所在的位置,这时再进行关联就会得到错误的结果,将A‘与B关联在一起。那怎么才能避免这种出现关联误..原创 2021-11-11 11:33:19 · 4019 阅读 · 0 评论 -
智慧交通day02-车流量检测实现05:卡尔曼滤波器实践(小车模型)
1.filterpyFilterPy是一个实现了各种滤波器的Python模块,它实现著名的卡尔曼滤波和粒子滤波器。我们可以直接调用该库完成卡尔曼滤波器实现。其中的主要模块包括: filterpy.kalman 该模块主要实现了各种卡尔曼滤波器,包括常见的线性卡尔曼滤波器,扩展卡尔曼滤波器等。 filterpy.common 该模块主要提供支持实现滤波的各种辅助函数,其中计算噪声矩阵的函数,线性方程离散化的函数等。 filterpy.stats 该模块提供与滤波相关的原创 2021-11-11 17:18:54 · 2387 阅读 · 0 评论 -
智慧交通day02-车流量检测实现05:小车匀速案例
"""现在利用卡尔曼滤波对小车的运动状态进行预测。主要流程如下所示: 导入相应的工具包 小车运动数据生成 参数初始化 利用卡尔曼滤波进行小车状态预测 可视化:观察参数的变化与结果""" #导入包from matplotlib import pyplot as pltimport seaborn as snsimport numpy as npfrom filterpy.kalman import KalmanFilterfrom pylab imp.原创 2021-11-11 17:22:38 · 2085 阅读 · 0 评论 -
智慧交通day02-车流量检测实现05:小车匀加速案例
"""现在利用卡尔曼滤波对小车的运动状态进行预测。主要流程如下所示: 导入相应的工具包 小车运动数据生成 参数初始化 利用卡尔曼滤波进行小车状态预测 可视化:观察参数的变化与结果""" #导入包from matplotlib import pyplot as pltimport seaborn as snsimport numpy as npfrom filterpy.kalman import KalmanFilterfrom pylab imp.原创 2021-11-11 17:24:39 · 1740 阅读 · 0 评论 -
智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波
在这里我们主要完成卡尔曼滤波器进行跟踪的相关内容的实现。初始化:卡尔曼滤波器的状态变量和观测输入 更新状态变量 根据状态变量预测目标的边界框 初始化: 状态量x的设定是一个七维向量: 分别表示目标中心位置的x,y坐标,面积s和当前目标框的纵横比,最后三个则是横向,纵向,面积的变化速率,其中速度部分初始化为0,其他根据观测进行输入。初始化卡尔曼滤波器参数,7个状态变量和4个观测输入,运动形式和转换矩阵的确定都是基于匀速运动模型,状态转移矩阵F根据运动学公式确定:量测矩.原创 2021-11-11 17:56:10 · 2522 阅读 · 0 评论 -
智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波(汇总)
from __future__ import print_functionfrom numba import jitimport numpy as npfrom scipy.optimize import linear_sum_assignmentfrom filterpy.kalman import KalmanFilter#计算IOU(交并比)@jitdef iou(bb_test,bb_gt): """ 在两个box间计算IOU :param b...原创 2021-11-11 17:57:58 · 3973 阅读 · 0 评论 -
智慧交通day02-车流量检测实现07:匈牙利算法
匈牙利算法(Hungarian Algorithm)与KM算法(Kuhn-Munkres Algorithm)是用来解决多目标跟踪中的数据关联问题,匈牙利算法与KM算法都是为了求解二分图的最大匹配问题。有一种很特别的图,就做二分图,那什么是二分图呢?就是能分成两组,U,V。其中,U上的点不能相互连通,只能连去V中的点,同理,V中的点不能相互连通,只能连去U中的点。这样,就叫做二分图。可以把二分图理解为视频中连续两帧中的所有检测框,第一帧所有检测框的集合称为U,第二帧所有检测框的集合称为.原创 2021-11-14 14:38:15 · 2885 阅读 · 0 评论 -
智慧交通day02-车流量检测实现08:目标跟踪中的数据关联(将检测框bbox与卡尔曼滤波器的跟踪框进行关联匹配)
# 将YOLO模型的检测框和卡尔曼滤波的跟踪框进行匹配def associate_detection_to_tracker(detections,trackers,iou_threshold=0.3): """ 将检测框bbox与卡尔曼滤波器的跟踪框进行关联匹配 :param detections:检测框 :param trackers:跟踪框,即跟踪目标 :param iou_threshold:IOU阈值 :re......原创 2021-11-14 15:29:12 · 6036 阅读 · 1 评论 -
智慧交通day02-车流量检测实现09:SORT/deepSORT
SORT和DeepSORT是多目标跟踪中两个知名度比较高的算法。DeepSORT是原团队对SORT的改进版本。现在来解析一下SORT和DeepSORT的基本思路。1.SORTSORT核心是卡尔曼滤波和匈牙利匹配两个算法。流程图如下所示,可以看到整体可以拆分为两个部分,分别是匹配过程和卡尔曼预测加更新过程,都用灰色框标出来了。关键步骤:轨迹卡尔曼滤波预测→ 使用匈牙利算法将预测后的tracks和当前帧中的detecions进行匹配(IOU匹配) → 卡尔曼滤波更新卡尔曼滤波分为两个过程原创 2021-11-15 10:40:02 · 4596 阅读 · 0 评论 -
智慧交通day02-车流量检测实现10:多目标追踪实现
在这里我们主要实现了一个多目标跟踪器,管理多个卡尔曼滤波器对象,主要包括以下内容:初始化:最大检测数,目标未被检测的最大帧数 目标跟踪结果的更新,即跟踪成功和失败的目标的更新 初始化 def __init__(self, max_age=1, min_hits=3): """ 初始化:设置SORT算法的关键参数 """ # 最大检测数:目标未被检测到的帧数,超过之后会被删 self.m原创 2021-11-15 12:22:48 · 23072 阅读 · 0 评论 -
智慧交通day02-车流量检测实现11:yoloV3模型
yoloV3以V1,V2为基础进行的改进,主要有:利用多尺度特征进行目标检测;先验框更丰富;调整了网络结构;对象分类使用logistic代替了softmax,更适用于多标签分类任务。1.算法简介YOLOv3是YOLO (You Only Look Once)系列目标检测算法中的第三版,相比之前的算法,尤其是针对小目标,精度有显著提升。yoloV3的流程如下图所示,对于每一幅输入图像,YOLOv3会预测三个不同尺度的输出,目的是检测出不同大小的目标。2.多尺度检测..原创 2021-11-15 14:51:46 · 6320 阅读 · 0 评论 -
智慧交通day02-车流量检测实现12:基于yoloV3的目标检测
在这里我们进行的目标检测是基于OPenCV的利用yoloV3进行目标检测,不涉及yoloV3的模型结构、理论及训练过程,只是利用训练好的模型进行目标检测,整个流程如下:基于OPenCV中的DNN模块加载已训练好的yolov3模型及其权重参数 将要处理的图像转换成输入到模型中的blobs 利用模型对目标进行检测 遍历检测结果 应用非极大值抑制 绘制最终检测结果,并存入到ndarray中,供目标追踪使用。代码如下:1.加载yolov3模型及其权重参数# 1.加载可以识别物体的名称,原创 2021-11-15 21:40:48 · 6938 阅读 · 1 评论 -
cv2.dnn.readNetFromDarknet()在python3上遇到的问题
问题描述:代码如下net = cv2.dnn.readNetFromDarknet(configPath,weightsPath)#获取YOLO每一层的名称#getLayerNames():获取网络所有层的名称。ln = net.getLayerNames()# 获取输出层的名称: [yolo-82,yolo-94,yolo-106]# getUnconnectedOutLayers():获取输出层的索引ln = [ln[i[0] - 1] for i in net.getUnconn原创 2021-11-15 21:54:54 · 8999 阅读 · 2 评论 -
智慧交通day02-车流量检测实现13:基于虚拟线圈法的车辆统计+视频中的车流量统计原理解析
1.基于虚拟线圈法的车辆统计基于虚拟线圈的车流量统计算法原理与交通道路上的常见的传统的物理线圈类似,由于物理线圈需要埋设在路面之下,因此会有安装、维护费用高,造成路面破坏等问题,而采用基于视频的虚拟线圈的车辆计数方法完全避免了以上问题,且可以针对多个感兴趣区域进行检测。虚拟线圈车辆计数法的原理是在采集到的交通流视频中,在需要进行车辆计数的道路或路段上设置一条或一条以上的检测线对通过车辆进行检测,从而完成计数工作。检测线的设置原则一般是在检测车道上设置一条垂直于车道线,居中的虚拟线段,通过判断其与通过原创 2021-11-16 17:14:07 · 20937 阅读 · 0 评论 -
智慧交通day02-车流量检测实现14:代码汇总+问题修正
环境要求:python2.7环境配置:见文末requirements.txt1.YOLO.py# encoding:utf-8import imutilsimport timeimport cv2import numpy as npfrom kalman import *import matplotlib.pyplot as plt#根据摄像头的图像尺寸进行设置line = [(0,150),(2560,150)]#车辆总数counter = 0#正向车道的车辆数c.原创 2021-11-16 17:26:09 · 21582 阅读 · 1 评论 -
智慧交通day02-车流量检测实现15:思维导图(代码超精汇总)
占坑原创 2021-11-17 19:09:08 · 4803 阅读 · 0 评论