这次我们看的不是某个开源框架,而是一个很现实的场景:托管房/公寓一次住了多少人,真的数得清吗?1818黄金眼的相关报道里出现过“89平方托管房住了20多个人”的案例。这类问题靠人工巡查很难根治,因为租客上下班时间不固定,房东和托管公司不可能每天上门数人头。实际上,从技术实现的角度,这类超员监管问题是可以被一套本地化AI系统解决的:视频画面接入后,用目标检测模型识别画面中的人,再用跟踪算法统计同一房间内的实时人数,超过阈值就触发告警,并联动智能门禁和后台推送。整套流程可以部署在普通x86主机上,不依赖云服务,数据留在本地,非常适合有隐私管控要求的物业公司、托管公司以及自研系统团队参考。
本文将围绕“AI视觉人数统计 + 智能门禁联动”展开,先给核心能力速览和适用边界,再给出环境准备、部署启动、功能测试、接口API与批量任务的具体步骤,最后补充资源占用观察、常见问题排查和最佳实践。读者不需要拥有专门的算法团队,只需要基本Linux/Windows操作能力和Python环境,就能照着一套通用模板把系统跑起来。文章里所有模型版本、端口、目录路径均按通用示例处理,实际部署时以你选择的项目仓库和显卡驱动版本为准。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | AI视觉人数统计 + 智能门禁联动示例方案 |
| 核心功能 | 实时人数检测、人员轨迹跟踪、区域人数统计、进出事件记录、超员阈值告警、门禁权限联动 |
| 部署方式 | 本地化部署,支持GPU推理,也可CPU推理(性能受限) |
| 支持平台 | Windows / Linux,均可作为服务端运行 |
| 启动方式 | 命令行启动、WebUI可视化、API服务方式 |
| 接口能力 | 提供HTTP API,可对接门禁厂商、物业管理平台、企业微信/钉钉通知 |
| 批量任务 | 支持批量导入房间与租客名单、批量生成门禁权限、批量推送告警 |
| 显存需求 | 以所选检测模型为准,常规边缘设备建议4G及以上显存,纯CPU方案可运行但帧率偏低 |
| 适合场景 | 托管房监管、公寓安全、办公室/工地人数统计、机房/仓库人员管理 |
由于不同项目使用的模型版本、推理框架和视频路数不一样,实际显存占用需要以本机部署为准。比如单路720P视频跑轻量检测模型和四路1080P视频跑大模型,资源占用完全是两个量级。下面的部署方案默认按单机多路视频接入来设计,如果你只需要一台办公室门口的单路监控,硬件门槛还能更低。这里的“4G及以上显存”是一个更容易跑通轻量模型的参考值,不代表所有模型都能在这个显存下流畅运行;选择模型时优先看项目文档给出的最低要求,再结合自己手上的显卡决定。
从功能模块来看,这套系统可以做更细的拆分。人数检测是基础能力,负责识别画面中出现的每一个人;人员跟踪在检测基础上把同一目标跨帧关联起来,避免重复计数;区域统计通过多边形围栏判断某个人是否进入到特定房间区域;超员阈值是规则层能力,当区域人数持续超过设定值并且超过持续时间,系统判定为有效告警。除此之外,事件记录会保存每次进入/离开的详细时间,门禁联动可以在人数达到上限时拒绝新的开门请求。把这些模块组合起来,系统的可扩展性就比较完整了。
2. 适用场景与使用边界
这套系统适合谁来用?第一类是房屋托管公司和公寓运营商,需要定期核查在住人数是否符合合同约定,避免一套托管房里被转租给很多人,既影响其他住户体验,也带来消防和治安风险。第二类是园区、办公楼、施工工地的管理者,需要统计某个封闭区域的实时人数,超员时及时干预。第三类是有自建物业管理平台的团队,希望把人数统计作为其中一个数据源,通过API把结果接到现有系统里。这三类用户的共同特点是:关注的不是单个人的精细身份,而是“这个区域当前有多少人”这个统计口径。
不适合的场景也要讲清楚。如果只是想抓拍人脸做身份识别并跟踪个人行踪,这类需求涉及强个人信息处理,必须依法取得明确授权,并且要经过隐私影响评估。技术上可以做,但部署方要自己承担合规责任,不能默认允许。另外,如果现场画面涉及公共区域之外更私密的场所,比如卧室内部、卫生间门口,这类位置不建议摄像头覆盖。技术方案再成熟,采集边界不控制,后续管理风险会很大。
合规边界是重点。无论使用哪种本地部署方案,以下几点必须满足:安装摄像头前要提前告知管理人员和居住人员,并保留同意记录;录像和识别记录不能无限期保存,建议按当地法规要求设置留存周期;接口返回的姓名、房号、人脸特征、进出时间等字段要加密存储并做权限控制;系统只用于合法的租赁管理、安全管理和应急处理,不用于针对个人的歧视性判断。本文后面所有示例代码都建议在测试环境、取得授权的测试场景中运行。
数据生命周期也是部署方案里容易忽略的部分。建议把原始视频流、检测事件、告警记录、租客名单分开存储,并按重要程度设置不同的保留时间和访问权限。原始视频占用空间最大,通常只保留数天;检测事件需要保留一段时间用于审计;告警记录涉及安全事件,可以保留更长时间。租客名单属于静态数据,导出和更新都要有记录。这个设计看似麻烦,但真正遇到纠纷时,清晰的数据留存规则反而能保护部署方的管理权限。
3. 系统总体架构与运行原理
这个系统并不神秘,本质上是一条标准的视频AI流水线。摄像头输出RTSP或RTMP视频流,推理服务对视频帧做目标检测,检测到人后生成边界框;接着用跟踪算法把相邻帧的同一个人关联起来,确保一个人不会被重复计数;再把人的坐标和房间区域的多边形围栏做比对,就能得到某个房间或区域的实时人数。当人数超过阈值并且持续数秒,系统判定为超员事件,触发告警和门禁联动。
架构上可以拆成四层。第一层是视频接入层,负责拉流、解码、抽帧,一般用FFmpeg或OpenCV。第二层是智能分析层,负责目标检测和跟踪。常见做法是使用YOLO系列检测模型配合ByteTrack或DeepSORT这类跟踪算法,模型推理可以用ONNX Runtime或TensorRT加速。第三层是规则与事件层,保存区域围栏配置、人数阈值、生效时间,产生“超员”“非法闯入”等事件。第四层是业务应用层,提供Web管理后台、API接口、告警推送、门禁联动。四层之间通过消息队列解耦会更好,比如把检测结果写入Redis或RabbitMQ,业务端消费后入库。
事件类型可以预先设计好,避免后续维护时字段混乱。建议系统至少包含下面几类事件:
| 事件类型 | 触发条件 | 业务动作 |
|---|---|---|
| person_enter | 检测到人员从区域外进入内部 | 实时人数+1,记录进入时间 |
| person_leave | 检测到人员从内部离开区域 | 实时人数-1,记录离开时间 |
| over_limit | 区域人数超过阈值且持续N秒 | 产生告警,推送通知,联动门禁 |
| illegal_entry | 非授权时间段内检测到人员活动 | 产生安全告警,推送值班人员 |
| offline | 视频流断开或检测服务异常 | 记录故障,标记摄像头离线 |
这里说明一下,本文不会绑定某个具体开源项目的版本号,因为不同团队的代码结构差异很大。实际选择项目时,重点确认三件事:是否支持视频流接入、是否有人数统计或绊线检测功能、是否提供HTTP API或WebHook。具备这三点,就能快速对接本文的部署思路。存储层面建议先使用SQLite做单机验证,数据量上来后切换到MySQL或PostgreSQL;告警消息可以走WebHook,对接企业微信机器人、钉钉群机器人或自建IM。
4. 环境准备与前置条件
先列硬件清单。最低配置建议是一台64位操作系统的主机,可以是Windows 10/11,也可以是Ubuntu 20.04/22.04。CPU建议8线程以上,内存16GB以上,磁盘预留50GB以上,因为要存放视频流临时缓存、模型文件和数据库。如果使用NVIDIA显卡做推理,需要安装对应版本的驱动和CUDA,常见部署环境是CUDA 11.8或12.x配合PyTorch;具体以项目文档为准。纯CPU部署也能跑,但帧率和并发路数会明显下降,适合测试验证,不适合生产环境多路接入。磁盘方面,如果只跑单路测试视频,20GB也够,但视频事件截图会逐步累积,预留50GB以上更稳妥。
软件方面需要Python 3.8以上,建议用虚拟环境隔离依赖。以Linux环境为例,通用安装步骤是:先创建虚拟环境,再安装Python依赖包,下载检测模型文件到指定目录,最后修改配置文件。下面是一个基础命令模板,实际路径和包名需要按项目替换:
# 创建虚拟环境 python3 -m venv venv source venv/bin/activate # 升级pip并安装依赖(示例,具体包名按项目requirements为准) pip install --upgrade pip pip install -r requirements.txt # 检查显卡是否可用(如果使用GPU推理) python -c "import torch; print(torch.cuda.is_available())"开始部署前,建议先按检查清单过一遍环境。下面的表格列的是最常见的前置项,每项都能影响服务能否正常启动,比直接陷入代码调试更省时间。
| 检查项 | 是否满足 | 影响 |
|---|---|---|
| 显卡驱动版本匹配CUDA | 是/否 | 不匹配则GPU推理直接报错 |
| Python版本在3.8以上 | 是/否 | 版本过低会导致依赖安装失败 |
| 模型文件已下载且路径配置正确 | 是/否 | 模型缺失会报加载错误 |
| RTSP摄像头地址可访问 | 是/否 | 拉流失败会导致画面黑屏 |
| 服务端口未被占用 | 是/否 | 端口冲突会引发启动失败 |
| 测试视频文件已准备 | 是/否 | 没有素材时无法验证检测功能 |
如果项目要求使用NVIDIA容器部署,也可以使用Docker。Docker的好处是依赖隔离更彻底,升级和卸载都方便。通用启动方式是把项目目录挂载进容器,把模型目录和配置目录映射出来,然后启动服务。到这一步,环境准备就算完成。接下来最重要的检查项是显卡驱动是否正常、模型文件是否下载完整、配置文件里的摄像头地址是否能被主机访问。这三个问题的出现频率最高,先排查这三个,能省很多时间。
5. 安装部署与启动方式
安装部署阶段,推荐先把项目目录结构梳理清楚,尤其是模型文件、配置文件、日志和数据输出目录不能混成一堆,否则后续查找事件快照和排查问题都很痛苦。下面是一个典型项目目录的示意,实际项目里可能多一层src或api目录,但整体思路一致:
project/ ├── config/ │ └── config.yaml ├── models/ │ └── detection_model.onnx ├── logs/ ├── inputs/ │ └── test_video.mp4 ├── outputs/ │ └── events ├── scripts/ │ ├── start_service.sh │ └── test_api.py └── app/ └── main.pyconfig.yaml里通常需要配置摄像头通道、区域围栏、人数阈值、告警WebHook地址、数据库连接。下面是一个简化配置示例,只用于说明字段含义,字段名以实际项目为准:
service: host: 127.0.0.1 port: 8080 camera: - channel_id: "room_101" rtsp_url: "rtsp://127.0.0.1:8554/test" zone_polygon: [[100, 200], [300, 200], [300, 500], [100, 500]] max_person_count: 4 alert_interval_seconds: 60 database: type: sqlite path: ./data/monitor.db webhook: url: "http://127.0.0.1:9090/api/alert" token: "your_token_here"数据库初始化是启动前要做的事情。单机验证阶段,SQLite比较方便,服务启动时自动创建表即可;如果需要用到历史事件查询、批量任务调度,建议把数据库表和索引设计提前规划好。一个最小表结构可以包含:房间表(room_id、名称、人数阈值、状态)、事件表(event_id、room_id、事件类型、发生时间、快照图片路径)、租客表(person_id、room_id、姓名、电话、授权有效期)。字段命名不固定,关键是事件表和房间表之间要有外键关联,快照图片路径要单独存,方便后续排查误报和审核。
启动服务的方式很直接。以命令行启动为例,一般命令会长这样:
# 启动检测服务,--config指定配置文件路径 python app/main.py --config config/config.yaml启动后,日志里会输出服务监听端口、摄像头连接状态、模型加载成功信息。如果一切正常,浏览器访问http://127.0.0.1:8080可以看到WebUI,页面里应该能看到摄像头画面、当前人数和事件列表。如果页面打不开,第一件事看后台日志,确认服务是没启动还是端口被占用。端口被占用时,可以改配置里的port字段,重新启动进程。如果模型加载失败,多半是模型文件路径写错或文件没下载完整,检查models目录里的文件大小是否和下载页一致。
这里要强调一个判断标准:服务启动成功不等于功能正常。需要先确认模型确实加载,摄像头画面确实有画面输出。最好准备一段本地测试视频文件代替真实摄像头流来做功能验证,比如把一段带多个人走动的MP4文件作为输入,这样反复测试不会受现场人员走动影响。启动方式可以根据环境选择:Windows环境可以用批处理脚本,Linux环境用systemd或supervisor托管进程,容器环境用docker-compose管理。对于长期运行的监管系统,不建议只靠前台进程裸奔,服务崩溃后没人拉起会漏掉一整晚的事件数据。
6. 功能测试与效果验证
功能测试建议从单一视频文件开始,不要直接接入几十路摄像头。受控测试环境的好处是人员数量、走动路线都可以预先设定,判断系统输出是否正确时没有干扰。下面把常用测试整理成一个用例表,方便直接复制到测试记录里。
| 用例编号 | 测试内容 | 输入条件 | 预期结果 | 通过标准 |
|---|---|---|---|---|
| TC-01 | 基础人数检测 | 视频中出现3人同时站立 | 画面显示人数3,3人都有检测框 | 连续10秒内无漏检误检 |
| TC-02 | 人员进出计数 | 先进入1人,再离开1人 | 人数从1变2再回到1,生成进出事件 | 事件时间与动作一致 |
| TC-03 | 超员告警 | 设定阈值1,画面出现2人 | 触发over_limit事件并推送告警 | 事件不重复刷屏 |
| TC-04 | 阈值恢复 | 画面人数降回0 | 告警状态恢复为normal | 系统自动解除告警 |
| TC-05 | 视频断流 | 停止推流 | 生成offline事件,WebUI提示离线 | 检测服务不崩溃 |
| TC-06 | 批量导入 | 导入10条租客CSV | 名单完整入库,无乱码和缺字段 | 数据库记录数为10 |
第一个测试是人数检测。准备一段包含多个行人走动的视频,在配置里划定一个矩形检测区域,把人数阈值设为一个较小值,比如2。运行服务后,观察画面上是否有人框,区域内人数是否稳定显示为画面中实际人数。判断成功的标准是:连续10秒内没有漏检和误检,检测到的人数与人工观看画面统计的人数基本一致。失败时优先检查光线、遮挡和模型精度,过暗画面和人员密集遮挡是漏检的主要原因。如果画面中人员之间的距离很近,检测框会部分重叠,跟踪算法可能出现ID切换,导致计数瞬时抖动。
第二个测试是超员告警。把人数阈值改为1,播放那段多人的视频,系统应该产生“人数超过阈值”的事件,并在事件列表里生成一条记录。再把阈值改回5,让画面中人数少于5,事件应该不再触发。这个测试的关键点是确认告警触发有持续时间过滤,比如画面中出现瞬时抖动导致人数突增,系统不应产生误报。判断是否成功的标准是:告警事件与真实超员时间段对应,且没有连续重复刷屏。告警频控策略通常会设置60秒到300秒的间隔,具体数值要根据房间的进出频率调整。
第三个测试是进出事件与门禁联动。在测试环境中模拟一人进入房间、一人离开房间,后台应该记录两条事件:进入时间、离开时间、人员ID。如果项目支持刷卡或小程序开门,可以再测试门禁联动:系统检测到房间人数达到上限后,下一次开门请求被拒绝,或者触发管理端审批通知。此处要注意,门禁联动涉及硬件厂商协议,通常需要门禁厂家提供SDK或HTTP接口,本文示例只描述流程,实际接口字段需要按厂家文档调整。
第四个测试是批量任务。把多个房间的配置批量写入配置文件,比如3个房间分别对应3个RTSP源,人数阈值分别是2、4、6。启动后检查是否每个通道都正常显示人数。批量导入租客信息时,可以准备一个CSV文件,包含房号、姓名、手机号、门禁权限有效期,上传后检查后台列表是否完整入库。判断标准是:所有通道都能独立计算人数、互不影响,租客名单导入后没有乱码和缺字段。
下面是批量导入CSV的简化示例格式:
room_id, person_name, phone, valid_from, valid_to 101, 张三, 13800000001, 2025-01-01, 2025-12-31 102, 李四, 13800000002, 2025-01-01, 2025-06-307. 接口 API 与批量任务
系统如果能提供HTTP API,对接现有物业平台会方便很多。常用的接口一般是三类:查询实时人数、查询历史事件、触发门禁操作。对外暴露时,所有接口都要加认证,最简单的做法是使用Token放在请求头里。接口设计可以参考下面的表,实际字段名以你的项目文档为准:
| 接口 | 方法 | 路径 | 功能 |
|---|---|---|---|
| 查询实时人数 | GET | /api/v1/room/{room_id}/person_count | 获取指定房间当前人数 |
| 查询历史事件 | GET | /api/v1/events | 按时间范围查询事件列表 |
| 设置人数阈值 | PUT | /api/v1/room/{room_id}/threshold | 动态调整阈值 |
| 批量导入名单 | POST | /api/v1/persons/import | 上传CSV批量导入租客 |
| 触发门禁操作 | POST | /api/v1/door/{room_id}/control | 联动门禁开门或锁定 |
查询某房间实时人数的请求示例:
curl -X GET "http://127.0.0.1:8080/api/v1/room/101/person_count" \ -H "Authorization: Bearer your_token_here"正常返回的JSON结果可以设计成下面这样:
{ "code": 0, "message": "success", "data": { "room_id": "101", "person_count": 5, "max_person_count": 4, "status": "over_limit", "updated_at": "2025-06-01 10:30:00" } }查询历史事件的Python调用示例:
import requests url = "http://127.0.0.1:8080/api/v1/events" params = { "room_id": "101", "event_type": "over_limit", "start_time": "2025-06-01 00:00:00", "end_time": "2025-06-01 23:59:59" } headers = {"Authorization": "Bearer your_token_here"} response = requests.get(url, params=params, headers=headers, timeout=30) data = response.json() for event in data.get("data", []): print(event.get("event_time"), event.get("person_count"))批量任务方面,比较可靠的做法是设计一个任务队列。管理后台定时生成批量任务,比如每天晚上8点对所有房间做一次人数复核,任务处理器从数据库读取房间列表,依次调用人数查询接口,把结果写入统计表。批量处理要注意两点:一是对每个网络请求设置超时和重试,避免某个摄像头断流导致整个任务卡死;二是任务要写日志,记录每个房间的处理状态,方便排查是哪个房间的RTSP地址失效导致失败。重试策略通常采用3次重试、指数退避的方式,间隔可以是5秒、10秒、20秒。
批量导入名单也要加入幂等设计。同一个CSV文件如果被重复上传两次,不应该产生重复的租客记录。实现方式可以是在导入接口里先检查手机号或身份证件号在数据库中是否已存在,存在则走更新逻辑,不存在才新增。这样可以避免运营人员在管理后台反复手动导名单时误操作。导入结果应该返回三个数字:成功条数、失败条数、失败原因列表。失败原因通常包括手机号格式不对、房号不存在、日期格式错误等。
8. 资源占用与性能观察
部署AI视觉系统,资源占用是绕不开的话题。观察方法很简单:Linux下用nvidia-smi查看GPU显存和利用率,Windows下用任务管理器或nvidia-smi同样可以;CPU占用可以用top或htop查看。以单路1080P视频流为例,轻量检测模型在GPU上的显存占用可能不到2GB,但换成更大尺寸输入的模型,或者同时接入多路视频,显存消耗会成倍增长。具体数字必须按你所选模型和输入分辨率实测,不同版本的模型差异极大。
影响性能的主要变量有三个。第一是输入分辨率,720P和1080P的推理耗时差别很大,摄像头画面不需要一直保持最高分辨率时,可以在拉流阶段做一次缩放,减少检测层压力。第二是检测帧率,不是每帧都需要做模型推理,可以设置每2秒或每3秒分析一帧,人数统计场景对实时性要求不高,降低帧率能明显降低CPU和GPU占用。第三是同时接入的路数,每增加一路视频,显存和带宽都会增加,建议先在测试环境验证单路资源消耗,再乘上预期路数估算总需求。
下面是常用观察命令的整理,方便在部署和排查时直接使用:
| 观测内容 | Linux命令 | Windows方式 |
|---|---|---|
| GPU显存与利用率 | nvidia-smi | 任务管理器“性能”页面 |
| CPU占用 | top或htop | 任务管理器“进程”页面 |
| 进程内存占用 | ps -aux --sort=-%mem | 资源监视器 |
| 端口占用检查 | ss -lntp或netstat -lntp | netstat -ano |
| 日志实时跟踪 | tail -f logs/service.log | PowerShell的Get-Content -Wait |
降低显存和CPU占用可以按这个顺序尝试:把输入分辨率从1080P降到720P;跳过无画面帧,利用视频帧的时间差降低推理频率;如果项目支持TensorRT或OpenVINO,通过模型转换换取更高帧率;纯CPU场景下使用量化模型,减少浮点计算量。此外还要注意进程残留问题,频繁重启服务时,旧进程不一定退出,端口被占、显存不释放是常见现象。排查时可以先用ps -ef | grep python或nvidia-smi看看有没有残留进程,确认没有再用新的配置启动服务。
CPU和GPU推理的差异也比较明显。GPU推理适合多路视频并发,单路视频时体验差距可能不大,但接入路数增多后GPU的并行优势会体现出来。CPU推理适合临时测试和预算受限的小规模场景,接入路数建议控制在1到2路。如果现场无法布置GPU服务器,可以考虑把检测模型部署到NVR设备或AI盒子,把分析能力下沉到边缘,服务器只负责汇总事件和展示,这样整个方案的部署成本和能耗会更低,但这需要硬件厂商提供对应推理框架支持。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 服务启动后页面打不开 | 端口被占用,或服务未成功启动 | 查看启动日志,检查端口状态 | 修改配置端口后重启,或kill残留进程 |
| 模型加载失败 | 模型文件未下载完整或路径配置错误 | 检查models目录文件大小,与下载页对比 | 重新下载模型文件,修正config路径 |
| 摄像头画面黑屏 | RTSP地址不可达,或账号密码错误 | 用VLC播放器测试RTSP地址能否打开 | 核对地址、账号、端口,确认网络互通 |
| 人数统计不准 | 画面光线暗、人员遮挡、阈值不合理 | 查看检测画面上人框是否正常 | 调整摄像头角度,降低检测置信度阈值 |
| 超员告警刷屏 | 没有设置告警间隔,或事件去重逻辑缺失 | 检查告警日志时间戳 | 配置alert_interval,增加事件去重 |
| GPU推理报CUDA错误 | 显卡驱动与CUDA版本不匹配 | 运行nvidia-smi和python -c "import torch" | 安装匹配的驱动版本,或切换CPU推理 |
| API返回401 | Token过期或未带请求头 | 检查请求Header和token配置 | 重新生成token,确认Authorization格式 |
| 批量任务中途卡住 | 某个请求超时,任务无重试机制 | 查看任务日志中最后处理的房间 | 增加请求超时和重试逻辑,单任务失败不阻塞队列 |
| 服务重启后数据丢失 | 数据库文件路径没配置或没有持久化 | 检查SQLite文件是否写入本地磁盘 | 配置数据库路径,Docker部署时挂载数据卷 |
这些问题的共同特点是:不要直接改代码,先看日志。日志里通常会明确提示是模型问题、网络问题还是权限问题。把日志里的关键字带进搜索引擎,90%的问题都能找到原因。排查时建议执行顺序是:日志 -> 配置 -> 网络 -> 模型 -> 代码依赖,而不是一上来就怀疑算法精度。实际运行中,很多“人数统计不准”的问题根源是摄像头安装角度不佳,或者RTSP拉流分辨率过高导致分析帧太卡,这都和环境配置直接相关。
10. 最佳实践与使用建议
第一,先小参数测试。第一次部署时,只接1路测试视频,用720P分辨率,推理频率设置为每秒1帧,人数阈值设一个明显低于实际人数的值,确认事件能触发,再逐步提高帧率和接更多路摄像头。这样的好处是出现问题可以快速定位,不会因为多路并发把问题混在一起。测试通过后,先把参数记录到文档里,包括模型名称、分辨率、置信度阈值、推理间隔,后续换环境时可以快速复现。
第二,保留一套最小可运行配置。把配置文件、模型文件、测试视频、启动脚本放好,复制到新环境时,先跑这套最小配置验证环境是否正常。环境和代码分开管理,模型文件不要放进代码仓库,用单独目录存储并备份。配置文件中建议把摄像头地址和WebHook Token这类敏感信息用环境变量引用,不要直接写在代码里,避免提交到Git仓库时泄密。
第三,日志和数据要区分目录。建议目录结构为logs/、data/、outputs/,日志按天滚动,事件结果可以按月份归档。批量任务必须有日志和失败重试,不然任务跑了一半停电,恢复后还要人工对账,很痛苦。事件快照图片建议统一保存为按room_id/日期/时间戳.jpg的路径格式,方便后续取图审核,也方便从数据库事件表反查现场画面。
第四,接口服务要限制访问范围。如果对外提供API,不应当把服务端口直接暴露到公网,建议只在局域网内开放,或者通过反向代理加认证。门禁联动操作接口尤其要注意权限控制,避免一个接口把整个门的权限都放开。对人脸特征、姓名、电话这类数据要加密传输和存储,人员名单导出功能要做审计。门禁控制接口应当单独分配权限角色,不能和只读查询接口使用同一个Token,防止普通查询操作被误用为控制操作。
第五,涉及人脸、声音、版权素材时必须确认授权。虽然本篇主要讲人数统计,但如果项目扩展了人脸识别能力,部署方需要提前取得居住人员的明确授权,并向租户说明采集内容和用途。测试阶段要使用模拟数据和虚拟人物视频,不要用真实住户数据进行随手验证。对外宣传时也不要强调“识别到某某人”,而是突出“统计某区域人数并及时提醒超员”,这两个方向的性质完全不同。
11. 总结与下一步
这篇内容的起点是托管房超员问题,但真正需要验证的是“人数统计能不能自动化、低成本、本地化”。一个包含视频拉流、目标检测、人员跟踪、区域计数、超员告警和API对接的系统,不需要云平台和大型算法团队支撑,普通服务器加开源组件就能搭出来。如果一定要给一个验证优先级,基础人数检测放在第一位,它决定后续告警、门禁联动、批量任务全部流程是否成立。
最容易踩的坑其实不是模型精度,而是环境适配:显卡驱动和CUDA版本不匹配、RTSP地址不可达、模型文件下载不完整,这三个问题占了启动阶段故障的大部分。真正进入稳定运行后,需要重点优化的是推理帧率和多路并发策略,保证系统在长时间运行时不掉帧、不卡死。部署验收时建议观察连续运行24小时的事件记录是否完整,而不是只看当下页面有没有画面。
后续可以扩展的方向很简单:把人数统计结果接入物业收费系统和门禁系统,实现“超员即提醒运营人员”;增加月报统计,自动分析各房间人员变化趋势;在公共区域与合规授权前提下,引入更轻量的边缘设备,把检测模型部署到NVR或AI盒子,减少服务器资源占用。这篇文章里所有命令和接口只是通用模板,实际部署时以你选择项目的文档为准;确认好模型、端口和配置路径,剩下的就是把流程跑通。如果在部署测试中遇到问题,按第九章的排查表逐步对照,基本都能找到方向。