去年我做素材处理管线时,遇到一个反复出现的情况:一段30秒的教学视频里有一串浮动字幕水印在画面右下方,位置随镜头平移而偏移。用传统NLE(如Premiere、DaVinci)去做的话,通常是把画面放大裁掉水印区域,或者用内容识别填充描出线稿再等一帧等它算。
放大裁剪的问题很直接——分辨率从1920×1080被裁到1760×960,二次拉伸后边缘出现可见的色差渐变。而NLE自带的content-aware fill(内容识别填充)本质上是逐帧独立推理:每帧裁出遮罩外接框送进模型,修完再羽化贴回画面。它没有用到相邻帧的任何信息,所以在水印区域存在透明通道、纹理有连续性的场景下(比如栏杆后面露出的蓝天),会出现帧间闪烁——同一根栏杆上一帧是连续的、下一帧突然断了一截。
这个问题的根源在于:视频去水印不是空间问题,而是时空联合恢复问题。遮罩覆盖的区域在时间轴上是连续的,相邻帧之间存在光流关系,时序信息可以提供比单帧有效得多的上下文约束。
所以我们在项目中走了另一条路:把修复拆成两遍。第一遍记录哪些帧的哪些区域需要修复;第二遍把这些区域按裁剪框送进时序修复引擎——先用RAFT计算光流完成循环光流补全,再通过特征传播和Transformer做最终画面恢复。关键区别在于,模型在恢复一个缺失像素时能看到它前后各若干帧的相关区域。
代价也很明确:时序修复的显存和CPU占用远高于逐帧方案(LaMa v1模型约200MB TorchScript),长段处理需要分块落盘,失败时必须做降级回退。如果你的场景只是去静态图片水印,逐帧方案够用;如果水印在画面内运动或有遮挡变化,时序方案的帧间一致性优势才会体现出来。
另外一点容易被忽略:时序修复的视野是有限的——RAFT光流补全±5帧、Transformer邻居±5帧。段长超过80帧时模型原本就不看全局参考,所以盲目拉长处理窗口不会提升效果,反而增加内存峰值。
本文来自抹影的开发笔记。
网硕互联帮助中心




评论前必须登录!
注册