1️⃣ MODNet 抠图原理
- 抠图是什么?
- 把图片中的主体(通常是人像)从背景中分离出来。
- 输出是一张带透明背景的图片(PNG 格式,RGBA 模式)。
- MODNet 的原理
- MODNet 是一个深度学习模型,专门生成 alpha mask(前景透明度)。
- 工作流程:
- 输入图片 → MODNet → 输出 alpha mask。
- 用 alpha mask 对原图进行处理 → 背景透明化。
- 优点:速度快、效果好,可处理高分辨率人像。
2️⃣ 源码获取与模型准备
2.1 下载 MODNet 源码
-
官方 GitHub 仓库:https://github.com/ZHKKKe/MODNet
-
本地下载方式:
- Clone 仓库(如果有 Git):
git clone https://github.com/ZHKKKe/MODNet.git - 或者直接下载 ZIP,解压到本地:
- 例如放到项目根目录下:workspace_py/MODNet/
- Clone 仓库(如果有 Git):
-
注意结构:
MODNet/
├─ demo/
├─ doc/
├─ MODNet/
├─ onnx/
├─ pretrained/
├─ src/
│ └─ models/
│ ├─ backbones/
│ ├─ modnet.py
│ ├─ trainer.py
│ └─ init .py
2.2 下载模型文件 -
MODNet 官方提供两类 ckpt 文件:
- 人像抠图模型(photographic portrait matting)
modnet_photographic_portrait_matting.ckpt - webcam 人像抠图模型(实时摄像头)
modnet_webcam_portrait_matting.ckpt
- 人像抠图模型(photographic portrait matting)
-
下载地址示例:
- 官方 release 或项目 README 会提供 Google Drive / Baidu 网盘链接。
-
保存到项目:
workspace_py/models/
modnet_photographic_portrait_matting.ckpt
modnet_webcam_portrait_matting.ckpt
2.3 配置路径 -
在 config.py 中指定模型路径:
MODNET_CKPT_PATH = "models/modnet_photographic_portrait_matting.ckpt" -
读取时使用:
from config import MODNET_CKPT_PATH
3️⃣ 项目文件结构
假设项目根目录为 workspace_py,结构示例:
workspace_py/
├─ app/services/test001/
│ ├─ segmentation.py # 核心抠图逻辑
│ ├─ utils.py # 图片读写、日志处理
│ └─ config.py # 模型路径等配置
├─ models/ # 存放 ckpt 模型文件
│ ├─ modnet_photographic_portrait_matting.ckpt
│ └─ modnet_webcam_portrait_matting.ckpt
├─ MODNet/ # 源码文件夹
│ ├─ src/models/modnet.py
│ ├─ src/models/backbones/
│ └─ ...
├─ tests/
│ └─ test_segmentation.py # 测试脚本
4️⃣ 运行环境配置
- 创建虚拟环境:
conda create -n tf_env python=3.8 -y
conda activate tf_env - 安装依赖:
pip install torch torchvision pillow pytest
注意:Windows 下不需要编译,直接用 pip 安装即可。
5️⃣ 核心操作步骤
- 准备图片
- 将要抠图的图片放在本地,例如:
d://temp//test//face_image.jpg
- 调用抠图函数
from app.services.test001.segmentation import remove_background, save_image
image_path = "d://temp//test//face_image.jpg"
output_path = "d://temp//test//face_image_out.png"
result_img = remove_background(image_path)
save_image(result_img, output_path)
print("抠图完成,结果保存到:", output_path)
- 运行测试
python -m pytest tests/test_segmentation.py
- 输出示例:
测试通过:有效图片抠图成功
测试通过:无效图片正确抛出异常
- 查看结果
- 打开生成的 PNG 图片,检查是否透明背景正确。
6️⃣ 理解要点
- remove_background 核心逻辑:
- 读取图片 → Image.open()
- 调用 MODNet 模型 → 生成 alpha mask
- alpha mask 与原图融合 → 透明背景
- utils.py:处理图片读写、日志、异常,方便调试
- config.py:集中管理模型路径
- test_segmentation.py:单元测试示例,学生可修改路径测试自己的图片
7️⃣ 小贴士
- 输出图片必须为 PNG 才能保留透明通道。
- 模型首次加载可能比较慢。
- 图片过大可能占用内存,可先缩小后处理。