简易视频人像背景AI替换

用 Python 给视频换个背景

一个基于 RVM 的抠像小工具!

最近折腾了这么个小工具:把视频里的人像抠出来,换成你指定的背景图,同时把原来的声音原样保留。不用绿幕,不用一帧一帧手动描,丢进去一批视频就能批量出片。

写它的起因挺简单——手头有些固定机位拍的视频,背景乱七八糟,想换成干净一点的图。网上抠像工具要么要钱,要么只能处理图片,要么在线的传视频又慢又担心隐私。于是干脆自己vibe coding撸一个,能本地跑、能批量、速度快就行。

它到底在做什么

一句话:对每一帧,模型先判断”这个像素属于前景的概率是多少”,得到一个透明度遮罩(alpha),再用这个遮罩把原画面和背景图按比例叠在一起。

核心公式就一行:

1
com = fgr * pha + bg * (1.0 - pha)
  • fgr:模型算出来的前景颜色
  • pha:每个像素的透明度(0 到 1)
  • bg:你想换上去的背景图

透明度高的地方保留原画面,低的地方露出背景,中间过渡的部分两种混着来,边缘才不会硬邦邦。

抠像模型用的是 Robust Video Matting(RVM)。它和很多”一帧一帧独立处理”的抠图模型不一样的地方在于:它是有记忆的。它会把上一帧的信息传给下一帧,所以同一段视频里人物的边缘是连续的,不会这一帧飘、下一帧抖。这对视频来说很关键,否则看着像抽风。

仓库里有两个版本:

  • liteV1.py:用轻量的 MobileNetV3 骨干,代码直白好读,适合先看懂流程。
  • commonV2.py:用 ResNet50 骨干,加了锁页内存、异步拷贝那一套优化,主打高吞吐,4K 也能压。

流水线是怎么搭的

整个处理是一条生产者—消费者式的多线程流水线,大致是这样:

1
2
3
视频文件 → 解码线程 → 内存池 → 主线程(GPU推理+合成) → 内存池 → 编码线程 → 成品

最后把原音频合并进去

拆开说:

  1. 解码:用 FFmpeg 把视频解成原始的 RGB 帧(性能版直接走 CUDA 硬件解,零拷贝)。
  2. 输入内存池:预先申请好一批锁页(pinned)内存块排成环。解码线程往里填,主线程从里取,两边不用互相等。
  3. GPU 推理合成:主线程把帧搬上显卡,在 GPU 上顺手把颜色空间转换、归一化这些预处理也做了,然后跑模型、和背景图合成。
  4. 编码:成品帧交给 FFmpeg,用 N 卡自带的 NVENC 硬件编码器写成视频文件(显存不够或报错可以退回到 CPU 的 x264)。
  5. 合音频:最后再跑一次 FFmpeg,把原视频的音轨以”流复制”的方式(-c:a copy)无损拼回去,不重新压缩,所以声音不会有损。

几个踩过、也填上的坑

说”高性能”容易,真正跑起来全是细节。这里记几个:

  • 4K 下管道短读:大分辨率的一帧体积很大,从 FFmpeg 管道里读的时候经常会一次读不满一整帧(系统叫 short read),直接拿来用画面就错位了。处理办法是用 memoryview 循环补读,直到凑够一整帧才往下走。
  • 异步拷贝导致的画面撕裂:帧从 GPU 写回 CPU 内存是异步的,如果 CPU 这边刚拿到指针就提前回收,画面就会花。加一句 torch.cuda.synchronize() 等 GPU 真正写完再动内存,就稳了。
  • 零拷贝:用锁页内存 + 环形队列,省掉了 Python 层每帧创建和销毁对象的开销,4K 这种大帧收益很明显。

怎么跑起来

环境前提:一块 NVIDIA 独显(4K 建议 8G 显存以上)、系统装好 FFmpeg 并加进 PATH、PyTorch 带 CUDA 版本。

依赖:

1
2
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install opencv-python numpy tqdm

用法:

  1. 把要处理的视频丢进 input_videos/(支持 mp4、mov、avi、mkv 等)。
  2. 准备一张 bg.jpg 放在脚本同级目录,作为统一替换的背景。如果你的视频是固定机位,可以截一帧进 PS 把人抹掉、只换你要改的背景物体,这样透视最自然。
  3. 跑脚本,它会自动扫描并批量处理:
1
2
python commonV2.py    # 要速度、要 4K 用这个
python liteV1.py # 想先看懂流程、机器配置一般先用这个

几个能调的参数都在脚本头部配置区:USE_NVENC(N 卡硬件编码开关,报错就关掉)、QUEUE_SIZE(内存池深度,显存大就调高)、BG_IMAGE_PATH(背景图路径)等。

中途想停,按 Ctrl+C 就行,程序会清干净内存再退出,不会留僵尸进程。

它适合谁,以及它的局限

适合:固定或接近固定机位拍的视频、想把背景换成干净图片或统一底色的场景、本地批量处理、对隐私有要求不想传云端的。

局限也得说清楚:

  • 必须 N 卡 + CUDA,纯 CPU 基本跑不动视频。
  • RVM 对复杂发丝、半透明这类细节能处理,但不是完美的,边缘仍可能要后期修。
  • 它是为”离线批量压制”优化的,不是为实时直播抠像设计的。要做直播虚拟摄像头那条路得改输入源和输出方式。
  • 模型权重默认从 GitHub 拉,国内网络慢的话建议提前下好改本地加载。
  • 画面复杂或人数一多就效果不是很好了。

总之,这就是个解决”我有一堆视频想换背景”这种具体需求的小工具。

写着玩的,代码仓库


简易视频人像背景AI替换
https://zyue2022.github.io/2026/08/10/简易视频人像背景AI替换/
作者
ZYUE
发布于
2026年8月10日
更新于
2026年8月10日
许可协议