基于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.mzph.cn/pingmian/36801.shtml

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

相关文章

基于单片机和LabVIEW 的远程矿井水位监控系统设计

摘要 &#xff1a; 针 对 现 有 矿 井 水 位 监 控 系 统 存 在 结 构 复 杂 和 不 能 远 程 监 控 的 问 题 &#xff0c; 设计了基于单片机和&#xff2c;&#xff41;&#xff42;&#xff36;&#xff29;&#xff25;&#xff37; 的远程矿井水位监控系统 &#xff0c; 详…

密码管理器大比拼:哪款更适合你?(KeePass、Bitwarden、LastPass、1Password和Dashlane对比)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 密码管理器 📒🎯 对比🎯 付费情况🎯 安全性🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 随着互联网的发展和网络安全问题的日益突出,密码管理器已经成为保障个人和企业信息安全的重要工具。本文将详细对比市面…

Dataease安装,配置Jenkins自动部署

Dataease安装&#xff0c;配置Jenkins自动部署 一.安装Dataease 安装前准备&#xff1a;1.Ubuntu20.04 LTS国内源安装指定版本Docker 2.docker-compose安装 下载离线安装的安装包&#xff0c;下载地址&#xff1a;https://community.fit2cloud.com/#/download/dataease/v1-…

人工智能AI风口已开:如何赋予UI设计与视频剪辑新生命

随着科技的浪潮不断向前推进&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度重塑着我们的世界&#xff0c;特别是在创意产业的核心领域——UI设计与视频剪辑中&#xff0c;AI正逐步成为驱动行业创新与变革的关键力量。在这个AI技术全面开花的新时代&#xff0c;…

C++学习笔记---串口通信

串口基础知识 DB9针的RS-232串口&#xff0c;分别是公头、母头&#xff0c;这两种串口可以连接在一起。DB9针的串口信号脚编号及信号脚的具体含义如下 串口通信可以使用3根线完成&#xff0c;对应信号脚分别是&#xff1a;2接收、3发送、5地线。对此&#xff0c;有个简单的记法…

强化学习:值函数近似【Deep Q-Network,DQN,Deep Q-learning】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld…

(番外篇)指针的一些相关习题讲解(速进,干货满满)(1)

前言&#xff1a; 我已经好久没写过博客了&#xff0c;这几天确实有点偷懒了&#xff0c;上次博客我们已经讲完了指针的部分内容&#xff0c;但我觉着没有习题是不够的&#xff0c;于是我出了这一篇番外篇&#xff0c;来让各位读者朋友们进行指针强化&#xff0c;这些题目都是小…

Python27 神经网络中的重要概念和可视化实现

1. 神经网络背后的直观知识 神经网络的工作方式非常相似&#xff1a;它接受多个输入&#xff0c;经过多个隐藏层中的多个神经元进行处理&#xff0c;并通过输出层返回结果&#xff0c;这个过程在技术上称为“前向传播”。 接下来&#xff0c;将神经网络的输出与实际输出进行比…

GIT-LFS使用

0.前言 目前git仓库有很多很大的文件需要管理&#xff0c;但是直接上传&#xff0c;每次clone的文件太大&#xff0c;所有准备使用git-lfs解决。 1、下载和安装 Git LFS 1.1、直接下载二进制包&#xff1a; Releases git-lfs/git-lfs GitHub 安装 Git LFS sudo rpm -ivh…

Spring Boot中获取请求参数的几种方式

前言 在构建现代 Web 应用时&#xff0c;处理来自客户端的请求参数是不可或缺的一部分。Spring Boot作为构建微服务应用的领先框架&#xff0c;提供了多种灵活高效的方式来获取请求参数&#xff0c;满足各种应用场景。 无论您是Spring Boot的初学者&#xff0c;还是希望更深入…

LabVIEW电涡流检测系统

开发了一种基于LabVIEW的软件与硬件结合的电涡流检测系统&#xff0c;通过同步采样技术和编码器的协同工作&#xff0c;显著提高了大型结构物的损伤检测精度和效率&#xff0c;具有良好的应用前景和实用价值。 项目背景 传统的手持式电涡流检测方法因其速度慢、灵敏度低、准确…

<sa8650>QCX 诊断模块和错误处理

<sa8650>QCX 诊断模块和错误处理 一、错误报告设计二、QCarCam API 的错误报告2.1 QCarCamRegisterEventCallback2.2 CarCamErrorInfo_t2.3 QCarCamErrorInfo_t2.4 Error ID2.4.1 QCARCAM_ERROR_WARNING2.4.2 QCARCAM_ERROR_SUBSYSTEM_FATAL2.4.3 QCARCAM_ERROR_FATAL2.4.4 Q…

Links: Challenging Puzzle Game Template(益智游戏模板)

链接:挑战益智游戏 《Links》是一款独特且具有挑战性的益智游戏,即将发布。 每个级别都会向玩家展示不同的棋盘。目标是通过移动和旋转所有棋子来连接它们。每个棋子都有自己的特点和功能-你可以移动它们,旋转它们,或者两者兼而有之。连接所有棋子,以解决难度和挑战不断增…

谷歌发布两款新Gemma 2大语言模型;阿里云开源Qwen2-72B模型荣登榜首

&#x1f989; AI新闻 &#x1f680; 谷歌发布两款新Gemma 2大语言模型 摘要&#xff1a;谷歌发布Gemma 2大语言模型&#xff0c;包括90亿和270亿参数两种版本。Gemma 2在推理性能、效率和安全性上较第一代有显著提升。27B模型的性能媲美更大规模的主流模型&#xff0c;且部署…

收银系统开源源码-千呼新零售2.0【打折促销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

OpenAI穿着「皇帝的新衣」;扒了数万条帖子汇总100种AIGC玩法;北美出海的财务避坑指南;我创业「如」有CTO | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 我扒了 Reddit 论坛数万条帖子&#xff0c;汇总了 GenAI 的 100 种玩法 ChatGPT 已经问世一年半了。这期间诞生了很多大语言模型和生成式人工智能…

[数据集][目标检测]金属架螺栓螺丝有无检测数据集VOC+YOLO格式857张3类别

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

Vite: 关于Rollup打包

概述 Rollup 是一款基于 ES Module 模块规范实现的 JavaScript 打包工具&#xff0c;在前端社区中赫赫有名&#xff0c;同时也在 Vite 的架构体系中发挥着重要作用不仅是 Vite 生产环境下的打包工具&#xff0c;其插件机制也被 Vite 所兼容&#xff0c;可以说是 Vite 的构建基…

数据结构速成--树和二叉树

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 气死了…

东京裸机云服务器怎么用

东京裸机云服务器是一种结合了物理服务器性能和云服务灵活性的高性能计算服务&#xff0c;它为用户提供了高效、安全的计算和存储能力。在了解如何使用东京裸机云服务器之前&#xff0c;需要了解其基本特性和优势。具体分析如下&#xff0c;rak部落小编为您整理发布。 1. **硬件…