PaddleHub 图像分类模型 rexnet_3_0_imagenet 实战指南:预测、Fine-tune 与 Serving 部署
2026/9/24 5:54:45 网站建设 项目流程
  • 人工智能
  • 大模型
  • 微调
  • 模型推理服务

【免费下载链接】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 仓库中的 rexnet_3_0_imagenet 模块 为核心,完整讲解基于 PaddleHub 的 ReXNet 图像分类模型的安装、命令行与 Python API 预测、Flowers 数据集 Fine-tune 以及 Serving 在线服务部署全流程。读完本文,你将掌握如何在本地通过hub install/hub run快速体验 1000 类 ImageNet 分类,使用Trainer完成自定义花卉分类任务的迁移学习,并将训练好的模型一键封装为 HTTP 分类服务。

一、模型基本信息

1.1 模块速览

项目内容
模型名称rexnet_3_0_imagenet
类别图像-图像分类
网络ReXNet
数据集ImageNet-2012
是否支持 Fine-tuning
模型大小200MB
指标-
最新更新日期2021-09-14

该模块由 module.py 实现,通过@moduleinfo声明了name="rexnet_3_0_imagenet"type="CV/classification"version="1.0.0"等元信息,并以ImageClassifierModule作为元基类,因此天然继承了 PaddleHub 图像分类模块的predict、命令行hub run与 Serving 能力(详见 cv_module.py)。

1.2 ReXNet 网络原理

ReXNet 由 NAVER AI Lab 提出,是一套基于新网络设计原则设计的网络。作者认为常规网络设计会产生表征瓶颈(Representational Bottleneck),从而影响模型性能。为研究表征瓶颈,作者研究了由一万个随机网络生成的特征矩阵的秩(Rank),并研究了整个层的通道配置以设计更准确的网络架构,最终提出了一套简单有效的设计原则来缓解表征瓶颈。

从本仓库的 module.py 源码结构看,模型实现与论文设计原则一一对应:

  • 通道渐进式扩展input_ch=16final_ch=180width_mult=3.0,在构造特征层时每个 block 的通道数按inplanes += final_ch / (self.depth // 3 * 1.0)线性递增,确保每一层都成为扩展层(expand layer),避免出现表征瓶颈;
  • Linear Bottleneck 堆叠:核心算子LinearBottleneck(module.py 中定义)由 1x1 扩展卷积 + 3x3 深度可分离卷积(groups=dw_channels)+ 可选 SE 模块 + 1x1 投影构成,采用 Swish / ReLU6 激活;
  • SE 注意力use_se=Truese_ratio=12SE类通过全局平均池化与 1x1 卷积生成通道注意力并加权;
  • 深度与宽度配置depth_mult=1.0,各阶段 block 数为[1, 2, 2, 3, 3, 5],步长为[1, 2, 2, 2, 1, 2],SE 使用位置为[False, False, True, True, True, True]
  • 分类头nn.Dropout(dropout_ratio)(默认 0.2)后接 1x1 卷积映射到class_dim(默认 1000)个类别。

1.3 类别标签

模块目录下的 label_list.txt 共包含 1000 行,即 ImageNet-2012 的 1000 个类别,从tenchgoldfisheartoilet tissueReXNetV1.__init__中,若未显式传入label_list,则会自动读取该文件并据此设置class_dim = len(self.labels)

二、安装与环境依赖

2.1 环境依赖

使用本模型需要满足:

  • paddlepaddle >= 2.0.0
  • paddlehub >= 2.0.0

2.2 安装模块

在终端执行:

$ hub install rexnet_3_0_imagenet

安装时会自动下载模型权重。若安装遇到问题,可参考仓库中的零基础安装文档:

  • 零基础 Windows 安装
  • 零基础 Linux 安装
  • 零基础 MacOS 安装

三、模型 API 预测

3.1 命令行预测

安装完成后,直接通过hub run对单张图片进行 Top-K 分类预测:

$ hub run rexnet_3_0_imagenet --input_path "/PATH/TO/IMAGE" --top_k 5

该命令最终由ImageClassifierModule.run_cmd(cv_module.py 中定义)解析执行:--input_path指定图片路径(必填),--top_k指定返回概率最高的类别个数(默认为 1),解析后调用self.predict(images=[args.input_path], top_k=args.top_k)

3.2 Python API 预测

在代码中加载模型并预测:

import paddle import paddlehub as hub if __name__ == '__main__': model = hub.Module(name='rexnet_3_0_imagenet') result = model.predict(['flower.jpg'])

model.predict的签名与行为(定义于 cv_module.py 的ImageClassifierModule.predict)为:

  • images(list[np.ndarray]):待预测图片,元素为 BGR 格式的np.ndarray
  • batch_size(int):预测批大小,默认 1;
  • top_k(int):每张图返回概率最高的 k 个类别,默认 1。

其内部流程为:对每张图执行模块内置的预处理self.transforms(Resize 到 256x256、CenterCrop 224、按 ImageNet 均值方差 Normalize),前向得到 logits 后经F.softmax转为概率,再np.argsort取 Top-K,最后以{类别名: 概率}字典列表形式返回。

模块内置预处理与 Fine-tune 时使用的预处理完全一致(定义于 module.py 的ReXNetV1.transforms):

transforms = T.Compose([ T.Resize((256, 256)), T.CenterCrop(224), T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ], to_rgb=True)

3.3 如何开始 Fine-tune

在完成 PaddlePaddle 与 PaddleHub 安装后,执行python train.py即可使用 rexnet_3_0_imagenet 对 Flowers 等数据集进行 Fine-tune。完整可运行的示例可参考 demo/image_classification/train.py(该示例基于resnet50_vd_imagenet_ssld,将其中的name替换为rexnet_3_0_imagenet即可)。下面按步骤展开。

Step1:定义数据预处理方式

import paddlehub.vision.transforms as T transforms = T.Compose([T.Resize((256, 256)), T.CenterCrop(224), T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])], to_rgb=True)

transforms数据增强模块定义了丰富的数据预处理方式,用户可按照需求替换自己需要的数据预处理方式。

Step2:下载数据集并使用

from paddlehub.datasets import Flowers flowers = Flowers(transforms) flowers_validate = Flowers(transforms, mode='val')

参数说明:

  • transforms:数据预处理方式;
  • mode:选择数据模式,可选项有traintestval,默认为train

数据集的准备代码可参考 flowers.py:Flowers类通过@download_data(url='https://bj.bcebos.com/paddlehub-dataset/flower_photos.tar.gz')装饰器标注,hub.datasets.Flowers()会自动从网络下载数据集并解压到用户目录下$HOME/.paddlehub/dataset目录;数据集共 5 类(num_classes = 5),train模式读取train_list.txttest模式读取test_list.txt、其余(val)读取validate_list.txt

Step3:加载预训练模型

model = hub.Module(name="rexnet_3_0_imagenet", label_list=["roses", "tulips", "daisy", "sunflowers", "dandelion"])

参数说明:

  • name:选择预训练模型的名字;
  • label_list:设置输出分类类别,默认为 Imagenet2012 类别(即读取模块目录下的 label_list.txt)。

传入label_list后,module.py 中class_dim = len(self.labels),分类头输出维度随之变为 5,从而与 Flowers 数据集对齐。此外,ReXNetV1构造器还暴露了input_chfinal_chwidth_multdepth_multuse_sese_ratiodropout_ratiobn_momentum等网络结构参数,默认值分别为 16、180、3.0、1.0、True、12、0.2、0.9;若传入load_checkpoint,会加载该路径下的model.pdparams自定义权重,否则加载模块自带的 ImageNet 预训练权重。

Step4:选择优化策略和运行配置

optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()) trainer = Trainer(model, optimizer, checkpoint_dir='img_classification_ckpt') trainer.train(flowers, epochs=100, batch_size=32, eval_dataset=flowers_validate, save_interval=1)

Trainer(实现在 trainer.py)主要控制 Fine-tune 的训练,包含以下可控制的参数:

  • model:被优化模型;
  • optimizer:优化器选择;
  • use_gpu:是否使用 GPU 训练(默认 False,为 True 时执行paddle.set_device('gpu'));
  • use_vdl:是否使用 VisualDL 可视化训练过程(默认 True,日志写入checkpoint_dir/visualization);
  • checkpoint_dir:保存模型参数的地址(默认ckpt_{time.time()});
  • compare_metrics:保存最优模型的衡量指标(默认为以validation_step返回的第一个指标比较,越大越好)。

trainer.train主要控制具体的训练过程,包含以下可控制的参数:

  • train_dataset:训练时所用的数据集;
  • epochs:训练轮数;
  • batch_size:训练的批大小,如果使用 GPU,请根据实际情况调整 batch_size;
  • num_workers:数据加载子进程数量,默认为 0;
  • eval_dataset:验证集(设置后会在每个save_interval轮执行一次评估);
  • log_interval:打印日志的间隔,单位为执行批训练的次数,默认 10;
  • save_interval:保存模型的间隔频次,单位为执行训练的轮数,默认 10;
  • collate_fn:自定义组 batch 函数,默认 None。

训练过程中,Trainer会在每个save_interval轮将模型参数与优化器状态分别保存为model.pdparamsmodel.pdopt;当验证集指标优于历史最优时,将最优模型额外保存到${CHECKPOINT_DIR}/best_model目录,并写入metrics.pkl。从源码看,Trainer还支持断点续训:启动时自动扫描checkpoint_dir下形如epoch_{N}的目录并恢复模型与优化器状态。

模型预测

当完成 Fine-tune 后,Fine-tune 过程在验证集上表现最优的模型会被保存在${CHECKPOINT_DIR}/best_model目录下,其中${CHECKPOINT_DIR}目录为 Fine-tune 时所选择的保存 checkpoint 的目录。使用该模型进行预测的 predict.py 脚本如下:

import paddle import paddlehub as hub if __name__ == '__main__': model = hub.Module(name='rexnet_3_0_imagenet', label_list=["roses", "tulips", "daisy", "sunflowers", "dandelion"], load_checkpoint='/PATH/TO/CHECKPOINT') result = model.predict(['flower.jpg'])

完整示例可参考 demo/image_classification/predict.py。

NOTE:进行预测时,所选择的 module、checkpoint_dir、dataset 必须和 Fine-tune 所用的一样,否则标签对齐与权重形状可能不一致。

四、服务部署(PaddleHub Serving)

PaddleHub Serving 可以部署一个在线分类任务服务,将上一步训练好的模型封装为可并发访问的 HTTP API。

第一步:启动 PaddleHub Serving

运行启动命令:

$ hub serving start -m rexnet_3_0_imagenet

这样就完成了一个分类任务服务化 API 的部署,默认端口号为 8866。

NOTE:如使用 GPU 预测,则需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。

Serving 场景下,服务端调用的是ImageClassifierModule.serving_method(cv_module.py 中定义),接收 base64 编码的图片列表与top_k参数,解码后经predict得到结果并转换为 float 返回。

第二步:发送预测请求

配置好服务端,以下代码即可实现发送预测请求、获取预测结果:

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 # 发送HTTP请求 org_im = cv2.imread('/PATH/TO/IMAGE') data = {'images':[cv2_to_base64(org_im)], 'top_k':2} headers = {"Content-type": "application/json"} url = "http://127.0.0.1:8866/predict/rexnet_3_0_imagenet" r = requests.post(url=url, headers=headers, data=json.dumps(data)) data = r.json()["results"]['data']

其中请求体images为 base64 图片列表,top_k控制返回的类别数量,服务地址为http://127.0.0.1:8866/predict/rexnet_3_0_imagenet,返回结构为{"results": {"data": [...]}}

五、更新历史

  • 1.0.0:初始发布(2021-09-14)。
  • 人工智能
  • 大模型
  • 微调
  • 模型推理服务

【免费下载链接】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
点击查看免费下载

相关推荐

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

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

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

立即咨询