基于 PaddleHub 的 ISANet 图像分割实战:isanet_resnet50_voc 模型微调与部署全指南
2026/9/24 16:08:38 网站建设 项目流程
  • 人工智能
  • 大模型
  • 微调
  • 模型推理服务

【免费下载链接】PaddleFormers

PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleFormers
点击查看免费下载

本文以 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.0
  • paddlehub >= 2.0.0

其中 PaddleHub 为模型加载、训练与部署的统一框架,PaddlePaddle 提供底层计算能力。

2、安装模块

执行以下命令安装模型模块:

$ hub install isanet_resnet50_voc

安装过程中如遇到环境问题,可参考仓库中的官方安装指引:Windows 快速开始、Linux 快速开始、Mac 快速开始。

三、模块源码结构解析

在动手使用之前,先了解模块的源码组织有助于理解其工作原理。该模块目录下包含 4 个文件:

文件职责
module.pyISANet 网络主体、ISAHead 分割头、SelfAttentionBlock 自注意力块
resnet.pyResNet50_vd 骨干网络(含空洞卷积配置)
layers.pyConvBNReLU、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_cornersF.interpolate的对齐参数,默认False
  • pretrained:预训练权重路径或 URL,默认None

从源码可见,加载模型时若pretrainedNone,则会自动加载模块目录下内置的model.pdparams权重文件并打印load pretrained parameters success;若传入自定义路径,则打印load custom parameters success

2、ISAHead 分割头与交错稀疏注意力

ISAHead是整个模块的精华所在,其forward过程完整实现了论文中的"交错稀疏自注意力":

  1. 输入 C3、C4 两阶段特征,通过ConvBNReLU将 C4 降到中间通道数(in_channels // 4);
  2. down_factor=(8, 8)将特征图划分成Q_h × Q_w组,先执行global_relation(长距离全局注意力),再执行local_relation(短距离局部注意力);
  3. 拼接全局与局部注意力输出,经out_conv融合后由cls分类头输出分割 logits;
  4. 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即基于它实例化;
  • ASPPModuleAuxLayerSeparableConvBNReLU:空洞空间金字塔池化、辅助损失层与深度可分离卷积等分割任务常用组件。

四、模型 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的实现,其核心参数如下:

参数类型说明
imageslist[str | np.ndarray]图片路径或 BGR 格式 ndarray 组成的列表
batch_sizeint预测时的批大小,默认1
visualizationbool是否保存可视化结果,默认True
save_pathstr结果保存路径,默认'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),支持NEARESTLINEARCUBICAREALANCZOS4RANDOM六种插值模式(标注图固定使用最近邻插值);
  • 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:数据模式,可选项为traintestval,默认为train

数据集准备代码可参考 paddlehub/datasets/opticdiscseg.py。hub.datasets.OpticDiscSeg()会自动从网络下载数据集并解压到用户目录下$HOME/.paddlehub/dataset目录。从源码可见,该数据集类通过@download_data装饰器自动下载,并定义了num_classes=2ignore_index=255train/val/test三种模式分别读取train_list.txtval_list.txttest_list.txt,其中 test 模式不要求标注文件。

如果你要使用自己的分割数据,可参照 paddlehub/datasets/base_seg_dataset.py 中的SegDataset基类,它支持通过dataset_roottrain_pathval_pathtest_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=4log_interval=10(每 10 步打印一次日志)、save_interval=4(每 4 个 epoch 保存一次 checkpoint)。

Trainer实现在 paddlehub/finetune/trainer.py,其行为值得关注:

  • 训练过程中会自动创建checkpoint_dir目录,并在其中写入 VisualDL 可视化日志(visualization子目录)与epoch_N/格式的周期 checkpoint(含model.pdparamsmodel.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 部署进行了全流程讲解。核心要点可总结为:

  1. 开箱即用hub install isanet_resnet50_voc安装后,hub.Module即可直接加载并完成单张图片的分割预测;
  2. 微调范式清晰:通过segmentation_transforms定义预处理、OpticDiscSeg加载数据、hub.Module加载预训练权重(修改num_classes)、Trainer执行训练与最优模型保存,四步即可完成一次领域微调;
  3. 服务化便捷:一条hub serving start命令即可部署在线分割服务,配合 base64 编解码即可完成 HTTP 调用;
  4. 实现可深究:仓库中 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.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleFormers
点击查看免费下载

相关推荐

上一篇:15分钟快速上手:在Linux上无缝运行Android应用的终极解决方案
下一篇:STM32高精度温度控制系统实战:从传统开关控制到智能PID调节

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询