当前位置: 首页 > news >正文

[C++]使用yolov10的onnx模型结合onnxruntime和bytetrack实现目标追踪

【官方框架地址】 

yolov10yolov10框架:https://github.com/THU-MIG/yolov10

bytetrack框架:https://github.com/ifzhang/ByteTrack

【算法介绍】

Yolov10与ByTetrack:目标追踪的强大组合

Yolov10和ByTetrack是两种在目标追踪领域具有显著影响力的技术。当它们结合使用时,可以显著提高目标追踪的准确性和实时性。

Yolov10是Yolov系列算法的最新版本,它在目标检测方面具有出色的性能。相较于之前的版本,Yolov10在精度和速度上都进行了优化,使其成为实时目标检测的理想选择。通过结合ByTetrack,Yolov10可以更有效地应用于目标追踪任务。

ByTetrack是一种基于轨迹匹配的目标追踪方法。它利用目标的运动信息和外观特征进行追踪,能够在复杂场景下实现稳定的目标追踪。ByTetrack的优势在于其强大的鲁棒性和适应性,即使在目标被遮挡或出现运动模糊的情况下,它仍能保持较高的追踪精度。

当Yolov10与ByTetrack结合使用时,Yolov5首先检测视频中的目标,并生成目标的初始位置和运动轨迹。然后,ByTetrack利用这些信息对目标进行精确追踪。这种结合方式既发挥了Yolov10的高检测精度,又利用了ByTetrack的高追踪精度,使得整体目标追踪效果显著提升。

综上所述,Yolov10与ByTetrack的结合为解决复杂场景下的目标追踪问题提供了新的解决方案。随着人工智能技术的不断进步,这种结合方式有望成为目标追踪领域的研究热点和发展趋势。通过进一步的研究和优化,我们可以期待这种组合在未来的目标追踪任务中发挥更大的潜力。

【效果展示】

【实现部分代码】

#include "YOlov10Manager.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include "BYTETracker.h"
#include <fstream>
#include <iomanip>
#include <time.h>
#include <chrono>
#include "util.h"
#include <map>
#include<vector>
#include<algorithm>using namespace std;
using namespace cv;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].class_id != class_id){ continue; }obj[i].label = res[i].class_id;obj[i].rect.x = res[i].bbox.x;obj[i].rect.y = res[i].bbox.y;obj[i].rect.height = res[i].bbox.height;obj[i].rect.width = res[i].bbox.width;obj[i].prob = res[i].confidence;}catch(const std::exception& e){std::cerr << e.what() << '\n';}        }};
int main(int argc, char const *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;//只想追踪的目标std::string model_path="yolov10n.onnx";Yolov10Manager detector(model_path);cv::Mat frame;std::vector <double> avg;cv::VideoCapture cap("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  =  cap.get(cv::CAP_PROP_FRAME_WIDTH);int frame_height =  cap.get(cv::CAP_PROP_FRAME_HEIGHT);int fpsvideo = cap.get(cv::CAP_PROP_FPS);cv::namedWindow("Camera", cv::WINDOW_NORMAL);BYTETracker tracker(fpsvideo, 30);while (cap.isOpened()) {cap >> frame;if (frame.empty()){break;}std::vector<Object> obj;auto results = detector.Inference(frame);const int num = results.size();obj.resize(num);bytetrack_update(results, 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;}}cap.release();cv::destroyAllWindows();return 0;
}

【视频演示】
基于opencv和onnxruntime的C++版本yolov10-onnx和bytetrack追踪算法实现目标追踪_哔哩哔哩_bilibili测试环境:vs2019cmake==3.24.3opencv==4.7.0onnxruntime==1.12.0更多信息参考博文:, 视频播放量 2、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:AI换脸真变态,绅士必备的一键启动包!,使用纯opencv部署yolov8目标检测模型onnx,基于yolov8+bytetrack实现目标追踪视频演示,易语言部署yolox的onnx模型,C语言、C++和C#的区别竟是这样,看完我瞬间懂了!,基于yolov8官方目标追踪botsort和bytetrack源码开发视频演示,基于C++版本yolov5-onnx和bytetrack追踪算法实现目标追踪,使用C++部署yolov8的onnx和bytetrack实现目标追踪,将yolov8封装成一个类几行代码完成语义分割任务,使用C#的winform部署yolov8的onnx实例分割模型icon-default.png?t=N7T8https://www.bilibili.com/video/BV1rZ421M77T/
【测试环境】
 opencv==4.7.0 onnxruntime==1.12.0 vs2019 cmake==3.24.3 

 【源码下载地址】

https://download.csdn.net/download/FL1623863129/89442051

相关文章:

  • 1. NAS和SAN存储
  • 《大数据分析》期末考试整理
  • Flink作业执行之 2.算子 StreamOperator
  • 云计算【第一阶段(14)】Linux的目录和结构
  • YASKAWA机器人HW1171921-B电缆维修
  • 使用itextPDF实现PDF电子公章工具类
  • Java Swing库学习
  • JavaScript算法实现dfs查找省市区路径
  • ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的侧信道抵御
  • PostgreSQL 数据类型详细说明
  • 【EtherCAT电机板】CiA402增加cst模式
  • 反向传播算法
  • @AliasFor 使用
  • DenseNet完成Cifer10任务的效果验证
  • MFC四种方法编写多线程
  • 深入了解以太坊
  • $translatePartialLoader加载失败及解决方式
  • [数据结构]链表的实现在PHP中
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • emacs初体验
  • golang中接口赋值与方法集
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java,console输出实时的转向GUI textbox
  • Koa2 之文件上传下载
  • mac修复ab及siege安装
  • Python爬虫--- 1.3 BS4库的解析器
  • SpringBoot几种定时任务的实现方式
  • unity如何实现一个固定宽度的orthagraphic相机
  • 从0实现一个tiny react(三)生命周期
  • 对象引论
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 入门级的git使用指北
  • 线上 python http server profile 实践
  • 新书推荐|Windows黑客编程技术详解
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 中文输入法与React文本输入框的问题与解决方案
  • postgresql行列转换函数
  • ​​​​​​​​​​​​​​Γ函数
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C++20) consteval立即函数
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转)编辑寄语:因为爱心,所以美丽
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理出现中文乱码的情况
  • .NET 5种线程安全集合