PaddleFormers(PaddleHub)vgg13_imagenet 图像分类模块:安装、预测 API 与 VGG13 实现解析
2026/9/23 14:09:09 网站建设 项目流程

PaddleFormers(PaddleHub)vgg13_imagenet 图像分类模块:安装、预测 API 与 VGG13 实现解析

【免费下载链接】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 仓库中modules/image/classification/vgg13_imagenet模块文档展开,系统讲解基于 VGG13 网络、在 ImageNet-2012 数据集上训练的图像分类 PaddleHub 模块的安装方法、命令行与 Python 双入口预测方式、classificationAPI 的完整参数语义,并结合仓库内同系列模块的源码,深入剖析输入图像预处理流程、VGG 主干网络结构与 1000 类标签映射原理。读完本文,你将能够独立安装并调用vgg13_imagenet完成单张图片的类别预测,并能读懂 PaddleHub 图像分类模块的内部实现机制。

一、模型基本信息

根据模块文档,vgg13_imagenet的核心元数据如下:

项目内容
模块名称vgg13_imagenet
类别image classification(图像分类)
网络VGG
数据集ImageNet-2012
是否支持 Fine-tuning
模块大小508MB
最新更新日期-
数据指标-

模型介绍:VGG 是由牛津大学视觉组(University of Oxford)与 DeepMind 于 2014 年提出的一系列图像分类模型,该系列模型系统探索了卷积神经网络深度与性能之间的关系,通过实验证明了"网络越深,性能越好"的趋势。直至今日,VGG 仍被大量图像任务用作特征提取的 Backbone 网络。本模块采用 VGG13 结构,基于 ImageNet-2012 数据集训练,接受尺寸为 224 × 224 × 3 的输入图片,支持直接通过命令行或 Python 接口进行预测。

需要说明的是,vgg13_imagenet目录在仓库中仅保留 README 元数据(英文版与中文版),模块的可执行实现与同系列的vgg16_imagenet模块共享同一套 PaddleHub 模块架构。因此,本文后续的源码级解析将以仓库中vgg16_imagenet的完整实现(module.pyvgg.pydata_feed.py等)为参照,二者在输入输出规格(224×224×3、ImageNet 1000 类)与 API 约定上完全一致,仅网络深度配置不同。

二、环境依赖与安装

1、环境依赖

安装vgg13_imagenet前需要满足以下两个基础环境要求:

  • paddlepaddle >= 1.4.0:PaddlePaddle 深度学习框架,为模块预测提供底层算子执行能力。
  • paddlehub >= 1.0.0:PaddleHub 模型管理及预测框架,负责模型的下载、安装与统一调用。

PaddleHub 的完整安装指引参见仓库文档 PaddleHub 安装指南。

2、安装模块

在满足上述依赖后,通过 PaddleHub 命令行安装模块:

$ hub install vgg13_imagenet

安装过程中如遇到问题,可参考仓库提供的各平台快速上手文档:

  • Windows 快速上手
  • Linux 快速上手
  • MacOS 快速上手

从 PaddleHub 的模块管理机制来看,hub install会从模型仓库拉取模块包并注册到本地环境,之后便可通过hub run命令行或hub.Module(name=...)Python 接口随时调用。

三、命令行预测

安装完成后,最快捷的预测方式是使用 PaddleHub 命令行:

$ hub run vgg13_imagenet --input_path "/PATH/TO/IMAGE"

其中--input_path指定待预测图片的本地路径。执行后,模块会输出该图片的预测类别及其对应的置信度概率。

关于命令行调用的完整指令说明(包括参数组、输入选项与配置选项的用法),可进一步参阅仓库文档 PaddleHub 命令行指令。

四、Python 预测代码示例

在工程化场景中,更推荐通过 Python API 进行预测。官方文档给出的示例代码如下:

import paddlehub as hub import cv2 classifier = hub.Module(name="vgg13_imagenet") test_img_path = "/PATH/TO/IMAGE" input_dict = {"image": [test_img_path]} result = classifier.classification(data=input_dict)

这段代码的执行链路为:

  1. hub.Module(name="vgg13_imagenet")创建模块实例,内部会加载预训练模型与标签文件;
  2. 将图片路径以{"image": [path1, path2, ...]}的字典形式传入classification接口;
  3. 返回结果result为 list,每个元素对应当前输入图片的分类结果 dict,键为类别名(label),值为该类别对应的概率。

关于 API 形态的说明

需要提醒的是,上例中的data=input_dict是早期版本的调用约定。从仓库内同系列模块vgg16_imagenet的模块实现来看,classification接口实际接受的是更丰富的命名参数形态:

def classification(self, paths=None, images=None, use_gpu=False, batch_size=1, top_k=1):

其中:

  • paths:list 类型,每个元素为一张图片的文件路径;
  • images:numpy.ndarray 类型,可直接传入图像数据,形状为[N, H, W, C]
  • use_gpu:bool 类型,是否使用 GPU 进行预测,默认False
  • batch_size:int 类型,批大小,默认1
  • top_k:int 类型,返回概率最高的前 k 个类别,默认1,源码中会将取值限制在[1, 1000]区间内(top_k = max(min(top_k, 1000), 1))。

因此,在较新版本中更推荐的调用写法是直接传路径列表:

import paddlehub as hub classifier = hub.Module(name="vgg13_imagenet") result = classifier.classification( paths=["/PATH/TO/IMAGE1", "/PATH/TO/IMAGE2"], use_gpu=False, batch_size=1, top_k=3 )

两种写法最终都会走到同一套图像预处理与预测管线(详见下文第六节)。

五、classification API 详解

模块对外暴露的分类接口定义如下:

def classification(data)
  • 参数data(dict 类型):key 为"image",value 为待检测图片路径的 list。
  • 返回值result(list[dict] 类型):每个元素为对应输入图片的分类结果,dict 的 key 为类别名 label,value 为该 label 对应的概率。

源码层的执行流程

结合vgg16_imagenet的模块实现可以还原classification的内部执行链路:

  1. 惰性初始化预测程序:首次调用时通过self.context(trainable=False, pretrained=True, get_prediction=True)构建推理 Program,加载预训练权重,并clone(for_test=True)得到推理图;trainable=False表示冻结网络参数不做梯度更新,pretrained=True表示加载模块自带的 ImageNet 预训练权重。
  2. 数据读取与预处理:通过test_reader(paths, images)将路径或 ndarray 数据统一转换为预处理后的张量(详见第六节)。
  3. 分批推理:按batch_size切分输入,将批数据包装为PaddleTensor后交给预测器执行。
  4. 结果后处理:对输出概率向量执行np.argsort降序排列,取前top_k个索引,再通过标签文件映射为类别名,最终返回[{label: prob}, ...]结构。

命令行参数的对应关系

add_module_config_argadd_module_input_arg可以看到命令行参数与 API 参数的映射:

  • --input_path(str):指定单张图片路径;
  • --input_file(str):指定一个文本文件,文件内每行一条图片路径,通过txt_parser.parse解析后批量预测;
  • --use_gpu(bool,默认 False):是否使用 GPU;
  • --batch_size(int,默认 1):预测批大小。

run_cmd装饰器将命令行参数解析后统一转调self.classification(paths=input_data, use_gpu=..., batch_size=...),这正是hub run命令能够工作的底层机制。

六、输入图像预处理流程解析

图片从磁盘加载到送入网络之前,需要经过标准化的预处理。仓库中vgg16_imagenet的数据读取实现完整呈现了这一流程:

DATA_DIM = 224 img_mean = np.array([0.485, 0.456, 0.406]).reshape((3, 1, 1)) img_std = np.array([0.229, 0.224, 0.225]).reshape((3, 1, 1))

process_image的具体步骤为:

  1. 等比缩放(resize_short):将图片短边缩放到 256 像素(target_size=256),长边按比例缩放,使用Image.LANCZOS高质量插值;
  2. 中心裁剪(crop_image):从缩放后的图片中心裁剪出 224 × 224 的区域(center=True),与训练阶段随机裁剪形成对应;
  3. 模式归一:非 RGB 模式统一转换为 RGB;
  4. 标准化:像素值除以 255 归一化到[0, 1],再减去均值[0.485, 0.456, 0.406]、除以标准差[0.229, 0.224, 0.225],最后将 HWC 布局转置为 CHW(transpose((2, 0, 1)))。

这一组均值/标准差正是 ImageNet 数据集的经典统计量(与模块实现中get_pretrained_images_mean/get_pretrained_images_std返回的[0.485, 0.456, 0.406][0.229, 0.224, 0.225]一致),在推理时对输入做相同预处理,是保证预训练权重发挥效力的关键前提。

test_reader作为生成器,同时兼容paths(文件路径)与images(ndarray 数据)两种输入来源,并对不存在的路径执行assert os.path.isfile(...)校验,保证下游拿到的一定是有效图片。

七、VGG 网络结构与模块源码解析

1、VGG 主干结构

vgg16_imagenet的网络实现(VGG类)以论文 Very Deep Convolutional Networks for Large-Scale Image Recognition 为依据,核心配置如下:

depth_cfg = {16: [2, 2, 3, 3, 3], 19: [2, 2, 4, 4, 4]} vgg_base = [64, 128, 256, 512, 512]

depth_cfg定义每个卷积阶段的卷积层数量,vgg_base定义各阶段输出通道数。由此可推断,VGG13 对应depth=13的结构即为 5 个卷积阶段的 8 个卷积层(2+2+3+3+3=13,其中前 8 个为卷积层,后接全连接层)——本系列模块文档对 VGG13 的定义即为"VGG 系列中 13 层配置的模型",输入 224×224×3,经逐阶段 3×3 卷积(padding=1、stride=1、ReLU 激活)与 2×2 最大池化逐层下采样,最后接入fc6fc7(均为 4096 维)与fc8(1000 维)三层全连接,经 softmax 输出 1000 类概率分布。

2、分类头与输出

get_prediction=True(纯推理)模式下,网络输出层为:

out = fluid.layers.fc(input=fc2, size=self.class_dim, ...) out = fluid.layers.softmax(out)

class_dim=1000对应 ImageNet-2012 的类别总数。推理时通过np.argsort(res)[::-1][:top_k]取概率最高的 k 个索引,再借助标签文件(共 1000 行,每行格式为类名, 可能的同义词/别名,由processor.pyload_label_info读入)映射为可读的类别名称。模块在返回结果时取class_name.split(',')[0],即只保留主类别名。

3、CPU/GPU 双预测器

_set_config中模块同时构建了 CPU 与 GPU 两套AnalysisConfig预测器:默认禁用 GPU 并关闭 IR 优化以适配 CPU 推理;若检测到环境变量CUDA_VISIBLE_DEVICES设置了合法 GPU 编号,则额外构建显存池 500MB 的 GPU 预测器。classification根据use_gpu参数在两者间切换,这也是--use_gpu命令行参数生效的底层机制。

八、版本说明(Release Note)

模块当前发布版本为1.0.0(初始发布),可通过指定版本号重新安装:

$ hub install vgg13_imagenet==1.0.0

九、延伸阅读

  • 中文版模块文档:vgg13_imagenet README(中文)
  • 同系列完整实现(模块 API、预处理、网络定义):vgg16_imagenet 模块目录
  • 图像分类 Demo 实战:demo/image_classification 训练与预测示例
  • 更多图像分类模块(ResNet、MobileNet、EfficientNet 等系列)可在 modules/image/classification 目录下按需查阅

本文内容均以当前仓库内模块文档与实际源码为准。实际运行时,请根据你安装的 paddlepaddle / paddlehub 版本核对 API 形态差异(例如data=dictpaths=两种传参方式),并以模块help()输出的签名信息为最终依据。

【免费下载链接】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),仅供参考

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

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

立即咨询