去除视频字幕 5: 使用 ProPainter, 记录探索过程
使用 ProPainter 去除视频上的字幕,效果演示(比之前好多了。)
。
1. 项目目标
去除视频 (bear.webm
) 中的硬字幕。
2. 初始尝试与关键失败:IOPaint
- 方法: 使用
IOPaint
(一个图像修复工具)配合PaddleOCR
逐帧修复。 - 结果: 修复区域严重闪烁。
- 核心认知: 图像修复工具独立处理每一帧,缺乏时间一致性。必须使用专业的视频修复工具。
3. 正确的工具:ProPainter
- 项目来源: https://github.com/sczhou/ProPainter
- 优势: 专为视频设计,能感知帧间联系,从根本上解决闪烁问题。
4. 调试过程
-
A. 环境搭建
git clone
仓库。- 使用
conda env create -f environment.yml
创建并激活propainter
环境。 - 下载预训练模型放入
checkpoints
目录。
-
B. 数据准备:遮罩 (Mask) 的陷阱
- 问题: ProPainter 要求每一帧都必须有对应的遮罩文件。
- 解决: 我的 OCR 脚本只为有字幕的帧生成了遮罩。因此,我编写了一个辅助脚本,为所有无字幕的干净帧创建了对应的纯黑色空白遮罩,确保文件数量和帧数完全一致。
-
C. 运行报错:
ModuleNotFoundError
- 问题: 脚本无法找到
utils
等本地模块。 - 根源: 在错误的 Python 虚拟环境 (
venv
) 中运行。 - 解决: 切换到正确的 Conda 环境 (
conda activate propainter
)。
- 问题: 脚本无法找到
-
D. 硬件瓶颈:内存耗尽 (Out of Memory)
- 问题: 32GB 内存被瞬间占满。
- 根源: 脚本默认将整个视频(所有帧、遮罩、光流数据)一次性加载到内存。
- 解决: 使用 ProPainter 内置的命令行参数进行优化:
--subvideo_length [N]
: 最关键的参数。将视频切成 N 帧的短片进行分块处理,大幅降低峰值内存。我设置为20
。--fp16
: 启用半精度浮点数,内存占用减半。
5. 最终运行命令
500个图片 + 使用 fp16
python inference_propainter.py --video inputs/object_removal/resized-bear-500 --mask inputs/object_removal/resized_mask_500 --fp16
**6. 合并2个视频,对比2个视频。 **
这个命令解决了帧率不同步的核心问题
ffmpeg -i masked_in.mp4 -i inpaint_out.mp4 -filter_complex "[0:v]setpts=PTS-STARTPTS,fps=30[v0];[1:v]setpts=PTS-STARTPTS,fps=30[v1];[v0][v1]hstack=inputs=2[v]" -map "[v]" -an -c:v libx264 -crf 23 -preset veryfast -shortest both.mp4
最后说一下感受
- 视频处理,需要成本的,硬件,时间。所以,如果一个视频的质量很差,根本不值得搬运。西瓜不甜,不值得摘下来。
- 显存不够,会非常慢。只能: 减少帧数,降低图片大小,使用 fp16, 尝试云主机,目前就这几个办法。