赞
踩
深度学习
专栏收录该内容
95 篇文章12 订阅
订阅专栏
【官方框架地址】
yolov8:
https://github.com/ultralytics/ultralytics
bytetrack:
https://github.com/ifzhang/ByteTrack
【算法介绍】
随着人工智能技术的不断发展,目标追踪已成为计算机视觉领域的重要研究方向。Yolov8和ByTetrack作为当前先进的算法,当它们结合使用时,能够显著提升目标追踪的准确性和实时性。
Yolov8,源于“You Only Look Once”的简称,是一款强大且高效的目标检测算法。它继承了Yolov3和Yolov4的优点,并在其基础上进行了改进,使得检测精度和速度都得到了显著提升。Yolov8特别适合于处理视频流中的目标追踪任务,因为它能够实时地、准确地检测出视频中的目标。
ByTetrack,全称为Background and Tracklet-based Object Tracking,是一种基于背景减除和轨迹匹配的目标追踪方法。它利用背景减除技术初步确定目标的运动轨迹,再结合轨迹匹配算法,对目标进行精确追踪。ByTetrack的优势在于,即使在复杂场景下,如目标遮挡、运动模糊等,它仍能保持较高的追踪精度。
当Yolov8与ByTetrack结合使用时,首先,Yolov8快速并准确地检测出视频中的目标;然后,ByTetrack利用Yolov8提供的信息,对目标进行精确追踪。这种结合方式既发挥了Yolov8的高检测精度,又利用了ByTetrack的高追踪精度,使得整体目标追踪效果更上一层楼。
综上所述,Yolov8与ByTetrack的结合为解决复杂场景下的目标追踪问题提供了新的思路和方法。在未来的人工智能技术发展中,这种结合方式有望成为目标追踪领域的研究热点。
【效果展示】
【实现部分代码】
- #include <iostream>
- #include<opencv2/opencv.hpp>
-
- #include<math.h>
- #include "yolov8.h"
- #include<time.h>
- #include <math.h>
- #include <time.h>
- #include <vector>
- #include <chrono>
- #include <float.h>
- #include <stdio.h>
- #include "BYTETracker.h"
-
- using namespace std;
- using namespace cv;
- using namespace dnn;
-
-
-
- int main() {
-
- string detect_model_path = "./models/yolov8n.onnx";
- Yolov8 detector;
- detector.ReadModel(detect_model_path,"labels.txt",false);
- vector<Object> objects;
- cv::VideoCapture cap("D:\\car.mp4");
- int img_w = cap.get(CAP_PROP_FRAME_WIDTH);
- int img_h = cap.get(CAP_PROP_FRAME_HEIGHT);
- int fps = cap.get(CAP_PROP_FPS);
- long nFrame = static_cast<long>(cap.get(CAP_PROP_FRAME_COUNT));
- if (!cap.isOpened())
- {
- std::cout << "open failed!" << std::endl;
- return -1;
- }
- Mat frame;
- BYTETracker tracker(fps, 30);
- int num_frames = 0;
- int keyvalue = 0;
- int total_ms = 1;
- while (true)
- {
- cap.read(frame);
- if (frame.empty())
- {
- std::cout << "read to end" << std::endl;
- break;
- }
- num_frames++;
- auto start = chrono::system_clock::now();
- objects.clear();
- detector.Detect(frame, objects);
- vector<STrack> output_stracks = tracker.update(objects);
- auto end = chrono::system_clock::now();
- total_ms = total_ms + chrono::duration_cast<chrono::microseconds>(end - start).count();
- for (int i = 0; i < output_stracks.size(); i++)
- {
- vector<float> tlwh = output_stracks[i].tlwh;
- bool vertical = tlwh[2] / tlwh[3] > 1.6;
- if (tlwh[2] * tlwh[3] > 20 && !vertical)
- {
- Scalar s = tracker.get_color(output_stracks[i].track_id);
- putText(frame, format("%d", output_stracks[i].track_id), Point(tlwh[0], tlwh[1] - 5),
- 0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
- rectangle(frame, Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), s, 2);
- }
- }
- putText(frame, format("frame: %d fps: %d num: %d", num_frames, num_frames * 1000000 / total_ms, (int)output_stracks.size()),
- Point(0, 30), 0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
-
- imshow("result", frame);
- keyvalue = waitKey(1);
- if (keyvalue == 113 || keyvalue == 81)
- {
- break;
- }
-
- }
- cap.release();
-
- }
-
-
【视频演示】
基于opencvC++版本yolov8-onnx和bytetrack追踪算法实现目标追踪_哔哩哔哩_bilibili
【测试环境】
vs2019
cmake==3.24.3
opencv==4.7.0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。