把带人脸的视频发出去前需要遮挡,如果选择用程序来做,最大的障碍不在「怎么画框」,而在检测和追踪这条管线如何稳定跑完。
网上有一些在线打码网站,原理是把视频上传服务器后由后端跑模型、返回合成结果。对普通自拍没有太大问题;涉及企业素材、监控画面或人物肖像权时,文件离机本身就是合规风险。即使忽略隐私,网络带宽也会直接拖慢循环速度------一段十分钟 1080p 的视频,上传+推理+下载至少等几分钟到十几分钟,反复调试效率更低。
本地方案的核心管线一般分三步:
第一步是检测。常见做法是用 YOLO 系列模型做人脸检测,输出边界框。YOLOv11-m 是一个中等体量的 checkpoint,单张 1080p 推理在 CPU 上约 15~30ms(取决于硬件),GPU 能压到 3ms 左右。模型全部随包分发意味着不需要首次联网拉权重------弱网环境下不会卡死。
第二步是追踪。只在关键帧检测、中间帧靠跟踪器插值,可以大幅降低计算量。实际工程中用 BoT-SORT 比较多:先用 OCR 提取特征向量做 ReID 匹配,再用卡尔曼滤波预测下一帧位置。问题是追踪不是万能的------人脸被遮挡三秒以上或镜头剧烈晃动时,ReID 特征会失效、跟踪器跟丢。
第三步是遮罩绘制。检测到的人脸框需要转成椭圆、加羽化边缘,并把 alpha 值从半透明渐变到不透明。淡入过程很重要:刚检测到的脸如果直接上全遮罩,画面会出现「闪一下」的视觉效果。常见做法是从第 1/3 透明度开始,在连续三帧检测里慢慢抬满。
追踪管线的实际坑比想象中多------硬切转场时检测器可能漏掉切换事件,追踪状态不应当清空;ID 冲突导致旧轨数据被覆盖是最隐蔽的 bug:新的帧检测到 id=1 时,把之前 id=1 的记录整段冲掉,最终一条遮罩都没输出。
还有一个细节:OpenCV 在不同平台上的后端实现不同。macOS 上默认会用 AVFoundation 做视频捕获,它会向主线程派发回调,如果在后台线程里用 cv2.VideoCapture() 会导致死锁。解决方法是强制指定 CAP_FFMPEG backend:
python
cap = cv2.VideoCapture(path, cv2.CAP_FFMPEG)
多遍识别策略能提高小字证件号的检出率:原图跑一遍 → CLAHE(局部对比度增强)+ 锐化 + 放大 → 反色再跑。对同一帧重复送检,比直接上复杂模型更省算力。
如果处理的企业素材本身带有敏感信息(身份证号、车牌),还需要在通用人脸检测之外加一层 OCR/正则识别:macOS 可用系统级 Apple Vision framework,其他平台则依赖 EasyOCR(CRAFT 文本检测 + CRNN 文字识别管线),CPU 推理单帧约 200~500ms。证件号格式分三级正则覆盖国内身份证、美国 SSN 等常见模板。
本地处理的关键是权衡:内存占用随分辨率和模型增大而线性增长,一段视频导出时如果遮罩区域很大(比如整条长街的车牌),AI 修复算法的显存可能直接爆了。实际工程里需要按可用内存预算动态调整推理窗口大小,而不是写死的固定值。
选择本地工具的判断标准很简单:第一看依赖安装是否完整(opencv-contrib、不同平台的编译差异很容易踩坑);第二看追踪器在关键帧丢失时的恢复策略;第三看导出管线是否有完善的错误回退------模型加载失败时能否降级到传统算法而不是直接卡死。
这篇笔记的思路来自抹影的开发记录。