PaddleHub 人像抠图实战:modnet_resnet50vd_matting 模型安装、预测与 Serving 部署全指南
【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers
导读
本文以 PaddleFormers 仓库中 modnet_resnet50vd_matting 模型文档 为主体,系统讲解基于 PaddleHub 的人像 Matting(精细化分割/抠图)模型的完整使用链路。你将掌握:MODNet 人像抠图的核心原理与模型基本信息、环境依赖与安装方式、命令行与 Python API 两种预测形态、predict接口各参数的实际含义(含 Trimap 引导机制),以及基于 PaddleHub Serving 的在线服务部署与 HTTP 请求调用。文中所有参数与行为均以仓库内 module.py、processor.py 等源码为事实依据,确保内容可直接对照源码验证。
一、模型基本信息
modnet_resnet50vd_matting 是 PaddleHub 提供的人像 Matting(抠图)模型,其模型卡片信息如下:
| 项目 | 内容 |
|---|---|
| 模型名称 | modnet_resnet50vd_matting |
| 类别 | 图像-抠图 |
| 网络 | modnet_resnet50vd |
| 数据集 | 百度自建数据集 |
| 是否支持 Fine-tuning | 否 |
| 模型大小 | 535MB |
| 指标 | SAD112.73 |
| 最新更新日期 | 2021-12-03 |
说明:以上指标与数据均来自 README.md 模型卡片,SAD(Sum of Absolute Differences,绝对误差和)是 Matting 任务常用的精度评价指标,数值越低表示预测 Alpha 遮罩与真值越接近。
1. 什么是 Matting
Matting(精细化分割/影像去背/抠图)是指借由计算前景的颜色和透明度,将前景从影像中撷取出来的技术,可用于替换背景、影像合成、视觉特效,在电影工业中被广泛使用。影像中的每个像素会有一个代表其前景透明度的值,称作阿法值(Alpha);一张影像中所有阿法值的集合称作阿法遮罩(Alpha Matte)。将影像被遮罩所涵盖的部分取出即可完成前景的分离,modnet_resnet50vd_matting 即可直接生成人像抠图结果。
2. 模型出处与源码实现
该模型源自 PaddleSeg release/2.3 分支的 contrib/Matting 实现,仓库内的 module.py 是其在 PaddleHub 中的封装,核心要点如下:
- 类
MODNetResNet50Vd通过@moduleinfo(name="modnet_resnet50vd_matting", type="CV/matting", version="1.0.0")注册为 PaddleHub 模块,其中type="CV/matting"决定了该模块在命令行与 Serving 中被识别为 CV 类抠图任务; - 模型结构上采用ResNet50_vd 骨干网络 + MODNet 三分支解码头,
MODNetHead由LRBranch(低分辨率语义分支)、HRBranch(高分辨率细节分支)与FusionBranch(融合分支)组成(见 module.py),这一结构对应 MODNet 论文 "Is a Green Screen Really Necessary for Real-Time Portrait Matting?"(arXiv:2011.11961)中的设计; - 骨干网络 resnet.py 中的
ResNet50_vd基于 "Bag of Tricks for Image Classification with Convolutional Neural Networks"(arXiv:1812.01187)实现,采用 vd(虚拟下采样)模式,在 stem 阶段使用平均池化降采样并逐阶段输出多尺度特征feat_channels = [64, 256, 512, 1024, 2048],供 MODNet 各分支使用。
二、安装与环境依赖
1. 环境依赖
根据 README.md 与 requirements.txt,运行该模型需要满足:
| 依赖 | 版本要求 |
|---|---|
| paddlepaddle | >= 2.2.0 |
| paddlehub | >= 2.1.0 |
| paddleseg | >= 2.3.0 |
其中paddleseg是强依赖:模型的预处理算子(如ResizeByShort、ResizeToIntMult、Normalize)在 processor.py 中直接from paddleseg.transforms import functional调用,因此必须安装对应版本的 PaddleSeg。
2. 安装模型
在满足上述依赖的前提下,执行:
$ hub install modnet_resnet50vd_matting安装完成后,PaddleHub 会将该模块登记到本地模块管理器中,后续命令行、Python API 与 Serving 三种调用方式均通过模块名modnet_resnet50vd_matting引用。
如安装时遇到环境问题,可参考仓库内的快速开始文档:零基础 Windows 安装 | 零基础 Linux 安装 | 零基础 MacOS 安装。
三、模型 API 预测
1. 命令行预测
安装完成后,可以直接通过 PaddleHub 命令行调用:
$ hub run modnet_resnet50vd_matting --input_path "/PATH/TO/IMAGE"hub run命令内部会通过@runnable装饰的run_cmd方法执行(见 module.py)。结合 run.py 的命令分发逻辑,该模块命令行支持以下参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--input_path | str | 必填 | 输入图片路径 |
--trimap_path | str | None | Trimap 路径,提供后可显著提升抠图边缘精度 |
--output_dir | str | modnet_resnet50vd_matting_output | 结果保存目录 |
--visualization | bool | True | 是否将结果保存为图片 |
关于命令行调用 PaddleHub 模块的完整指令说明,可参考 PaddleHub 命令行指令。
2. 预测代码示例
Python 侧调用只需三行核心代码:
import paddlehub as hub import cv2 model = hub.Module(name="modnet_resnet50vd_matting") result = model.predict(["/PATH/TO/IMAGE"]) print(result)其中result为list(numpy.ndarray),每个元素对应一张输入图的 Alpha 预测结果,形状与输入图一致,数值范围为 0~255(uint8),255 表示完全不透明的前景像素,0 表示背景像素。
3. predict API 详解
predict方法的完整签名如下(见 module.py):
def predict(self, image_list, trimap_list=None, visualization=False, save_path="modnet_resnet50vd_matting_output"):参数说明
| 参数 | 类型 | 默认值 | 含义 |
|---|---|---|---|
image_list | list(str | numpy.ndarray) | 必填 | 图片输入路径列表,或 BGR 格式的[H, W, C]numpy 数据列表 |
trimap_list | list(str | numpy.ndarray) | None | Trimap 输入路径列表或灰度图单通道[H, W]数据列表;不传时模型进行全自动抠图 |
visualization | bool | False | 是否保存可视化结果 |
save_path | str | modnet_resnet50vd_matting_output | 当visualization=True时结果的保存目录 |
返回
result(list(numpy.ndarray)):人像分割结果列表,即每张输入图对应的 Alpha 遮罩。
Trimap 的引导机制:当传入 Trimap 时,模型输出会经过 processor.py 中save_alpha_pred的硬约束处理——alpha[trimap == 0] = 0(Trimap 黑色区域强制为背景),alpha[trimap == 255] = 255(Trimap 白色区域强制为前景),中间灰色区域(未知区)保留模型预测值。这意味着用户可以通过标注粗略的三分类掩膜(背景/前景/未知)来纠正模型在复杂场景下的误分割,这也是在实际业务中提升抠图质量最直接的手段。
4. 预测流程的源码级解读
一次predict调用的完整数据流(以 module.py 与 processor.py 为依据)为:
- 预处理:
preprocess依次执行LoadImages(读图并 BGR→RGB)、ResizeByShort(短边缩放到 512,长边等比缩放)、ResizeToIntMult(将宽高调整为 32 的整数倍,满足网络下采样对齐要求)、Normalize(使用 mean/std = 0.5 归一化),随后转为 CHW 张量并增加 batch 维度; - 前向推理:在
paddle.no_grad()下将图片送入ResNet50_vd骨干提取多尺度特征feat_list,再由MODNetHead的低分辨率、高分辨率与融合三个分支产出最终 Alpha 预测(见 module.py); - 反向变换:
reverse_transform依据预处理阶段记录的trans_info,将预测结果逐级双线性插值回原始输入尺寸; - 后处理与保存:Alpha 数值乘以 255 转为 uint8,经
save_alpha_pred应用 Trimap 约束后,写入结果列表;若visualization=True,则以时间戳命名保存为 PNG 到save_path目录。
四、服务部署(PaddleHub Serving)
PaddleHub Serving 可将该人像 Matting 模型部署为在线 HTTP 服务,供外部系统通过 RESTful 接口调用。
第一步:启动 PaddleHub Serving
$ hub serving start -m modnet_resnet50vd_matting执行后即完成一个人像 Matting 在线服务 API 的部署,默认监听端口为8866(该默认值在 serving.py 的--port参数中定义)。服务内部通过@serving装饰的serving_method对外提供预测能力(见 module.py):接收 base64 编码的图片(可选 Trimap),内部解码为 BGR 后调用predict,再将结果编码为 base64 字符串返回。
NOTE:如使用 GPU 预测,需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量指定 GPU 设备;不使用 GPU 则无需设置。更多 Serving 启动、停止与多模块配置的说明可参考 Serving 使用文档。
第二步:发送预测请求
配置好服务端后,以下代码即可发送预测请求并保存抠图结果:
import requests import json import cv2 import base64 import time import numpy as np def cv2_to_base64(image): data = cv2.imencode('.jpg', image)[1] return base64.b64encode(data.tostring()).decode('utf8') def base64_to_cv2(b64str): data = base64.b64decode(b64str.encode('utf8')) data = np.fromstring(data, np.uint8) data = cv2.imdecode(data, cv2.IMREAD_COLOR) return data # 发送HTTP请求 data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]} headers = {"Content-type": "application/json"} url = "http://127.0.0.1:8866/predict/modnet_resnet50vd_matting" r = requests.post(url=url, headers=headers, data=json.dumps(data)) for image in r.json()["results"]['data']: data = base64_to_cv2(image) image_path = str(time.time()) + ".png" cv2.imwrite(image_path, data)请求要点:
- 接口路径:
http://127.0.0.1:8866/predict/{模块名},其中modnet_resnet50vd_matting必须与启动服务时-m指定的模块名一致; - 请求体:JSON 格式,
images字段为 base64 编码的图片字符串列表;如需要传入 Trimap,可参考serving_method的trimaps参数(源码位于 module.py,Trimap 会先转为灰度图再参与预测); - 响应解析:响应中的
results.data为 base64 编码的 Alpha 结果列表,解码后即为可保存的抠图 PNG; - 服务停止:可通过
hub serving stop --port 8866安全停止服务(实现见 serving.py)。
五、更新历史
- 1.0.0:初始发布(2021-12-03)。
六、使用注意事项
- 不支持 Fine-tuning:该模块以推理预测为主要用途,模型卡片明确标注不支持微调,请勿尝试对其进行训练流程接入;
- 输入约定:
predict的 numpy 输入需为 BGR 格式(与 OpenCV 读取一致)、shape 为[H, W, C];Trimap 需为灰度单通道[H, W],模块内部会进行 RGB 转换与归一化,无需用户自行预处理; - 输入尺寸:预处理会将短边缩放至 512 并将宽高对齐到 32 的整数倍,因此输入图片的分辨率不宜过小,否则细节会因下采样而损失;
- 结果语义:返回的 Alpha 图可直接与原始 RGB 图像做 alpha 合成以替换背景,这是抠图结果最典型的应用方式;
- 硬件提示:Serving 场景下如需 GPU 加速,务必在启动服务前设置
CUDA_VISIBLE_DEVICES,否则默认使用 CPU 推理。
通过本文,你已经可以完整掌握 modnet_resnet50vd_matting 从环境准备、安装、命令行/代码预测,到在线服务部署的整个落地链路;如需深入网络细节,可继续阅读仓库内的 module.py(MODNet 三分支实现)、resnet.py(ResNet50_vd 骨干)与 processor.py(预处理与后处理流水线)三份核心源码。
【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考