ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于 PaddleHub 使用 repvgg_a1_imagenet 进行图像分类推理、Fine-tune 与 Serving 部署实战指南

基于 PaddleHub 使用 repvgg_a1_imagenet 进行图像分类推理、Fine-tune 与 Serving 部署实战指南 基于 PaddleHub 使用 repvgg_a1_imagenet 进行图像分类推理、Fine-tune 与 Serving 部署实战指南【免费下载链接】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_a1_imagenet 模块文档为主体系统讲解 RepVGG 图像分类模型的架构原理、PaddleHub 安装方式、命令行与 Python API 预测、Flowers 数据集上的迁移学习Fine-tune以及基于 PaddleHub Serving 的在线服务化部署。读完本文你将掌握如何基于该预训练模型快速完成从单张图片分类到自定义数据集微调、再到 HTTP 服务发布的完整链路并理解其背后训练多分支、推理重参数化的核心实现。一、模型基本信息模型名称repvgg_a1_imagenet类别图像-图像分类网络RepVGG数据集ImageNet-2012是否支持 Fine-tuning是模型大小82MB指标-最新更新日期2021-09-141.1 RepVGG 架构背景RepVGGMaking VGG-style ConvNets Great Again系列模型由清华大学丁桂光团队、旷视科技孙建等、香港科技大学和阿伯里斯特威斯大学于 2021 年共同提出是一种简单但功能强大的卷积神经网络架构。其核心设计思想是训练阶段采用多分支拓扑每个 RepVGGBlock 由 3×3 卷积分支rbr_dense、1×1 卷积分支rbr_1x1以及恒等映射分支rbr_identity仅当输入输出通道相同且 stride 为 1 时存在构成三个分支均带有 BatchNorm 层最后经 ReLU 非线性激活后相加输出推理阶段退化为 VGG 风格通过重新参数化re-parameterization技术在推理时把多分支结构融合为单个 3×3 卷积加偏置得到一个仅由 3×3 卷积和 ReLU 堆叠组成的、与 VGG 相似的推理时网络兼具训练时的高精度与推理时的高吞吐、低内存占用。这一设计正是模型名称repvggre-parameterized VGG的由来。1.2 源码中的 RepVGG 实现仓库中该模块的模型定义位于 modules/image/classification/repvgg_a1_imagenet/module.py其中RepVGGBlock类的三个分支在forward中直接体现了训练/推理的解耦逻辑def forward(self, inputs): if not self.training: return self.nonlinearity(self.rbr_reparam(inputs)) # 推理单分支 3x3 卷积 if self.rbr_identity is None: id_out 0 else: id_out self.rbr_identity(inputs) return self.nonlinearity(self.rbr_dense(inputs) self.rbr_1x1(inputs) id_out) # 训练三分支求和当模型切换到eval()模式时RepVGGBlock.eval()会调用get_equivalent_kernel_bias()将 3×3 分支、1×1 分支通过_pad_1x1_to_3x3_tensor补齐为 3×3 卷积核和恒等分支构造单位卷积核的 BN 参数逐一融合为等价的单一卷积核与偏置写入rbr_reparam卷积层。_fuse_bn_tensor完成 Conv-BN 的折叠计算t gamma / sqrt(running_var eps)最终卷积核为kernel * t偏置为beta - running_mean * gamma / std。这段代码完整呈现了 RepVGG 重参数化推理的全部数学过程是理解该模型性能优势的关键。RepVGG_A1类通过_make_stage按num_blocks [2, 4, 14, 1]与width_multiplier [1, 1, 1, 2.5]构建四个阶段stage1~stage4加上stage0输入层最后经AdaptiveAvgPool2D全局池化与全连接分类层输出类别分数并返回(out, feature)供上层调用。二、安装2.1 环境依赖paddlepaddle 2.0.0paddlehub 2.0.02.2 安装模块执行以下命令安装repvgg_a1_imagenet预训练模型模块$ hub install repvgg_a1_imagenet安装过程中模型权重model.pdparams82MB会被下载并随模块一同管理。从源码看RepVGG_A1.__init__在未显式传入load_checkpoint时会自动加载模块目录下的model.pdparams预训练权重见 module.py 中checkpoint os.path.join(self.directory, model.pdparams)一段。如安装时遇到环境问题可参考仓库内的安装教程零基础 Windows 安装零基础 Linux 安装零基础 MacOS 安装三、模型 API 预测3.1 命令行预测安装完成后可直接通过命令行对任意图片进行预测--top_k指定输出置信度最高的前 k 个类别$ hub run repvgg_a1_imagenet --input_path /PATH/TO/IMAGE --top_k 5该命令的实现入口位于 paddlehub/module/cv_module.py 的ImageClassifierModule.run_cmd通过runnable装饰器暴露为hub run子命令它会解析--input_path与--top_k参数并调用内部predict逻辑。3.2 预测代码示例import paddle import paddlehub as hub if __name__ __main__: model hub.Module(namerepvgg_a1_imagenet) result model.predict([flower.jpg])其中predict方法的完整签名见 cv_module.py为def predict(self, images: List[np.ndarray], batch_size: int 1, top_k: int 1) - List[dict]:参数说明images待预测图片列表元素为 BGR 格式的np.ndarraybatch_size预测批大小默认 1top_k每张图片输出置信度最高的 k 个类别默认 1。预测流程为先对输入做与训练一致的数据预处理再经 softmax 得到各类别概率最后按top_k截取并返回[{类别名: 概率}, ...]形式的列表。模型内置的预处理管线定义在 module.py 的RepVGG_A1.transforms中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_rgbTrue)即先缩放到 256×256再中心裁剪为 224×224最后按 ImageNet 均值/标准差归一化与后续 Fine-tune 阶段的数据增强完全一致。模型默认的分类标签为 ImageNet-2012 的 1000 个类别类别清单存放在 modules/image/classification/repvgg_a1_imagenet/label_list.txt从tench、goldfish到toilet tissue共 1000 行。RepVGG_A1.__init__会在未传入label_list时读取该文件并据此设置全连接层的输出维度。四、如何开始 Fine-tune在完成 PaddlePaddle 与 PaddleHub 安装后执行python train.py即可使用repvgg_a1_imagenet对 Flowers 等数据集进行 Fine-tune。完整可运行示例可参考 demo/image_classification/train.py该示例默认使用resnet50_vd_imagenet_ssld只需将name参数替换为repvgg_a1_imagenet即可无缝切换。以下按四个步骤展开说明。Step1: 定义数据预处理方式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_rgbTrue)transforms数据增强模块定义了丰富的数据预处理方式缩放、裁剪、归一化、颜色空间转换等用户可按照实际需求替换为自定义预处理。为保证训练与预测一致性此处应保持与模型内置transforms相同的参数。Step2: 下载数据集并使用from paddlehub.datasets import Flowers flowers Flowers(transforms) flowers_validate Flowers(transforms, modeval)参数说明transforms数据预处理方式mode数据模式可选项为train、test、val默认为train。数据集的实现位于 paddlehub/datasets/flowers.py。Flowers继承paddle.io.Dataset通过download_data(urlhttps://bj.bcebos.com/paddlehub-dataset/flower_photos.tar.gz)装饰器在首次使用时自动从网络下载flower_photos数据集并解压到用户目录下的$HOME/.paddlehub/dataset目录。该数据集共 5 类roses、tulips、daisy、sunflowers、dandelionmodetrain读取train_list.txtmodetest读取test_list.txtmodeval读取validate_list.txt每一行按图片路径 类别索引组织__getitem__返回预处理后的图像张量与类别标签。Step3: 加载预训练模型model hub.Module(namerepvgg_a1_imagenet, label_list[roses, tulips, daisy, sunflowers, dandelion])参数说明name预训练模型名称此处为repvgg_a1_imagenetlabel_list设置输出分类类别默认为 ImageNet-2012 的 1000 个类别。传入自定义label_list后源码会以class_dim len(label_list)重建全连接分类层见 module.py 中self.linear nn.Linear(int(512 * width_multiplier[3]), class_dim)从而支持迁移到任意数量类别的下游任务。Step4: 选择优化策略和运行配置import paddle from paddlehub.finetune.trainer import Trainer optimizer paddle.optimizer.Adam(learning_rate0.001, parametersmodel.parameters()) trainer Trainer(model, optimizer, checkpoint_dirimg_classification_ckpt) trainer.train(flowers, epochs100, batch_size32, eval_datasetflowers_validate, save_interval1)优化策略Paddle 2.0 提供了多种优化器如SGD、Adam、Adamax等本例使用Adamlearning_rate全局学习率此处设为 0.001parameters待优化的模型参数即model.parameters()。Trainer 参数Trainer主要控制 Fine-tune 的训练过程定义于 paddlehub/finetune/trainer.py其核心构造参数包括model被优化模型paddle.nn.Layeroptimizer优化器use_gpu是否使用 GPU 运行默认为False内部通过paddle.set_device(gpu)/paddle.set_device(cpu)切换设备use_vdl是否使用 VisualDL 可视化训练过程默认为True日志写入checkpoint_dir/visualizationcheckpoint_dir保存模型参数checkpoint的目录未指定时默认使用ckpt_{time.time()}格式自动生成Trainer 启动时会扫描该目录下epoch_*前缀的 checkpoint 实现断点续训compare_metrics保存最优模型时的衡量指标比较方法callable默认取validation_step返回的主指标数值越大越好。trainer.train 参数trainer.train控制具体的训练过程完整签名可查看 trainer.py 中的train方法主要参数包括train_dataset训练所用的数据集epochs训练轮数batch_size训练的批大小若使用 GPU请根据显存实际情况调整num_workersDataLoader 的 worker 数量默认为 0eval_dataset验证集用于每个 epoch 结束后的评估log_interval打印日志的间隔单位为执行批训练的次数save_interval保存模型的间隔频次单位为执行训练的轮数。在训练/验证的单步逻辑上ImageClassifierModule.training_step与validation_step见 cv_module.py会调用模型前向得到preds使用F.softmax_with_cross_entropy计算损失并用paddle.metric.accuracy计算准确率返回{loss: loss, metrics: {acc: acc}}供 Trainer 汇总。模型预测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( namerepvgg_a1_imagenet, label_list[roses, tulips, daisy, sunflowers, dandelion], load_checkpoint/PATH/TO/CHECKPOINT) result model.predict([flower.jpg])源码中load_checkpoint非空时执行paddle.load(load_checkpoint)并set_dict加载自定义权重否则自动加载模块自带的 ImageNet 预训练权重。NOTE:进行预测时所选择的 module、checkpoint 目录、dataset 必须与 Fine-tune 时保持一致。五、服务部署PaddleHub ServingPaddleHub Serving 可以部署一个在线分类任务服务将上述模型能力以 HTTP API 形式对外提供。第一步启动 PaddleHub Serving$ hub serving start -m repvgg_a1_imagenet执行后即完成分类任务服务化 API 的部署默认端口号为8866。NOTE:如使用 GPU 预测需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量否则无需设置。服务端实现可参见 paddlehub/module/cv_module.py 中ImageClassifierModule.serving_method通过serving装饰器暴露接收 base64 编码的图像列表与top_k参数解码后调用predict将结果中的概率值转为float并包装为{data: [...]}返回。第二步发送预测请求配置好服务端后以下代码即可实现发送预测请求并获取预测结果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_a1_imagenet r requests.post(urlurl, headersheaders, datajson.dumps(data)) data r.json()[results][data]要点说明请求体以 JSON 形式提交images字段为图片经 base64 编码后的字符串列表top_k指定返回前 k 个类别请求 URL 格式为http://127.0.0.1:8866/predict/{module_name}其中module_name必须与启动服务时-m指定的模型名一致响应中results.data即为每张图片的{类别名: 置信度}字典列表。六、更新历史1.0.0初始发布2021-09-14。【免费下载链接】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),仅供参考
返回列表