设计一个带计算机的监控系统
你有没有想过把电脑和摄像头变成一个监控系统?你只需要有实现想法的意愿。
创意
我家和院子里需要监控,这让我产生了一个问题:“当没人在家时,我该如何看守我的住所?” 我把它看作一个有趣的挑战——我喜欢这类谜题,尤其是那些涉及编程和工程的。
一旦我理清了项目在外观、功能和整体运作方面的构想,便为我的程序制定了一套清晰的要求:
•兼容廉价摄像头:USB摄像头、内置摄像头、网络摄像头、IP摄像头等。
•跨平台:可移植,支持 Windows、Linux 以及单板计算机(SBC)。
•轻量级:尽可能少地占用系统资源。
•目标检测:专门用于检测车辆和行人。
•即时提醒:当检测到物体时,会向我发送带照片的消息。
•远程访问:可通过互联网访问,方便我随时查看工作中的直播流或已保存的照片。
由于我之前已有使用 Python 和 OpenCV 进行物体检测的经验,所以我知道该朝哪个方向去。
最困难的部分是想办法开发一个移动应用,让用户能够查看摄像头画面、浏览照片、远程触发操作或调整设置。
所以,设置需要看起来像这样:
起初,我考虑过使用 Qt 框架,但那会带来巨大的挑战。由于我更倾向于用更简单的方式实现想法,于是我想:为什么不直接用内置的网页浏览器作为用户界面,而不是为每个移动平台都开发定制应用呢?我们可以把按钮、视频流和控件直接嵌入网页中,将网页托管在家庭电脑上作为网络服务器,并远程访问它。
当我向大语言模型咨询如何构建这个系统时,它们的首选建议是使用 Django 和 Flask 这样的 Python 框架。选择显而易见:Flask。它简单易懂,上手方便,且文档清晰。
一如既往,经过多次尝试和调整,我终于取得了第一个成功:编写了一个Python脚本,用于读取视频流,使用OpenCV进行处理,并通过Ultralytics的YOLO模型识别物体。
这真的很棒。即使对机器学习了解不多,你也可以使用他们的基础模型,或者训练自己的模型来获得你所需的精确结果。
整体项目架构设计如下图所示:
引擎盖下
•摄像头持续从视频输入中捕获帧,并将这些帧直接传送到两个地方:识别流水线和用于实时查看的Web服务器。
•识别类负责处理繁重的任务:它接收图像帧,运行YOLO物体检测,并输出边界框坐标。
•start_recognition 是应用程序的启动点——在此处初始化处理流程
•Pipeline 类充当核心协调者,负责初始化所有线程、事件和路由,并创建 Camera、Server、Messenger 和 Recorder 对象。它还监控相关条件,以触发照片保存并发送警报通知。
•消息发送器类接收包含检测到对象的快照,并将其转发至 Telegram 通知。
•Server类充当前端Web界面与后端处理之间的桥梁。
为了修复一些性能延迟问题,我重新组织了项目结构。将系统初始化、路由和任务调度等操作从主脚本中移出,移到了独立的模块中。
最终架构如下所示:
启动时,应用程序会设置其路由,并在缺少的情况下自动创建一个system_settings目录。该目录用于存储摄像头、机器人和应用的配置文件,确保每次运行之间数据都能持久保存。
Jetson ORIN Nano
如果你不知道Jetson Orin Nano是什么,以下是来自谷歌AI搜索助手的简要说明:
我非常好奇SBC的表现如何。出乎意料的是,它与RTX 3050笔记本电脑相比表现相当,轻松应对单个30帧每秒的视频流。然而,当叠加更多摄像头时,性能会受到影响——更多的摄像头对象意味着GPU负载显著增加。因此,解决方案是降低帧率读取,以减轻CPU和GPU的负担,同时不会对用户造成明显影响。
由于NVIDIA JetPack支持TensorRT(专为极速边缘计算而设计),我决定将标准的YOLO .pt模型转换为TensorRT的.engine文件。
我设计这款应用时,使其能够完全跨平台使用——无需针对 Windows 或 Linux 进行任何操作系统特定的调整。
请查看以下检测到的一些快照示例:
作为项目顾问,我使用了 OpenAI 的 Codex。它是一款出色的工具,可用于修正架构、添加注释等操作。但另一方面,当你让其修改代码时要格外小心——有时它会做出一些你甚至没有要求的更改!
本文编译自hackster.io





