项目概述
这个项目旨在开发一个智能家居监控系统,主要面向有老人和小孩的家庭用户。系统支持多摄像头输入,具备人脸监测、摔倒检测、危险区域检测和火灾监测四大功能。项目采用分布式架构,包括摄像头、直播转播服务器、边缘服务器和中央云服务器四个层面。整个开发过程历时15天,涉及多项复杂技术的整合与创新应用。
第1天:项目启动与初步研究
- 确定项目方向:家庭监控系统,主要面向有老人和小孩的家庭用户
- 开始研究MediaPipe框架,为实现摔倒检测功能做准备
- 初步了解项目所需的技术栈,包括计算机视觉、实时视频处理、分布式系统等
- 讨论可能遇到的技术挑战,如多摄像头数据处理、实时分析等
第2天:技术验证与环境搭建
- 对MediaPipe框架进行深入测试,结果令人满意
- 研究摔倒检测算法,最终决定采用头部速度+身体保持水平姿态时间作为判断标准
- 在Windows 11笔记本上成功部署nginx-rtmp服务器
- 实现OBS推流,并成功使用他人的前端播放视频流
- 注意到一个潜在问题:没有意识到自己配置了HLS流,恰巧前端播放的是HLS流,这为后续埋下了一个"雷"
第3天:功能实现与测试
- 学习OpenCV拉流技术,成功拉取OBS的局域网推流
- 发现并开始使用VLC软件,成功接入组员云服务器的RTMP流
- 摔倒检测功能初步实现,效果良好
- 完成并提交立项文档
- 此时对项目的整体架构还没有清晰的认识,但对核心功能已有初步实现
第4天:架构重新思考
- 意识到单台2核2G服务器无法同时运行四个CV功能,开始重新思考系统架构
- 考虑到服务器带宽限制(4Mbps),认识到多摄像头实现面临严重挑战
- 初步设计:考虑使用一台游戏笔记本运行四个后端功能,对每个摄像头进行处理
- 经过测试,发现单台游戏本也无法支持多摄像头多功能的并发处理
- 最终确定初步架构:四个功能以微服务形式部署到四台游戏本上
- 设计告警信息和处理后视频流推送到中央服务器的机制
- 这一天的架构重新设计为后续开发奠定了基础
第5天:视频处理优化与架构讨论
- 使用FFmpeg成功推流处理后的视频帧,这是一个重要的技术突破
- 优化摔倒检测功能,解决"慢动作"问题
- 开发简易缓冲区存放MediaPipe处理后的帧,保证推流帧数稳定
- 测试单台笔记本同时运行4个MediaPipe的可行性,为系统性能评估提供依据
- 协助其他组员解决功能开发问题,体现了团队协作精神
- 与负责云服务器的组员深入讨论,意识到需要中央服务器+转播服务器的架构
- 这一天的工作不仅解决了具体的技术问题,还进一步完善了系统架构,为后续开发指明了方向
第6天:服务器化与功能扩展
- 研究如何将程序转变为服务器,开始学习Flask框架
- 成功实现接收请求和发送告警信息的功能
- 引入线程机制,添加start_process、stop_process、start_stream和stop_stream的API
- 实现控制摔倒检测的开启/关闭,以及推流的开启/关闭
- 测试多线程运行,确保可以同时处理多个摄像头
- 其他组员开始使用YOLOv5s并训练火焰图片特征,为火灾检测功能做准备
- 讨论跨区域追踪(ReID)的实现方法(后因时间限制未完成)
- 这一天的工作大大提高了系统的灵活性和可控性,为后续的系统集成打下了基础
第7天:问题排查与讨论
- 继续讨论ReID的实现方法,虽然最终未能实现,但这个讨论过拓展了技术视野
- 修复已发现的bug,编写详细的日报,确保团队所有成员都了解当前进展
- 发现处理后视频存在"快动作"问题,导致前端播放卡顿
- 开始深入分析"快动作"问题的原因,为第8天的问题解决做准备
- 这一天的工作虽然没有取得明显的突破,但对问题的深入分析为后续的解决奠定了基础
第8天:视频同步问题解决与数据库设计
- 深入研究"快动作"问题,发现是FFmpeg推流的标记帧数和实际帧数不匹配,导致前端以24帧的速度播放实际只有20帧的直播流
- 尝试使用GPU加速编码,效果有所改善但问题仍未完全解决
- 最终通过巧妙调整标记帧数和FFmpeg设置,成功解决"快动作"问题
- 与服务器组员深入讨论中央服务器设计,选择SpringBoot+MySQL+Vue的技术栈
- 在双层教室的黑板上详细设计项目数据库结构
- 这一天的工作不仅解决了关键的技术问题,还为整个系统的后端架构奠定了基础
第9天:多摄像头支持与直播问题解决
- 重构项目,实现多摄像头的并发处理和推流,这是系统功能的一个重大突破
- 重新设计API,支持对特定摄像头的精确控制
- 第二天埋的雷出了问题,发现并着手解决RTMP流在浏览器中无法播放的问题
- 经过通宵测试和调试,最终确定使用RTMP推流到直播服务器,再由直播服务器进行HLS转码的方案
- 这一天的工作解决了系统的核心功能问题,大大提高了系统的实用性和可靠性
第10天:微服务架构完善与内网穿透
- 进一步完善微服务架构,确定使用RTMP推流作为微服务间的通信方式
- 编写详细的API文档,为团队协作提供清晰的接口规范
- 创建简单的HTML脚本作为参考前端,方便其他组员进行测试
- 意识到微服务架构中局域网访问的潜在问题
- 深入研究WebSocket和内网穿透两种解决方案
- 最终选择使用ngrok实现内网穿透,写了简单脚本,成功测试公网访问局域网设备
- 这一天的工作不仅解决了架构层面的问题,还为系统的远程访问能力打下基础
第11天:系统优化与健壮性测试
- 对已有项目进行ngrok的外挂操作,并成功穿透摔倒检测微服务后端
- 向组员详细介绍ngrok,分享使用ngrok-python的具体实现思路
- 对整个项目进行全面优化,提高系统的稳定性和效率
- 进行系统健壮性测试,模拟各种可能的异常情况
- 更新API,使用
falldetect/<cameraID>/...
格式控制对应功能和摄像头,提高了API的清晰度和可用性 - 这一天的工作大大提高了系统的可靠性和可维护性,为项目的最终交付做好了准备
第12天:微服务通信机制设计
- 解决ngrok免费版URL随机变化的问题
- 巧妙地设计简易"握手"机制,实现微服务后端与中央服务器的可靠连通
- 解决ngrok启动慢于Flask服务器的问题,确保系统启动的稳定性(至此,摔倒检测功能开发完成)
- 协助设计人脸录入功能的通信机制的具体流程
- 帮助设计危险区域检测的前端界面
- 与组员共同开发Vue组件,实现数据大屏功能,这是一个重要的可视化突破
- 这一天的工作解决了多个关键的系统集成问题,大大提高了整个系统的可靠性和易用性
第13天:系统集成与视频存储
- 协助服务器设计者实现"握手"和微服务后端控制,确保系统各部分的顺畅通信
- 设计原直播流视频的存储方案,选择使用.flv格式,平衡了存储效率和视频质量
- 绘制UML图用于结题报告,系统地梳理了整个项目的结构
- 这一天的工作专注于系统集成和文档准备,为项目的最终交付做好了充分准备
第14天:系统联调与前端开发
- 服务器设计者集中精力开发SpringBoot后端,完善中央控制功能
- 其他组员完成各自负责的微服务后端测试,确保每个模块都能稳定运行
- 成功展示全部摄像头原直播、告警信息列表和告警比例柱状图,直观展示系统运行状态
- 进行系统整体测试,模拟各种使用场景,确保系统的稳定性和可靠性
- 这一天的工作将整个系统的各个部分整合在一起,标志着项目即将完成
第15天:项目交付与演示
- 由于中央服务器到期,快速决定临时使用个人电脑作为中央服务器进行演示
- 利用系统的分布式特性,同时启动五台电脑(四台微服务+一台中央服务器)
- 第二次演示成功,项目顺利交付,达到了预期的所有功能要求
评论区