[C++]使用yolov5的onnx模型结合onnxruntime和bytetrack实现目标追踪
【官方框架地址】
yolov5框架:https://github.com/ultralytics/yolov5
bytetrack框架:https://github.com/ifzhang/ByteTrack
【算法介绍】
Yolov5与ByTetrack:目标追踪的强大组合
Yolov5和ByTetrack是两种在目标追踪领域具有显著影响力的技术。当它们结合使用时,可以显著提高目标追踪的准确性和实时性。
Yolov5是Yolov系列算法的最新版本,它在目标检测方面具有出色的性能。相较于之前的版本,Yolov5在精度和速度上都进行了优化,使其成为实时目标检测的理想选择。通过结合ByTetrack,Yolov5可以更有效地应用于目标追踪任务。
ByTetrack是一种基于轨迹匹配的目标追踪方法。它利用目标的运动信息和外观特征进行追踪,能够在复杂场景下实现稳定的目标追踪。ByTetrack的优势在于其强大的鲁棒性和适应性,即使在目标被遮挡或出现运动模糊的情况下,它仍能保持较高的追踪精度。
当Yolov5与ByTetrack结合使用时,Yolov5首先检测视频中的目标,并生成目标的初始位置和运动轨迹。然后,ByTetrack利用这些信息对目标进行精确追踪。这种结合方式既发挥了Yolov5的高检测精度,又利用了ByTetrack的高追踪精度,使得整体目标追踪效果显著提升。
综上所述,Yolov5与ByTetrack的结合为解决复杂场景下的目标追踪问题提供了新的解决方案。随着人工智能技术的不断进步,这种结合方式有望成为目标追踪领域的研究热点和发展趋势。通过进一步的研究和优化,我们可以期待这种组合在未来的目标追踪任务中发挥更大的潜力。
【效果展示】
【实现部分代码】
#include <iostream>
#include <fstream>
#include <iomanip>
#include <time.h>
#include <chrono>
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include "onnxruntime_cxx_api.h"
#include "onnxruntime_c_api.h"
#include "util.h"
#include "detector.h"
#include <map>
#include "logs.h"
#include "BYTETracker.h"
#include<algorithm>void bytetrack_update(const std::vector<Detection>& res, std::vector<Object>& obj, const int& class_id ){for (size_t i = 0; i < res.size(); i++){try{if (res[i].classId != class_id){ continue; }obj[i].label = res[i].classId;obj[i].rect.x = res[i].box.x;obj[i].rect.y = res[i].box.y;obj[i].rect.height = res[i].box.height;obj[i].rect.width = res[i].box.width;obj[i].prob = res[i].conf;}catch(const std::exception& e){std::cerr << e.what() << '\n';} }};int main(int argc, char* argv[])
{std::map<int, std::vector<int>> object_id_list;const std::vector<std::string> classNames = util::loadNames("labels.txt");const int class_id = 2;//只想追踪的目标YOLODetector detector {nullptr};cv::Mat frame;std::vector<Detection> result;detector = YOLODetector("yolov5s.onnx", false, cv::Size(640,640));std::vector <double> avg;cv::VideoCapture source("D:\\car.mp4");std::chrono::time_point<std::chrono::high_resolution_clock>prev_frame_time(std::chrono::high_resolution_clock::now());std::chrono::time_point<std::chrono::high_resolution_clock>new_frame_time;int frame_width = source.get(cv::CAP_PROP_FRAME_WIDTH);int frame_height = source.get(cv::CAP_PROP_FRAME_HEIGHT);int fpsvideo = source.get(cv::CAP_PROP_FPS);cv::namedWindow("Camera", cv::WINDOW_NORMAL);BYTETracker tracker(fpsvideo, 30);while (source.isOpened()) {source >> frame;if (frame.empty()){break;}std::vector<Object> obj;result = detector.detect(frame, 0.5, 0.45);const int num = result.size();obj.resize(num);bytetrack_update(result, obj, class_id);std::vector<STrack> output_stracks = tracker.update(obj);for (size_t i = 0; i < output_stracks.size(); i++){std::vector<float> tlwh = output_stracks[i].tlwh;cv::Scalar __color = tracker.get_color(output_stracks[i].track_id);cv::putText(frame, std::to_string(output_stracks[i].track_id), cv::Point(tlwh[0], tlwh[1] - 10), cv::FONT_ITALIC, 0.75, __color, 2);cv::rectangle(frame, cv::Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), __color, 2); }//cv::imwrite("demo.jpg", frame);new_frame_time = std::chrono::high_resolution_clock::now();std::chrono::duration<double> duration1(new_frame_time - prev_frame_time);double fps = 1/duration1.count();avg.push_back(fps);std::cout <<"FPS: " << fps << std::endl;prev_frame_time = new_frame_time;cv::imshow("Camera", frame);if (cv::waitKey(1) == 27) {break;}}cv::destroyAllWindows();detector.Dispose();return 0;
}
【视频演示】
https://www.bilibili.com/video/BV1iT4y1h7Wa/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee
【测试环境】
opencv==4.7.0 onnxruntime==1.12.0 vs2019 cmake==3.24.3
相关文章:

[C++]使用yolov5的onnx模型结合onnxruntime和bytetrack实现目标追踪
【官方框架地址】 yolov5框架:https://github.com/ultralytics/yolov5 bytetrack框架:https://github.com/ifzhang/ByteTrack 【算法介绍】 Yolov5与ByTetrack:目标追踪的强大组合 Yolov5和ByTetrack是两种在目标追踪领域具有显著影响力…...

i2c接口验证
用i2cdetect命令。 1,检测有几组i2c总线在系统上 i2cdetect -l 2,查询i2c总线上挂接的设备及设备的地址 i2cdetect -y <number> i2cdetect -y 0命令用于扫描I2C总线/dev/i2c-0,并列出所有在该总线上存在的有效I2C设备地址。...
1、Pandas 数据结构:从 Series 到 DataFrame
目录 Series 创建 Series Series 索引和选择 DataFrame 创建 DataFrame DataFrame 索引和选择 DataFrame 操作和转换 数据结构转换 Series Series 是 Pandas 中的一维数组形式的数据结构,它可以包含任何数据类型(整数、字符串、浮点数、Python对象…...

MySQL函数—字符串函数
MySQL函数—字符串函数 函数功能CONCAT(s1,s2,...sn)字符串拼接,将s1,s2,...sn拼接成一个字符串LOWER(str)将字符串全部转为小写UPPER(str)将字符串全部转为大写LPAD(str,n,pad)左填充,用字符串pad对str左边进行填充,达到n个字符串长度RPAD(s…...

PLC从HTTP服务端获取JSON文件,解析数据到寄存器
智能网关IGT-DSER集成了多种PLC协议,方便实现各种PLC与HTTP服务端之间通讯。通过网关的参数配置软件绑定JSON文件的字段与PLC寄存器地址,配置URL,即可采用POST命令,将JSON文件提交给HTTP的服务端; 服务端有返回的JSON&…...
LeetCode 46. 全排列
46. 全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#…...

NVMe TCG安全数据存储简介
NVMe(非易失性内存主机控制器接口规范)与TCG(可信计算组)的集成主要体现在数据安全、固件验证和硬件信任根等方面,以确保存储设备的数据保护能力和安全性。 TCG Opal定义了一套针对自加密硬盘(SED, Self-En…...
Linux命令-ab命令(Apache服务器的性能测试工具 )
Apache服务器的性能测试工具 ab命令 是一个测试你 Apache http 服务器的工具,你可以通过这个工具,指定一个单位时间内向 apache 发出的请求数量来看看你的 Apache 和机器配合的性能如何。 语法 []内容为ab命令后跟的语法,eg:ab …...

蓝桥杯java基础
数组的倒序与隔位输出 时间限制:1.000S 空间限制:128MB 题目描述 给定一个整数数组,编写一个程序实现以下功能: 1. 将输入的整数数组倒序输出,每个数之间用空格分隔。 2. 从正序数组中,每隔一个单位&a…...

Unity3d引擎中使用AIGC生成的360全景图(天空盒)
前言 在这里与Skybox AI一起,一键打造体验无限的360世界,这是这个AIGC一键生成全景图的网站欢迎语。 刚使用它是23年中旬,在没有空去给客户实地拍摄全景图时,可以快速用它生成一些相关的全景图,用作前期沟通的VR de…...

React Router v6 改变页面Title
先说正事再闲聊 1、在路由表加个title字段 2、在index包裹路由 3、在App设置title 闲聊: 看到小黄波浪线了没 就是说默认不支持title字段了 出来的提示, 所以我本来是像下面这样搞的,就是感觉有点难维护,就还是用上面的方法了 …...

postman测试导入文件
01 上传文件参数 1.选择请求方式 选择post请求方式,输入请求地址 2.填写Headers Key:Content-Type ; Value:multipart/form-data 如下图 3.填写body 选择form-data,key选择file类型后value会出现按钮࿰…...

ZigBee学习(一)
文章目录 一、ZigBee介绍二、IEEE 802.15.42.1 物理层2.2 MAC层2.3 如何实现网络和设备寻址2.4 能量管理 三、ZigBee网络拓扑结构四、ZigBee配置参数 一、ZigBee介绍 ZigBee是一种基于IEEE 802.15.4标准的高级通信协议,它被设计用于低速率、低功耗和短距离无线通信&…...

Unity—配置lua环境变量+VSCode 搭建 Lua 开发环境
每日一句:保持须臾的浪漫,理想的喧嚣,平等的热情 Windows 11下配置lua环境变量 一、lua-5.4.4版本安装到本地电脑 链接:https://pan.baidu.com/s/14pAlOjhzz2_jmvpRZf9u6Q?pwdhd4s 提取码:hd4s 二、高级系统设置 此电…...
前端-云点播技术
一、简介 云点播(Cloud Video On Demand)是一种基于云计算平台提供的视频点播服务。这种服务允许用户在需要的时候按需观看视频内容,而无需等待下载完成。以下是一些关于云点播技术的常见特征和要点: 存储和管理: 云存…...

k8s---ingress对外服务(traefik)
目录 ingress的证书访问 traefik traefik的部署方式: deamonset deployment nginx-ingress与traefix-ingress相比较 nginx-ingress-controller ui访问 deployment部署 ingress的证书访问 ingress实现https代理访问: 需要证书和密钥 创建证书 密钥 secre…...

MySQL-SQL-DQL
DQL-介绍 DQL-语法 基本查询 1、查询多个字段 2、设置别名 3、去除重复记录 条件查询 1、语法 2、条件 聚合函数 1、介绍 2、常见的聚合函数 3、语法 分组查询 1、语法 2、where与having区别 排序查询 1、语法 2、排序方式 分页查询 1、语法 DQL-执行顺序...

Docker(十四)Etcd 项目
作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! etcd etcd 是 CoreOS 团队发起的一个管理配置信息和服务发现(Service Discovery)的项目,在这一章里面&a…...

EtherNet/IP开发:C++开发CIP源代码
① 介绍一下CIP CIP是一种考虑到自动化行业而设计的通用协议。然而,由于其开放性,它可以并且已经应用于更多的领域。CIP网络库包含若干卷: 第1卷介绍了适用于所有网络自适应的CIP的常见方面。本卷包含通用对象库和设备配置文件库࿰…...
【算法题】68. 文本左右对齐
题目 给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...

新版NANO下载烧录过程
一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...

【Linux】使用1Panel 面板让服务器定时自动执行任务
服务器就是一台24小时开机的主机,相比自己家中不定时开关机的主机更适合完成定时任务,例如下载资源、备份上传,或者登录某个网站执行一些操作,只需要编写 脚本,然后让服务器定时来执行这个脚本就可以。 有很多方法实现…...
【R语言编程——数据调用】
这里写自定义目录标题 可用库及数据集外部数据导入方法查看数据集信息 在R语言中,有多个库支持调用内置数据集或外部数据,包括studentdata等教学或示例数据集。以下是常见的库和方法: 可用库及数据集 openintro库 该库包含多个教学数据集&a…...