DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程)

本文主要是介绍DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DeepSORT算法是一种用于目标跟踪的算法,它可以对车辆和行人进行跟踪计数,并且可以检测是否存在道路违规行为。该算法采用深度学习技术来提取特征,并使用卡尔曼滤波器来估计物体的速度和位置。

DeepSORT算法通过首先使用目标检测算法来识别出场景中的车辆和行人,然后使用卷积神经网络(CNN)来提取物体的特征。接着,该算法使用余弦相似度来计算物体之间的相似度,并使用匈牙利算法来匹配跟踪器和检测器之间的物体。最后,DeepSORT算法使用卡尔曼滤波器来预测物体的位置和速度,并更新跟踪器状态。

除了可以进行目标跟踪计数外,DeepSORT算法还可以用于道路违规检测。例如,该算法可以检测车辆是否违规超速或跨越道路中心线等。此外,DeepSORT算法还可以应用于视频监控、智能交通和自动驾驶等领域。

总之,DeepSORT算法是一种用于目标跟踪的高效算法,它可以用于车辆和行人的跟踪计数,并且可以检测道路违规行为。在未来,该算法将会在各种领域中有广泛的应用价值。

特征提取

此处面对的场景是是交通摄像头下的马路场景,数据格式为视频流或者视频,所以我们要提取视频的第一帧作为背景来进行车道线的标定,运行extra.py文件即可提取第一帧背景图片。

 车道线和斑马线

根据第一步提取的场景背景图片,进行道路信息的标定,并返回道路信息的相关参数。
标定的方式是运行车道线标定文件即可。
先鼠标在背景图片上从左至右依次点击红色的两边的车道线实线,然后鼠标再依次在背景图片点击斑马线绿色框的从左至右四个顶点。这样就可以将斑马线和车道线的位置信息进行提取了,项目目录下会生成如上图标记好了的输出图片如上。

车牌识别


车牌号使用车牌号的识别是从车辆出现在画面的第一帧开始,一直到车辆消失在画面中。我们并不能事先确定在哪一帧对车牌的识别效果最好。因此,我们在车辆出现的第一帧,就将它的id和车牌信息传入字典chepaixinxi保存起来。如果当前帧比之前的识别效果都好(置信度高),我们就用它替换之前的车牌信息。另一方面,为了节省计算资源,只要是该车在某一帧的车牌置信度高于0.9,我们就不再将其传入车牌识别模块,运行LPR.py即可提取车牌信息,提取效果如下图所示

 

import cv2
import numpy as np
import math""" 输入图像归一化 """def stretch(img):max = float(img.max())min = float(img.min())for i in range(img.shape[0]):for j in range(img.shape[1]):img[i, j] = (255 / (max - min)) * img[i, j] - (255 * min) / (max - min)return imgdef dobinaryzation(img):max = float(img.max())min = float(img.min())x = max - ((max - min) / 2)ret, thresholdimg = cv2.threshold(img, x, 255, cv2.THRESH_BINARY)return thresholdimgdef find_retangle(contour):y, x = [], []for p in contour:y.append(p[0][0])x.append(p[0][1])return [min(y), min(x), max(y), max(x)]def locate_license(img, orgimg):img, contours, hierachy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)# 找到最大的三个区域blocks = []for c in contours:# 找出轮廓的左上和右下点,计算出其面积和长宽比r = find_retangle(c)a = (r[2] - r[0]) * (r[3] - r[1])s = (r[2] - r[0]) / (r[3] - r[1])blocks.append([r, a, s])# 选出面积最大的3个区域blocks = sorted(blocks, key=lambda b: b[2])[-3:]# 使用颜色识别判断出最像车牌的区域maxweight, maxinedx = 0, -1for i in range(len(blocks)):b = orgimg[blocks[i][0][1]:blocks[i][0][3], blocks[i][0][0]:blocks[i][0][2]]# RGB 转HSVhsv = cv2.cvtColor(b, cv2.COLOR_BGR2HSV)# 蓝色车牌范围lower = np.array([100, 50, 50])upper = np.array([140, 255, 255])# 根据阈值构建掩膜mask = cv2.inRange(hsv, lower, upper)# 统计权值w1 = 0for m in mask:w1 += m / 255w2 = 0for w in w1:w2 += w# 选出最大权值的区域if w2 > maxweight:maxindex = imaxweight = w2return blocks[maxindex][0]def find_license(img):'''预处理'''# 压缩图像a = 400 * img.shape[0] / img.shape[1]a = int(a)img = cv2.resize(img, (400, a))cv2.imshow('img',img)cv2.waitKey()# RGB转灰色grayimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow('grayimg', grayimg)cv2.waitKey()# 灰度拉伸stretchedimg = stretch(grayimg)cv2.imshow('stretchedimg', stretchedimg)cv2.waitKey()# 进行开运算,用来去除噪声r = 16h = w = r * 2 + 1kernel = np.zeros((h, w), dtype=np.uint8)cv2.circle(kernel, (r, r), r, 1, -1)openingimg = cv2.morphologyEx(stretchedimg, cv2.MORPH_OPEN, kernel)cv2.imshow('openingimg', openingimg)cv2.waitKey()strtimg = cv2.absdiff(stretchedimg, openingimg)cv2.imshow('strtimg', strtimg)cv2.waitKey()# 图像二值化binaryimg = dobinaryzation(strtimg)cv2.imshow('binaryimg', binaryimg)cv2.waitKey()# Canny算子进行边缘检测cannyimg = cv2.Canny(binaryimg, binaryimg.shape[0], binaryimg.shape[1])cv2.imshow('cannyimg', cannyimg)cv2.waitKey()'''消除小区域,连通大区域'''# 进行闭运算kernel = np.ones((5, 19), np.uint8)closingimg = cv2.morphologyEx(cannyimg, cv2.MORPH_CLOSE, kernel)cv2.imshow('closingimg', closingimg)cv2.waitKey()# 进行开运算openingimg = cv2.morphologyEx(closingimg, cv2.MORPH_OPEN, kernel)cv2.imshow('openingimg', openingimg)cv2.waitKey()# 再次进行开运算kernel = np.ones((11, 5), np.uint8)openingimg = cv2.morphologyEx(openingimg, cv2.MORPH_OPEN, kernel)cv2.imshow('openingimg', openingimg)cv2.waitKey()# 消除小区域,定位车牌位置rect = locate_license(openingimg, img)return rect, imgif __name__ == '__main__':orgimg = cv2.imread('car3.jpg')rect, img = find_license(orgimg)cv2.rectangle(img, (rect[0], rect[1]), (rect[2], rect[3]), (0, 255, 0), 2)cv2.imshow('img', img)cv2.waitKey()cv2.destroyAllWindows()

车辆越实线、不礼让行人检测

我们将车辆在上一帧的检测位置保存下来。如果车辆在上一帧的位置和在这一帧的位置分别位于车道线实线的两侧,或者落在了实线上,我们就判定车辆非法越实线了。行人在斑马线上时,车辆也在斑马线上 ==>车辆不礼让行人,运行效果图:

# 生成感兴趣区域即Mask掩模
def region_of_interest(image, vertices):mask = np.zeros_like(image)  # 生成图像大小一致的zeros矩# 填充顶点vertices中间区域if len(image.shape) > 2:channel_count = image.shape[2]ignore_mask_color = (255,) * channel_countelse:ignore_mask_color = 255# 填充函数cv.fillPoly(mask, vertices, ignore_mask_color)masked_image = cv.bitwise_and(image, mask)return masked_image# 生成Mask掩模vertices = np.array([[(0, imshape[0]), (9 * imshape[1] / 20, 11 * imshape[0] / 18),(11 * imshape[1] / 20, 11 * imshape[0] / 18), (imshape[1], imshape[0])]], dtype=np.int32)masked_edges = region_of_interest(edge_image, vertices)

企鹅耗子:767172261

这篇关于DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/661208

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi