news 2026/9/23 9:47:08

基于PaddleHub的RepVGG-B2g4图像分类模型实战:从模型安装、推理预测到Fine-tune与服务化部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于PaddleHub的RepVGG-B2g4图像分类模型实战:从模型安装、推理预测到Fine-tune与服务化部署

基于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 + biasid

    1x1 卷积核通过_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_stepvalidation_steppredictserving_methodrun_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,支持NEARESTLINEARCUBICAREALANCZOS4RANDOM等插值模式(见 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:选择数据模式,可选项有traintestval,默认为train

数据集的实现参考 paddlehub/datasets/flowers.py:hub.datasets.Flowers()会自动从网络下载数据集(flower_photos.tar.gz)并解压到用户目录下$HOME/.paddlehub/dataset目录。该数据集共 5 个类别(num_classes = 5),根据mode的不同分别读取train_list.txttest_list.txtvalidate_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.pdparamsmodel.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 所用的一样。也就是说,namelabel_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 9:45:56

心理咨询师证有必要报班吗?从报名学习到考试拿证,报考全攻略

考心理咨询师证,真的有必要报班吗?这是很多人报名前的第一道纠结。有人说网上资料一大堆自学就行,有人说没有系统培训很难考过——两种说法都有道理,关键看你的基础、时间和目标。本文从心理咨询师证的价值、自学与报班的真实差别…

作者头像 李华
网站建设 2026/9/23 9:44:46

Atlas 300V推理卡上部署YOLO:完整实践与避坑指南

最近群里有个话题被反复问起来:**Atlas 300V 24G这个卡,到底算不算运算加速卡?能不能在上面跑YOLO目标检测?**问题虽然短,但背后绕着的其实是昇腾推理卡在产品定位、软件栈和实际落地之间的那层窗户纸。我的答案是&…

作者头像 李华
网站建设 2026/9/23 9:44:39

智能工牌录音的隐私合规边界:风险不在采集在流转

智能工牌录音的合规问题,通常被简化成一句“征得客户同意了吗”。但同意只是起点。真正的风险发生在这之后:数据采回来之后谁能听、听多久、存在哪里、能拿去做什么。多数出问题的项目,不是倒在“没告知”,而是倒在“告知了却管不…

作者头像 李华
网站建设 2026/9/23 9:43:02

Rollup 代码分割实战:从动态导入到 manualChunks 优化首屏加载

1. 从一个“单文件加载缓慢”问题说起:为什么需要代码分割前阵子帮朋友排查一个生产环境的性能问题,现象很典型:一个后台管理系统,首屏白屏时间在弱网环境下能到 8 秒以上。打开浏览器 Network 面板一看,主 JS 文件 6.…

作者头像 李华
网站建设 2026/9/23 9:42:40

台达PLC编程经典实例教程之四:从点位控制到多轴联动的实战拆解

1. 台达PLC编程经典实例教程之四:从点位控制到多轴联动的实战拆解搞工控的朋友对台达DVP系列PLC肯定不陌生,尤其是做设备改造和产线升级的兄弟,手头多多少少都碰过几台。这个“经典实例教程”系列我一直在追,前三篇聊了基本指令、…

作者头像 李华
网站建设 2026/9/23 9:41:03

开放式代码审查:从“走过场”到数据驱动的代码质量体系

我们团队半年前做了一次复盘,发现将近三分之一的线上故障,根因都能追溯到代码审查环节的疏漏——不是没人审,而是审了等于没审。review 评论永远是“LGTM”“改下命名”,严重的逻辑问题反而没人提。后来我们彻底重构了审查流程&am…

作者头像 李华