- 人工智能
- 大模型
- 微调
- 模型推理服务
【免费下载链接】PaddleFormers
PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.
本文以 PaddleFormers 仓库中
modules/image/semantic_segmentation/isanet_resnet50_voc模块为主线,完整讲解 ISANet(Interlaced Sparse Self-Attention)语义分割模型在 PaddleHub 生态下的安装、API 预测、Fine-tune 微调与 Serving 服务化部署全流程,并结合仓库源码剖析其网络结构与底层实现。读完本文,你将能够独立使用isanet_resnet50_voc完成一次从数据集准备、训练配置到线上推理的完整分割任务。
一、模块概览
isanet_resnet50_voc是 PaddleHub 提供的一个图像语义分割预训练模型模块,其基础信息如下:
| 属性 | 值 |
|---|---|
| 模块名称 | isanet_resnet50_voc |
| 类别 | 图像分割(Image Segmentation) |
| 网络 | isanet_resnet50vd |
| 数据集 | PascalVOC2012 |
| 是否支持 Fine-tuning | 是 |
| 模型大小 | 217MB |
| 最新更新日期 | 2022-03-22 |
该模块对应论文为 Lang Huang 等人的"Interlaced Sparse Self-Attention for Semantic Segmentation"(arXiv:1907.12273)。ISANet 的核心思想是将密集的全局自注意力拆解为"长距离稀疏全局注意力 + 短距离稀疏局部注意力"两个阶段,在保持全局上下文建模能力的同时显著降低计算复杂度,非常适合高分辨率语义分割场景。在 PaddleFormers 仓库中,该模块的完整实现位于 modules/image/semantic_segmentation/isanet_resnet50_voc,包含module.py(网络主体)、resnet.py(ResNet50_vd 骨干)、layers.py(通用卷积/注意力层)三个源码文件。
二、环境依赖与模块安装
1、环境依赖
使用该模块前需要确保已安装以下 Python 依赖:
paddlepaddle >= 2.0.0paddlehub >= 2.0.0
其中 PaddleHub 为模型加载、训练与部署的统一框架,PaddlePaddle 提供底层计算能力。
2、安装模块
执行以下命令安装模型模块:
$ hub install isanet_resnet50_voc安装过程中如遇到环境问题,可参考仓库中的官方安装指引:Windows 快速开始、Linux 快速开始、Mac 快速开始。
三、模块源码结构解析
在动手使用之前,先了解模块的源码组织有助于理解其工作原理。该模块目录下包含 4 个文件:
| 文件 | 职责 |
|---|---|
| module.py | ISANet 网络主体、ISAHead 分割头、SelfAttentionBlock 自注意力块 |
| resnet.py | ResNet50_vd 骨干网络(含空洞卷积配置) |
| layers.py | ConvBNReLU、SyncBatchNorm、AttentionBlock 等通用组件 |
| README.md / README_en.md | 中英文使用文档 |
1、ISANet 网络主体(module.py)
module.py中通过@moduleinfo装饰器注册模块元信息(名称、类型CV/semantic_segmentation、版本1.0.0),并定义ISANet(paddle.nn.Layer)类。其核心构造参数如下:
num_classes:目标类别数,默认21(对应 PascalVOC2012 的 21 类,含背景);backbone_indices:骨干网络输出的特征索引,默认(2, 3),即取 C3、C4 两阶段特征;isa_channels:ISA 模块的通道数,默认256;down_factor:将高、宽维度划分成的分组数(Ph, PW),默认(8, 8);enable_auxiliary_loss:是否启用辅助损失,默认True;align_corners:F.interpolate的对齐参数,默认False;pretrained:预训练权重路径或 URL,默认None。
从源码可见,加载模型时若pretrained为None,则会自动加载模块目录下内置的model.pdparams权重文件并打印load pretrained parameters success;若传入自定义路径,则打印load custom parameters success。
2、ISAHead 分割头与交错稀疏注意力
ISAHead是整个模块的精华所在,其forward过程完整实现了论文中的"交错稀疏自注意力":
- 输入 C3、C4 两阶段特征,通过
ConvBNReLU将 C4 降到中间通道数(in_channels // 4); - 按
down_factor=(8, 8)将特征图划分成Q_h × Q_w组,先执行global_relation(长距离全局注意力),再执行local_relation(短距离局部注意力); - 拼接全局与局部注意力输出,经
out_conv融合后由cls分类头输出分割 logits; - 若
enable_auxiliary_loss=True,还会从 C3 特征经aux分支输出辅助 logits,用于训练时辅助监督。
其中SelfAttentionBlock继承自layers.py中的通用AttentionBlock,其注意力计算流程为:query/key/value 分别经 1×1 卷积投影 →paddle.matmul(query, key)计算相似度矩阵 → 按channels**-0.5缩放 → softmax 归一化 → 与 value 相乘得到上下文特征。
3、ResNet50_vd 骨干(resnet.py)
骨干网络ResNet50_vd基于"Bag of Tricks for Image Classification with Convolutional Neural Networks"中的 ResNet_vd 结构,关键配置为:
layers=50,四个阶段深度为[3, 4, 6, 3];output_stride=8,即输出特征相对于输入图像的步长为 8,对应空洞卷积字典{2: 2, 3: 4}(stage2 膨胀率 2、stage3 膨胀率 4),从而在不下采样的前提下扩大感受野;multi_grid=(1, 1, 1),作用于 stage4;- 网络前向会依次返回每个阶段的特征列表,供 ISAHead 按
backbone_indices选取。
4、注意力通用组件(layers.py)
layers.py还提供了若干可复用的基础层,理解它们有助于自行扩展:
SyncBatchNorm:GPU 环境使用nn.SyncBatchNorm,CPU 环境自动降级为nn.BatchNorm2D(见该文件开头的注释说明);ConvBNReLU/ConvBN:标准卷积 + 批归一化(+ ReLU)组合;AttentionBlock:通用自注意力/非局部块,支持 key/query 是否共享投影、是否下采样、是否带输出投影等开关,SelfAttentionBlock即基于它实例化;ASPPModule、AuxLayer、SeparableConvBNReLU:空洞空间金字塔池化、辅助损失层与深度可分离卷积等分割任务常用组件。
四、模型 API 预测
安装完成后,可以直接使用 PaddleHub 加载模型并对单张图片进行分割预测。
1、预测代码示例
import cv2 import paddle import paddlehub as hub if __name__ == '__main__': model = hub.Module(name='isanet_resnet50_voc') img = cv2.imread("/PATH/TO/IMAGE") result = model.predict(images=[img], visualization=True)代码说明:
hub.Module(name='isanet_resnet50_voc')会从本地(若已安装)加载该模块;- 输入图片使用 OpenCV 读取,格式为 BGR 的
[H, W, C]ndarray; predict方法返回分割掩膜(mask)列表。
2、predict 接口参数详解
结合 paddlehub/module/cv_module.py 中ImageSegmentationModule.predict的实现,其核心参数如下:
| 参数 | 类型 | 说明 |
|---|---|---|
images | list[str | np.ndarray] | 图片路径或 BGR 格式 ndarray 组成的列表 |
batch_size | int | 预测时的批大小,默认1 |
visualization | bool | 是否保存可视化结果,默认True |
save_path | str | 结果保存路径,默认'seg_result' |
从源码可以看到,预测时会依次执行:图片经transform预处理(Normalize)→ 前向推理得到 logits →argmax取每个像素的类别索引 → 将预测结果reverse_transform回原图尺寸。当visualization=True时,会在save_path下分别生成image/目录(原图与分割结果叠加的彩色图,融合权重 0.6)和mask/目录(伪彩色分割掩膜图)。
五、如何开始 Fine-tune
该模块官方支持微调,文档以OpticDiscSeg(视盘分割)数据集为例演示完整流程。OpticDiscSeg 提取自 iChallenge-AMD 眼底图像数据集,是二分类分割任务(num_classes=2)。
Step 1:定义数据预处理方式
from paddlehub.vision.segmentation_transforms import Compose, Resize, Normalize transform = Compose([Resize(target_size=(512, 512)), Normalize()])segmentation_transforms是 PaddleHub 针对图像分割任务提供的数据增强/预处理模块,实现在 paddlehub/vision/segmentation_transforms.py,用户可按照需求替换或组合自己需要的预处理方式。几个常用算子:
Resize:将图片与标注缩放到目标尺寸,target_size默认(512, 512),支持NEAREST、LINEAR、CUBIC、AREA、LANCZOS4、RANDOM六种插值模式(标注图固定使用最近邻插值);Normalize:按均值/标准差归一化,默认mean=(0.5, 0.5, 0.5)、std=(0.5, 0.5, 0.5);Padding:对图片和标注做右下角补零填充,im_padding_value默认(128, 128, 128)、label_padding_value默认255;Compose:按列表顺序依次执行各算子,默认to_rgb=True(将 BGR 转 RGB),最终输出为[C, H, W]格式。
Step 2:下载数据集并使用
from paddlehub.datasets import OpticDiscSeg train_reader = OpticDiscSeg(transform, mode='train')参数说明:
transforms:数据预处理方式;mode:数据模式,可选项为train、test、val,默认为train。
数据集准备代码可参考 paddlehub/datasets/opticdiscseg.py。hub.datasets.OpticDiscSeg()会自动从网络下载数据集并解压到用户目录下$HOME/.paddlehub/dataset目录。从源码可见,该数据集类通过@download_data装饰器自动下载,并定义了num_classes=2、ignore_index=255;train/val/test三种模式分别读取train_list.txt、val_list.txt、test_list.txt,其中 test 模式不要求标注文件。
如果你要使用自己的分割数据,可参照 paddlehub/datasets/base_seg_dataset.py 中的SegDataset基类,它支持通过dataset_root、train_path、val_path、test_path传入自定义数据集路径,列表文件每行格式为图片路径 标注路径(空格分隔)。
Step 3:加载预训练模型
import paddlehub as hub model = hub.Module(name='isanet_resnet50_voc', num_classes=2, pretrained=None)参数说明:
name:预训练模型名称;num_classes:微调任务类别数,视盘分割为 2 类,因此需从默认的 21 改为 2;pretrained/load_checkpoint:是否加载自己训练的模型权重,若为None则加载模块自带的 PascalVOC2012 预训练参数(对应module.py中加载model.pdparams的分支)。
Step 4:选择优化策略与运行配置
import paddle from paddlehub.finetune.trainer import Trainer scheduler = paddle.optimizer.lr.PolynomialDecay(learning_rate=0.01, decay_steps=1000, power=0.9, end_lr=0.0001) optimizer = paddle.optimizer.Adam(learning_rate=scheduler, parameters=model.parameters()) trainer = Trainer(model, optimizer, checkpoint_dir='test_ckpt_img_seg', use_gpu=True) trainer.train(train_reader, epochs=10, batch_size=4, log_interval=10, save_interval=4)配置要点:
- 学习率调度器:采用多项式衰减
PolynomialDecay,初始学习率0.01,衰减步数1000,幂次0.9,最终学习率0.0001; - 优化器:Adam 优化器,绑定上述调度器与模型参数;
- Trainer:传入模型、优化器,
checkpoint_dir为 checkpoint 保存目录,use_gpu=True表示使用 GPU 训练; - train 参数:
epochs=10(训练轮数)、batch_size=4、log_interval=10(每 10 步打印一次日志)、save_interval=4(每 4 个 epoch 保存一次 checkpoint)。
Trainer实现在 paddlehub/finetune/trainer.py,其行为值得关注:
- 训练过程中会自动创建
checkpoint_dir目录,并在其中写入 VisualDL 可视化日志(visualization子目录)与epoch_N/格式的周期 checkpoint(含model.pdparams和model.pdopt); - 如果传入
eval_dataset,Trainer 会在每个save_interval周期执行评估,并按compare_metrics(默认取第一个主指标、越大越好)比较,将验证集上表现最优的模型保存到${CHECKPOINT_DIR}/best_model目录; - Trainer 支持断点续训:启动时会扫描
checkpoint_dir下所有epoch_*目录,自动恢复最近的模型与优化器状态,并打印当前指标; - 支持多卡分布式训练(
paddle.distributed),多卡场景会自动将模型包装为DataParallel。
模型预测(微调后)
Fine-tune 完成后,验证集上表现最优的模型保存在${CHECKPOINT_DIR}/best_model目录,其中${CHECKPOINT_DIR}即训练时指定的 checkpoint 保存目录。使用该模型进行预测的脚本如下:
import paddle import cv2 import paddlehub as hub if __name__ == '__main__': model = hub.Module(name='isanet_resnet50_voc', pretrained='/PATH/TO/CHECKPOINT') img = cv2.imread("/PATH/TO/IMAGE") model.predict(images=[img], visualization=True)Args 说明:
images:原始图像路径或 BGR 格式图片(ndarray);visualization:是否可视化/保存分割结果,默认为True;save_path:结果保存路径,默认保存路径为'seg_result'。
注意:进行预测时,所选择的 module、checkpoint_dir、dataset 必须与 Fine-tune 时所用的一致,即使用微调时同一个模型结构(
num_classes一致)加载微调得到的权重。
六、服务部署(PaddleHub Serving)
PaddleHub Serving 可以将图像分割模型部署为在线 HTTP 服务。
Step 1:启动 PaddleHub Serving
运行启动命令:
$ hub serving start -m isanet_resnet50_voc这样即完成了一个图像分割服务化 API 的部署,默认端口号为 8866。
NOTE:如使用 GPU 预测,需要在启动服务之前设置
CUDA_VISIBLE_DEVICES环境变量(例如export CUDA_VISIBLE_DEVICES=0);否则无需设置。
从 paddlehub/module/cv_module.py 的ImageSegmentationModule.serving_method实现可以看出,服务端收到请求后会将 base64 编码的图片解码为 cv2 图像,调用predict得到分割掩膜,再以 base64 字符串形式返回结果。
Step 2:发送预测请求
配置好服务端后,以下代码即可实现发送预测请求并获取预测结果:
import requests import json import cv2 import base64 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 org_im = cv2.imread('/PATH/TO/IMAGE') data = {'images':[cv2_to_base64(org_im)]} headers = {"Content-type": "application/json"} url = "http://127.0.0.1:8866/predict/isanet_resnet50_voc" r = requests.post(url=url, headers=headers, data=json.dumps(data)) mask = base64_to_cv2(r.json()["results"][0])请求要点:
- 客户端将图片通过
cv2_to_base64转为 base64 字符串,封装为 JSON 请求体(键名为images,值为列表); - POST 到
http://127.0.0.1:8866/predict/isanet_resnet50_voc,其中 URL 路径中的isanet_resnet50_voc为模块名; - 响应中的
results为 base64 编码的分割掩膜,通过base64_to_cv2解码回 cv2 图像即可得到掩膜结果。
七、更新历史
- 1.0.0:初始发布(First release)。
八、小结
本文围绕isanet_resnet50_voc模块,从模块信息、源码结构、API 预测、Fine-tune 到 Serving 部署进行了全流程讲解。核心要点可总结为:
- 开箱即用:
hub install isanet_resnet50_voc安装后,hub.Module即可直接加载并完成单张图片的分割预测; - 微调范式清晰:通过
segmentation_transforms定义预处理、OpticDiscSeg加载数据、hub.Module加载预训练权重(修改num_classes)、Trainer执行训练与最优模型保存,四步即可完成一次领域微调; - 服务化便捷:一条
hub serving start命令即可部署在线分割服务,配合 base64 编解码即可完成 HTTP 调用; - 实现可深究:仓库中 module.py、resnet.py、layers.py 完整呈现了交错稀疏自注意力的 PaddlePaddle 实现,Trainer 与 SegDataset 则为自定义数据集微调提供了通用底座,值得在真实项目中复用与扩展。
- 人工智能
- 大模型
- 微调
- 模型推理服务
【免费下载链接】PaddleFormers
PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.
相关推荐
GhostNet 图像分类模型实战:基于 PaddleHub 的 ghostnet_x1_0_imagenet 推理、微调与服务化部署指南
GhostNet 图像分类模型实战:基于 PaddleHub 的 ghostnet_x1_0_imagenet 推理、微调与服务化部署指南 GhostNet 是
人工智能大模型微调模型推理服务基于 PaddleHub 的图像着色实战:user_guided_colorization 模型 Fine-tune 与部署全指南
基于 PaddleHub 的图像着色实战:user_guided_colorization 模型 Fine tune 与部署全指南 本文以 PaddleForm
人工智能大模型微调模型推理服务PaddleHub 图像分割实战指南:基于 ocrnet_hrnetw18_voc 的 Fine-tune、预测与服务部署
PaddleHub 图像分割实战指南:基于 ocrnet_hrnetw18_voc 的 Fine tune、预测与服务部署 导读 本指南以 PaddleHub
人工智能大模型微调模型推理服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考