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

news2024/10/5 19:56:41

文章目录

  • 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 argparse

def parse_opt():
	parser = argparse.ArgumentParser()
	# person tracker params
	parser.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 opt

def 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:
			break
		tracks = 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,y1
    point1,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.")
        break
    tracks = 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.coloradmin.cn/o/1869609.html

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

相关文章

Does a vector database maintain pre-vector chunked data for RAG systems?

题意&#xff1a;一个向量数据库是否为RAG系统维护预向量化分块数据&#xff1f; 问题背景&#xff1a; I believe that when using an LLM with a Retrieval-Augmented Generation (RAG) approach, the results retrieved from a vector search must ultimately be presented…

提升用户转化率秘诀!Xinstall的H5拉起应用技术让您领先一步!

在移动互联网时代&#xff0c;App的推广和运营面临着诸多挑战。其中&#xff0c;H5页面如何高效、便捷地拉起应用&#xff0c;成为了一个亟待解决的问题。今天&#xff0c;我们就来谈谈如何利用Xinstall品牌&#xff0c;轻松解决这一痛点&#xff0c;提升用户体验&#xff0c;助…

ONLYOFFICE桌面编辑器8.1:办公体验新升级

引入 当今时代办公三件套已经成为我们日常生活中不可或缺的一部分了&#xff0c;但是说到办公软件不知道大家会首先想到那些产品 office 亦或是 WPS。最近也发布了 8.1 新版本&#xff0c;更新了一些新功能今天我们就来评测评测。 文章目录 引入一、ONLYOFFICE 是什么&#xff…

java基于ssm+jsp 仓库智能仓储系统

1管理员功能模块 管理员登录&#xff0c;通过填写用户名、密码等信息&#xff0c;输入完成后选择登录即可进入智能仓储系统 &#xff0c;如图1所示。 图1管理员登录界面图 智能仓储系统 &#xff0c;在智能仓储系统可以查看个人中心、公告信息管理、员工管理、供应商管理、商…

大模型技术的应用场景

大模型技术&#xff08;Large Language Model&#xff0c;LLM&#xff09;是指具有大量参数和训练数据的神经网络模型&#xff0c;它能够学习语言的统计规律&#xff0c;并生成与人类书写的文本相似的文本。大模型技术在近年来取得了重大进展&#xff0c;并开始在各种领域得到应…

reactjs18 中使用@reduxjs/toolkit同步异步数据的使用

react18 中使用@reduxjs/toolkit 1.安装依赖包 yarn add @reduxjs/toolkit react-redux2.创建 store 根目录下面创建 store 文件夹,然后创建 index.js 文件。 import {configureStore } from "@reduxjs/toolkit"; import {counterReducer } from "./feature…

OpenCloudOS开源的操作系统

OpenCloudOS 是一款开源的操作系统&#xff0c;致力于提供高性能、稳定和安全的操作系统环境&#xff0c;以满足现代计算和应用程序的需求。它结合了现代操作系统设计的最新技术和实践&#xff0c;为开发者和企业提供了一个强大的平台。本文将详细介绍 OpenCloudOS 的背景、特性…

抖音营销新策略:MessageBox与HubSpot集成,引领企业获客新潮流

在全球数字化浪潮中&#xff0c;抖音以其独特的短视频形式、庞大的用户群体和高度互动性&#xff0c;成为了企业出海战略中不可或缺的一环。抖音营销不仅仅是简单的内容发布和互动&#xff0c;它更是一种深度策略和创新思维的体现。今天将深入探讨抖音营销的核心价值、应用场景…

git基本使用(二):git分支的操作命令

Git 的多分支管理是指在同一个仓库中创建和管理多个分支&#xff0c;每个分支可以独立开发&#xff0c;互不干扰。分支是 Git 中的一种强大功能&#xff0c;允许开发人员同时在多个不同的功能、修复或实验上工作&#xff0c;而不会影响主分支或其他分支。通过多分支管理&#x…

svn怎么新建分支,切换分支

在当前分支下&#xff0c;点svn右键&#xff0c;选择分支/标记 在选择远端地址时&#xff0c;点右边更多选项&#xff0c;打开远端版本库。找到对应的分支上级位置&#xff0c;点击确定 填写新分支名称&#xff0c;我这儿是将分支建在了branches下&#xff0c;分支名称为V1.1 填…

SD-WAN解决多云环境的挑战

随着SD-WAN成为远程用户访问基于云的应用程序的主要途径&#xff0c;促使越来越多的部署多云环境以优化性能的企业、IT专业人员选择支持安全、低延迟且易于管理的SD-WAN技术。与此同时&#xff0c;SD-WAN供应商和云服务供应商之间的合作&#xff0c;有助于跨多个云供应商轻松管…

车载信息安全:技术要求,实验方法

目录 1. 技术要求 1.1 硬件安全要求 1.2 通信协议与接口安全要求 1.2.1 对外通信安全 1.2.2 内部通信安全 1.2.3 通信接口安全 1.3 操作系统安全要求 1.3.1 操作系统安全配置 1.3.2 安全调用控制能力 1.3.3 操作系统安全启动 1.3.4 操作系统更新 1.3.5 操作系统隔离…

架构师篇-5、架构语言-ArchiMate

内容摘要&#xff1a; TOGAF内容元模型TOGAF架构语言ArchiMate3ArchiMate实践案例分享 TOGAF内容框架【核心内容元模型】 作为一个通用且开放式的标准&#xff0c;TOGAF需要采用一种非常灵活的方式来对其内容元模型进行定义&#xff0c;从而使得不同的企业可以根据自身需要对…

实施医院无纸化签署服务的案例说明

随着技术的发展&#xff0c;电子签署服务在医疗行业中的应用越来越广泛。本文将介绍一个医院实施无纸化签署服务的案例&#xff0c;包括其核心功能、实施过程和预期效果。 医院全院无纸化签署服务平台 该平台专为医院设计&#xff0c;支持医护人员、患者知情文书以及管理工作…

面试-collection体系

1.整体collection体系图 2.集合List和Set (1)ArrayList和LinkedList区别 我们知道&#xff0c;通常情况下&#xff0c;ArrayList和LinkedList的区别有以下几点&#xff1a; 1. ArrayList是实现了基于动态数组的数据结构(可以实现扩容&#xff0c;实现方式是建立一个新的数组,再…

Adobe Acrobat编辑器最新版下载安装 Adobe Acrobat版本齐全!

功能强大&#xff0c;Adobe Acrobat无疑是PDF文档处理领域的翘楚。这款软件集多种PDF文档处理功能于一身&#xff0c;不仅使得用户可以轻松地编辑PDF文档&#xff0c;更能轻松应对转换和合并等多种需求。 在编辑功能上&#xff0c;Adobe Acrobat的表现尤为出色。无论是添加文字…

shark云原生-日志管理体系-filebeat

文章目录 1. deploy 文件1.1 RBAC1.2. DaemonSet1.2.1. Elasticsearch 连接信息1.2.2. Volume 1.3. ConfigMap1.3.1. 日志路径1.3.2. 日志事件输出目标 2. 在控制平面节点上运行Filebeat3. 查看输出3.1. 关于处理器 processors 4. 日志收集配置4.1. 手动指定日志收集路径4.2. 自…

3d渲染软件有哪些(3),渲染100邀请码1a12

3D渲染很复杂&#xff0c;涉及到多方面的知识&#xff0c;比如光线追踪、全局光照、反射、折射等&#xff0c;还有3D软件的选择和应用&#xff0c;今天我们继续介绍其他的3D渲染软件。 1、Maya Maya是三维计算机图形软件&#xff0c;它功能丰富&#xff0c;灵活性强&#xff…

Servlet中请求转发【 Forward】与重定向【Redirection】的区别

在Servlet中&#xff0c;请求转发&#xff08;Request Forwarding&#xff09;和重定向&#xff08;Redirection&#xff09;是用于控制请求流程的两种不同机制。它们的主要区别如下&#xff1a; 一、请求转发 服务器内部操作&#xff1a;转发是在服务器内部进行的操作&#xf…

构建LangChain应用程序的示例代码:46、使用 Meta-Prompt 构建自我改进代理的 LangChain 实现

Meta-Prompt 实现 摘要&#xff1a; 本文介绍了 Noah Goodman 提出的 Meta-Prompt 方法的 LangChain 实现&#xff0c;该方法用于构建能够自我反思和改进的智能代理。 核心思想&#xff1a; Meta-Prompt 的核心思想是促使代理反思自己的性能&#xff0c;并修改自己的指令。…