ProPainter 可以根据蒙版对视频区域进行生成式修补。实际操作要先让每个画面的蒙版准确覆盖目标,再运行推理,最后检查物体消失后是否留下闪烁、重影或不合理背景。它不是从被遮挡区域找回真实画面。
本页以固定摄像机拍摄的自有桌面短片为学习示例,演示为每帧保存黑白蒙版。依据 2026 年 10 月 1 日核对的项目 README 与代码编写,未下载模型运行、未验证显存和去物体效果。项目代码与模型明确限非商业用途;商业用途须先取得额外授权,不能直接套用这份学习配置。

先核对许可和运行前提
官方 README说明代码与模型使用 NTU S-Lab License 1.0,限制非商业用途;许可文件给出商业授权联系办法。先确认这与你的用途相符,再配置 Linux/WSL、Conda 与可用 GPU。
git clone https://github.com/sczhou/ProPainter.git
cd ProPainter
conda create -n propainter python=3.8 -y
conda activate propainter
python -m pip install -r requirements.txt
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
ffmpeg -version
Python 3.8 按项目示例选用,不代表新环境一定兼容。依赖文件没有锁定全部版本,安装后还要核对 PyTorch、torchvision 和 CUDA;不把 pip 结束当成推理已验证。首次运行会需要 ProPainter、循环光流补全和 RAFT 权重,按 README 下载到 weights,或允许其下载流程联网。
提取短片帧,并保持顺序一致
先截取一段约 3 秒的自有片段,保存为 clip.mp4,内容是固定桌面与不移动的小物体。下面按 24 fps 提取帧,保持比例缩放并补边至 432×240;蒙版坐标要按补边后的帧图确定。学习目录中只放这一轮 PNG,不混入旧帧。
mkdir -p inputs_demo/frames inputs_demo/masks
ffmpeg -i clip.mp4 -t 3 -vf "fps=24,scale=432:240:force_original_aspect_ratio=decrease,pad=432:240:(ow-iw)/2:(oh-ih)/2" inputs_demo/frames/%05d.png
推理源码会分别按文件名字典序读取帧目录和蒙版目录,不根据“看起来相似”自动配对。使用 00001.png、00002.png 这样的等长编号,使顺序和时间一致。
为每帧保存蒙版,并先核对位置
白色表示要移除、黑色表示保留。对于本例中不移动的物体,可以在每帧复制同一选区;若物体或相机移动,就必须逐帧调整白区,不能沿用固定矩形。目标的影子也需要根据用途纳入编辑范围,否则可能留下明显痕迹。
保存下面代码为 prepare_masks.py,修改 box 坐标使它覆盖你的小物体,再运行。这里的坐标只是教学示例;在 432×240 的帧图上检查左、上、右、下的位置。
from pathlib import Path
from PIL import Image, ImageDraw
frames = sorted(Path("inputs_demo/frames").glob("*.png"))
if not frames:
raise ValueError("帧目录为空")
target = Path("inputs_demo/masks")
target.mkdir(exist_ok=True)
if any(target.iterdir()):
raise ValueError("请使用空蒙版目录,避免残留文件")
box = (120, 80, 210, 190) # 根据自己的每帧目标位置修改
for source in frames:
with Image.open(source) as image:
if image.size != (432, 240):
raise ValueError(f"尺寸不一致: {source}")
mask = Image.new("L", image.size, 0)
ImageDraw.Draw(mask).rectangle(box, fill=255)
mask.save(target / source.name)
if [p.name for p in frames] != [p.name for p in sorted(target.glob("*.png"))]:
raise RuntimeError("帧与蒙版名称不一致")
print("帧与蒙版各", len(frames), "张")
打开第一帧、中间帧和最后一帧,对照同名蒙版;白区必须一直覆盖目标而不误盖旁边主体。随后逐帧扫过物体边缘。源码可能继续扩张蒙版边缘,默认 mask_dilation 为 4;这会扩大修补范围,所以贴得过近的重要内容要提前检查。
运行推理,并查找实际结果
python inference_propainter.py --video inputs_demo/frames --mask inputs_demo/masks --output results_demo --save_fps 24 --width 432 --height 240 --fp16 --save_frames
这里用图像序列作为输入,所以显式设 save_fps=24,与提取时一致;若不设置,源码的序列默认也是 24,但不要在更换帧率后忘记同步。–fp16 是降低内存占用的尝试选项,不保证 GPU 都兼容,也不保证固定显存就能运行。
按当前源码,结果应在 results_demo/frames/ 中,包含 masked_in.mp4 和 inpaint_out.mp4;前者可检查实际覆盖区域,后者是修补结果。–save_frames 还保存输出帧,方便细查。目录名来自输入帧目录的名字,换目录时路径也会变。
检查连续画面,不只看一帧
先播放 masked_in.mp4,确认被编辑的位置正确;再播放 inpaint_out.mp4,重点盯住被删除物体周围的纹理、桌面线条和其他移动物体。最后逐帧检查镜头开始、结尾和遮挡变化处,寻找背景跳动、物体残影和边缘“呼吸”。
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=width,height,avg_frame_rate,nb_read_frames:format=duration -of json results_demo/frames/inpaint_out.mp4
帧率应与本例提取时的 24 fps 对应,帧数应与帧目录数量对应;时长按帧数除以帧率检查。再用播放器确认可解码。输出是一段由帧写出的无声视频,原音轨不会由本例序列输入自动带回来;需要声音时先检查时长一致,再另行封装音轨。
- 移除错位置:先修正同名蒙版与帧顺序,不先换随机参数。
- 影子残留:扩大白区覆盖影子,但避免侵入需要保留的物体。
- 显存不足:先用更短、更低分辨率的片段检查流程,按 README 调整子视频与邻帧参数;仍失败就记录设备边界。
- 背景扭曲:原视频没有足够可用背景时,修补只能推测。保留原片,缩小编辑目标或改用重拍。
这套检查通过,也只表示生成结果满足你的视觉用途,不能证明隐藏区域原本就是这样的。用在纪实材料时需要说明生成式编辑;用于商业生产前,先处理项目的授权限制。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31957.html