安防监控里的目标检测,听起来就是目标检测,真正下场做两个项目,你会发现它跟公开数据集上的玩法根本不是一回事。首先,你不会有无穷无尽的训练卡可用,运算终端大多是一台台算力只有几个 Tops 的边缘盒子;其次,画面里出现的多半是几十个像素大小的目标,还得在夜间、逆光、雨雾天候下工作;最后,客户真正关心的不是模型指标,而是漏报、误报、报警延时要同时达标。
这篇文章是我把几个监控项目里的真实经验汇总起来的一份方案思路梳理,从系统架构选型、模型取舍、数据标注、推理优化,再到夜间低照度、逆光、小目标这些监控场景里的硬骨头,一步步说清楚我踩过的坑和现在更倾向的做法。无论你是刚接手一个监控智能化项目的开发者,还是想把已有算法往边缘设备上迁移的工程负责人,这份总结应该能帮你少走不少弯路。
1. 监控场景的目标检测,和通用检测根本不是同一道题
很多人拿通用目标检测的思路直接套安防监控,第一版往往跑不通。原因不是模型不够强,而是监控场景的约束条件跟普通图像识别差得太远。
1.1 固定视场角下,模型面对的场景复杂度却不低
摄像头装好之后,视角、焦距、朝向基本固定,看起来环境比自动驾驶简单。但实际上,监控画面的场景复杂度一点都不低:同一台相机,凌晨、正午、黄昏的光照完全不一样;晴天和雨天的背景纹理不一样;树叶晃动、水面反光、灯光直射这些动态干扰,在画面里持续存在。
更麻烦的是不同点位之间的差异极大。车间通道、小区出入口、园区周界、地下车库、电梯轿厢,这些场景的目标姿态、遮挡模式、背景复杂度差异很大,一个模型很难在所有点位都保持稳定效果。实际项目里经常要按点位分组训练或者做场景化调优,而不是训练一个“万能模型”就万事大吉。
视角高度也是个大变量。同一类目标在2米高的枪机画面里和在10米高的球机画面里,外观差别很大。你说“人”是一个类别,但俯视视角下的人头和正面全身的人,特征分布完全不同。这些都要在数据阶段就纳入考量。
1.2 小目标占比极高,尺度分布严重倾斜
通用目标检测数据集里的目标通常占据画面较大面积。监控画面则相反,大量目标出现在中远距离,像素可能只有二三十个。一个身高1米7的人,在1080P画面里、大约30米外的横向宽度只有20到30像素,几乎就是一个噪点一样的块。
这就导致监控场景的目标尺度分布是严重倾斜的。小目标数量占比可能超过一半,而通用检测模型对小目标的召回率本来就比中大型目标差一大截。如果只是在公开预训练模型上微调,不对小目标做专门优化,实测结果一定很难看。
1.3 漏检和误报的代价并不对称
通用检测竞赛里,漏检和误报都算错,权重差不多。但安防业务里,这两者的代价严重不对等。
人员入侵漏报,可能直接导致安全事故,这是不能接受的;而目标误报,比如把树影晃动识别成人,最多是多推送一条报警,客户会烦躁,但不会出大事。所以做监控项目时,调优方向往往不是单纯追求mAP,而是先保证召回率,再尽量压低误报率。
不同报警类型的容忍度也不一样。周界入侵更看重召回,越界检测对位置精度要求高,人员聚集则更关注密度估计的准确性。这个逻辑要在模型设计和后处理规则阶段就想清楚。
1.4 算力与带宽是绕不开的紧箍咒
监控项目通常不是一台机器跑一路视频,而是几十路甚至几百路并发。每路720P或1080P视频,按25帧每秒传输,解码、缩放、推理、跟踪串起来,算力分摊到每路可能只有个位数GFLOPs的预算。
带宽也是成本。24小时不间断把高清码流传回中心机房,网络投入和存储投入都很高。所以很多项目要求前端做一部分检测,只把报警时刻的截图和事件信息回传。这个限制直接决定了算法能不能上、上多大模型。
2. 先定架构再挑模型:边缘、集中、两级混合怎么选
架构是方案的第一步,它决定了后续所有技术路线的边界。我见过不少团队先选了一个好模型,最后发现目标设备根本跑不动,推倒重来的不在少数。
2.1 边缘端部署:低延迟、省带宽,但算力预算很紧
边缘端方案是指把检测模型部署在摄像头附近的设备里,比如装有专用芯片的智能盒子,或者直接在摄像头内部署模型。优点是延迟低,画面在本地点完;带宽占用极小,只上报报警事件;隐私性也更好,原始视频不出本地。
但边缘端的算力非常有限。一台中等偏上的边缘设备,算力也就十几到几十Tops,还要同时跑多路视频。对应的检测模型必须很小,通常只能用轻量级网络加低分辨率输入,精度上限受限。如果场景复杂、要求高识别率,边缘端不一定扛得住。
2.2 集中式分析:看起来省心,实际上有大量隐性成本
集中式方案把所有视频流拉到中心服务器,由GPU集群统一检测。优点是算力充裕,可以上更好的模型,方便统一升级维护;缺点是延迟高,受网络波动影响,而且基础设施建设成本高。
还有一个很容易被忽略的问题:集中式的视频流解码非常吃资源。GPU做推理很快,但把几十路H.264/H.265码流从网络拉下来、解码成YUV、缩放到模型输入尺寸,这一整套IT管线比推理本身还容易成为瓶颈。很多人项目卡在“GPU利用率低”上,其实不是推理引擎的问题,是数据喂不进去。
2.3 两级混合:我目前最推荐的一条稳定路径
我目前更倾向于两级混合方案。前端跑一个非常轻量的检测或运动感知模型,负责快速过滤画面,判断“大概有目标出现”,然后把裁剪后的区域或关键帧传回后端;后端用更强大的模型做精确检测、目标跟踪和事件确认。
这么做的好处很明显:前端省带宽、低延迟,后端又能在关键时刻发挥大模型精度优势。误报可以在后端被二次确认压掉,漏报则靠前端尽量兜底。实际项目中,这个架构的稳定性和性价比都比较高。
2.4 架构参数测算:先算账再做决定
做架构决策前,一定要先做一轮数学估算。以1080P、25帧、H.265编码为例,一路视频码率按2Mbps算,一天产生的数据量大约是21GB左右。100路设备就是2TB以上的日增量存储和传输成本,这个数字会让很多团队重新考虑边缘计算的价值。
三种架构的基本对比:
| 方案 | 平均延迟 | 带宽占用 | 单路算力预算 | 综合成本 |
|---|---|---|---|---|
| 边缘端 | 低 | 极低 | 低 | 硬件成本较分散 |
| 集中式 | 较高 | 高 | 高 | 服务器和带宽投入大 |
| 两级混合 | 较低 | 低 | 前端低,后端高 | 均衡,易扩展 |
先把这个表对照业务需求算清楚,再谈选什么模型。架构错了,后面再努力也是白搭。
3. 模型选型:比 mAP 更重要的四个部署问题
模型选型阶段,很多人第一反应是看mAP排行榜。但实际项目里,模型能不能落地,更多取决于部署维度的限制。
3.1 单阶段、两阶段、Transformer 类模型的路况差异
单阶段检测器(比如 YOLO 系列、SSD 这一类)目前是监控落地的主流。它们把分类和回归放在一个网络里直接完成,速度快,工程化成熟,边缘设备上优化生态也好。对监控这种类别数量少、实时性要求高的场景来说,性价比最高。
两阶段检测器(比如 Faster R-CNN 这类)精度更高,尤其对遮挡、密集场景更稳,但速度慢,推理引擎优化不如单阶段方便。我的经验是,可以用在中心端做二次确认,不太适合前端实时跑。
Transformer 结构的检测器在公开榜单很强,但部署有不少现实问题:模型体积大、内存占用高、量化难度大,在许多边缘推理引擎上的支持也不完善。目前只适合算力很充裕的中心端场景。
三条路线的对比很清楚:
| 模型路线 | 精度 | 速度 | 量化难度 | 监控落地成熟度 |
|---|---|---|---|---|
| 单阶段检测器 | 中高 | 快 | 低 | 高 |
| 两阶段检测器 | 高 | 慢 | 中 | 中 |
| Transformer类 | 高 | 较慢 | 高 | 低 |
3.2 轻量模型的核心不是“变小”,而是结构化的选择
监控项目经常要上轻量模型,但轻量化不是简单地把大模型缩小。我见过有人把主干网络的通道数砍到原来的四分之一,结果精度掉得一塌糊涂。问题在于,盲目的宽度压缩牺牲了特征表达,而监控场景又偏偏需要小目标检测能力。
更值得做的轻量化是结构性调整:替换主干为计算量更小的卷积组合,保留多尺度特征层,优先保证中远距离目标感受野。这比单纯压缩通道数更合理。
3.3 先搭一条可回滚的 Baseline,再谈优化
我的建议是,不要一上来就追求极致精度。先选一个工程生态最成熟的单阶段中号模型,比如输入分辨率设定为1280像素,批次大小1,把整条链路跑通,记录精度和延迟基线。这条基线作为后续优化的参照物。
之后按照收益递减的顺序做优化:先量化,再调输入分辨率,最后再替换网络结构。每一步都回到基线去对比,出了问题随时回滚。这样做虽然保守,但项目风险可控。
3.4 输入分辨率比模型浮点运算量更能影响小目标召回
监控项目里,提高输入分辨率往往比更换大模型带来的收益更明显。这是因为监控画面里大量小目标对分辨率非常敏感。同样是0.5mAP的模型,输入从640提高到1280,小目标召回率可能提升好几个百分点,但计算量会涨好几倍。
所以,调分辨率一定要跟算力预算一起评估。很多边缘设备能把416或640输入跑得很好,上到960就开始掉帧。先对需求点位做分辨率敏感性测试,再定合理输入尺寸,是这个阶段最重要的事。
4. 数据和标注:监控项目真正的天花板在这里
模型再好,没有对应的数据也是白搭。监控项目的数据问题,比大多数人想象中严重。
4.1 数据来源与标注规范的建立
监控数据通常要从实际点位采集。要覆盖不同时段(白天、黄昏、夜晚)、不同天气、不同相机高度。光靠公开数据集远远不够,公开数据里的场景分布跟实际点位差异很大。
标注规范要在动手前定死。比如“人”这个类别,被遮挡一半算不算?骑电动车的人和推自行车的人怎么分?模糊到看不清的算不算目标?这些规则不统一,标注质量必然失控,模型训练效果也会受到直接影响。
4.2 场景化增强比在线增强更值钱
训练模型时大家都会做数据增强,但监控场景有一个特点:在线增强的随机策略(随机翻转、随机裁剪、色彩抖动)虽然通用,却不能真正解决监控里的难点。
更有价值的做法是场景化增强:把白天样本调暗模拟夜间,加高斯噪声模拟低照度,加模糊模拟雨天镜头沾水,做局部遮挡模拟树枝干扰,甚至叠加反光、灯光光晕。这些增强应该围绕监控画面的常见噪声模型来做,而不是无脑堆叠随机策略。
4.3 训练集和验证集的划分有一个隐藏雷区
监控视频是时间连续帧,直接随机划分训练集和验证集,很容易出现同一段视频里相似画面同时出现在两边的情况,测出来的指标虚高。正确做法是按摄像头划分,甚至是按时间段划分,保证验证集的场景跟训练集有真正的分布差异。这样才能看出模型在未见点位上的真实泛化能力。
我踩过这个坑:当时玩数据集混在一起划分,验证集mAP有0.85,换到实际新点位一测只有0.4。问题的根源就是把同一摄像头不同时间段的帧同时放进了训练集和验证集,模型“记住”了场景。
4.4 用数据闭环对付难例
监控模型上线后,最大的价值不是它能跑,而是它能产生大量难例。把这些难例收集起来,回灌到训练集里重新训练,是最有效提升模型的方式之一。
实际操作上,我会在系统里加一个负样本回流通道:把误报截屏存下来,定期人工简单标注“这不是目标”,把漏报的目标重新补标出来,然后合并进训练集。如此循环三四轮,模型的现场表现会有肉眼可见的提升。
5. 推理优化与部署排障:从模型到产品的最后一公里
模型训完只是开始,部署优化是决胜局。这一节分享几个在项目中反复出现的技术关键点。
5.1 INT8 量化:精度账要这么算
边缘设备和部分推理引擎都支持 INT8 量化,可以把模型体积缩小到原来的四分之一,推理速度提升明显。但量化几乎必然带来精度损失,关键是损失的多少能不能接受。
我的经验是,在监控场景中直接全局量化往往会让小目标检测效果明显变差。处理办法是先用代表性的校准集做量化,评估精度变化,找到掉点最严重的那几个网络层,把这些层保留为FP16精度计算,其余层继续用INT8。这样速度几乎不变,精度损失可控。量化不是一次做完就完事,模型更新后要重新评估一次。
5.2 解码和预处理经常吃掉一半预算
在做监控项目的排障时,最常遇到的问题不是推理慢,而是整条链路慢。我碰到过一个项目,GPU利用率看起来只有40%,以为是模型优化不到位,后来才发现瓶颈在网络拉流和解码环节。
解法是尽量把解码、缩放、色域转换、归一化这些前置步骤都放在专用硬件或者预分配的内存管线里,避免每一步都做一次内存拷贝。我用了一个简单的流水线:解码线程负责拉流和解码,预处理线程负责缩放和归一化,推理线程只做模型计算,三个线程通过锁帧缓冲队列串起来,吞吐量直接翻倍。
5.3 多路并发的真实瓶颈往往是内存带宽
单路跑得好,不代表多路并发没问题。监控项目动辄几十路上台,内存带宽经常会先于计算能力耗尽。
多路并发时,每个线程都要分配输入输出缓冲,内存占用呈线性增长,且频繁的分配和释放还会带来碎片和抖动。我的做法是启动时统一预分配内存池,各路视频复用缓冲;批次大小调成2到4的倍数,让 GPU 或 NPU 的计算单元尽量打满。不少项目在这样调整之后,整体算力利用率提高明显。
5.4 压测别只看单路算力
验收测试最好模拟真实条件:多路视频并发运行,连续跑12到24小时,观察CPU占用、内存增长、报警延迟的变化,别只看单路推断延迟。长期运行中很常见的问题是内存慢慢涨上去了,或者推理线程被解码线程拖到卡死,这些只有通过长时间压测才能发现。
6. 夜间、逆光、小目标:躲不开的三块硬骨头
监控场景最让人头疼的三个问题就是低照度、逆光和小目标。这三个问题互相纠缠,没有一招制敌的解法,必须多管齐下。
6.1 低照度场景:图像增强和处理增强要分清主次
一说到夜间检测,很多人第一反应是做图像增强,把暗画面调亮。但单纯调亮会放大噪点,噪点多了模型反而更容易误报。比这更重要的,是保证训练数据里本身就有大量夜间样本,让模型学会在暗光下提取特征。
还有一个工程细节:很多相机有日夜切换机制,白天是彩色模式,晚上切红外或黑白模式。这个切换瞬间画面特征突变,模型容易产生一阵子抖动报警。处理办法是白天和夜间分别维护模型,或者至少做模型输入适配,确保切换瞬间不误报。
6.2 逆光与强动态范围:图像参数设置会影响模型输入
逆光场景里,人站在强光前面,脸部是黑的,轮廓周围是高光溢出。相机开启宽动态功能可以兼顾亮部和暗部细节,但宽动态处理会增加延迟、可能带来拖影,对运动目标反而有害。
最佳做法不是把宽动态调到最大,而是针对点位做参数标定。对比开与关宽动态两种模式下的检测效果,选择一个折中值。某些情况下,对重点区域做手动感兴趣区域曝光,比全局宽动态更有效。
6.3 小目标漏检:从分辨率和区域设计两头入手
小目标漏检是监控中最难受的问题。从算法侧来说,提高输入分辨率是最简单直接的思路,但它受算力约束。一个更精细的做法是区分区域:画面中只有一小块区域是重点检测区域,其余区域属于较低优先级,可以用较低分辨率处理或者直接忽略。
有些相机支持电子放大,在重点区域大幅放大后再送进模型,相当于在不增加全局分辨率的情况下增加了目标像素。这个做法在一些周界项目里效果非常好。
6.4 工程手段与算法互相补位
算法再强也扛不住所有恶劣场景,工程手段的补位同样重要。比如在周界检测里,先用运动检测把静态画面过滤掉,只有画面中出现运动目标时才启动检测模型,既省算力,又减少了静态背景的误报。
又比如,把传送带、树木晃动、水面反光等容易误报的区域用掩膜排除掉,只用掩膜外的区域做检测,往往能去掉一半以上的误报。工程手段和算法优化结合,才是监控项目稳定运行的保证。
实际上,每个项目都会遇到它独有的怪问题。我的体会是,先把架构分清楚、数据闭环跑起来、量化优化一步步做,再把夜间、逆光、小目标这几个顽疾用组合拳应对,大部分安防监控检测项目是可以稳定交付的。如果你也正在做类似的东西,建议从一条可回滚的基线开始,拿数据说话,一步一步往上走。