【官方框架地址】
yolov11框架:https://github.com/ultralytics/ultralytics
bytetrack框架:https://github.com/ifzhang/ByteTrack
【算法介绍】
Yolov11与ByTetrack:目标追踪的强大组合
Yolov11和ByTetrack是两种在目标追踪领域具有显著影响力的技术。当它们结合使用时,可以显著提高目标追踪的准确性和实时性。
Yolov11是Yolov系列算法的最新版本,它在目标检测方面具有出色的性能。相较于之前的版本,Yolov11在精度和速度上都进行了优化,使其成为实时目标检测的理想选择。通过结合ByTetrack,Yolov11可以更有效地应用于目标追踪任务。
ByTetrack是一种基于轨迹匹配的目标追踪方法。它利用目标的运动信息和外观特征进行追踪,能够在复杂场景下实现稳定的目标追踪。ByTetrack的优势在于其强大的鲁棒性和适应性,即使在目标被遮挡或出现运动模糊的情况下,它仍能保持较高的追踪精度。
当Yolov11与ByTetrack结合使用时,Yolov5首先检测视频中的目标,并生成目标的初始位置和运动轨迹。然后,ByTetrack利用这些信息对目标进行精确追踪。这种结合方式既发挥了Yolov11的高检测精度,又利用了ByTetrack的高追踪精度,使得整体目标追踪效果显著提升。
综上所述,Yolov11与ByTetrack的结合为解决复杂场景下的目标追踪问题提供了新的解决方案。随着人工智能技术的不断进步,这种结合方式有望成为目标追踪领域的研究热点和发展趋势。通过进一步的研究和优化,我们可以期待这种组合在未来的目标追踪任务中发挥更大的潜力。
【效果展示】
【实现部分代码】
#include <iostream>
#include<opencv2/opencv.hpp>
#include<math.h>
#include "yolov11.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 = "./yolo11n.onnx";
Yolov11 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 capture failured!" << 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("demo", frame);
keyvalue = waitKey(1);
if (keyvalue == 113 || keyvalue == 81)
{
break;
}
}
cap.release();
}
【视频演示】
【测试环境】
opencv==4.8.0
onnxruntime==1.12.0
vs2019
cmake==3.24.3
【源码下载地址】