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

[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

http://www.lryc.cn/news/286014.html

相关文章:

  • i2c接口验证
  • 1、Pandas 数据结构:从 Series 到 DataFrame
  • MySQL函数—字符串函数
  • PLC从HTTP服务端获取JSON文件,解析数据到寄存器
  • LeetCode 46. 全排列
  • NVMe TCG安全数据存储简介
  • Linux命令-ab命令(Apache服务器的性能测试工具 )
  • 蓝桥杯java基础
  • Unity3d引擎中使用AIGC生成的360全景图(天空盒)
  • React Router v6 改变页面Title
  • postman测试导入文件
  • ZigBee学习(一)
  • Unity—配置lua环境变量+VSCode 搭建 Lua 开发环境
  • 前端-云点播技术
  • k8s---ingress对外服务(traefik)
  • MySQL-SQL-DQL
  • Docker(十四)Etcd 项目
  • EtherNet/IP开发:C++开发CIP源代码
  • 【算法题】68. 文本左右对齐
  • PHP 调用 e 签宝接口签名指南
  • 穿越Flink的时间隧道:解锁实时数据之窗,掌握流处理之巅
  • 服务器与Ajax
  • Electron项目架构方案心得
  • Java中创建List接口、ArrayList类和LinkedList类的常用方法(一)
  • 顶级开源社区开发者体验实践分享
  • STM32之RTC实时时钟
  • Java JVM 堆、栈、方法区详解
  • Oracle篇—分区表和分区索引的介绍和分类(第一篇,总共五篇)
  • Vue中的模式和环境变量
  • 用ChatGPT教学、科研!亚利桑那州立大学与OpenAI合作