使用方式:每完成一项就勾选;每个大项建议补充“证据链接”(日志路径/截图/PR链接/视频)。
! 各自负责的同学根据具体实现适当修改~
- RTSP拉流(含账号密码、主/子码流配置) (注:cv2.VideoCapture 接口已预留)
- USB摄像头(/dev/video0…) (实现:使用 cv2.VideoCapture(0) 定心采集)
- 本地视频文件回放(用于离线复现与调试) (实现:支持 .mp4 文件路径加载)
- 多路输入预留(source_id区分,至少结构上支持)
- FramePacket结构实现并单测通过(frame_bgr/ts_ms/frame_id/source_id/meta) (实现:Dict 数据结构封装)
- ts_ms 使用单调时钟(避免系统时间跳变影响)
- frame_id 单调递增且断流重连后不回退
- 分辨率输出策略明确:
- 默认输出1080p原图
- 可配置推理输入resize(由任务2处理或任务1输出额外字段) (实现:YOLO 内部自动处理 resize)
- 采集端缓冲最小化(降低内部队列深度)
- 提供 LatestFrameBuffer(容量=1,覆盖写入)供任务2读取
- 验证:推理变慢时系统延迟不累积(仍处理最新帧)
- RTSP断流检测(超时/读失败)
- 自动重连(可配置间隔、最大重试)
- 断流期间上报状态(meta或单独status通道)
- 重连成功后恢复正常帧输出
- tools/camera_diagnose.py 输出:实际FPS、丢帧率、延迟、重连次数
- 日志记录:断流时间点、重连次数、错误码/异常堆栈
- 采集模块可独立运行自测(不依赖任务2/3)
- 优雅退出(Ctrl+C / service stop) (实现: NiceGUI on_shutdown 钩子回收资源)
- 24小时Soak测试通过(CPU/内存稳定)
- configs/camera.yaml 完整(URL、鉴权、fps、分辨率、重连策略、日志等级)
- 验收材料:采集录屏/日志(证明稳定)
- 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/日期/来源)
- infer(frame)->dets 标准接口实现
- det字段:cls_id/conf/xyxy 坐标基于原图像素
- 至少一个后端跑通(CPU优先):
- Ultralytics (版本:YOLO26)
- ONNXRuntime
- OpenVINO
- Jetson TensorRT 规划与导出脚本准备(可后置):
- ONNX导出
- engine构建工具与README
- ROI定义与读取(rect或polygon)
- ROI可视化(叠加到debug画面)
- 只使用ROI内目标参与开闸决策(ROI外仅统计)
- ROI版本号(roi_version)写入Decision.debug,便于追溯
- 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联动)
- N_open 连续命中才触发(默认3,可配置)
- N_close 连续丢失才解除(默认5,可配置)
- cooldown_ms 冷却期(默认2000ms,可配置)
- open_duration_ms 传给SDK(配置)
- 所有阈值写入 configs/logic.yaml,并可热更新(任务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 缓冲关门逻辑已通过)
- latency_test.py 输出 P50/P95 推理耗时、端到端耗时
- 指标文档 docs/benchmark.md 填真实数据(含硬件/分辨率/输入尺寸)
- 误开闸/漏开闸用例集(至少20个事件clip回放验证)
- 模型版本化(v1/v2…),可回滚
- 线程/协程拆分清晰:采集/推理/UI/SDK互不阻塞 (实现:使用 asyncio.to_thread 隔离阻塞计算)
- “取最新帧”策略落地(不堆积)
- “最新决策缓冲 + 必达事件队列”双通道落地 (实现:state.log_queue + DataLogger 独立线程)
- 全链路耗时统计(采集→推理→决策→UI;SDK单独统计) (实现:前端 UI 实时置信度与状态响应)
- 实时视频叠框显示(稳定刷新)
- ROI显示与开关 (实现:画面 Y 轴权重判定算法)
- 闸机状态显示(开/关/故障)
- 计数展示(Allowed/Blocked分开)
- 最近事件列表(可点击查看snapshot/clip) (实现:终端 HTML 动态流日志显示)
- conf_thres 调节
- N_open / N_close 调节
- cooldown_ms / open_duration_ms 调节
- ROI编辑并保存(生成roi_version)
- 配置保存与加载(重启后保持)
- GateController接口定义完成
- gate_sdk_mock 可用(无闸机联调)
- 实际SDK适配器至少1种完成(HTTP/串口/DLL/GPIO)
- SDK调用隔离线程 + 超时 + 重试
- 熔断机制(连续失败进入降级,UI告警)
- heartbeat 状态上报到UI
- data_root 配置与目录自动创建
- 每个 OPEN/DENY 事件落盘:
- event.json(含Decision、阈值、roi_version、source_id、耗时) (实现:CSV 日志按行记录详细 Decision 数据)
- snapshot.jpg (实现:推理结果帧实时渲染)
- 事件短视频 clip.mp4(触发前后各N秒):
- 采集侧环形缓冲或编码缓存实现
- post/pre 秒数可配置
- 统计导出 CSV/Excel(按天/小时/类别/事件类型) (实现:自动按日生成日志文件数据)
- 磁盘管理:滚动删除策略(按天数/容量阈值),记录清理日志
- UI支持“标记为误检/漏检/边界case”
- 自动生成待标注队列 todo_label.jsonl(包含clip/snapshot路径与原因)
- 一键导出到 datasets/gate5 结构(抽帧、复制、生成meta记录)
- 训练完成后:
- 模型产物写入 models/runs/版本目录
- 生成 model_card.md(数据版本、指标、阈值建议)
- 部署切换仅改配置(model.yaml指向新版本)
- 支持快速回滚上一版本模型
- 用例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 样例(脱敏后)