YOLOv8+bytetrack实现多目标追踪

1. bytetrack简介

ByteTrack是一种基于检测的目标追踪算法,它在YOLOv8检测器的基础上进行了改进,实现了更高效的目标追踪,具有简单、高效和通用的特点。相较于传统的多目标跟踪方法,ByteTrack不依赖于ReID模型,而是通过关联每个检测框来进行跟踪。这种方法可以有效地解决低分检测框被简单丢弃的问题,从而减少漏检和碎片化轨迹的情况。

ByteTrack算法流程如下:首先,使用目标检测器对当前帧进行检测,得到一系列候选目标框。然后,利用卡尔曼滤波对目标框进行预测,并利用匈牙利算法进行数据关联,将检测框与历史轨迹进行匹配。对于得分较高的目标框,直接与历史轨迹匹配;对于得分较低的目标框,则与第一次没有匹配上的轨迹进行匹配,用于检测目标遮挡的情形。

为了实现高效的实时多目标跟踪,ByteTrack还采用了一些优化策略。例如,对轨迹进行分类,避免在代码阅读时出现混淆的情形;同时,对于连续两帧都未匹配上的轨迹,将其标记为即将删除的轨迹,从而及时清理无效轨迹。

在实际应用中,ByteTrack能够轻松应用到各种多目标跟踪框架中,并取得显著的性能提升。在MOT17测试集上,ByteTrack实现了80.3 MOTA、77.3 IDF1和63.1 HOTA等优异性能指标,同时在单个V100 GPU上运行速度达到了30 FPS。这表明ByteTrack具有高效、准确和实时性强的特点,能够满足实际应用的需求。

2. 实现流程

使用了 YOLOv8 和 ByteTrack 进行目标识别与跟踪。实现流程:如下面代码所示

  1. 导入必要的库:

    • cv2:用于处理视频和图像。
    • os:用于处理文件路径。
    • ultralytics.YOLO:用于加载 YOLOv8 模型进行目标检测和跟踪。
  2. 加载 YOLOv8 模型:

    model = YOLO(r'track/pt/best.pt')
    

    这行代码加载了预训练的 YOLOv8 模型,该模型用于目标检测和跟踪。

  3. 设置输入视频文件夹路径和输出视频文件夹路径:

    input_video_folder = r"track/input"
    output_video_folder = r"track/output"
    

    这里定义了输入视频文件夹路径和输出视频文件夹路径。

  4. 获取视频文件列表并按文件名排序:

    video_files = [file for file in os.listdir(input_video_folder) if file.endswith(".mp4")]
    video_files.sort()
    

    这行代码获取指定文件夹中所有以 .mp4 结尾的视频文件,并按文件名排序。

  5. 循环处理每个视频文件:

    for video_file in video_files:
    

    这是一个循环,遍历所有视频文件。

  6. 打开视频文件并设置输出视频路径:

    input_video_path = os.path.join(input_video_folder, video_file)
    output_video_path = os.path.join(output_video_folder, video_file)
    

    这里根据当前视频文件构建输入视频文件路径和输出视频文件路径。

  7. 获取视频的帧率和尺寸:

    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    

    这行代码获取视频的帧率和尺寸。

  8. 创建视频写入对象:

    out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))
    

    这行代码创建了一个视频写入对象,用于写入处理后的视频帧。

  9. 循环处理视频的每一帧:

    while cap.isOpened():
    

    这是一个循环,用于处理视频的每一帧。

  10. 读取视频的下一帧:

    success, frame = cap.read()
    

    这行代码读取视频的下一帧,并将帧存储在变量 frame 中。

  11. 使用 YOLOv8 模型进行目标检测和跟踪:

    results = model.track(frame, tracker="ultralytics/cfg/trackers/bytetrack.yaml", persist=True)
    

    这行代码使用 YOLOv8 模型对当前帧进行目标检测和跟踪,使用 ByteTrack 跟踪器,并设置 persist=True 以保持跟踪。

  12. 将检测和跟踪结果可视化并写入输出视频:

    annotated_frame = results[0].plot()
    out.write(annotated_frame)
    

    这行代码将检测和跟踪结果可视化在当前帧上,并将结果写入输出视频。

  13. 显示处理后的视频帧:

    cv2.imshow("YOLOv8 Tracking", annotated_frame)
    

    这行代码显示处理后的视频帧。

  14. 检测是否按下 ‘q’ 键:

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break
    

    如果用户按下键盘上的 ‘q’ 键,则跳出循环。

  15. 释放视频捕获对象和视频写入对象:

    cap.release()
    out.release()
    

    这行代码释放视频捕获对象和视频写入对象,释放视频资源。

  16. 关闭显示窗口:

    cv2.destroyAllWindows()
    

    这行代码关闭 OpenCV 显示的所有窗口。

  17. 显示处理完成信息:

    print("所有视频处理完成!")
    

    这行代码打印输出所有视频处理完成的消息。

3. 总体代码:

import cv2
from ultralytics import YOLO
import os

# Load the YOLOv8 model
model = YOLO(r'track/pt/best.pt')

# 输入视频文件夹路径和输出视频文件夹路径
input_video_folder = r"track/input"
output_video_folder = r"track/output"

# 获取视频文件夹中的所有视频文件名,并按文件名排序
video_files = [file for file in os.listdir(input_video_folder) if file.endswith(".mp4")]
video_files.sort()

# 循环处理每个视频文件
for video_file in video_files:
    # 打开视频文件
    input_video_path = os.path.join(input_video_folder, video_file)
    cap = cv2.VideoCapture(input_video_path)

    # 获取输出视频文件名
    output_video_path = os.path.join(output_video_folder, video_file)

    # 获取视频的帧率和尺寸
    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

    # 创建视频写入对象
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))

    # Loop through the video frames
    while cap.isOpened():
        # Read a frame from the video
        success, frame = cap.read()

        if success:
            # Run YOLOv8 tracking on the frame, persisting tracks between frames
            results = model.track(frame, tracker="ultralytics/cfg/trackers/bytetrack.yaml", persist=True)

            # Visualize the results on the frame
            annotated_frame = results[0].plot()

            # Write the annotated frame to the output video
            out.write(annotated_frame)

            # Display the annotated frame
            cv2.imshow("YOLOv8 Tracking", annotated_frame)

            # Break the loop if 'q' is pressed
            if cv2.waitKey(1) & 0xFF == ord("q"):
                break
        else:
            # Break the loop if the end of the video is reached
            break

    # Release the video capture and video write objects
    cap.release()
    out.release()

# Close the display window
cv2.destroyAllWindows()

print("所有视频处理完成!")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL底层执行过程

MySQL 的查询流程 客户端请求连接器 负责与客户端的通信,是半双工模式(半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。),验证请求用户的账户和密码是否正确,③如果用户的账户和密码验…

模型量化与量化在LLM中的应用 | 得物技术

一、模型推理优化 随着模型在各种场景中的落地实践,模型的推理加速早已成为AI工程化的重要内容。而近年基于Transformer架构的大模型继而成为主流,在各项任务中取得SoTA成绩,它们在训练和推理中的昂贵成本使得其在合理的成本下的部署实践显得…

Git 如何修改已经推送的错误提交信息(有图有真相)

解决方案一:修改最新的提交信息 首先,我们来考虑最简单的情况:如果你在最近一次提交时输入了错误的提交信息,并且还没有进行下一次提交,那么你可以使用如下命令来修改最新的提交信息: $ git commit --ame…

VSCode SSH连接远程主机失败,显示Server status check failed - waiting and retrying

vscode ssh连接远程主机突然连接不上了,终端中显示:Server status check failed - waiting and retrying 但是我用Xshell都可以连接成功,所以不是远程主机的问题,问题出在本地vscode; 现象一: 不停地输入…

CPU架构

一、CPU组成 CPU内部由ALU(算术逻辑单元)、CU(控制器)、寄存器(PC、IR、PSW、DR、通用寄存器等)、中断系统组成,外部通过总线与控制总线、数据总线、地址总线进行相连,对数据和程序…

【保姆级讲解如何安装与配置Xcode】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

第十二章 案例二:配置Trunk,实现相同VLAN的跨交换机通信

1、实验环境 公司的员工人数已达到 100 人,其网络设备如图12.13所示,现在的网络环境导致广播较多网速慢,并且也不安全,公司希望按照部门划分网络,并且能够保证一定的网络安全性 图12.13 实验案例二拓扑图 其网络规划…

环境安装:python环境迁移(无网和有网)

前言 环境部署或迁移是一项简单而又考验应对能力的一项工作,需要考虑到网络环境的情况,无网环境下需要采取离线方式进行操作,有网环境则可以直接通过在线安装完成。 在进行Python环境迁移时,需要注意保持环境的一致性,…

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?

Notion是什么 Notion,一款强大的多功能工具,可用于组织笔记、任务、项目、数据库和文档等。 Notion软件下载 这个到Notion官方网站下载就可以了。 怎么订阅Notion会员 注册好了Notion的账号,来到首页,点击设置,左边…

LED显示屏黑屏的常见原因及解决办法

LED显示屏在使用过程中偶尔会出现黑屏现象,可能由多种原因引起。以下是LED显示屏出现黑屏的主要情况及相应的解决办法: 1. 上电的瞬间就是黑的 原因:可能是因为上电过程中出现了一些异常情况,导致屏幕无法正常显示。 解决办法&…

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存,再更新数据 该方案数据不一致的原因 2. 先更新数据库,再更新缓存 3. 先删除缓存,再更新数据库 延时双删 4. 先更新数据库,再删除缓存 该方案数据不一致的…

新手如何用Postman做接口自动化测试?

1、什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试,模拟人去操作软件界面,把人从简单重复的劳动中解放出来,本质是用代码去测试另一段代码,属于一种软件开发工作,已…

洗地机哪个牌子质量最好?四款年度口碑品牌盘点

在当今家庭生活中,洗地机技术的飞速发展给我们的日常带来了极大的便利。洗地机作为智能家居领域的佼佼者,其实用性和智能化程度受到越来越多消费者的欢迎。许多人在选洗地机时会纠结一个问题:洗地机哪个牌子质量最好? 洗地机怎么…

# 谷歌 Chrome 浏览器无法安装插件的解决方法

谷歌 Chrome 浏览器无法安装插件的解决方法 运用开发模式安装 安装步骤: 1、 将 XX.crx 插件的扩展名改成 .zip 或者 .rar 并解压到文件夹 XX 目录。 1)如:下载的 前端框架 vue.js 插件 nhdogjmejiglipccpnnnanhbledajbpd-6.6.1-Crx4Chro…

【AGX】Ubuntu20.04 + ROS_ noetic+ 大疆Mid360激光 雷达评测

大家好,我是虎哥,最近组装机器人,使用到了大疆孵化的圳市览沃科技有限公司(简称Livox览沃科技)推出的觅道系列全新混合固态激光雷达Mid-360,顺便试试效果,也记录一下使用入门过程。 "觅道M…

自然语言处理 (NLP) 和文本分析

自然语言处理 (NLP) 和文本分析:NLP 在很多领域都有着广泛的应用,如智能助手、语言翻译、舆情分析等。热门问题包括情感分析、命名实体识别、文本生成等。 让我们一起来详细举例子的分析讲解一下自然语言处理(NLP)和文本分析的应用…

基于java+springboot+vue实现的新闻资讯系统(文末源码+Lw)216

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,文章信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…

String2⃣️-string类对象的修改操作

目录 string类对象的修改操作 1.push back ;append;operator 2.assign;insert 3.erase;replace 4.rfind 5.substr 6.c_str 补充 1.reverse(逆置 反转) 2.Sort string类对象的修改操作 1.push back …

【算法刷题 | 贪心算法07】4.29(用最少数量的箭引爆气球、无重叠区间)

文章目录 12.用最少数量的箭引爆气球12.1题目12.2解法:贪心12.2.1贪心思路12.2.2代码实现 13.无重叠区间13.1题目13.2解法:贪心13.2.1贪心思路13.2.2代码实现 12.用最少数量的箭引爆气球 12.1题目 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面…

Kafka 3.x.x 入门到精通(08)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通(08)——对标尚硅谷Kafka教程 5. Kafka优化5.1 资源配置5.1.1 操作系统5.1.2 磁盘选择5.1.3 网络带宽5.1.4 内存配置5.1.5 CPU选择 5.2 集群容错5.2.1 副本分配策略5.2.2 故障转移方案5.2.3 数据备份与恢复 5.3 参数配置优化5.4 数…
最新文章