1、立项背景和目标:公司员工通道原有人工登记/刷卡模式存在代刷、漏登,台账靠 Excel 月底手工汇总耗时,且无法核对现场影像。为此立项建设「员工出入口管理系统」:入口、出口各部署 AI 人脸识别摄像头(人脸比对在相机本地完成,不依赖外网、不上传云端),摄像头把抓拍与识别结果通过 HTTP 实时推送到本系统,由系统统一完成留档、检索、统计与导出,形成「何人、何时、从哪个门进出」的完整电子台账;同时让本地人员档案与四台相机的人脸底库一键同步,免除逐台上门维护。
2、核心功能模块:(1)抓拍接收:对接摄像头厂商 HTTP 推送协议,解析报文、兼容秒/毫秒时间戳、幂等去重,人脸特写图压缩落盘,过期图片自动清理;(2)抓拍记录:关键词(姓名/工号/部门)与起止时间(精确到秒)检索、分页含序号、人脸缩略图与详情、摄像头属性码值中文翻译、CSV 导出、一键清空(密码二次确认);(3)本地人脸库:人员(姓名/工号/部门/照片)增删改查与检索分页,支持 Excel/CSV 名单配合按姓名命名的照片整目录批量导入,重复导入不产生重复人员;(4)相机同步:把人员资料幂等下发到入口1、入口2、出口1、出口2 四台相机人脸底库,支持单人、本页、全部待同步,逐台显示已同步/待更新/失败;(5)相机配置:四台相机 Web 地址与账号维护、一键跳转相机管理页、保存并测试连接;(6)分析报表:出入概况、人员与部门报表、24 小时及星期时段分布、外出离岗分析(在司→离厂→回厂计一次外出),报表与明细支持按区间导出。
3、业务流程与路径:摄像头刷脸→HTTP 推送→接口解析、时间归一、幂等去重→人脸图压缩落盘、记录入库→按上报 IP 映射进/出方向→管理端检索、看图、导出→报表统计在司与外出情况;人员侧流程为本地建档或批量导入→同步到四台相机→相机端刷脸通行并回传抓拍。页面路径:登录后进入抓拍记录(/)及其详情页,本地人脸库(/faces/)及批量导入、新增/编辑,相机配置(/cameras/),分析报表(/reports/)。
1、整体架构与技术栈:采用 Django 5.2 单体架构(MTV 分层:models/services/views/模板),SQLite(timeout=60,数据库与相机地址等运行数据独立存放于 data/ 且不进代码仓库),waitress 多线程 WSGI 托管,Django 模板 + 原生 JS/CSS(零前端构建,内网无外网依赖),Pillow 负责图片压缩重编码,openpyxl 解析 Excel 名单;Linux 下由 systemd 常驻(启动前自动执行数据库迁移),配合内网 Git 裸仓库的 post-receive 钩子实现 push 即自动发布、重启。
2、本人负责与结果:独立完成需求梳理、数据建模、编码、联调、部署与运维全过程。业务代码约 2700 行、模板约 4300 行、前端静态资源约 650 行,交付 1 个摄像头推送接口、10 个页面模板、2 个管理命令、28 类摄像头属性码值翻译;支持 4 台相机人脸底库同步,单次批量上限 50 人;抓拍图压缩到最长边 800px、目标 45KB,保留 30 天后自动清理而记录长期留存。系统已在公司内网服务器上线运行(systemd 托管、浏览器访问即用),替代了原有的人工台账与月底手工汇总。
3、遇到的难点与解决方案:(1)摄像头重复推送、时间戳单位不统一:以「设备号 + 时间戳 + 抓拍ID」做唯一性幂等去重,毫秒时间戳整除归一,并用数据库唯一约束兜底并发写入;(2)属性码值文档不全:独立维护码值字典(28 类),未定义码值原样保留、原始属性整体存入 JSON 字段,语义不丢失;(3)抓拍图体积拖垮磁盘:重编码压缩(最长边 800、目标 45KB,质量从 88 逐级下调直至达标)+ 按日期归档 + 借推送流量低频惰性清理(间隔不小于 6 小时)并由管理命令兜底,只清图片不清记录;(4)相机底库同步易重复建档:按「相机内编号→工号→姓名」三级匹配,用同步状态表记录每人每台相机的编号,批量同步复用登录会话,单台相机异常不影响其他相机,相机必填的性别/年龄沿用相机原值兜底;(5)同一通行多帧推送导致统计虚高:同一人 45 秒内连续同向的多帧合并为一次通行,在司时长只累计成对进出,离厂超过 8 小时不计为中途外出;(6)服务器无外网、不能在线装依赖:内网裸仓库 + 钩子自动部署,data/、media/、.venv/ 全部纳入忽略清单,更新与回滚都不触碰运行数据;(7)现场需求持续变更(表格样式、时间精度到秒、相机由 2 台扩到 4 台):相机槽位、码值、图片保留策略全部做成配置驱动,新增相机只改槽位定义与字段枚举迁移,无需改动表结构。