目标下一秒会往哪里走?我用 YOLO + ByteTrack 做了轨迹预测

发布时间:2026/10/14 5:20:52

目标下一秒会往哪里走?我用 YOLO + ByteTrack 做了轨迹预测 项目地址yolo-object-detection-lab:基于 FastAPI 与 Ultralytics YOLO 的图像目标检测实验项目 - AtomGit前面几篇里这个项目已经陆续加入了目标检测、目标跟踪、过线统计、ROI 区域分析、轨迹热力图、多 ROI 流转分析、速度估计以及四点透视标定。做到这里以后其实已经能够回答很多问题目标是谁目标在哪里目标走过哪里目标进入了哪个区域目标速度大概有多快但还有一个更有意思的问题它接下来会往哪里走所以这一次我继续在现有 YOLO ByteTrack 的基础上加入了Trajectory Prediction也就是基于目标的历史运动轨迹对未来 13 秒的位置进行预测。这次实现了两种方法Constant Velocity和Kalman Prediction并且继续支持前面已经做好的 Perspective 4-Point 透视标定。一、为什么要做轨迹预测传统目标检测只能告诉我这一帧目标在哪里。加入 ByteTrack 后可以进一步知道连续多帧中的这个目标是不是同一个目标。于是可以得到Track ID历史位置运动方向运动速度完整轨迹再往前一步就可以根据过去一段时间的运动状态推测它未来可能出现的位置。整个思路变成YOLO↓ByteTrack↓历史轨迹↓运动状态估计↓未来轨迹预测这也是这次 Trajectory Prediction 的核心。二、轨迹数据从哪里来这次依然没有重新设计一套目标位置而是继续沿用项目里一直使用的Bottom-center Anchor也就是目标检测框底边中心点。计算方式anchor_x (x1 x2) / 2anchor_y y2为什么不用 Bounding Box 中心因为对于道路视频来说Bottom-center 更接近目标与地面的实际接触位置。例如行人更接近脚的位置车辆更接近车轮和道路接触的位置所以它更适合Line CrossingROIHeatmapSpeed EstimationTrajectory Prediction整个项目的空间分析逻辑也能保持统一。三、每个 Track 都保存一段历史轨迹对每一个 ByteTrack 的 Track ID我会保存最近 N 个轨迹点。这次测试设置History Length10也就是说每个目标最多保留最近 10 个有效位置。每个历史点至少包含时间戳x 坐标y 坐标于是一个目标的历史轨迹可以理解为P1 → P2 → P3 → P4 → ... → P10有了这些历史点以后就可以估算运动方向速度变化轨迹稳定程度然后进一步预测未来位置。四、第一种方法Constant Velocity第一种方法是最简单、也最容易解释的Constant Velocity也就是匀速模型。核心假设是目标接下来短时间内会继续保持最近的运动方向和速度。程序会根据最近的历史轨迹估计vx Δx / Δtvy Δy / Δt然后预测未来某个时刻的位置future_x current_x vx × tfuture_y current_y vy × t这次不是只预测一个终点而是生成一整条未来轨迹。比如Prediction Horizon2 sPrediction Steps10意味着在未来 2 秒内生成 10 个预测位置点。于是就能在视频中画出一条未来预测轨迹线五、为什么不能只预测一个点如果只预测“2 秒后会在哪里”其实不太直观。因为我更想知道的是它未来的运动趋势是什么所以这次预测的是一系列点。例如当前点↓0.2 s↓0.4 s↓0.6 s↓...↓2.0 s这样 Result Video 里看到的就不是一个孤立圆点而是一条完整的未来轨迹。图中的历史轨迹和预测轨迹采用不同样式显示避免把真实轨迹和未来预测混在一起。六、Constant Velocity 真实测试结果这次仍然使用之前一直测试的同一段道路视频。视频信息Resolution1920×1080FPS29.97Total Frames962Duration约 32.10 s预测参数Prediction MethodConstant VelocityPrediction Horizon2 sPrediction Steps10History Length10Confidence Threshold0.50Frame IntervalEvery Frame同时开启Perspective 4-Point标定区域继续使用Width6 mHeight12 m最终完整处理962 / 962 Frames100%结果Unique Tracks37Tracks With Prediction34Average History Length8.1Elapsed84.0 sCalibration Modeperspective七、为什么 37 个 Track 只有 34 个生成预测这个结果是正常的。Constant Velocity 需要至少有足够的历史位置和有效时间差才能计算速度。如果某个 Track出现时间太短历史点不足有效 Δt 不足轨迹不连续就不会强行生成预测。所以这次37 Unique Tracks其中34 Tracks With Prediction没有预测的 3 个目标并不是程序出错而是轨迹历史不足以支持可靠的匀速预测。八、第二种方法Kalman Prediction第二种方法就是Kalman Filter这次使用的是一个简单的二维匀速状态模型。状态可以写成[x, y, vx, vy]其中x、y 表示当前位置vx、vy 表示当前速度每一帧主要做两件事Predict↓UpdatePredict 负责根据上一时刻的运动状态预测当前位置。Update 则利用当前实际检测到的位置对预测进行修正。这样相比直接计算平均速度Kalman 能不断融合历史运动状态当前观测位置从而维持一个连续的状态估计。九、Kalman 并没有直接使用 ByteTrack 内部状态这里有一个设计细节。虽然 ByteTrack 本身内部也包含运动模型但这次没有直接去读取或修改 ByteTrack 的内部 Kalman 状态。而是单独维护Trajectory Prediction State这样可以避免影响原本的目标跟踪逻辑。整个结构变成YOLO↓ByteTrack↓Track ID↓独立 Prediction State↓Kalman Predict / Update↓Future Trajectory这样 Tracking 和 Prediction 是解耦的。十、Kalman 真实测试结果为了和 Constant Velocity 对比我保持了基本相同的参数只把Prediction Method切换成Kalman其余仍然是Prediction Horizon2 sPrediction Steps10History Length10Confidence0.50Every FramePerspective CalibrationON这次最终结果962 / 962 Frames100%Unique Tracks37Tracks With Prediction37Average History Length8.1Elapsed53.8 sCalibration Modeperspective也就是说37 个 Track 全部生成了预测轨迹。十一、Constant Velocity 和 Kalman 实测对比这次两组真实实验结果如下指标Constant VelocityKalmanTotal Frames962962Unique Tracks3737Tracks With Prediction3437Average History Length8.18.1Prediction Horizon2 s2 sCalibrationperspectiveperspectiveProcessing Time84.0 s53.8 s从这次实验结果来看Constant Velocity34 / 37 生成预测Kalman37 / 37 生成预测Kalman 在这次数据中覆盖率更高。不过这里要注意不能因为这一轮 Kalman 用时更短就直接得出 Kalman 一定比 Constant Velocity 更快。整体处理时间还受到YOLO 推理视频编码磁盘 IO系统负载当前运行环境等因素影响。所以更准确的表述是在本次相同视频实验中Kalman 版本的总处理时间更短。十二、分类统计结果Kalman 这一轮中bicycle3 个 Unique Track3 个生成预测car18 个 Unique Track18 个生成预测person16 个 Unique Track16 个生成预测也就是说三类目标全部完成预测。这说明预测逻辑并不是只针对车辆而是对 ByteTrack 产生的不同类别 Track 都可以工作。十三、Perspective Calibration 也参与了预测这一版还有一个比较有意思的地方Trajectory Prediction 可以继续使用前面 Speed Estimation 已经实现的Perspective 4-Point Calibration也就是原图目标位置↓Homography↓Birds-eye Plane↓进行轨迹预测↓Inverse Homography↓映射回原视频这样预测可以先在更适合道路运动分析的鸟瞰平面中完成再映射回原始图像显示。这次真实实验里Prediction Summary 已经明确显示Calibration Modeperspective说明这不是单纯前端画了一个标定框而是真正进入了预测流程。十四、为什么还要映射回原图最终用户看的还是原始视频。所以即使预测是在 Birds-eye Plane 中完成的最后还是需要把预测位置映射回原图。这也是为什么 Track Prediction Table 里的Predicted End XPredicted End Y仍然可以理解为最终原图中的预测终点坐标。这样就可以直接在视频上画未来轨迹预测终点Track ID而不是只能看一张单独的鸟瞰图。十五、Result Video 里到底显示了什么最终 Result Video 中同时包含Bounding BoxTrack IDClass真实历史轨迹未来预测轨迹预测终点Prediction MethodPrediction Horizon这时候就可以非常直观地看到目标之前怎么走↓现在在哪里↓未来两秒可能往哪里走这比单纯在表格里看坐标直观很多。十六、Prediction Horizon 是什么意思这次设置的是Prediction Horizon2 s也就是说程序预测的是目标未来 2 秒内的运动趋势。同时Prediction Steps10所以会把未来 2 秒分成多个预测点。需要注意Prediction Horizon 越长并不代表结果越好。因为随着预测时间变长不确定性也会越来越大。例如车辆可能刹车转弯变道行人也可能突然停下改变方向所以这种简单运动模型更适合短时间轨迹预测而不是预测十几秒之后的位置。十七、Reliability 不是概率这次还加入了Reliability结果分为LowMediumHigh但这里一定要说明Reliability 不是神经网络输出的概率。它只是一个启发式指标。主要参考历史轨迹点数量最近运动速度稳定程度轨迹波动情况例如历史点很少速度变化很大就更容易得到 Low。反过来历史点较多运动比较稳定则可能得到 Medium 或 High。所以High Reliability并不代表“预测有 90% 概率正确”。它只是帮助判断当前这条 Track 的历史状态是否适合进行短时运动预测。十八、Current Speed 为什么还是 px/s在 Track Prediction Table 中还可以看到Current Speed目前这里仍然主要作为图像空间中的辅助运动量使用。所以不要直接把它解释成真实 m/s真实 km/hTrajectory Prediction 的重点是未来位置和运动趋势而不是重新做一遍 Speed Estimation。如果需要真实世界速度还是应该使用之前已经完成的Perspective Speed Estimation两者关注的目标不同。十九、轨迹预测并不等于“知道未来”这点也需要说清楚。当前实现基于的是Constant VelocityKalman Constant Velocity Model它们本质上都是根据过去的运动状态去推测短时间未来运动趋势它并不知道红绿灯道路规则驾驶员意图行人意图障碍物车辆转向灯所以如果一个目标突然转弯停车变道模型之前的预测轨迹就可能失效。因此这里更准确的说法是短时运动轨迹预测而不是精准预测目标未来行为。二十、这次测试增加到 511 个Trajectory Prediction 完成以后511 pytest passed相比之前的428新增了83 个后端测试。前端308 assertions passed相比之前288新增了20 个前端断言。覆盖内容包括Bottom-centerHistory BufferConstant VelocityStationary TargetHorizontal MotionVertical MotionPrediction HorizonPrediction StepsKalman InitializationKalman Predict / UpdateInsufficient HistoryZero dtReliabilityPrediction ClippingZero TracksExportStale ResetDetector Failure而前面已经完成的其他模式也全部保留。二十一、开发分支这次开发使用Branchfeat/trajectory-prediction最终 commit2a5a45366af58139eeb5360577bd323377538e12主要新增app/trajectory_prediction.pystatic/prediction.jstests/test_trajectory.py同时对app/main.pyapp/schemas.pystatic/index.htmlstatic/app.jstests/test_frontend_logic.js进行了对应集成。二十二、项目已经从“检测”走到了“预测”一路做到现在这个项目的能力已经从最开始的Single Image Detection逐步发展成Single Image↓Batch Images↓Video Detection↓ByteTrack Tracking↓Line Crossing↓ROI Analysis↓Trajectory Heatmap↓Multi-ROI Flow↓Speed Estimation↓Perspective Calibration↓Trajectory Prediction整个过程已经不只是“YOLO 能不能识别一个目标”而是在逐渐回答它是谁它在哪里它从哪里来它去了哪里它在区域里待了多久它移动得有多快它接下来可能往哪里走总结这次真实实验中我分别跑了 Constant Velocity 和 Kalman 两种预测方式。Constant Velocity962 Frames37 Unique Tracks34 Tracks With PredictionAverage History Length8.1Prediction Horizon2 sElapsed84.0 sKalman962 Frames37 Unique Tracks37 Tracks With PredictionAverage History Length8.1Prediction Horizon2 sElapsed53.8 s同时启用了Perspective 4-Point Calibration最终完整流程已经变成YOLO↓ByteTrack↓Bottom-center Anchor↓History Buffer↓Perspective Homography↓Constant Velocity / Kalman↓Future Trajectory↓Inverse Homography↓Result Video相比之前只能回答目标现在在哪里这一次已经可以进一步尝试回答目标未来两秒大概会往哪里走当然这仍然属于基于运动状态的短时预测并不能理解真正的驾驶意图或行人意图。但对于一个从 YOLO 检测项目逐步扩展出来的视频行为分析系统来说这一步已经让它从Detection开始走向Motion Understanding项目地址yolo-object-detection-lab:基于 FastAPI 与 Ultralytics YOLO 的图像目标检测实验项目 - AtomGit下一步如果继续做我准备在现有 Trajectory Prediction 上加入Collision Risk / TTC Analysis也就是利用两个目标的相对运动状态进一步判断它们会不会发生潜在冲突以及大概还有多久接近危险区域。
延伸阅读

更多相关文章

2026/10/14 5:20:52

AI招聘落地五大断点与30天验收方法论

1. 这不是AI的问题,是“人怎么用AI”的问题“AI招聘系统上线三个月没效果”——这句话我过去一年在三场不同行业的HR数字化闭门会上都听到过。不是某一家公司,而是普遍现象:采购流程走完、SaaS合同签了、账号开通了、培训也做了,结…

2026/10/14 5:20:52

工业检测软件如何引入AI Agent:从架构到落地全攻略

这两年做工业检测软件开发的朋友应该都有同感:软件功能本身很久没有质变了。定位、测量、缺陷分类这些算子库越来越全,可真正到了产线上,调试一套检测流程依旧靠老师傅一点一点试参数、标缺陷、调阈值。我去年参与了一个模拟项目X&#xff0c…

2026/10/14 5:15:51

ponytail项目解析:从术语 ambiguity 到技术定位

我无法根据当前输入生成符合要求的博文。原因如下:项目标题为“ponytail”,这是一个英文单词,直译为“马尾辫”,属于常见发型术语;项目正文为空;关键词为空;摘要描述为空;所谓“相关…

2026/10/14 6:21:19

OpenClaw API配置实战:从入门到自动化工作流搭建

最近不少朋友在问,网上说的那个开源工具 OpenClaw 到底怎么配置 API 才能免费跑起来。我一开始也以为这东西和那些需要折腾很久才能用的服务一样,结果实际看了一下,发现它的配置思路其实很清晰,门槛比想象中低不少。这篇就把我自己…

2026/10/14 6:21:19

IDEA创建Spring Boot项目:五种方式详解与选型指南

用 IntelliJ IDEA 创建 Spring Boot 项目,看起来是件小事,但我在带新人的时候发现,恰恰是这一步,能把入门者分岔成两类:一类顺利跑起了项目,另一类卡在“怎么生成骨架”上大半天。严格说,IDEA 里…

2026/10/14 6:21:19

Claude Skills 从零构建指南:按需加载机制与实战技巧

1. 从零理解 Claude Skills 到底是什么1.1 一个被名字耽误的能力扩展机制第一次看到 Claude Skills 这个词,很多人会以为它又是一个新的模型版本或者某个付费功能。其实不是。Claude Skills 本质上是一套让模型学会“按需加载专业知识包”的机制。你可以把它想象成给…

2026/10/14 6:21:19

NAT实战指南:原理、四种转换类型与配置排错

搞网络的人,迟早都会撞上NAT这个词。不管是刚入门的学生,还是在机房摸爬滚打多年的老手,只要你的网络需要上网、需要对外开放服务、需要做地址规划,就一定绕不开网络地址转换这个基础技术。数据通信课程里NAT通常作为核心章节出现…

2026/10/14 6:21:19

深入理解反序列化:从JSON到对象的底层机制与Jackson实践

1. 从一次线上事故说起:反序列化不是“new 一个对象”那么简单两年前我接手过一个内部订单系统的维护,系统本身不大,但有一个接口隔三差五地报错。报错信息长这样:com.fasterxml.jackson.databind.exc.InvalidDefinitionException…

2026/10/14 6:16:18

软件配置管理实战:从版本混乱到基线可控,保障发布可靠

你有没有经历过这样的项目:白天一切正常,夜里一上线就崩,查了一整晚,最后发现只是某个配置文件被改来改去,谁都不知道哪个才是该上线的版本。如果有,那说明你们缺的不是代码质量门禁,而是软件配…

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/13 17:09:18

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

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

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

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑