基于yolov5使用sort实现目标追踪,支持rk3568以及rk3588部署,提供python接口与c++接口
基于yolov5使用sort实现目标追踪支持rk3568以及rk3588部署提供python接口与c接口1下面给你一套完整的YOLOv5 SORT 目标追踪代码并适配RK3568/RK3588部署含 Python 与 C 接口说明。一、项目整体说明项目说明算法YOLOv5 目标检测 SORT 多目标追踪硬件瑞芯微 RK3568 / RK3588部署方式Python 接口RKNN Lite、C 接口RKNN C API功能视频/摄像头中车辆、行人等目标检测ID追踪二、Python 接口代码RKNN Lite 版本1. 依赖安装pipinstallrknn-toolkit-lite2 opencv-python numpy2. SORT 追踪器核心实现importnumpyasnpfromscipy.optimizeimportlinear_sum_assignmentfromfilterpy.kalmanimportKalmanFilter# 单个目标的卡尔曼滤波器classKalmanBoxTracker:def__init__(self,bbox):self.kfKalmanFilter(dim_x7,dim_z4)self.kf.Fnp.array([[1,0,0,0,1,0,0],[0,1,0,0,0,1,0],[0,0,1,0,0,0,1],[0,0,0,1,0,0,0],[0,0,0,0,1,0,0],[0,0,0,0,0,1,0],[0,0,0,0,0,0,1]])self.kf.Hnp.array([[1,0,0,0,0,0,0],[0,1,0,0,0,0,0],[0,0,1,0,0,0,0],[0,0,0,1,0,0,0]])self.kf.R[2:,2:]*10.self.kf.P[4:,4:]*1000.self.kf.P*10.self.kf.Q[-1,-1]*0.01self.kf.Q[4:,4:]*0.01self.kf.x[:4]self.convert_bbox_to_z(bbox)self.time_since_update0self.id-1self.hit_streak0defconvert_bbox_to_z(self,bbox):wbbox[2]-bbox[0]hbbox[3]-bbox[1]xbbox[0]w/2.ybbox[1]h/2.sw*h rw/hreturnnp.array([x,y,s,r]).reshape((4,1))defconvert_x_to_bbox(self,x):x,y,s,rx[0,0],x[1,0],x[2,0],x[3,0]wnp.sqrt(s*r)hs/wreturnnp.array([x-w/2.,y-h/2.,xw/2.,yh/2.]).reshape((4,))defupdate(self,bbox):self.time_since_update0self.hit_streak1self.kf.update(self.convert_bbox_to_z(bbox))defpredict(self):ifself.kf.x[6]self.kf.x[2]0:self.kf.x[6]0self.kf.predict()ifself.time_since_update0:self.hit_streak0self.time_since_update1returnself.convert_x_to_bbox(self.kf.x)classSORT:def__init__(self,max_age3,min_hits3):self.max_agemax_age self.min_hitsmin_hits self.trackers[]self.frame_count0self.next_id1defupdate(self,dets):self.frame_count1trks[]to_del[]ret[]# 预测所有轨迹fort,trkinenumerate(self.trackers):postrk.predict()trks.append(pos)iftrk.time_since_updateself.max_age:to_del.append(t)trksnp.array(trks)fortinreversed(to_del):self.trackers.pop(t)# 匈牙利匹配matched,unmatched_dets,unmatched_trksself.associate(dets,trks)# 更新匹配的轨迹forminmatched:self.trackers[m[1]].update(dets[m[0]])# 新增轨迹foriinunmatched_dets:trkKalmanBoxTracker(dets[i])trk.idself.next_id self.next_id1self.trackers.append(trk)# 输出结果fort,trkinenumerate(self.trackers):iftrk.time_since_update1andtrk.hit_streakself.min_hits:ret.append(np.concatenate((trk.convert_x_to_bbox(trk.kf.x),[trk.id])).reshape(1,-1))iflen(ret)0:returnnp.concatenate(ret)returnnp.empty((0,5))defassociate(self,dets,trks):iflen(dets)0:return[],[],list(range(len(trks)))iflen(trks)0:return[],list(range(len(dets))),[]iou_matrixnp.zeros((len(dets),len(trks)))ford,detinenumerate(dets):fort,trkinenumerate(trks):iou_matrix[d,t]self.iou(det,trk)matched_indiceslinear_sum_assignment(-iou_matrix)matched_indicesnp.array(list(zip(*matched_indices)))unmatched_dets[]unmatched_trks[]iflen(matched_indices)0:unmatched_detslist(range(len(dets)))unmatched_trkslist(range(len(trks)))else:unmatched_dets[dfordinrange(len(dets))ifdnotinmatched_indices[:,0]]unmatched_trks[tfortinrange(len(trks))iftnotinmatched_indices[:,1]]matches[]forminmatched_indices:ifiou_matrix[m[0],m[1]]0.3:unmatched_dets.append(m[0])unmatched_trks.append(m[1])else:matches.append(m.reshape(1,2))iflen(matches)0:matchesnp.empty((0,2),dtypeint)else:matchesnp.concatenate(matches,axis0)returnmatches,unmatched_dets,unmatched_trksdefiou(self,a,b):xx1max(a[0],b[0])yy1max(a[1],b[1])xx2min(a[2],b[2])yy2min(a[3],b[3])wmax(0.,xx2-xx1)hmax(0.,yy2-yy1)area_interw*h area_a(a[2]-a[0])*(a[3]-a[1])area_b(b[2]-b[0])*(b[3]-b[1])returnarea_inter/(area_aarea_b-area_inter)3. YOLOv5 SORT 主程序RKNN Liteimportcv2importnumpyasnpfromrknnlite.apiimportRKNNLitefromsortimportSORT# 上面的SORT代码# 配置RKNN_MODELyolov5s.rknnIMG_SIZE640CONF_THRESH0.25IOU_THRESH0.45# 初始化RKNNrknn_liteRKNNLite()retrknn_lite.load_rknn(RKNN_MODEL)retrknn_lite.init_runtime(core_maskRKNNLite.NPU_CORE_0)# 初始化追踪器trackerSORT(max_age3,min_hits3)defpreprocess(img):imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)imgcv2.resize(img,(IMG_SIZE,IMG_SIZE))imgnp.expand_dims(img,axis0)returnimgdefpostprocess(outputs,img0):# 这里简化处理实际需按YOLOv5后处理逻辑解析outputs# 示例outputs为[N,6]的检测结果格式为[x1,y1,x2,y2,conf,cls]dets[]# 实际实现中需根据RKNN的输出格式解析检测框# 这里用假数据示意returnnp.array(dets)capcv2.VideoCapture(0)# 或视频文件路径whilecap.isOpened():ret,framecap.read()ifnotret:breakimgpreprocess(frame)outputsrknn_lite.inference(inputs[img])detspostprocess(outputs,frame)# 追踪trackstracker.update(dets)# 画框IDfordintracks:x1,y1,x2,y2,track_idd cv2.rectangle(frame,(int(x1),int(y1)),(int(x2),int(y2)),(0,0,255),2)cv2.putText(frame,fID:{int(track_id)},(int(x1),int(y1)-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255),2)cv2.imshow(YOLOv5SORT,frame)ifcv2.waitKey(1)0xFFord(q):breakcap.release()cv2.destroyAllWindows()rknn_lite.release()三、C 接口说明RKNN C API 部署1. 环境依赖交叉编译工具链RK3568/RK3588 SDKOpenCVRKNN C API 库2. 关键流程#includerknn_api.h#includeopencv2/opencv.hpp// 1. 初始化RKNNrknn_context ctx;rknn_init(ctx,yolov5s.rknn,0,0,NULL);// 2. 预处理cv::Mat imgcv::imread(test.jpg);cv::resize(img,img,cv::Size(640,640));// ...// 3. 推理rknn_input inputs[1];rknn_output outputs[1];// 设置inputsrknn_run(ctx,NULL);rknn_outputs_get(ctx,1,outputs,NULL);// 4. 后处理SORT追踪// 解析outputs调用SORT的C实现// ...// 5. 释放资源rknn_destroy(ctx);注C 完整代码需基于 RKNN SDK 示例改造并移植 SORT 算法卡尔曼滤波匈牙利匹配可参考官方 yolov5 示例。四、RK3568/RK3588 部署要点模型转换使用rknn-toolkit2将 PyTorch/ONNX 版 YOLOv5 转换为.rknn格式命令示例python-mrknn.api.converter yolov5s.onnx yolov5s.rknn--platformrk3588性能优化使用core_mask指定 NPU 核心预处理/后处理尽量用 NEON 或 OpenCV 硬件加速降低推理分辨率如 416x416提升帧率视频流处理使用cv2.VideoCapture读取摄像头/视频多线程一帧推理一帧预处理避免阻塞五、补充说明Python 版代码可直接在 RK3568/RK3588 的 Linux 系统上运行需安装rknn-toolkit-lite2C 版适合追求极致性能的场景可参考瑞芯微官方 SDK 示例改造SORT 算法中max_age、min_hits、IOU_THRESH可根据场景调整

相关新闻

具身智能视觉后门攻击:BEAT框架原理、威胁与防御策略

具身智能视觉后门攻击:BEAT框架原理、威胁与防御策略

1. 项目概述:当具身智能的“眼睛”被植入后门 最近在具身智能和视觉-语言大模型(MLLM)的圈子里,一个名为BEAT的框架引起了不小的讨论。简单来说,它揭示了一个令人警醒的事实:我们寄予厚望、能够理解世界并执…

2026/9/30 16:55:28 阅读更多 →
Windows 11 CPU调度优化:低端设备性能提升指南

Windows 11 CPU调度优化:低端设备性能提升指南

1. Windows 11的CPU调度机制解析 Windows 11引入了一套全新的处理器调度机制,这套系统会根据硬件配置自动调整资源分配策略。在搭载现代多核处理器的设备上,系统会优先将前台任务分配给性能核心(P-core),而将后台任务分…

2026/10/8 11:21:28 阅读更多 →
人形机器人Digit:如何用物理AI与强化学习破解仓库劳动力短缺难题

人形机器人Digit:如何用物理AI与强化学习破解仓库劳动力短缺难题

1. 项目概述:当人形机器人走进仓库,劳动力短缺的解法变了 最近在关注制造业和物流行业的朋友,可能都绕不开一个词:劳动力短缺。这不是什么新话题,, 但解决它的方式正在发生根本性的变化。过去我们谈自动化&…

2026/10/1 3:55:17 阅读更多 →

最新新闻

Unity2D弹球游戏可运行完整项目:物理引擎+碰撞+UI闭环实现

Unity2D弹球游戏可运行完整项目:物理引擎+碰撞+UI闭环实现

简介:这是一份面向Unity初学者与2D游戏开发入门者的可运行完整项目,聚焦弹球游戏核心逻辑实现,帮助开发者掌握不依赖物理引擎的2D运动控制、碰撞检测、挡板交互、得分系统及UI状态管理等关键技能。资源包含432个文件,以128个info配…

2026/10/14 14:38:54 阅读更多 →
零基础网页制作入门:HTML与CSS实战指南

零基础网页制作入门:HTML与CSS实战指南

1. 项目概述与核心思路拆解 1.1 这个项目到底在解决什么问题 先说结论:创建简单网页教学这个方向,本质上是帮那些完全不了解前端的人,用最短的时间建立起对网页制作的基本认知和动手能力。很多人觉得做网页是程序员的专属技能,一…

2026/10/14 14:38:54 阅读更多 →
Kubernetes CronJob执行延迟排查:从控制器到节点侧的关键链路与优化

Kubernetes CronJob执行延迟排查:从控制器到节点侧的关键链路与优化

告警一夜之间刷了十几条:原本应该准点 1:00 执行的 CronJob,实际跑到 1:37 才从 Pod 里打出第一批日志。我盯着“执行延迟”三个字想了很久,最初以为是容器时间不同步,后来才发现问题根本不在 CronJob 控制器,而在调度…

2026/10/14 14:38:54 阅读更多 →
MySQL SELECT与SHOW实战:从基础查询到性能排查的完整指南

MySQL SELECT与SHOW实战:从基础查询到性能排查的完整指南

从接触数据库开始,大多数人的第一条SQL都是SELECT,而SHOW往往是那个“我知道它存在,但很少深入研究”的兄弟命令。这个主题虽然叫“简单检索”,但SELECT和SHOW几乎撑起了日常数据库操作的半边天:前者负责从一张或多张表…

2026/10/14 14:38:54 阅读更多 →
主成分分析PCA从原理到实战:高维数据降维的核心技术解析

主成分分析PCA从原理到实战:高维数据降维的核心技术解析

很多人在刚开始接触数据分析时,面对几十个甚至上百个特征,第一反应往往是茫然。画出来的散点图矩阵密密麻麻,算出来的相关系数表让人眼花缭乱,跑出来的模型又总被多重共线性拖后腿。这时候,主成分分析(PCA&…

2026/10/14 14:38:54 阅读更多 →
Pandas线性插值实战:空气质量数据异常值与缺失值处理

Pandas线性插值实战:空气质量数据异常值与缺失值处理

这段时间帮某个环境监测项目处理城市空气质量数据,遇到最多的不是模型效果差,而是数据本身的问题。一套PM2.5、PM10、NO2、SO2浓度数据拿过来,缺失值、异常值、重复记录混在一起,直接建模结果根本没法看。把这些数据清洗干净&…

2026/10/14 14:37:53 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →