构建一个实时的运动传感器
该项目展示了一套端到端的实时边缘视觉处理流程,结合了目标检测、多目标跟踪和基于像素的运动估计技术,仅在物体实际移动时可靠地捕捉图像(或录制视频),且可选择性地仅记录用户自定义区域内的动态内容。
在树莓派AI摄像头中,使用NanoDet目标检测模型、BYTETracker实现稳定的目标识别,并结合一个基于时间像素变化计算运动边界框的运动模块,该应用将“检测结果”与“运动”进行匹配,以决定何时触发录像。最终得到的是一种实用的运动传感器,其性能优于原始帧差法,且比持续录像更高效。
故事
基于像素差异的经典运动传感器容易产生噪声:光照变化、阴影和相机噪点都可能触发误报。另一方面,纯粹的物体检测可能会持续“开启”,即使物体静止时也会保存帧数。
该项目融合了两种方法:
•Motion 会告诉你哪些像素在变化(即有物体在移动)。
•检测与追踪可告知您物体的类型,并在时间上保持稳定的识别标识。
•匹配逻辑确认检测到的对象也在运动,只有在该情况下才会触发捕获。
•区域功能可让您将触发器限制在特定区域(例如,您的门口、走廊或装卸区)。
最终成果是一款轻量级边缘应用,仅在需要时捕获证据(图像)或录制片段(视频),从而减少存储空间、降低误报率,并使事件审核更加便捷。
架构概览
该应用程序由六个主要部分组成:
•模型推理(目标检测)在每一帧上运行NanoDet,以生成边界框、类别ID和置信度分数。
•检测过滤通过应用置信度阈值和可选的类别过滤器(例如,仅保留“人”)来减少噪声。
•对象跟踪(BYTETracker)为跨帧的检测结果分配持久性ID,使系统能够对“同一物体”进行时间上的推理。
•运动估计(像素变化 → 运动框)通过分析帧间像素变化来计算运动边界框。
•区域门禁(可选)将检测/运动检查限制在从JSON文件加载的用户自定义多边形区域内。
•匹配 + 触发逻辑:将跟踪的检测结果与运动框进行匹配,当条件满足时触发图像采集(或视频录制)。
1. 使用 NanoDet 进行目标检测
该应用将NanoDet模型部署到AI摄像头,并从每一帧中读取检测结果:
检测结果按置信度进行筛选:
并(在此示例中)过滤为单一类别:
您可以根据使用情况移除或扩展此筛选器,以监控多个班级。
2. 使用BYTETracker进行多目标跟踪
BYTETracker 模块通过分配持久的跟踪 ID 来稳定检测结果,使其随时间保持一致。
这一点很重要,因为运动触发通常需要时间逻辑(“连续N帧移动”、“连续N帧未移动”),而当对象具有稳定ID时,这种逻辑会容易得多。
3. 基于像素变化的运动检测
运动模块通过观察像素随时间的变化来计算运动边界框:
这会产生边界框,表示运动发生的位置,而与物体类别无关。
4. 按区域筛选(可选)
区域从JSON文件中加载(手动创建/编辑或通过点选择工具生成):
然后可以将检测框和运动框筛选为仅包含在区域内内的部分:
这非常适合“仅在门附近触发”或“仅在装载区域内触发”的场景。
5. 匹配检测与运动(谁在移动?)
关键思路是确认检测到/跟踪的对象与运动区域重叠。匹配器模块执行此关联:
现在 motion_detections 表示被检测到且正在移动的对象(可选地在区域内移动)。
6. 触发逻辑:何时拍摄图像
check() 函数实现了触发规则。简而言之,当以下情况发生时即可触发:
未检测到运动,且运动在阈值处保持恒定(即“仅运动”回退模式),或一个跟踪对象被匹配为持续移动足够长时间(例如,运行时间 > 10 帧),并且相同的ID不会重复触发,除非离开或重置。
当触发器被激活时,应用程序会保存一帧:
这会在./images目录下生成带时间戳的图像证据记录。
应用摘要
•检测:NanoDet 边框 + 类别ID
•追踪:BYTETracker 分配稳定 ID
•运动:像素变化的运动框
•区域门禁:通过JSON区域进行可选限制
•匹配:确认检测到的对象正在移动
•输出:带注释的实时视图 + 保存的图像(或在其他应用中录制的视频)
亲测体验
1. 定义运动区域(JSON)
要更改监控区域,请编辑 example.json,或直接使用两种工具之一来编辑点位:
•在应用配置工具中
•点选择工具
2. 运行图像采集版本
使用 uv(从 pyproject.toml 安装依赖并运行应用程序):
参数:
--json-file(必需):包含区域多边形的JSON文件
--area(可选):在流上叠加显示区域
3. 运行视频录制版本
如果您更倾向于录制视频而不是拍摄照片:
本文编译自hackster.io





