使用 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, 嘗試云主機,目前就這幾個辦法。