基于PaddleHub的RepVGG-B2g4图像分类模型实战:从模型安装、推理预测到Fine-tune与服务化部署
【免费下载链接】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 仓库中的repvgg_b2g4_imagenet预训练分类模块为核心,完整讲解 RepVGG 重参数化网络的原理、模块安装方式、命令行与 Python API 两种推理方法、基于 Flowers 数据集的 Fine-tune 全流程,以及通过 PaddleHub Serving 将模型部署为在线分类服务的方法。读完本文,你将能够独立完成 RepVGG 分类模型的下载安装、图片预测、迁移学习与服务化发布。
一、模型基本信息
repvgg_b2g4_imagenet是 PaddleHub 提供的一个图像分类预训练模块,基本信息如下表:
| 模型名称 | repvgg_b2g4_imagenet |
|---|---|
| 类别 | 图像-图像分类 |
| 网络 | RepVGG |
| 数据集 | ImageNet-2012 |
| 是否支持 Fine-tuning | 是 |
| 模型大小 | 357MB |
| 指标 | - |
| 最新更新日期 | 2021-09-14 |
该模块对应的完整代码位于仓库的 modules/image/classification/repvgg_b2g4_imagenet/module.py,其中还包含一份 label_list.txt,记录了模块默认使用的 ImageNet-2012 类别名称(默认 1000 类)。
二、RepVGG 网络与模块源码解析
2.1 模型介绍
RepVGG(Making VGG-style ConvNets Great Again)系列模型由清华大学(丁桂光团队)、旷视科技(孙建等)、香港科技大学和阿伯里斯特威斯大学于 2021 年提出,是一种简单但功能强大的卷积神经网络架构。它拥有一个类似于 VGG 的推理期结构:主体仅由 3x3 卷积和 ReLU 堆叠而成;而训练期模型则采用多分支拓扑(3x3 卷积分支 + 1x1 卷积分支 + 恒等映射分支)。训练期与推理期结构通过重参数化(reparameterization)技术解耦,因此该模型被称为 RepVGG。
2.2 源码级解析:多分支训练与单分支推理
在 module.py 中,RepVGGBlock类完整实现了这一思想:
训练阶段的前向计算(
forward方法中self.training为真时):return self.nonlinearity(self.rbr_dense(inputs) + self.rbr_1x1(inputs) + id_out)其中
rbr_dense是 3x3 卷积 + BN 分支,rbr_1x1是 1x1 卷积 + BN 分支,id_out是恒等映射(BN)分支(当out_channels == in_channels and stride == 1时存在)。三个分支的输出直接相加后经 ReLU 激活。推理阶段的重参数化(
eval方法):首次切换到推理模式时,通过get_equivalent_kernel_bias将三条分支融合为单个 3x3 卷积:kernel3x3, bias3x3 = self._fuse_bn_tensor(self.rbr_dense) kernel1x1, bias1x1 = self._fuse_bn_tensor(self.rbr_1x1) kernelid, biasid = self._fuse_bn_tensor(self.rbr_identity) return kernel3x3 + self._pad_1x1_to_3x3_tensor(kernel1x1) + kernelid, bias3x3 + bias1x1 + biasid1x1 卷积核通过
_pad_1x1_to_3x3_tensor填充为 3x3,恒等分支生成单位卷积核,BN 的均值、方差、缩放与偏置通过_fuse_bn_tensor折算进卷积核与偏置中。融合完成后,推理时forward直接执行self.nonlinearity(self.rbr_reparam(inputs)),网络退化为纯 3x3 卷积栈,这正是 RepVGG 高吞吐推理的关键。
2.3 模型结构配置
从RepVGG_B2G4.__init__中的源码可以看出 B2g4 变体的结构参数:
num_blocks = [4, 6, 16, 1] # 四个 stage 的 RepVGGBlock 数量 width_multiplier = [2.5, 2.5, 2.5, 5] # 各 stage 通道数倍率 optional_groupwise_layers = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26] self.override_groups_map = {l: 4 for l in optional_groupwise_layers} # 指定层使用 group=4 的分组卷积即 B2g4 表示基础宽度倍率为 2.5、部分层采用 groups=4 的分组卷积。整个网络由stage0起始卷积块加上stage1~stage4四个阶段构成,最后通过AdaptiveAvgPool2D全局池化和nn.Linear全连接层输出类别 logits;forward同时返回(out, feature),其中feature为全局池化后的特征向量,可供下游任务使用。模块继承自paddlehub.module.cv_module.ImageClassifierModule(见 paddlehub/module/cv_module.py),该基类实现了training_step、validation_step、predict、serving_method、run_cmd等标准接口。
三、环境依赖与模块安装
3.1 环境依赖
使用本模块需要满足以下版本要求:
- paddlepaddle >= 2.0.0
- paddlehub >= 2.0.0
3.2 安装模块
执行以下命令即可从 PaddleHub 官方模型库安装repvgg_b2g4_imagenet:
$ hub install repvgg_b2g4_imagenet如安装过程中遇到问题,可参考以下零基础安装教程:
- 零基础Windows安装
- 零基础Linux安装
- 零基础MacOS安装
安装完成后,模块会连同预训练权重(model.pdparams)一起就绪。从 module.py 的加载逻辑可以看到,hub.Module(name='repvgg_b2g4_imagenet')在未指定load_checkpoint时会自动从模块目录加载 ImageNet 预训练权重并打印load pretrained checkpoint success。
四、模型 API 预测
4.1 命令行预测
安装完成后,可直接通过hub run命令对单张图片进行预测:
$ hub run repvgg_b2g4_imagenet --input_path "/PATH/TO/IMAGE" --top_k 5--input_path:待预测图片的路径(必填)。--top_k:返回置信度最高的前 k 个分类结果,默认值为 1(该参数的默认值定义见 cv_module.py 中的add_module_config_arg)。
命令行预测的内部实现位于ImageClassifierModule.run_cmd:解析参数后调用self.predict(images=[args.input_path], top_k=args.top_k),因此命令行与 Python API 的预测逻辑完全一致。
4.2 预测代码示例
import paddle import paddlehub as hub if __name__ == '__main__': model = hub.Module(name='repvgg_b2g4_imagenet') result = model.predict(['flower.jpg'])model.predict的内部流程(见 cv_module.py)为:先调用self.eval()触发 RepVGG 的重参数化,再在paddle.no_grad()环境下按batch_size分批处理,对模型输出施加softmax后按置信度降序取前top_k个类别,最终返回形如[{类别名: 置信度}, ...]的列表。每个输入图片会先经过模块内置的数据预处理(Resize((256, 256))→CenterCrop(224)→Normalize,并转成 RGB 通道顺序),与 Fine-tune 时采用的预处理保持一致。
五、基于 Flowers 数据集进行 Fine-tune
在完成 PaddlePaddle 与 PaddleHub 安装后,通过执行python train.py即可开始使用repvgg_b2g4_imagenet对 Flowers 等数据集进行 Fine-tune。仓库中的 demo/image_classification/train.py 提供了同结构的完整可运行示例(默认使用resnet50_vd_imagenet_ssld,将其替换为repvgg_b2g4_imagenet即可)。代码步骤如下:
Step 1: 定义数据预处理方式
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数据增强模块定义了丰富的数据预处理方式,用户可按照需求替换自己需要的数据预处理方式:
T.Resize((256, 256)):将图片缩放到 256x256,支持NEAREST、LINEAR、CUBIC、AREA、LANCZOS4、RANDOM等插值模式(见 paddlehub/vision/transforms.py),默认线性插值。T.CenterCrop(224):从中心裁剪出 224x224 区域,与 ImageNet 分类的经典输入尺寸一致。T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]):使用 ImageNet 统计的均值与标准差进行标准化。to_rgb=True:将 OpenCV 读取的 BGR 图片转为 RGB 通道顺序;Compose默认还会将图片从 HWC 排列转为 CHW(channel_first=True)。
Step 2: 下载数据集并使用
from paddlehub.datasets import Flowers flowers = Flowers(transforms) flowers_validate = Flowers(transforms, mode='val')transforms:数据预处理方式。mode:选择数据模式,可选项有train、test、val,默认为train。
数据集的实现参考 paddlehub/datasets/flowers.py:hub.datasets.Flowers()会自动从网络下载数据集(flower_photos.tar.gz)并解压到用户目录下$HOME/.paddlehub/dataset目录。该数据集共 5 个类别(num_classes = 5),根据mode的不同分别读取train_list.txt、test_list.txt或validate_list.txt,__getitem__返回(预处理后的图片, 类别索引)元组,可直接被paddle.io.DataLoader使用。
Step 3: 加载预训练模型
model = hub.Module(name="repvgg_b2g4_imagenet", label_list=["roses", "tulips", "daisy", "sunflowers", "dandelion"])name:选择预训练模型的名字。label_list:设置输出分类类别,默认为 ImageNet-2012 类别(即 label_list.txt 中的 1000 个类别)。
从 module.py 可以看出:传入label_list后,class_dim会按列表长度计算,全连接层self.linear的维度也随之改变(5 类时输出 5 维);不传时则读取默认的 1000 类列表。这保证了在迁移学习时只需更换分类头维度,而不必重新初始化整个骨干网络。
Step 4: 选择优化策略和运行配置
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主要控制 Fine-tune 的训练(实现在 paddlehub/finetune/trainer.py),包含以下可控制的参数:
model:被优化模型;optimizer:优化器选择;use_gpu:是否使用 GPU 运行,默认False;use_vdl:是否使用 VisualDL 可视化训练过程,默认True,日志写入checkpoint_dir/visualization目录;checkpoint_dir:保存模型参数的地址,若为空则自动生成ckpt_{时间戳}目录;compare_metrics:保存最优模型的衡量指标比较函数,默认取validation_step返回的第一个指标(越大越好)。
trainer.train主要控制具体的训练过程,包含以下可控制的参数:
train_dataset:训练时所用的数据集;epochs:训练轮数;batch_size:训练的批大小,如果使用 GPU,请根据实际情况调整 batch_size;num_workers:数据加载子进程数量,默认为 0;eval_dataset:验证集,设置后 Trainer 会在每个save_interval轮执行一次评估;log_interval:打印日志的间隔,单位为执行批训练的次数,默认 10;save_interval:保存模型的间隔频次,单位为执行训练的轮数,默认 10。
训练过程中,每次评估后若验证指标优于历史最优(由compare_metrics判定),Trainer 会将最优模型保存到${checkpoint_dir}/best_model目录(内含model.pdparams与model.pdopt),同时把历史最优指标写入metrics.pkl,便于断点续训时恢复。
六、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='repvgg_b2g4_imagenet', label_list=["roses", "tulips", "daisy", "sunflowers", "dandelion"], load_checkpoint='/PATH/TO/CHECKPOINT') result = model.predict(['flower.jpg'])NOTE:进行预测时,所选择的 module、checkpoint_dir、dataset 必须和 Fine-tune 所用的一样。也就是说,name、label_list要与训练阶段保持一致,load_checkpoint指向best_model目录下的权重文件;若类别顺序或数量不一致,全连接层维度与标签映射将无法对齐。
七、服务部署
PaddleHub Serving 可以部署一个在线分类任务服务,将repvgg_b2g4_imagenet封装为 HTTP API 对外提供预测能力。
第一步:启动 PaddleHub Serving
运行启动命令:
$ hub serving start -m repvgg_b2g4_imagenet这样就完成了一个分类任务服务化 API 的部署,默认端口号为 8866。
NOTE:如使用 GPU 预测,则需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。
第二步:发送预测请求
配置好服务端后,以下数行代码即可实现发送预测请求、获取预测结果:
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/repvgg_b2g4_imagenet" r = requests.post(url=url, headers=headers, data=json.dumps(data)) data = r.json()["results"]['data']请求体中images为 base64 编码的图片列表,top_k控制返回的 Top 类别数量。服务端收到请求后,会调用模块的serving_method(定义于 cv_module.py):将 base64 解码为 BGR 图片、调用predict完成分类、把 numpy 置信度转为 Pythonfloat后以{'data': [...]}形式返回,results字段即为该返回体。
八、更新历史
- 1.0.0:初始发布。
至此,你已经走通了 RepVGG-B2g4 从安装、推理到迁移学习、在线部署的完整链路。若需进一步了解 PaddleHub 其他预训练分类模型的用法,可对比参考仓库 modules/image/classification 目录下的同类模块;关于自定义数据集的接入方式,可参考 docs/docs_ch/finetune/customized_dataset.md。
【免费下载链接】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),仅供参考