基于YOLOv10的车辆统计跟踪与车速计算应用

文章目录

  • 1、前言
  • 2、安装运行环境
  • 3、下载v10s模型
  • 4、代码实现
  • 5、代码详读
    • 5.1、导入必要的库
    • 5.2、识别车辆
    • 5.3、读取视频文件
    • 5.4、创建视频写入器
    • 5.5、车速计算
    • 5.6、统计车辆
    • 5.7、应用跟踪
    • 5.8、视频处理
  • 6、目标检测系列文章

1、前言

在智能交通系统(ITS)的快速发展中,对车辆进行精确的检测和跟踪是实现交通监控、流量分析和安全预警的关键技术。本项目是基于YOLOv10的车辆统计跟踪与车速计算。

主要功能:
(1)车辆类别检测
(2)车辆进出统计
(3)车辆速度检测
(4)车辆ID分配
(5)车辆跟踪

目标计数过程通常包括四个主要步骤:

  1. 图像预处理:该步骤通过去噪、过滤和增强等技术处理输入图像或视频帧,以提高计数准确性。
  2. 目标检测:此步骤旨在识别预处理图像或视频中的特定对象。流行的目标检测算法包括Faster R-CNN、YOLO(You Only Look Once)和SSD(Single Shot MultiBox Detector)。
  3. 目标跟踪:在该步骤中,在连续图像帧序列中跟踪相同的对象。常见的目标跟踪算法包括KCF(Kernelized Correlation Filter)、TLD(Tracking, Learning, and Detection)、MOSSE(Minimum Output Sum of Squared Error)和 DeepSORT、Botsort 和 Bytetrack。目标跟踪确保在动态视频的连续帧中不会多次计数相同的对象。
  4. 目标计数:最后一步涉及计算检测到的和跟踪到的对象数量。

实现效果
在这里插入图片描述

论文地址https://arxiv.org/pdf/2405.14458

项目地址(https://github.com/THU-MIG/yolov10

2、安装运行环境

conda create -n yolov10 python=3.9
conda activate yolov10
pip install -r requirements.txt
pip install -e .

3、下载v10s模型

下载官方提供的与训练模型,这里我们直接使用YOLOv10-S.pt

在这里插入图片描述

模型下载

YOLOv10-N
YOLOv10-S
YOLOv10-M
YOLOv10-B
YOLOv10-L
YOLOv10-X

4、代码实现

from ultralytics import YOLOv10
from ultralytics.solutions import speed_estimation,object_counter
import cv2
import argparsedef parse_opt():parser = argparse.ArgumentParser()# person tracker paramsparser.add_argument('--weight', type=str, default='yolov10s.pt')parser.add_argument('--save_video', action = 'store_true')parser.add_argument('--input_video_path', type=str, default='./video/car-test.mp4',help='source video path.')parser.add_argument('--output_video_path', type=str, default='result_video.mp4',help='output video inference result storage path.')opt = parser.parse_args()return optdef main():#获取命令行参数opt = parse_opt()# 加载YOLOv10模型model = YOLOv10(opt.weight)# 获取模型中的对象名称names = model.model.names# 打开视频文件cap = cv2.VideoCapture(opt.input_video_path)assert cap.isOpened(), "Illegal or non-existing video file"# 获取视频的宽度、高度和帧率w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))# 创建视频写入器,用于输出处理后的视频video_writer = cv2.VideoWriter(opt.output_video_path,cv2.VideoWriter_fourcc(*'mp4v'),fps,(w, h))# 设置测速线段的两个端点,一条直线,(x,y)line_pts = [(0, 615), (1920, 615)]# 初始化速度估计器speed_obj = speed_estimation.SpeedEstimator()# 设置速度估计器的参数,包括测速线段、对象名称和是否实时显示图像# 计数区域或线。只有出现在指定区域内或穿过指定线的对象才会被计数。speed_obj.set_args(reg_pts=line_pts,names=names,view_img=True)# 初始化计数器counter_obj = object_counter.ObjectCounter()counter_obj.set_args(reg_pts = line_pts,classes_names = names,view_img = False)# 循环读取视频帧while cap.isOpened():# 读取一帧success, im0 = cap.read()# 如果读取失败,则退出循环if not success:breaktracks = model.track(im0, persist=True, show=False)im0 = counter_obj.start_counting(im0, tracks)im0 = speed_obj.estimate_speed(im0, tracks)# 将处理的结果保存为视频if opt.save_video is not None:video_writer.write(im0)# 释放视频读取器和写入器cap.release()video_writer.release()# 销毁所有OpenCV窗口cv2.destroyAllWindows()if __name__ == '__main__':main()

5、代码详读

5.1、导入必要的库

from ultralytics import YOLOv10
from ultralytics.solutions import speed_estimation
import cv2

这段代码导入了ultralytics库中的YOLOv10模型和速度估计模块,以及OpenCV库,用于视频处理。

5.2、识别车辆

为了识别物体,我们使用了可以从ultralytics库中获得的预训练 YOLO模型。该算法可以实时识别感兴趣的物体,并且准确率很高。这里加载了预训练的YOLOv10模型,用于识别车辆

model = YOLOv10("yolov10n.pt")
names = model.model.names

5.3、读取视频文件

# 要处理的视频
parser.add_argument('--input_video_path', type=str, default='./video/car-test.mp4',help='source video path.')# 打开视频文件
cap = cv2.VideoCapture(opt.input_video_path)
assert cap.isOpened(), "Illegal or non-existing video file"
# 获取视频的宽度、高度和帧率
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

这段代码读取名为"car-test.mp4"的视频文件,并获取视频的宽度、高度和帧率。

5.4、创建视频写入器

parser.add_argument('--input_video_path', type=str, default='./video/car-test.mp4',help='source video path.')video_writer = cv2.VideoWriter(opt.input_video_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))

这里创建了一个视频写入器,用于将处理后的视频帧写入新的视频文件。

5.5、车速计算

line_pts = [(0, 615), (1920, 615)]
speed_obj = speed_estimation.SpeedEstimator()
speed_obj.set_args(reg_pts=line_pts, names=names, view_img=True)im0 = speed_obj.estimate_speed(im0, tracks)

这段代码设置了用于速度估计的参考线line_pts,并初始化了速度估计器,同时设置了相关参数,view_img实时获取处理完的帧。

NameTypeDefaultDescription
namesdictNoneDictionary of class names.
reg_ptslist[(20,400),(1260,400)]List of region points for speed estimation.
view_imgboolFalseWhether to display the image
line_thicknessint2Thickness of the lines for drawing boxes and tracks.
region_thicknessint5Thickness of the region lines.
spdl_dist_threshint10Distance threshold for speed calculation.

速度计算的基本原理:

SpeedEstimator函数通过存储随时间推移的跟踪位置来处理帧,因此通过比较当前位置与定义区域内的先前位置来计算每个检测到的物体的速度,从而可以通过物体在该区域内移动所需的时间来估算物体的速度,这遵循了物理学中一个非常著名的术语:v = Δs/Δt, 其中,v为速度,Δs为位移(距离),Δt为时间间隔。

5.6、统计车辆

# 初始化计数器
counter_obj = object_counter.ObjectCounter()
counter_obj.set_args(reg_pts = line_pts,classes_names = names,view_img = False)im0 = counter_obj.start_counting(im0, tracks)

通过实例化object_counter.ObjectCounter()类 得到一个车辆统计器,调用start_counting()函数开启车辆统计。

其中车辆进出方向可以通过根据两个点的相对位置计算出移动方向。

def get_direction(point1, point2):"""根据两个点的相对位置计算出移动方向, point1和point2都是左上角坐标即point1=x1,y1point1,point2只是时间点不同的坐标。"""direction_str = ""# 根据两个点在y轴上的相对位置,确定是向南还是向北移动if point1[1] < point2[1]:direction_str += "In"elif point1[1] > point2[1]:direction_str += "Out"else:direction_str += ""# 根据两个点在x轴上的相对位置,确定是向东还是向西移动if point1[0] < point2[0]:direction_str += "East"elif point1[0] > point2[0]:direction_str += "West"else:direction_str += ""return direction_str

在这里插入图片描述

5.7、应用跟踪

YOLO模型中还包含一个跟踪算法,旨在通过连续帧连续监视和跟踪特定对象的运动。它的实现很简单,如下所示:

# 由于需要跨帧对象跟踪(避免在不同帧中多次计数同一个人或车辆),需要保留所有先前帧的检测结果。
tracks = model.track(im0, persist=True, show=False)
NameTypeDefaultDescription
sourceim0Nonesource directory for images or videos
persistboolFalsepersisting tracks between frames
trackerstrbotsort.yamlTracking method ‘bytetrack’ or ‘botsort’
conffloat8.3Confidence Threshold
ioufloat0.5lOU Threshold
classeslistNonefilter results by class, i.e. classes=0, or classes=[0,2,3]
verboseboolTrueDisplay the object tracking results

5.8、视频处理

通过cv2中VideoCapture()获取cap对象,对视频进行处理。

# 视频帧处理循环:
while cap.isOpened():success, im0 = cap.read()if not success:print("Video frame is empty or video processing has been successfully completed.")breaktracks = model.track(im0, persist=True, show=False)im0 = counter_obj.start_counting(im0, tracks)im0 = speed_obj.estimate_speed(im0, tracks)video_writer.write(im0)

在这个循环中,代码逐帧读取视频,使用YOLOv10模型进行对象跟踪,然后使用速度估计器估计对象的移动速度,并将结果写入新的视频文件。

# 释放资源:
cap.release()
video_writer.release()
cv2.destroyAllWindows()

最后,释放视频读取器和写入器的资源,并关闭所有OpenCV创建的窗口。

6、目标检测系列文章

  1. YOLOv5s网络模型讲解(一看就会)
  2. 生活垃圾数据集(YOLO版)
  3. YOLOv5如何训练自己的数据集
  4. 双向控制舵机(树莓派版)
  5. 树莓派部署YOLOv5目标检测(详细篇)
  6. YOLO_Tracking 实践 (环境搭建 & 案例测试)
  7. 目标检测:数据集划分 & XML数据集转YOLO标签
  8. DeepSort行人车辆识别系统(实现目标检测+跟踪+统计)
  9. YOLOv5参数大全(parse_opt篇)
  10. YOLOv5改进(一)-- 轻量化YOLOv5s模型
  11. YOLOv5改进(二)-- 目标检测优化点(添加小目标头检测)
  12. YOLOv5改进(三)-- 引进Focaler-IoU损失函数
  13. YOLOv5改进(四)–轻量化模型ShuffleNetv2
  14. YOLOv5改进(五)-- 轻量化模型MobileNetv3
  15. YOLOv5改进(六)–引入YOLOv8中C2F模块
  16. YOLOv5改进(七)–改进损失函数EIoU、Alpha-IoU、SIoU、Focal-EIOU
  17. YOLOv5改进(八)–引入Soft-NMS非极大值抑制
  18. YOLOv5改进(九)–引入BiFPN模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/366275.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FastApi中的常见请求类型

FastApi中的常见请求类型 后端开发语言中&#xff0c;我钟情于node&#xff0c;高效的异步处理真是让我眼前一亮&#xff0c;同时&#xff0c;简单易懂的语法也让我非常倾心 但是但是&#xff0c;因为考虑要写一个深度学习算法的后端接口&#xff0c;所以不得不选用python作为…

【源码+文档+调试讲解】基于vue的线上点餐系统

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了线上点餐系统的开发全过程。通过分析线上点餐系统管理的不足&#xff0c;创建了一个计算机管理线上点餐系统的方案。文章介绍了线上点餐系统的系统分析部分&…

产品经理-对产品经理的认识(1)

今天跟大家聊一下产品经理这个岗位的,产品经理是互联网岗位当中比较火的一个岗位,也是最接近CEO的岗位 产品经理岗位&#xff0c;技术门槛低&#xff0c;薪水和前景都很不错&#xff0c;又处于团队的核心位置 产品经理岗位没有完全相关的专业设置和清晰的学习路径&#xff0c;绝…

信号“地”的分类

无论是在模拟电路中还是在数字电路中都存在着个种各样的“地”。信号“地”又称参考“地”&#xff0c;就是零电位的参考点&#xff0c;也是构成电路信号回路的公共段&#xff0c;图形符号“⊥”。 (1) 数字地DGND&#xff1a;也叫逻辑地&#xff0c;是数字电路中各种开关量&a…

7.1.SQL注入-基于函数报错的方式来利用updatexml()

基于函数报错的方式来进行利用-字符型&#xff08;本页updatexml()&#xff09; 前提条件是后台数据库没有屏蔽数据库语法报错信息 updatexml()方法详解 注释&#xff1a; 第一个参数&#xff0c;意思就是xml文档的名称 第二个参数&#xff0c;意思就是定位到xml文档中指定…

C++专业面试真题(1)学习

常用Linux命令 ls&#xff1a;列出当前目录内容 ls -l&#xff1a;详细信息列表 ls -a&#xff1a;包括隐藏文件 cd&#xff1a;更改目录 pwd&#xff1a;显示当前目录路径 mkdir&#xff1a;创建新目录 rmdir&#xff1a;删除空目录 rm&#xff1a;删除文件或目录 rm -…

vision mamba-yolov8:结合Vmamba的yolov8目标检测改进实现

1.vision mamba结构与原理 Mamba成功的关键在于S6模型&#xff0c;该模型为NLP任务设计&#xff0c;通过选择性扫描空间状态序列模型&#xff0c;将二次复杂度降低至线性。但由于视觉信号&#xff08;如图像&#xff09;的无序性&#xff0c;Mamba的S6模型不能直接应用&#xf…

qt可点击的QLabel

需求——问题与思路 使用wpf实现一个可点击的超链接label相当简单&#xff08;如下图&#xff09;&#xff0c;但是qt的QLabel不会响应点击事件&#xff0c;那就从QLabel继承一个类&#xff0c;然后在该类中重写mousePressEvent函数&#xff0c;并在该函数中对左键点击事件做响…

【MySQL备份】Percona XtraBackup全量备份实战篇

目录 1. 前言 2.准备工作 2.1.环境信息 2.2.创建备份目录 2.3.配置/etc/my.cnf文件 2.4.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练&#xff1a;利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文…

如何给WPS、Word、PPT等办公三件套添加收费字体---方正仿宋GBK

1.先下载需要的字体。 下载字体的网站比较多&#xff0c;基本上都是免费的。随便在网上搜索一个就可以了&#xff0c;下面是下载的链接。 方正仿宋GBK字体免费下载和在线预览-字体天下 ​www.fonts.net.cn/font-31602268591.html 注意&#xff1a;切记不要商用&#xff0c;以免…

记一次EasyExcel的错误使用导致的频繁FullGC

记一次EasyExcel的错误使用导致的频繁FullGC 一、背景描述二、场景复现三、原因分析四、解决方案五、思考复盘 一、背景描述 繁忙的校招结束了&#xff0c;美好的大学四年也结束了&#xff0c;作者也有10个月没有更新了。拿到心仪的offer之后也开始了苦B的打工生活。 最近接到…

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 &#xff08;1&#xff09;判断bucket是否存在 &#xff08;2&#xff09;新建bucket &#xff08…

《解答元器件的排列方式》

之前刚接触电子的时候&#xff0c;心里有个疑惑&#xff0c;为什么线路板上的电子元器件是纵横交错的排列方式&#xff0c;为什么不能是像表格一样&#xff0c;一行一列&#xff0c;整整齐齐的排列&#xff1f;为什么这个芯片必须要放在线路板的中心位置呢&#xff1f;相信不少…

【面试系列】产品经理高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

深入理解 XML 和 HTML 之间的区别

在现代网络技术的世界中&#xff0c;XML&#xff08;可扩展标记语言&#xff09;和 HTML&#xff08;超文本标记语言&#xff09; 是两个非常重要的技术。尽管它们都使用标签和属性的格式来描述数据&#xff0c;但它们在形式和用途上有显著的区别。 概述 什么是 XML&#xff…

[数据集][目标检测]睡岗检测数据集VOC+YOLO格式3290张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3316 标注数量(xml文件个数)&#xff1a;3316 标注数量(txt文件个数)&#xff1a;3316 标注…

[图解]SysML和EA建模住宅安全系统-05-参数图

1 00:00:01,140 --> 00:00:03,060 这是实数没错&#xff0c;这是分钟 2 00:00:03,750 --> 00:00:07,490 但是你在这里选&#xff0c;选不了的 3 00:00:07,500 --> 00:00:09,930 因为它这里不能够有那个 4 00:00:11,990 --> 00:00:13,850 但是我们前面这里 5 00…

Linux下编程之内存检查

前言 我们在进行编程时&#xff0c;有时不免会无意中写出一些容易导致内存问题&#xff08;可能一时表象上正常&#xff09;的代码&#xff0c;导致的后果肯定是不好的&#xff0c;就像一颗颗“哑弹”&#xff0c;令人心慌。网上推荐的辅助工具很多&#xff0c;此篇文章…

爬虫逆向实战(42)-某巢登陆(AES、MD5、RSA、滑块验证码)

一、数据接口分析 主页地址&#xff1a;某巢 1、抓包 通过抓包可以发现在登录时&#xff0c;网站首先请求captcha/querySlideImage/来获取滑块验证码的图片&#xff0c;然后请求captcha/checkCode/接口来验证滑块验证码。滑块验证码校验成功后&#xff0c;请求noshiro/getPu…

每天五分钟深度学习:解决for循环效率慢的关键在于向量化

本文重点 上一节课程中,我们学习了多样本的线性回归模型,但是我们的伪代码实现中使用了大量的for循环,这样代码的问题是效率很低。为了克服这一瓶颈,向量化技术应运而生,成为提升程序执行效率、加速数据处理速度的重要手段。 向量化技术概述 向量化(Vectorization)是…