做公司网站都需要什么,博山信息港,网站建设小组,WordPress数据库添加管理员【官方框架地址】
yolov5框架#xff1a;https://github.com/ultralytics/yolov5
bytetrack框架#xff1a;https://github.com/ifzhang/ByteTrack
【算法介绍】
Yolov5与ByTetrack#xff1a;目标追踪的强大组合
Yolov5和ByTetrack是两种在目标追踪领域具有显著影响力…【官方框架地址】
yolov5框架https://github.com/ultralytics/yolov5
bytetrack框架https://github.com/ifzhang/ByteTrack
【算法介绍】
Yolov5与ByTetrack目标追踪的强大组合
Yolov5和ByTetrack是两种在目标追踪领域具有显著影响力的技术。当它们结合使用时可以显著提高目标追踪的准确性和实时性。
Yolov5是Yolov系列算法的最新版本它在目标检测方面具有出色的性能。相较于之前的版本Yolov5在精度和速度上都进行了优化使其成为实时目标检测的理想选择。通过结合ByTetrackYolov5可以更有效地应用于目标追踪任务。
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
#includealgorithmvoid bytetrack_update(const std::vectorDetection res, std::vectorObject 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::mapint, std::vectorint object_id_list;const std::vectorstd::string classNames util::loadNames(labels.txt);const int class_id 2;//只想追踪的目标YOLODetector detector {nullptr};cv::Mat frame;std::vectorDetection result;detector YOLODetector(yolov5s.onnx, false, cv::Size(640,640));std::vector double avg;cv::VideoCapture source(D:\\car.mp4);std::chrono::time_pointstd::chrono::high_resolution_clockprev_frame_time(std::chrono::high_resolution_clock::now());std::chrono::time_pointstd::chrono::high_resolution_clocknew_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::vectorObject obj;result detector.detect(frame, 0.5, 0.45);const int num result.size();obj.resize(num);bytetrack_update(result, obj, class_id);std::vectorSTrack output_stracks tracker.update(obj);for (size_t i 0; i output_stracks.size(); i){std::vectorfloat 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::durationdouble 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_source989ae2b903ea1b5acebbe2c4c4a635ee 【测试环境】 opencv4.7.0 onnxruntime1.12.0 vs2019 cmake3.24.3