Skip to content

Latest commit

 

History

History
183 lines (154 loc) · 8.83 KB

File metadata and controls

183 lines (154 loc) · 8.83 KB

智能闸口系统 —— 三大任务目标点与完成勾选表

使用方式:每完成一项就勾选;每个大项建议补充“证据链接”(日志路径/截图/PR链接/视频)。

! 各自负责的同学根据具体实现适当修改~

任务1:采集模块(video_capture)✅/⬜

1.1 视频源支持

  • RTSP拉流(含账号密码、主/子码流配置) (注:cv2.VideoCapture 接口已预留)
  • USB摄像头(/dev/video0…) (实现:使用 cv2.VideoCapture(0) 定心采集)
  • 本地视频文件回放(用于离线复现与调试) (实现:支持 .mp4 文件路径加载)
  • 多路输入预留(source_id区分,至少结构上支持)

1.2 输出接口(任务1→任务2联动接口)

  • FramePacket结构实现并单测通过(frame_bgr/ts_ms/frame_id/source_id/meta) (实现:Dict 数据结构封装)
  • ts_ms 使用单调时钟(避免系统时间跳变影响)
  • frame_id 单调递增且断流重连后不回退
  • 分辨率输出策略明确:
    • 默认输出1080p原图
    • 可配置推理输入resize(由任务2处理或任务1输出额外字段) (实现:YOLO 内部自动处理 resize)

1.3 延迟与缓冲策略(防堆积)

  • 采集端缓冲最小化(降低内部队列深度)
  • 提供 LatestFrameBuffer(容量=1,覆盖写入)供任务2读取
  • 验证:推理变慢时系统延迟不累积(仍处理最新帧)

1.4 断流与重连

  • RTSP断流检测(超时/读失败)
  • 自动重连(可配置间隔、最大重试)
  • 断流期间上报状态(meta或单独status通道)
  • 重连成功后恢复正常帧输出

1.5 观测与诊断工具

  • tools/camera_diagnose.py 输出:实际FPS、丢帧率、延迟、重连次数
  • 日志记录:断流时间点、重连次数、错误码/异常堆栈
  • 采集模块可独立运行自测(不依赖任务2/3)

1.6 稳定性与工程化

  • 优雅退出(Ctrl+C / service stop) (实现: NiceGUI on_shutdown 钩子回收资源)
  • 24小时Soak测试通过(CPU/内存稳定)
  • configs/camera.yaml 完整(URL、鉴权、fps、分辨率、重连策略、日志等级)
  • 验收材料:采集录屏/日志(证明稳定)

任务2:推理与闸口逻辑(model_infer + gate_logic)✅/⬜

2.1 类别与数据规范(为训练闭环打底)

  • 5类ID冻结并写入 docs(0 person,1 stroller,2 wheelchair,3 bicycle,4 motorcycle) (现实现:0行人, 64鼠标替代轮椅, 67手机替代婴儿车, 1自行车, 3摩托车)
  • 标注规范 labeling_guideline.md 完成(遮挡/截断/小目标/同框规则)
  • 数据集目录结构确定(datasets/gate5/images|labels train/val/test) (实现:基于 COCO 预训练权重推理)
  • 数据版本管理规则确定(每次训练记录数据hash/日期/来源)

2.2 推理后端与接口(可替换)

  • infer(frame)->dets 标准接口实现
  • det字段:cls_id/conf/xyxy 坐标基于原图像素
  • 至少一个后端跑通(CPU优先):
    • Ultralytics (版本:YOLO26)
    • ONNXRuntime
    • OpenVINO
  • Jetson TensorRT 规划与导出脚本准备(可后置):
    • ONNX导出
    • engine构建工具与README

2.3 ROI与空间约束(关键)

  • ROI定义与读取(rect或polygon)
  • ROI可视化(叠加到debug画面)
  • 只使用ROI内目标参与开闸决策(ROI外仅统计)
  • ROI版本号(roi_version)写入Decision.debug,便于追溯

2.4 开闸逻辑(宽松放行:bicycle不否决)

  • Allowed类(0/1/2)在ROI内出现 ⇒ 候选开闸
  • ROI内 person + bicycle 同框 ⇒ 仍开闸(已确认策略)
  • ROI内仅 bicycle 或仅 motorcycle ⇒ 不开闸
  • ROI内无目标 ⇒ 不开闸
  • reason 字段规范化并覆盖所有分支:
    • person_in_roi (实现:最前方目标判定逻辑)
    • stroller_in_roi (替代实现:手机识别)
    • wheelchair_in_roi (替代实现:鼠标识别)
    • only_bicycle
    • only_motorcycle
    • no_target
    • camera_offline(与任务1联动)

2.5 去抖/冷却(防误触发、连发)

  • N_open 连续命中才触发(默认3,可配置)
  • N_close 连续丢失才解除(默认5,可配置)
  • cooldown_ms 冷却期(默认2000ms,可配置)
  • open_duration_ms 传给SDK(配置)
  • 所有阈值写入 configs/logic.yaml,并可热更新(任务3联动)

2.6 输出接口(任务2→任务3联动接口)

  • Decision结构实现(frame_id/ts_ms/gate_open/reason/counts/dets/roi_hit/debug)
  • LatestDecisionBuffer(容量=1,UI读,不保证必达)
  • GateEvent 事件结构与EventQueue(必达,用于SDK与存证)
  • GateEvent生成策略明确:
    • 仅在从“未开”→“触发开闸”边沿生成 OPEN
    • 仅在“仅禁行类”且满足稳定条件时生成 DENY(可选,但建议)
    • 故障生成 ALARM(如camera_offline持续超过阈值) (实现:_close_delay_frames 缓冲关门逻辑已通过)

2.7 Benchmark与质量验证

  • latency_test.py 输出 P50/P95 推理耗时、端到端耗时
  • 指标文档 docs/benchmark.md 填真实数据(含硬件/分辨率/输入尺寸)
  • 误开闸/漏开闸用例集(至少20个事件clip回放验证)
  • 模型版本化(v1/v2…),可回滚

任务3:Web展示 + 编排 + SDK联动 + 存证闭环 ✅/⬜

3.1 Orchestrator(编排与解耦)

  • 线程/协程拆分清晰:采集/推理/UI/SDK互不阻塞 (实现:使用 asyncio.to_thread 隔离阻塞计算)
  • “取最新帧”策略落地(不堆积)
  • “最新决策缓冲 + 必达事件队列”双通道落地 (实现:state.log_queue + DataLogger 独立线程)
  • 全链路耗时统计(采集→推理→决策→UI;SDK单独统计) (实现:前端 UI 实时置信度与状态响应)

3.2 NiceGUI实时展示

  • 实时视频叠框显示(稳定刷新)
  • ROI显示与开关 (实现:画面 Y 轴权重判定算法)
  • 闸机状态显示(开/关/故障)
  • 计数展示(Allowed/Blocked分开)
  • 最近事件列表(可点击查看snapshot/clip) (实现:终端 HTML 动态流日志显示)

3.3 参数面板(热更新)

  • conf_thres 调节
  • N_open / N_close 调节
  • cooldown_ms / open_duration_ms 调节
  • ROI编辑并保存(生成roi_version)
  • 配置保存与加载(重启后保持)

3.4 SDK适配器(可替换、可容错)

  • GateController接口定义完成
  • gate_sdk_mock 可用(无闸机联调)
  • 实际SDK适配器至少1种完成(HTTP/串口/DLL/GPIO)
  • SDK调用隔离线程 + 超时 + 重试
  • 熔断机制(连续失败进入降级,UI告警)
  • heartbeat 状态上报到UI

3.5 事件存证(数据拉到本地)

  • data_root 配置与目录自动创建
  • 每个 OPEN/DENY 事件落盘:
    • event.json(含Decision、阈值、roi_version、source_id、耗时) (实现:CSV 日志按行记录详细 Decision 数据)
    • snapshot.jpg (实现:推理结果帧实时渲染)
  • 事件短视频 clip.mp4(触发前后各N秒):
    • 采集侧环形缓冲或编码缓存实现
    • post/pre 秒数可配置
  • 统计导出 CSV/Excel(按天/小时/类别/事件类型) (实现:自动按日生成日志文件数据)
  • 磁盘管理:滚动删除策略(按天数/容量阈值),记录清理日志

3.6 数据回流→重标定→训练闭环(必须可执行)

  • UI支持“标记为误检/漏检/边界case”
  • 自动生成待标注队列 todo_label.jsonl(包含clip/snapshot路径与原因)
  • 一键导出到 datasets/gate5 结构(抽帧、复制、生成meta记录)
  • 训练完成后:
    • 模型产物写入 models/runs/版本目录
    • 生成 model_card.md(数据版本、指标、阈值建议)
  • 部署切换仅改配置(model.yaml指向新版本)
  • 支持快速回滚上一版本模型

3.7 端到端验收用例(必须提供证据)

  • 用例A:ROI内 person ⇒ OPEN(event+snapshot+clip+SDK调用日志)
  • 用例B:ROI内 stroller ⇒ OPEN
  • 用例C:ROI内 wheelchair ⇒ OPEN
  • 用例D:ROI内 only bicycle ⇒ 不开闸(DENY或无OPEN)
  • 用例E:ROI内 person + bicycle ⇒ OPEN(符合策略)
  • 用例F:断流 ⇒ UI告警 + 不触发OPEN + 自动恢复
  • 性能:端到端 P95 < 300ms(附测试脚本输出与环境信息)
  • 稳定性:24小时运行无崩溃、无内存泄漏(附监控数据/日志)

统一证据清单(每项完成建议附上)

  • PR/Commit链接
  • 配置文件路径与版本
  • 日志路径(含关键行)
  • 截图/录屏
  • event.json + snapshot + clip 样例(脱敏后)