PP-LCNet 图像分类实战指南:基于 PaddleHub 使用 pplcnet_x2_5_imagenet 完成推理与服务部署
【免费下载链接】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 仓库中的pplcnet_x2_5_imagenet模型模块为对象,系统讲解 PP-LCNet 轻量级骨干网络的背景、PaddleHub 模块的安装方式、命令行与 Python API 两种预测形态,以及基于 PaddleHub Serving 的在线服务部署全流程。读完本文,你将能够独立完成该模型的安装、单图与批量推理、参数调优(batch_size / top_k / GPU 开关)以及 HTTP 服务化调用,并能结合仓库源码理解从图像预处理、前向推理到 TopK 后处理的完整实现链路。
一、模型基本信息:PP-LCNet 是什么
| 模型名称 | pplcnet_x2_5_imagenet |
|---|---|
| 类别 | 图像-图像分类 |
| 网络 | PPLCNet |
| 数据集 | ImageNet-2012 |
| 是否支持 Fine-tuning | 否 |
| 模型大小 | 34 MB |
| 最新更新日期 | 2022-04-02 |
| 数据指标 | Acc |
PP-LCNet(PP-LiteConvNet)是百度针对 Intel CPU 设备及其加速库 MKLDNN 设计的特定骨干网络。与同期其他轻量级 SOTA 模型相比,该骨干网络可以在不增加推理时间的前提下进一步提升模型性能,从而在整体上超越已有的轻量级方案。本模块对应scale参数为x2.5的放大版本,在 PP-LCNet 系列(仓库中同时收录了 x0.25 / x0.35 / x0.5 / x0.75 / x1.0 / x1.5 / x2.0 等多个规模,见 modules/image/classification 目录)中属于通道最宽的型号之一,模型体积约 34 MB。
关于模型结构的更多信息可参考论文 "PP-LCNet: A Lightweight CPU Convolutional Neural Network"(arXiv:2109.15099),本文不展开其完整理论细节,聚焦于工程使用。
1.1 从源码看网络结构
仓库中的 model.py 给出了 PP-LCNet 的完整 Paddle 实现,其核心设计在NET_CONFIG中清晰可见——每个元素表示一个深度可分离卷积块,字段含义依次为kernel_size / in_c / out_c / stride / use_se:
blocks2:1 个块,3×3 卷积,16→32 通道,stride 1;blocks3:2 个块,32→64 通道(首个 stride 2 下采样);blocks4:2 个块,64→128 通道;blocks5:6 个块,128→256 通道,其中 4 个块使用 5×5 卷积核;blocks6:2 个块,256→512 通道,且均启用 SE(Squeeze-and-Excitation)注意力模块。
在PPLCNet_x2_5()工厂函数中,通过PPLCNet(scale=2.5, ...)将上述基准通道数乘以 2.5(并经make_divisible对齐到 8 的倍数),从而得到 x2.5 规模的网络。每个DepthwiseSeparable块由「深度卷积(DW Conv)+ 可选 SE + 逐点卷积(PW Conv)」组成,配合ConvBNLayer中卷积后接 BatchNorm 与 HardSwish 激活的经典组合;分类头则由全局平均池化、1×1 卷积扩维(class_expand=1280)、HardSwish、Dropout 与全连接层构成,输出 1000 类(ImageNet-2012)得分。
二、安装与环境准备
2.1 环境依赖
- paddlepaddle >= 1.6.2:PaddlePaddle 深度学习框架运行时;
- paddlehub >= 1.6.0:PaddleHub 模型管理与推理工具,安装方式可参考 PaddleHub 安装文档。
2.2 安装模型模块
通过 PaddleHub 的hub install命令一键安装模型:
$ hub install pplcnet_x2_5_imagenet如需安装指定版本,可在模块名后追加版本号:
$ hub install pplcnet_x2_5_imagenet==1.0.0如安装过程中遇到问题,可参考不同平台的零基础安装指引:零基础 Windows 安装、零基础 Linux 安装、零基础 MacOS 安装。
2.3 模块加载时的初始化逻辑
安装完成后,hub.Module(name="pplcnet_x2_5_imagenet")会触发模块的__init__(见 module.py),其核心动作包括:
- 通过
get_config()(实现在 utils.py)读取模块内置的 YAML 推理配置(含Infer.transforms预处理算子列表); - 定位 ImageNet-1K 标签文件(
imagenet1k_label_list.txt)与预训练权重(PPLCNet_x2_5_pretrained.pdparams); - 实例化
PPLCNet_x2_5网络并调用paddle.load+set_dict载入权重; - 依据配置中的
Infer.transforms构造预处理算子链preprocess_funcs。
也就是说,模型权重与标签文件随模块打包分发,用户无需自行准备 checkpoint。
三、模型 API 预测
3.1 命令行预测
安装完成后,可直接通过命令行对单张图片进行分类预测:
$ hub run pplcnet_x2_5_imagenet --input_path "/PATH/TO/IMAGE"该命令由@runnable装饰的run_cmd方法支撑(见 module.py),命令行同时支持以下可选参数:
--use_gpu:是否使用 GPU 推理(默认 False,使用 CPU);--batch_size:批大小,默认 1;--top_k:返回置信度最高的前 k 个类别,默认 1。
关于 PaddleHub 命令行指令的更多用法,可参考 PaddleHub 命令行指令文档。
3.2 预测代码示例
在 Python 中以编程方式调用同样十分简洁:
import paddlehub as hub import cv2 classifier = hub.Module(name="pplcnet_x2_5_imagenet") result = classifier.classification(images=[cv2.imread('/PATH/TO/IMAGE')]) # or # result = classifier.classification(paths=['/PATH/TO/IMAGE'])注意:images分支要求传入 BGR 颜色空间的 numpy 数组(cv2.imread的默认输出即 BGR),模块内部会自动完成 BGR→RGB 翻转;paths分支则直接传入图片文件路径列表,内部同样使用cv2.imread读取后转 RGB。
3.3 classification API 详解
def classification(images=None, paths=None, batch_size=1, use_gpu=False, top_k=1):参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| images | list[numpy.ndarray] | 图片数据列表,每个元素的 shape 为 [H, W, C],颜色空间为 BGR |
| paths | list[str] | 图片路径列表,与images二选一(两者同时为 None 时返回提示并不执行) |
| batch_size | int | 批大小,控制每次送入模型推理的图片数量 |
| use_gpu | bool | 是否使用 GPU;若使用 GPU,请先设置CUDA_VISIBLE_DEVICES环境变量 |
| top_k | int | 返回预测结果中置信度最高的前 k 个类别 |
返回值
res(list[dict]):分类结果列表,每个元素为字典,包含三个 key:class_ids:类别索引(int 列表);scores:对应置信度(保留 5 位小数);label_names:类别名称(来自 ImageNet-1K 标签映射文件)。
3.4 源码视角:classification 的执行链路
从 module.py 的classification实现可以看到完整推理流水线:
- 设备设置:调用
paddle.disable_static()进入动态图模式,并按use_gpu选择gpu:0或cpu; - 输入收集:遍历
images(BGR→RGB 翻转)或paths(cv2.imread后翻转)得到输入列表; - 预处理:对每张图依次执行
preprocess_funcs中的算子(见 processor.py),典型链路为ResizeImage(按短边等比缩放到指定尺寸)→CropImage(中心裁剪到 224×224)→NormalizeImage(scale=1/255,ImageNet 均值 [0.485, 0.456, 0.406]、方差 [0.229, 0.224, 0.225])→ToCHWImage(HWC→CHW); - 分批推理:按
batch_size聚合数据为paddle.Tensor后送入模型,兼容模型返回 list、logits或output三种输出形态; - TopK 后处理:调用
Topk算子,对 logits 做softmax(axis=-1)得到概率,按概率降序取前top_k个索引,再通过标签映射文件把索引转换为label_names,最终拼装为{class_ids, scores, label_names}字典列表返回。
其中create_operators采用「配置驱动」的设计:读取 YAML 中Infer.transforms的算子名与参数列表,动态实例化对应预处理类,这也是 PaddleClas 风格配置体系在该模块中的体现。
四、服务部署(PaddleHub Serving)
PaddleHub Serving 可以将该图像分类模型部署为一个在线 HTTP 服务,供其他业务系统通过 RESTful 接口调用。
4.1 第一步:启动 PaddleHub Serving
运行如下命令:
$ hub serving start -m pplcnet_x2_5_imagenet命令执行后即完成一个图像识别在线服务的部署,默认端口号为 8866。服务端会为每个模块创建独立的预测 worker,实际进程管理与端口监听实现在 paddlehub/commands/serving.py 与 paddlehub/serving 目录中(worker 数量按 CPU 核数经验公式cpu_count * 2 + 1计算,并会向CONF_HOME写入含 PID 与模块信息的 JSON 文件以便后续管理)。
NOTE:如使用 GPU 预测,需要在启动服务之前设置
CUDA_VISIBLE_DEVICES环境变量;纯 CPU 推理则无需设置。
4.2 第二步:发送预测请求
服务就绪后,以下代码即可发送预测请求并获取结果。请求以 JSON 为载体,图片需先编码为 base64 字符串:
import requests import json import cv2 import base64 def cv2_to_base64(image): data = cv2.imencode('.jpg', image)[1] return base64.b64encode(data.tostring()).decode('utf8') # 发送HTTP请求 data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]} headers = {"Content-type": "application/json"} url = "http://127.0.0.1:8866/predict/pplcnet_x2_5_imagenet" r = requests.post(url=url, headers=headers, data=json.dumps(data)) # 打印预测结果 print(r.json()["results"])服务端收到请求后,会经由模块的@serving装饰方法serving_method处理(见 module.py):先将 base64 字符串通过base64_to_cv2解码为 BGR 图像数组(实现见 processor.py),再调用classification完成推理,最终以 JSON 形式返回与离线 API 相同结构的results列表。
五、更新历史
- 1.0.0:初始发布,提供 ImageNet-2012 预训练权重、标签映射与完整推理/服务化能力。
六、快速索引:仓库内相关资源
- 模块入口与 API 实现:modules/image/classification/pplcnet_x2_5_imagenet/module.py
- PP-LCNet 网络结构定义:modules/image/classification/pplcnet_x2_5_imagenet/model.py
- 预处理算子与 TopK 后处理:modules/image/classification/pplcnet_x2_5_imagenet/processor.py
- 配置解析工具:modules/image/classification/pplcnet_x2_5_imagenet/utils.py
- Serving 命令实现:paddlehub/commands/serving.py
- 同系列不同 scale 的模型(x0.25 至 x2.0):modules/image/classification 下各
pplcnet_x*_imagenet目录
综上,pplcnet_x2_5_imagenet是一个开箱即用的 CPU 友好型图像分类模块:从hub install安装、hub run命令行预测、Python API 批量推理,到hub serving start服务化部署,整个生命周期都有清晰、可验证的工程路径,适合在资源受限或 CPU 推理场景下快速落地 ImageNet 1000 类图像分类能力。
【免费下载链接】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),仅供参考