045、超分在安防监控:人脸与车牌超分的挑战与解决方案 📅 2026/7/4 11:42:48 045、超分在安防监控人脸与车牌超分的挑战与解决方案去年秋天我蹲在派出所机房调试一套老旧监控的超分系统屏幕里那个嫌疑人的人脸糊得像打了马赛克——不对马赛克都比这清晰。旁边民警大哥递了杯浓茶“兄弟能把这玩意儿弄清楚点不就这一帧有正脸。”我盯着那128x128的像素块心里清楚这不是单纯放大图像的问题是跟物理极限、噪声、运动模糊、压缩伪影打架。监控场景下的“坑”比想象中深先说说人脸超分。安防监控的人脸跟网上那些高清自拍完全是两码事。你拿CelebA数据集训练出来的模型扔到实际监控画面里效果直接崩盘。为什么因为监控人脸有几个致命特点分辨率极低。很多老摄像头输出的人脸区域只有20x20到40x40像素。我试过用EDSR直接4倍超分结果出来的脸像被揉过的面团五官位置都对但细节全是一团浆糊。这里踩过坑——别以为SRResNet的PSNR高就能用PSNR在极低分辨率下就是个笑话它更在意像素值接近而非感知质量。运动模糊失焦。嫌疑人快速转头或者摄像头自动对焦没跟上人脸就是拖影。我处理过一个案子关键帧的人脸横向模糊了十几个像素。普通超分模型看到这种输入会试图“修复”模糊但往往修复出错误的面部特征——比如把单眼皮修复成双眼皮这在法庭上是要出问题的。光照极端。夜间监控的补光灯打在脸上一半过曝一半死黑。我见过最离谱的情况人脸左半边亮度255右半边亮度5。超分模型在这种动态范围下高光区域会炸出伪影暗部则直接丢失纹理。车牌超分则是另一套难题。车牌字符是结构化信息错一个数字就全完。我调试过一套车牌超分系统在测试集上准确率95%一上真实场景直接掉到60%。排查后发现测试集里的车牌都是正对摄像头、光照均匀的而真实场景里车牌可能歪斜30度、被泥巴糊住一半、或者反光到字符完全看不清。技术方案别想着一个模型通吃针对人脸超分我最终采用的方案是退化感知的级联网络。别被名字吓到思路很简单先判断输入图像的退化类型模糊、噪声、压缩再针对性超分。具体实现上我写了个退化分类器作为前置模块# 这里踩过坑别把退化分类和超分网络分开训练# 联合训练才能让分类器关注超分真正需要的特征classDegradationAwareFaceSR(nn.Module):def__init__(self):super().__init__()# 共享特征提取避免重复计算self.shared_encoderSharedEncoder()# 三个分支分别处理不同退化self.blur_branchBlurSRBranch()self.noise_branchNoiseSRBranch()self.compress_branchCompressSRBranch()# 退化分类器输出softmax权重self.deg_classifierDegradationClassifier()defforward(self,x):featuresself.shared_encoder(x)# 别这样写直接取argmax选一个分支# 真实场景退化是混合的用软权重融合更好weightstorch.softmax(self.deg_classifier(features),dim1)blur_outself.blur_branch(features)noise_outself.noise_branch(features)compress_outself.compress_branch(features)# 加权融合outweights[:,0:1]*blur_out\ weights[:,1:2]*noise_out\ weights[:,2:3]*compress_outreturnout这个结构有个好处每个分支可以针对特定退化做优化。比如blur_branch我用了deblurSR的联合结构noise_branch加了非局部均值去噪模块。训练时我模拟了监控场景的退化pipeline先下采样加高斯模糊模拟失焦加运动模糊模拟抖动加泊松噪声模拟低光照最后JPEG压缩模拟传输损失。车牌超分我走了另一条路——字符感知的注意力机制。车牌字符是离散的你不能像处理自然图像那样平滑地超分。我参考了文本超分的思路在超分网络里嵌入一个字符识别器作为辅助监督# 注意这个字符识别器只在训练时用推理时去掉classLicensePlateSR(nn.Module):def__init__(self):super().__init__()self.sr_backboneRCAN()# 用RCAN做基础超分# 字符注意力模块让网络关注字符区域self.char_attentionCharAttention()# 辅助字符识别器训练用self.char_recogCharRecognizer()defforward(self,x,is_trainingTrue):sr_featself.sr_backbone(x)# 生成字符注意力图attnself.char_attention(sr_feat)# 注意力加权sr_outsr_feat*attnsr_feat# 残差连接保留背景ifis_training:# 别这样写直接用sr_out做字符识别# 应该用注意力加权后的特征但保持分辨率不变char_featF.interpolate(sr_out,size(48,192),modebilinear)char_predself.char_recog(char_feat)returnsr_out,char_predreturnsr_out训练时我同时优化超分损失L1感知损失和字符识别损失CTC loss。这样网络会自动把更多计算资源分配给字符区域背景区域则“差不多就行”。实测下来字符识别准确率从60%提升到了85%。实战中的那些“玄学”调参说几个实际调试中遇到的坑损失函数权重。人脸超分我用的是L1感知损失GAN损失比例1:0.1:0.001。别问为什么是这个比例试了二十组实验试出来的。GAN损失权重大了人脸会出现奇怪的纹理像皮肤上长了鳞片权重小了又不够锐利。车牌超分我干脆没用GAN因为GAN生成的字符可能“看起来像”但实际不对——比如把“8”生成成“3”人眼可能觉得差不多但车牌识别系统会报错。数据增强。监控场景的数据增强不能乱来。我见过有人把训练数据随机旋转90度结果模型学傻了——监控摄像头哪有倒着拍的我的数据增强pipeline随机裁剪保持人脸居中、颜色抖动模拟不同摄像头色彩偏差、高斯模糊模拟失焦、运动模糊模拟抖动。注意不要用随机翻转因为车牌文字方向是固定的。推理速度。安防场景要求实时或准实时。我试过用SwinIR做人脸超分效果确实好但一张图要跑2秒。后来换成ESPCN轻量级注意力速度提升到30ms效果虽然差一点但够用。这里有个经验监控超分追求的是“能看清”而非“完美”PSNR差个0.5dB在实际使用中根本看不出来。个人经验别迷信论文里的指标做了两年监控超分最大的感悟是论文里的PSNR/SSIM跟实际效果是两码事。我见过一个模型在Set5上PSNR 32dB放到监控画面里人脸像鬼片另一个模型PSNR只有30dB但实际效果反而更好。为什么因为论文数据集是理想退化的监控场景的退化是复杂且非理想的。我的建议做监控超分一定要建立自己的测试集。从实际监控录像里截取1000张人脸、500张车牌人工标注清晰版本可以用多帧融合或者同场景高清摄像头拍摄。用这个测试集评估比任何公开数据集都靠谱。另外超分不是万能的。如果原始人脸只有10x10像素再好的超分也救不回来。我现在的做法是先判断输入质量低于某个阈值直接提示“无法超分”而不是强行生成一个假脸。这在司法场景里尤其重要——你生成的人脸不能作为证据但清晰化后的真实特征可以。最后说个题外话做监控超分一定要跟一线民警多聊聊。他们知道哪些场景最需要超分哪些特征最关键。我有个案子就是民警提醒我“注意耳朵轮廓”因为嫌疑人耳朵有个明显特征。从那以后我的模型专门加了个耳朵超分模块。技术服务于实战别闭门造车。