bdbfca4252
fix(edge): 修复 batch 推理超过 MAX_BATCH_SIZE 导致缓冲区溢出
...
队列中 ROI 数量超过 8 时(多摄像头多 ROI 绑定场景),
一次性送入 TensorRT 引擎导致 np.copyto 溢出。
改为按 max_batch_size 分块推理。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-02 16:49:20 +08:00
a49a1be0eb
fix(edge): 云端Redis默认db改为1,配置更新回调支持所有同步模式
...
- CloudRedisConfig.db 默认值从0改为1,与部署环境一致
- 配置更新回调不再限制为LOCAL模式,REDIS模式也支持动态热更新
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-28 15:48:18 +08:00
9ec949ef02
fix(edge): LOCAL模式下独立连接云端Redis,确保截图处理器可用
...
CONFIG_SYNC_MODE=LOCAL 时 config_sync 不初始化云端 Redis,
截图处理器改为独立创建 Redis 连接。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-28 09:04:26 +08:00
f70e6b6003
feat(edge): 新增截图处理模块,支持远程截图请求
...
- 新增 core/screenshot_handler.py:监听云端 Redis Stream 截图请求,
抓帧后直传 COS,将结果 URL 写回 Redis
- main.py 集成 ScreenshotHandler 的初始化和停止
- requirements.txt 添加 cos-python-sdk-v5 依赖
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-27 17:22:49 +08:00
0b0e793785
fix(edge): 配置更新时保留算法状态,避免重复告警
...
- 新增 update_algorithm_params() 方法,仅更新参数不重置状态机
- 修改 reload_all_algorithms() 支持 preserve_state 参数
- preserve_state=True: 保留状态机,仅更新参数(配置更新)
- preserve_state=False: 完全重置(手动重启)
- 修改 main.py 配置更新回调使用 preserve_state=True
修复问题:配置更新导致算法状态机重置,周界入侵CONFIRMING_CLEAR状态丢失,重新生成新告警
现在配置更新时保留告警状态,不会产生重复告警
支持算法:
- leave_post: 更新 leave_countdown_sec, working_hours 等参数
- intrusion: 更新 confirm_intrusion_seconds, confirm_clear_seconds 等参数
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 11:24:41 +08:00
7b3265fe74
fix(edge): 配置推送后异步启动摄像头,不阻塞HTTP响应
...
问题:配置推送时同步启动摄像头,需等待13秒才返回响应,
导致云端10秒超时认为推送失败
修复:将_reload_cameras()改为异步执行:
1. 配置更新写入SQLite
2. 立即返回HTTP 200响应(<1秒)
3. 后台线程异步启动摄像头(10-15秒)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-14 22:36:56 +08:00
4f755dc7ec
feat(intrusion): main.py支持intrusion告警的alarm_id回填
...
- 在main.py中添加intrusion告警的alarm_id回填逻辑
- 遵循与leave_post相同的模式
- 在告警创建后调用IntrusionAlgorithm.set_last_alarm_id()
- 使能intrusion告警的自动解除功能
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-14 10:27:39 +08:00
4153efaae9
refactor(main): 优化摄像头视频流启动逻辑 - 只启动有ROI配置的摄像头
...
问题:
- 旧逻辑启动所有数据库中的摄像头视频流(7个)
- 实际只有3个摄像头有ROI配置
- 浪费带宽和计算资源
解决方案:
1. 新增 _get_camera_ids_with_roi() 方法
- 从ROI配置中提取有配置的摄像头ID集合
- 返回去重后的摄像头ID set
2. 新增 _get_camera_config_by_id() 方法
- 根据ID获取摄像头配置对象
- 提高代码复用性和可维护性
3. 重构 _load_cameras() 方法
- 只启动有ROI配置的摄像头
- 添加详细的成功/失败统计
- 改进日志信息,便于排查问题
4. 重构 _reload_cameras() 方法
- 配置更新时只添加有ROI且未启动的摄像头
- 使用集合运算提高性能
- 统一错误处理逻辑
5. 新增 _cleanup_cameras_without_roi() 方法
- 清理已启动但没有ROI的摄像头流
- 当用户删除所有ROI时自动停止视频流
- 节省系统资源
6. 更新配置回调逻辑
- 先清理无ROI的摄像头
- 再添加新增的有ROI的摄像头
- 保证视频流与ROI配置同步
优势:
- 资源利用率提升:只启动必要的视频流
- 代码模块化:提取公共逻辑,提高复用性
- 可维护性强:清晰的注释和文档字符串
- 日志完善:详细的统计信息便于监控
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-14 09:18:58 +08:00
ecebdd514f
feat(aiot): 离岗检测重写 - 单次告警 + 回岗确认 + 持续时长追踪
...
算法逻辑修改:
- OFF_DUTY状态只告警一次,不再每600秒重复告警
- 人员回岗后需经CONFIRMING(10秒)重新确认才恢复ON_DUTY
- 确认在岗后清除冷却记录,允许新一轮离岗检测
- 非工作时间进入时清除冷却记录
持续时长追踪(新增resolve机制):
- 离岗告警记录alarm_id和leave_start_time
- 人员回岗确认后生成resolve事件(duration_ms + last_frame_time)
- 进入非工作时间时也生成resolve事件
- ResultReporter新增report_alarm_resolve()写入Redis队列
- AlarmUploadWorker新增_process_resolve() HTTP POST到云端
- main.py区分普通告警和resolve事件,回填alarm_id到算法实例
- 告警ext_data附加first_frame_time(离岗开始时间)
2026-02-11 17:55:35 +08:00
b6fba4639d
fix(aiot): 修复离岗检测启动立即报警的三个Bug
...
Bug#1(严重): 无人帧不调用算法
- _batch_process_rois 中 len(boxes)>0 才调用 _handle_detections
- 导致离岗检测永远收不到"人走了"的信号
- 修复: 无论检测结果是否为空都调用算法
- 同时移除 _handle_detections 中 tracks 为空的 early return
Bug#2(高): WAITING 一帧就跳 ON_DUTY
- 检测到人第一帧就立即从 WAITING 跳到 ON_DUTY
- confirm_on_duty_sec 参数完全未被使用
- 修复: 新增 CONFIRMING 状态,需连续 10s 检测到人才确认上岗
Bug#3(中): confirm_leave_sec 默认值过短
- 默认 10 秒,用户预期 30 秒
- 修复: 所有默认值统一改为 30s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-11 10:01:20 +08:00
181623428a
feat(aiot): 告警冷却时间调整 + 截图本地保留 + 中文路径修复
...
- 离岗检测冷却时间: 300s → 600s(10分钟)
- 入侵检测冷却时间: 120s → 300s(5分钟)
- 入侵告警级别改为高(alarm_level=3)
- COS 不可用时保留本地截图文件,不再上报后删除
- 修复 cv2.imwrite 中文路径失败,改用 imencode + write_bytes
- 配置订阅在 LOCAL 模式下跳过 Redis 连接
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-11 09:57:02 +08:00
0191e498f1
feat: 告警HTTP上报 + 日志精简 + 边缘节点统一为edge
...
- 新增 alarm_upload_worker.py 异步告警上报(COS+HTTP)
- result_reporter 重构为Redis队列模式
- config_sync 适配WVP直推的聚合配置格式
- settings 默认 EDGE_DEVICE_ID 改为 edge
- 日志设置非告警模块为WARNING级别减少噪音
- main.py 集成新的告警上报流程
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-10 15:21:45 +08:00
93a2278626
fix: 优化边缘端稳定性和日志管理
...
1. database.py: 优化数据库连接和错误处理
2. postprocessor.py: 改进后处理逻辑
3. result_reporter.py: 完善告警上报字段
4. video_stream.py: 增强视频流稳定性
5. main.py: 优化启动流程和异常处理
6. logger.py: 改进日志格式和轮转配置
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-09 17:47:41 +08:00
ff3d6e2653
fix: 修复告警上报字段缺失和 MQTT 连接不稳定
...
- AlertInfo.to_dict() 补充 bind_id、device_id、algorithm 字段
- AlertInfo 新增 device_id 和 algorithm 属性
- MQTTConfig 新增 device_id 配置项(环境变量 EDGE_DEVICE_ID)
- main.py 创建 AlertInfo 时传入 device_id 和 algorithm
- 心跳上报使用配置的 device_id 代替硬编码字符串
- MQTT 协议从 MQTTv5 降级为 MQTTv311 提高兼容性
- MQTT client_id 添加随机后缀防止冲突
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-09 14:13:49 +08:00
cea4cb877b
fix: MQTT连接兼容paho-mqtt 1.x和2.x版本
...
- 添加paho-mqtt版本检测,兼容CallbackAPIVersion
- 修复回调函数签名,支持1.x的整数返回码和2.x的对象返回码
- 增强错误处理和日志输出
- 确保ResultReporter.initialize()被正确调用
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-05 16:02:32 +08:00
6c6c9b4c03
fix: 修复 MQTT 未连接问题
...
ResultReporter 创建后需调用 initialize() 方法初始化 MQTT 连接
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-05 15:23:29 +08:00
98595402c6
fix: 修复10个关键bug提升系统稳定性和性能
...
1. YOLO11输出解析错误: 移除不存在的objectness行,正确使用class_scores.max()
2. CPU NMS逻辑错误: keep_mask同时标记保留和抑制框导致NMS失效,改用独立suppressed集合
3. 坐标映射缺失: _build_tracks中scale_info未使用,添加revert_boxes还原到ROI裁剪空间
4. batch=1限制: 恢复真正的动态batch推理(1~8),BatchPreprocessor支持多图stack
5. 帧率控制缺失: _read_frame添加time.monotonic()间隔控制,按target_fps跳帧
6. 拉流推理耦合: 新增独立推理线程(InferenceWorker),生产者-消费者模式解耦
7. 攒批形同虚设: 添加50ms攒批窗口+max_batch阈值,替代>=1立即处理
8. LeavePost双重等待: LEAVING确认后直接触发告警,不再进入OFF_DUTY二次等待
9. register_algorithm每帧调用: 添加_registered_keys缓存,O(1)快速路径跳过
10. GPU context线程安全: TensorRT infer()内部加锁,防止多线程CUDA context竞争
附带修复:
- reset_algorithm中未定义algorithm_type变量(NameError)
- update_roi_params中循环变量key覆盖外层key
- AlertInfo缺少bind_id字段(TypeError)
- _logger.log_alert在标准logger上不存在(AttributeError)
- AlarmStateMachine死锁(Lock改为RLock)
- ROICropper.create_mask坐标解析错误
- 更新测试用例适配新API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-04 16:47:26 +08:00
fa0304aa47
feat: 重构数据库schema分离空间与业务配置 - 新增algorithm_registry和roi_algo_bind表 - roi_configs简化为纯空间配置 - 新增AlgorithmInfo/ROIAlgoBind数据模型
2026-02-03 14:26:52 +08:00
1caba41625
feat: 批处理多ROI推理 - 添加 batch_process_detections 批量后处理 - 重构 _process_frame 收集多ROI统一推理
2026-02-03 11:17:54 +08:00
d7f56683c7
perf: GPU NMS + 日志优化 + 数组预分配
...
- GPU NMS: torchvision.ops.nms 替代 CPU NMS, 50-80% 提升
- 日志优化: 每10帧输出一次性能日志, 减少90%日志开销
- 数组预分配: 预分配8400框缓冲区, 避免重复创建
- 预过滤: 置信度>0.3的框先过滤, 减少NMS计算量
性能对比:
- 优化前: 40-50ms
- 优化后: 17-22ms (60% 提升)
2026-02-02 16:37:24 +08:00
c17f983ab3
perf: batch=1 优化减少延迟
...
- settings: batch_size=41
- tensorrt_engine: BATCH_SIZE=41
- preprocessor: 移除 padding 逻辑,直接 batch=1
- 预处理延迟从 17ms 5ms
2026-02-02 15:25:13 +08:00
745cadc8e7
feat: TensorRT 固定 batch=4 重构
...
- tensorrt_engine.py 工业级 Buffer Pool
- preprocessor.py 添加 pad_to_batch4()
- postprocessor.py 支持批量输出
- settings.py 固定 batch_size=4
2026-02-02 14:49:47 +08:00
29d3ea0bc4
feat: 传递离岗时长到告警记录
...
- ResultReporter AlertInfo 添加 duration_minutes
- main.py 使用 report_alert 替代 report_detection_alert
- _store_alert 保存 duration_minutes
2026-01-30 17:27:39 +08:00
36674edff8
fix: 修复导入错误
...
- 移除不存在的 init_database 导入
- DatabaseManager SQLiteManager
2026-01-30 14:54:20 +08:00
fdd3e9ac88
feat: 算法层接管判断权
...
- 添加 AlgorithmManager 集成
- 新增 _build_tracks() 将检测转为算法输入格式
- 重构 _handle_detections() 让算法决定是否告警
- 注册算法时从 ROI 配置读取参数
- 停止使用 PostProcessor.check_alarm_condition() 做业务判断
新的执行链路:
ROI裁剪 480p预处理 YOLO推理 algorithm.process() 告警
2026-01-30 14:24:34 +08:00
b0ddb6ee1a
feat(project): move edge_inference_service contents to root and update paths
...
- Moved all project files and directories (config, core, models, etc.) from
edge_inference_service/ to the repository root ai_edge/
- Updated model path in config/settings.py to reflect new structure
- Revised usage paths in __init__.py documentation
2026-01-29 18:43:19 +08:00
6733344b11
初始化边缘推理服务
2026-01-29 18:33:12 +08:00