- 人工智能
- 大模型
- 微调
- 模型推理服务
【免费下载链接】PaddleFormers
PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.
本文以 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=16、final_ch=180、width_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=True、se_ratio=12,SE类通过全局平均池化与 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 个类别,从tench、goldfish到ear、toilet tissue。ReXNetV1.__init__中,若未显式传入label_list,则会自动读取该文件并据此设置class_dim = len(self.labels)。
二、安装与环境依赖
2.1 环境依赖
使用本模型需要满足:
paddlepaddle >= 2.0.0paddlehub >= 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:选择数据模式,可选项有train、test、val,默认为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.txt、test模式读取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_ch、final_ch、width_mult、depth_mult、use_se、se_ratio、dropout_ratio、bn_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.pdparams、model.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.
相关推荐
PaddleHub HRNet40 图像分类模型实战:从命令行预测到 Fine-tune 与 Serving 部署
PaddleHub HRNet40 图像分类模型实战:从命令行预测到 Fine tune 与 Serving 部署 本文以 PaddleHub 开源仓库中的 h
人工智能大模型微调模型推理服务PaddleHub 图像分类实战:基于 rexnet_1_0_imagenet 模块的预测、Fine-tune 与 Serving 部署
PaddleHub 图像分类实战:基于 rexnet_1_0_imagenet 模块的预测、Fine tune 与 Serving 部署 导读 rexnet_1
人工智能大模型微调模型推理服务DLSS Swapper:3分钟掌握游戏DLSS版本管理的终极技巧 🚀
DLSS Swapper:3分钟掌握游戏DLSS版本管理的终极技巧 🚀 还在为游戏画质模糊而烦恼吗?想体验最新DLSS版本带来的视觉提升,却苦于复杂的文件替换
人工智能大模型微调模型推理服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考