news 2026/9/23 16:51:47

PaddleHub HRNet40 图像分类模型实战:从命令行预测到 Fine-tune 与 Serving 部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleHub HRNet40 图像分类模型实战:从命令行预测到 Fine-tune 与 Serving 部署
  • 人工智能
  • 预训练
  • 微调
  • 模型推理服务

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

本文以 PaddleHub 开源仓库中的hrnet40_imagenet图像分类模块(模块文档)为核心,系统讲解 HRNet 高分辨率网络的模型结构、环境安装、命令行与 Python API 预测、基于 Flowers 数据集的 Fine-tune 全流程,以及 PaddleHub Serving 服务化部署。读完本文,你将掌握在 PaddlePaddle 2.0 + PaddleHub 2.0 环境下,完整走通"加载预训练模型 → 数据预处理 → 微调训练 → 最优模型保存 → 在线服务部署"的端到端图像分类实战链路。

一、模型基本信息

hrnet40_imagenet是 PaddleHub 提供的图像分类预训练模块,核心信息如下:

项目内容
模型名称hrnet40_imagenet
类别图像-图像分类
网络HRNet
数据集ImageNet-2012
是否支持 Fine-tuning
模型大小333MB
指标-
最新更新日期2021-09-14
当前版本1.0.0

HRNet(High-Resolution Net)是微软亚洲研究院在 2019 年提出的神经网络结构。与之前"先下采样提取深层语义、再恢复分辨率"的传统卷积网络不同,HRNet 在整个网络深层阶段依然保持高分辨率特征图的并行计算,因此输出的关键点热图在空间位置上更加精确。这种"全程保持高分辨率"的特性,使得它在对空间分辨率敏感的视觉任务(如关键点检测、目标检测、语义分割)中同样表现突出。

从仓库源码看,module.py 中通过@moduleinfo装饰器注册了该模块,type="CV/classification"summary明确说明该模块使用 ImageNet 数据集训练,类别标签列表见 label_list.txt(共 1000 类,即 ImageNet-2012 标准类别)。

二、HRNet40 网络结构与源码实现解析

2.1 高分辨率多分支并行架构

在 module.py 的HRNet40类中,网络宽度self.width = 40,并通过self.channels字典定义了不同宽度(18/30/32/40/44/48/60/64)对应的分支通道数。对于 width=40:

  • 第 2 阶段通道数:[40, 80]
  • 第 3 阶段通道数:[40, 80, 160]
  • 第 4 阶段通道数:[40, 80, 160, 320]

同时,num_modules_2, num_modules_3, num_modules_4 = 1, 4, 3表示第 2/3/4 阶段分别堆叠 1、4、3 个 HighResolutionModule。整个前向流程(forward)为:

  1. 两个 stride=2 的 3×3 卷积(conv_layer1_1conv_layer1_2)对输入降采样;
  2. Layer1堆叠 4 个 BottleneckBlock 提取初始特征;
  3. 依次经过tr1/st2tr2/st3tr3/st4三个"TransitionLayer + Stage"组合,逐步将单分支扩展为 2、3、4 个并行高分辨率分支;
  4. 分类头LastClsOut对各分支做 Bottleneck 处理,并通过cls_head_conv_list逐级融合多尺度特征;
  5. 经过 1×1 卷积、全局平均池化后,由nn.Linear(2048, class_dim)输出分类 logits。

2.2 核心组件的底层实现

从源码结构看,HRNet40 由以下可复用组件组成,各组件在 module.py 中均有对应实现:

  • ConvBNLayer:卷积 + BatchNorm 组合层,卷积默认不带 bias,BatchNorm 负责激活(act="relu"None);
  • BasicBlock/BottleneckBlock:标准残差块,支持downsample短接与可选的 SE 注意力模块(has_se,本模型未启用,self.has_se = False);
  • Branches:并行分支,每个分支独立堆叠block_num=4个 BasicBlock;
  • FuseLayers:多分辨率特征融合层,高分辨率分支通过F.upsample(..., mode="nearest")上采样与低分辨率分支对齐相加,低分辨率分支通过 stride=2 卷积逐步降采样后相加;
  • HighResolutionModule:一个"分支计算 + 特征融合"的完整模块;
  • Stage:多个 HighResolutionModule 的顺序堆叠。

这种"多分支并行 + 反复跨分辨率融合"的设计,正是 HRNet 能在深层保持高分辨率特征的关键,也是它与 ResNet 等串行下采样网络的本质区别。

三、环境依赖与模块安装

3.1 环境依赖

使用hrnet40_imagenet需要满足以下版本要求:

  • paddlepaddle >= 2.0.0
  • paddlehub >= 2.0.0

3.2 安装模块

执行以下命令安装模块:

$ hub install hrnet40_imagenet

若安装过程中遇到问题,可参考仓库内的零基础安装文档:

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

四、模型 API 预测

4.1 命令行预测

hub run命令通过 paddlehub/commands/run.py 中的RunCommand实现:它加载指定 Module,调用被@runnable装饰的run_cmd方法(见 cv_module.py),该方法会解析--input_path--top_k两个参数并执行预测:

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

参数说明:

  • --input_path:待预测图片的路径(必填);
  • --top_k:返回置信度最高的前 k 个分类结果,默认值为 1。

4.2 Python 代码预测

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

predict方法定义在 cv_module.py 的ImageClassifierModule中,其内部流程为:

  1. 将模型切换为 eval 模式,并在paddle.no_grad()下推理;
  2. 对输入图像依次执行模块内置的transforms预处理;
  3. 前向得到 logits 后经F.softmax转为概率;
  4. 通过np.argsort(preds)[:, ::-1][:, :top_k]取出 Top-k 类别索引,并映射为self.labels中的类别名称;
  5. 返回形如[{'类别名': 概率值}, ...]的字典列表。

其中transforms在 module.py 中定义,与 Fine-tune 阶段保持一致(Resize 256 → CenterCrop 224 → 按 ImageNet 均值/方差归一化)。

五、基于 Flowers 数据集进行 Fine-tune

在完成 PaddlePaddle 与 PaddleHub 安装后,执行python train.py即可使用hrnet40_imagenet对 Flowers 数据集进行 Fine-tune。完整代码参考 demo/image_classification/train.py(该示例默认使用resnet50_vd_imagenet_ssld,将name替换为hrnet40_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数据增强模块(实现见 paddlehub/vision/transforms.py)提供了丰富的数据预处理方式,用户可按需替换:

  • T.Compose:按顺序组合多个预处理算子;to_rgb=True表示将 OpenCV 读入的 BGR 图像转为 RGB,channel_first默认为 True,最终输出[C, H, W]布局;
  • T.Resize((256, 256)):将图像缩放到 256×256,支持NEAREST/LINEAR/CUBIC/AREA/LANCZOS4/RANDOM等插值模式,默认LINEAR
  • T.CenterCrop(224):从图像中心裁剪出 224×224 区域;
  • T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]):使用 ImageNet 数据集的均值与标准差做标准化,与该预训练模型的训练分布保持一致。

Step 2:下载数据集并使用

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

参数说明:

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

Flowers数据集的实现见 paddlehub/datasets/flowers.py:它是一个 5 分类花卉数据集(num_classes = 5),通过@download_data装饰器在首次使用时自动从网络下载并解压到用户目录下的$HOME/.paddlehub/dataset目录(源码中对应hubenv.DATA_HOME下的flower_photos目录),随后按train_list.txt/test_list.txt/validate_list.txt读取样本路径与标签。

Step 3:加载预训练模型

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

参数说明:

  • name:预训练模型的名字,即hrnet40_imagenet
  • label_list:设置输出分类类别,默认为 ImageNet-2012 的 1000 类(对应 label_list.txt);传入自定义列表后,模型最后的全连接层输出维度会动态调整为len(label_list)

加载时,module.py 会从模块目录加载预训练权重model.pdparams;若指定了load_checkpoint参数,则优先加载该路径下的微调权重。

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)

优化策略:PaddlePaddle 2.0 提供了SGDAdamAdamax等多种优化器,其中Adam常用参数:

  • learning_rate:全局学习率,默认 1e-3;
  • parameters:待优化的模型参数。

运行配置Trainer主要控制 Fine-tune 的训练(实现见 paddlehub/finetune/trainer.py),包含以下可控制参数:

参数说明
model被优化模型,必须是paddle.nn.Layer实例
optimizer优化器选择
use_gpu是否使用 GPU 训练(设为 True 时调用paddle.set_device('gpu')
use_vdl是否使用 VisualDL 可视化训练过程(默认 True,日志写入checkpoint_dir/visualization
checkpoint_dir保存模型参数的地址,未指定时默认为ckpt_<时间戳>
compare_metrics保存最优模型的衡量指标比较方法;默认取验证指标字典第一个 key,越大越好

trainer.train主要控制具体的训练过程,参数如下:

参数说明
train_dataset训练时所用的数据集
epochs训练轮数
batch_size训练的批大小,使用 GPU 时请根据显存实际情况调整
num_workers数据加载子进程数量,默认为 0
eval_dataset验证集;设置后每个save_interval轮执行一次评估
log_interval打印日志的间隔,单位为执行的批训练次数(默认 10)
save_interval保存模型的间隔频次,单位为训练轮数(默认 10)

从 trainer.py 的实现可以看到:每个 epoch 结束时若满足save_interval条件,Trainer 会先对验证集执行evaluate,再通过compare_metrics判断当前验证指标是否优于历史最优;若更优,则将模型权重与优化器状态保存到${checkpoint_dir}/best_model,同时记录metrics.pkl。每个 epoch 的 checkpoint(model.pdparams+model.pdopt)也会按轮保存,断点续训时_load_checkpoint会自动恢复最近一轮的状态。训练日志(loss、acc、lr、ETA)由logger.train输出,并同步写入 VisualDL。

模型预测(加载 Fine-tune 结果)

Fine-tune 完成后,验证集上表现最优的模型保存在${CHECKPOINT_DIR}/best_model目录下(${CHECKPOINT_DIR}为训练时选择的 checkpoint 目录)。使用该模型预测的脚本(参考 demo/image_classification/predict.py)如下:

import paddle import paddlehub as hub if __name__ == '__main__': model = hub.Module(name='hrnet40_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 时保持一致,否则类别映射与权重维度不匹配会导致预测错误。

六、服务部署:PaddleHub Serving

PaddleHub Serving 可以将hrnet40_imagenet部署为一个在线分类任务服务,整体分两步完成。

第一步:启动 PaddleHub Serving

$ hub serving start -m hrnet40_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/hrnet40_imagenet" r = requests.post(url=url, headers=headers, data=json.dumps(data)) data = r.json()["results"]['data']

服务端处理逻辑由 cv_module.py 中被@serving装饰的serving_method承担:它接收 base64 编码的图片列表,解码为 BGR 图像后调用predict(支持top_k参数),并将每个类别的概率统一转换为float后封装进{'data': ...}返回给客户端。

七、更新历史

  • 1.0.0:初始发布。

八、延伸阅读

  • 图像分类 Fine-tune 通用流程文档:docs/docs_ch/finetune/image_classification.md
  • 自定义数据集接入指南:docs/docs_ch/finetune/customized_dataset.md
  • 训练器实现:paddlehub/finetune/trainer.py
  • 数据集实现:paddlehub/datasets/flowers.py
  • 数据预处理算子:paddlehub/vision/transforms.py

本仓库modules/image/classification目录下还提供了大量可直接替换的 ImageNet 预训练分类模块(如 resnet、mobilenet、efficientnet、resnext、hrnet 全系列等),只需将hub.Module(name=...)中的模型名替换即可复用本文介绍的完整流程。

  • 人工智能
  • 预训练
  • 微调
  • 模型推理服务

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

相关推荐

上一篇:把微信公众号变成RSS:一份可私有化的完整自托管笔记
下一篇:苍穹(CangChain)框架技术文档

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

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

BP神经网络Simulink仿真从S函数到调参避坑,一份可运行资源

简介&#xff1a;面向MATLAB R2016a环境使用S函数开展BP神经网络仿真的开发者&#xff0c;包内提供了已测试通过的完整实现&#xff0c;适合正在学习神经网络、需要在Simulink中搭建自定义模块的自动化或电气专业学生与工程师。共4个文件&#xff0c;包含slx仿真模型、m脚本与两…

作者头像 李华
网站建设 2026/9/23 16:49:07

风电功率曲线数据清洗与风能资源评估实战指南

简介&#xff1a;《风电功率曲线异常数据清洗及考虑风速风向的风能资源评估》论文复现资源面向风电领域科研人员、工程技术人员及高校研究生&#xff0c;聚焦风机功率曲线异常数据识别与风速-风向联合风能评估问题。内容围绕k-means、DBSCAN、Thompson tau法与Copula理论等多种…

作者头像 李华
网站建设 2026/9/23 16:48:59

自动驾驶SoC功能安全设计:从FMEDA到故障注入的ISO 26262实践

简介&#xff1a;一份聚焦自动驾驶车载SoC设计与ISO 26262功能安全标准的专业解析资料&#xff0c;面向汽车制造商、OEM及供应链技术人员&#xff0c;也适合高校相关专业师生参考学习。内容围绕车辆架构向集中式域处理转型的背景&#xff0c;阐明SoC在自动驾驶、车辆连接、移动…

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

Java实现环境监测系统:从数据采集到WebSocket实时可视化

简介&#xff1a;这是一份面向Java初学者与毕业设计学生的环境监测系统完整源码&#xff0c;涵盖空气、温度、湿度等多类环境数据的采集、展示与管理流程。项目采用Spring、Servlet/JSP与DAO分层架构&#xff0c;覆盖业务处理、数据持久化与请求响应链路&#xff0c;适合课程设…

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

MCSE认证深度解析:从备考到实战,微软系统工程师进阶指南

“微软认证系统工程师”这个名头&#xff0c;放在今天的IT圈子里其实有点微妙。一方面&#xff0c;云时代 Azure、M365 的认证铺天盖地&#xff0c;微软自己都把认证体系从 MCP/MCSE 重构成了基于角色的 Role-based 认证&#xff1b;另一方面&#xff0c;我这两年面试运维和系统…

作者头像 李华
网站建设 2026/9/23 16:45:11

一站式 AI 学术辅助平台 okbiye 应用价值与适用场景研究

在高校毕业设计工作中&#xff0c;文献调研、文稿撰写、图表制作、格式规范、论文预检测、答辩材料制备构成完整工作链路。传统模式下&#xff0c;学生需要使用多款独立软件完成上述任务&#xff0c;工具间数据隔离、格式不兼容、学术风险难以预判等问题持续增加毕业设计的时间…

作者头像 李华