yolov8+deepsort+botsort+bytetrack车辆检测和测速系统

news2024/11/14 15:28:22

结合YOLOv8、DeepSORT、BoTSORT和ByteTrack等技术,可以实现一个高效的车辆检测和测速系统。这样的系统适用于交通监控、智能交通管理系统(ITS)等领域,能够实时识别并跟踪车辆,并估算其速度。

项目介绍

本项目旨在开发一个综合性的车辆检测和测速系统,该系统利用先进的目标检测和多目标跟踪技术,能够实现在视频流中对车辆进行实时检测、跟踪,并计算车辆的速度。系统主要分为以下几个部分:

  1. 目标检测:使用YOLOv8模型进行车辆检测。
  2. 目标跟踪:结合DeepSORT、BoTSORT和ByteTrack算法实现多目标跟踪。
  3. 测速:基于车辆在视频中的位移和时间差来计算速度。
  4. 用户界面:使用PyQt5构建GUI,便于用户操作和查看结果。

关键功能

  • 实时车辆检测:通过YOLOv8模型实时检测视频中的车辆。
  • 多目标跟踪:利用DeepSORT、BoTSORT和ByteTrack算法同时跟踪多个车辆。
  • 速度估计:根据车辆在视频中的运动轨迹和时间差计算速度。
  • 用户界面:提供图形用户界面供用户启动分析并查看结果。

技术栈

  • 目标检测:YOLOv8(You Only Look Once v8)
  • 多目标跟踪:DeepSORT、BoTSORT、ByteTrack
  • 图形用户界面:PyQt5
  • 视频处理:OpenCV
  • 编程语言:Python

关键代码示例

1. 安装依赖

首先确保安装了所有必要的库:

1pip install opencv-python torch torchvision pyqt5 numpy scikit-learn filterpy
2pip install ultralytics  # 用于YOLOv8
3git clone https://github.com/nwojke/deep_sort.git  # DeepSORT
4git clone https://github.com/ifzhang/ByteTrack.git  # ByteTrack
5git clone https://github.com/ifzhang/BoT-SORT.git  # BoTSORT
2. 导入库
1import sys
2import cv2
3import numpy as np
4import torch
5from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton
6from PyQt5.QtCore import QTimer
7from PyQt5.QtGui import QImage, QPixmap
8from ultralytics import YOLO  # 使用YOLOv8的最新版本
9from deep_sort_pytorch.deep_sort import DeepSort  # DeepSORT
10from botsort import BoTSORT  # BoTSORT
11from bytetrack import BYTETracker  # ByteTrack
3. 初始化模型

假设YOLOv8模型的权重文件位于weights/yolov8.pt

1device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
2yolo_model = YOLO('weights/yolov8.pt').to(device)
3
4# 初始化跟踪器
5deepsort = DeepSort(
6    "deep_sort_pytorch/deep_sort/deep/checkpoint/ckpt.t7",
7    max_dist=0.2,
8    max_iou_distance=0.7,
9    max_age=70,
10    n_init=3,
11    nn_budget=100,
12    use_cuda=True
13)
14
15botsort = BoTSORT(device, max_age=1, min_hits=3, iou_threshold=0.1)
16bytetrack = BYTETracker(device, fp16=True, track_thresh=0.5, track_buffer=30, match_thresh=0.8)
4. 创建GUI

创建一个简单的GUI来显示视频流和检测结果。

1class VideoAnalysisWindow(QMainWindow):
2    def __init__(self):
3        super().__init__()
4        self.initUI()
5
6    def initUI(self):
7        self.setWindowTitle('车辆检测与测速系统')
8        self.setGeometry(100, 100, 800, 600)
9        
10        layout = QVBoxLayout()
11        self.label = QLabel(self)
12        layout.addWidget(self.label)
13        
14        button = QPushButton('开始分析', self)
15        button.clicked.connect(self.start_analysis)
16        layout.addWidget(button)
17        
18        container = QWidget()
19        container.setLayout(layout)
20        self.setCentralWidget(container)
21    
22    def start_analysis(self):
23        self.capture = cv2.VideoCapture(0)  # 使用摄像头0作为视频源
24        self.timer = QTimer()
25        self.timer.timeout.connect(self.update_frame)
26        self.timer.start(20)  # 每50毫秒更新一次画面
27
28    def update_frame(self):
29        ret, frame = self.capture.read()
30        if ret:
31            # 检测车辆
32            results = yolo_model(frame)
33            detections = results.xyxy[0].cpu().numpy()
34            
35            # 跟踪车辆
36            tracks = deepsort.update(detections, frame)
37            tracks_botsort = botsort.update(detections, frame)
38            tracks_bytetrack = bytetrack.update(detections, frame)
39            
40            # 绘制边界框
41            self.draw_boxes(frame, tracks)
42            self.draw_boxes(frame, tracks_botsort)
43            self.draw_boxes(frame, tracks_bytetrack)
44            
45            # 显示结果
46            self.display_results(frame)
47            
48    def draw_boxes(self, frame, tracks):
49        for track in tracks:
50            bbox = track[:4]
51            id = int(track[4])
52            x1, y1, x2, y2 = [int(i) for i in bbox]
53            cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
54            cv2.putText(frame, f"ID: {id}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36, 255, 12), 2)
55    
56    def display_results(self, frame):
57        height, width, channel = frame.shape
58        bytesPerLine = 3 * width
59        qImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_BGR888)
60        pixmap = QPixmap.fromImage(qImg)
61        self.label.setPixmap(pixmap)
62
63if __name__ == '__main__':
64    app = QApplication(sys.argv)
65    window = VideoAnalysisWindow()
66    window.show()
67    sys.exit(app.exec_())

测速逻辑

测速逻辑可以通过计算车辆在视频中的位移和时间差来实现。具体来说,可以跟踪车辆的轨迹,并记录其在不同时间点的位置,然后使用这些信息来估算速度。

1def estimate_speed(tracks, fps):
2    speeds = []
3    for track in tracks:
4        # 获取轨迹点
5        positions = track['positions']
6        timestamps = track['timestamps']
7        
8        # 计算速度
9        for i in range(len(positions) - 1):
10            distance = np.linalg.norm(positions[i + 1] - positions[i])
11            time_diff = timestamps[i + 1] - timestamps[i]
12            speed = distance / time_diff * fps
13            speeds.append(speed)
14    
15    return speeds

结论

通过结合YOLOv8、DeepSORT、BoTSORT和ByteTrack等技术,本项目实现了一个功能完备的车辆检测和测速系统。该系统能够实时检测视频中的车辆,跟踪它们的运动,并计算速度。此外,系统还提供了一个简单的图形用户界面,使得用户可以轻松启动分析并查看结果。随着技术的不断发展和完善,这样的系统将在智能交通管理、公共安全等领域发挥越来越重要的作用。

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

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

相关文章

<<编码>> 第 6 章 发报机与继电器(Telegraphs and Relays) 示例电路

##继电器 info::操作说明 注: 此处输入处未添加电源及开关, 因此不能控制继电器的开合 读者可自行添加电源及开关, 或查看后续可操作的例子 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/c…

LOOKUP函数和VLOOKUP函数知识讲解与案例演示

〇、需求 在 Excel 文档中,根据查找值从查找域和结果域构成的数组中,找到对应的结果值。 一、知识点讲解 LOOKUP函数(比较常用,推荐)和VLOOKUP函数 两个公式都可以实现上述需求。 1. LOOKUP 函数 1.1 单个查询条件…

混合整数规划及其MATLAB实现

目录 引言 混合整数规划的基本模型 混合整数规划的求解方法 MATLAB中的混合整数规划实现 示例:多变量系统的混合整数规划 表格总结:混合整数规划的求解方法与适用场景 结论 引言 混合整数规划(Mixed Integer Programming, MIP&#xf…

大象机器人------2、坐标控制

坐标控制 主要用于实现智能规划路线让机械臂从一个位置到另一个指定位置。分为[x,y,z,rx,ry,rz],其中[x,y,z]表示的是机械臂头部在空间中的位置(该坐标系为直角坐标系),[rx,ry,rz]表示的是机械臂头部在该点的姿态(该坐…

如何将镜像推送到docker hub

前言 这一篇应该是最近最后一篇关于docker的博客了,咱来个有始有终,将最后一步——上传镜像给他写完,废话不多说,直接进入正题。 登录 首先需要确保登录才能推送到你的仓库中去,在终端输入docker login,输入用户名和…

通信工程学习:什么是HSS归属用户服务器

HSS:归属用户服务器 HSS(归属用户服务器,Home Subscriber Server)是IP多媒体子系统(IMS)中控制层的一个重要组成部分,它扮演着存储和管理用户相关信息的核心角色。以下是关于HSS归属用户服务器的…

中断映射及相关函数例程的控制流

GPIO 和 EXTIx 的映射关系 GPIOx0(xA~G)对应 EXTI0 ; GPIOx1(xA~G)对应 EXTI1 ; GPIOx2(xA~G)对应 EXTI2 ; GPIOx15(xA~G)对应 EXTI15 &…

java重点学习-集合

七 集合 7.1 复杂度分析 7.2 数组 1.数组(Array)是一种用连续的内存空间存储相同数据类型 数据的线性数据结构。 2.数组下标为什么从0开始 寻址公式是:baseAddressi*dataTypeSize,计算下标的内存地址效率较高 3.查找的时间复杂度 随机(通过下标)查询的时间复杂度是O…

通信工程学习:什么是CSCF会话控制功能、P-CSCF代理会话控制功能、I-CSCF询问会话控制功能、S-CSCF服务会话控制功能

一、CSCF会话控制功能 CSCF(Call Session Control Function)会话控制功能是IP多媒体子系统(IMS)内部的核心功能实体,主要负责处理多媒体呼叫会话过程中的信令控制。CSCF在整个IMS网络中起着至关重要的作用,…

第 9 章图像分割

图像分割是将一幅图像分割成有意义区域的过程。区域可以是图像的前景与背景或图像中一些单独的对象。这些区域可以利用一些诸如颜色、边界或近邻相似性等特征进行构建。本章中,我们将看到一些不同的分割技术。 9.1 图割(Graph Cut) 图论中的…

STL和C++11

1 补充知识点 c与c区别 c语言和C不能说一个面向过程,一个面向对象: 面向过程和面向对象只是一种编程思想,不是针对某一种语言的。Linux内核中的C语言就是运用面向对象的思想编写的。只是说,在实现面向对象编程时,C提…

线性因子模型 - PCA的流形解释篇

序言 线性因子模型,作为数据降维与特征提取的重要工具,在机器学习和统计分析领域发挥着关键作用。其中,主成分分析( PCA \text{PCA} PCA)作为线性因子模型的一种经典形式,其流形解释为我们深入理解数据结构…

VBA V3高级视频行为分析系统(含源码)

项目介绍 VBA V3是一个高级的视频行为分析系统,旨在通过实时或离线视频流来检测和分析人类的行为模式。该系统可以识别多种行为,如入侵检测、跌倒检测、异常行为识别等,并能提供实时警报和详细的行为报告。系统的设计充分考虑了易用性和扩展…

3GPP协议入门——物理层基础(三)

1. 栅格 1.1 全局栅格 5G频段范围是0-100GHz,在这100GHz的范围内,划分出了3279165个栅格,这些栅格从0开始编号,一直到编号3279165,每一个编号都代表一个绝对的频域位置,这些编号就叫做NR-ARFCN。   编号和频率范围如…

汽车免拆诊断案例 | 2013款捷豹XF车偶尔无法起动

故障现象 一辆2013款捷豹XF车,搭载3.0 L机械增压发动机(型号为AJ126),累计行驶里程约为20.6万km。车主反映,该车发动机偶尔无法起动,同时组合仪表上会提示很多故障信息;多按几次起动按钮或等待…

【GeekBand】C++设计模式笔记1_介绍

课程目标 理解松耦合设计思想掌握面向对象设计原则掌握重构技法改善设计掌握GOF核心设计模式 什么是设计模式 目标:复用,以不变应万变 GOF设计模式 从面向对象谈起 深入理解面向对象 向下:深入理解三大面向对象机制 封装:隐藏…

linux驱动开发-磁盘管理

在Linux系统中,mount命令是一种非常常见且有用的工具,用于将文件系统连接到指定的挂载点。通过使用mount命令,管理员可以访问和管理存储设备上的文件和目录,包括硬盘驱动器、CD或DVD驱动器、闪存驱动器等。 一、mount基本语法 mo…

非线性规划及其MATLAB实现

目录 引言 非线性规划的基本模型 非线性规划的求解方法 非线性规划的MATLAB实现 例子:多目标优化问题的非线性规划求解 表格总结:MATLAB常用非线性规划函数 实例:使用MATLAB求解非线性投资决策问题 结论 引言 非线性规划(…

Haskell中的数据交换:通过http-conduit发送JSON请求

无论是客户端与服务器之间的通信,还是服务之间的API调用,都需要一种高效、可靠的方法来传输数据。在众多编程语言中,Haskell以其强大的类型系统和函数式编程特性,为构建可靠和高效的数据交换提供了坚实的基础。本文将介绍如何在Ha…

基于ssm+vue+uniapp的食堂线上预约点餐系统小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…