ARTICLE DETAIL

资讯详情

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

PaddleHub 图像分割实战指南:基于 ocrnet_hrnetw18_voc 的 Fine-tune、预测与服务部署

PaddleHub 图像分割实战指南:基于 ocrnet_hrnetw18_voc 的 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点击查看免费下载导读本指南以 PaddleHub 图像分割示例为核心完整讲解如何基于预训练语义分割模型ocrnet_hrnetw18_vocOCRNet HRNetW18 骨干网络PASCAL VOC 预训练对 OpticDiscSeg 眼底视盘分割数据集进行微调Fine-tune、模型预测与 Serving 在线服务部署。读者将掌握 PaddleHub Fine-tune API 的四步标准流程数据预处理 → 数据集加载 → 模型加载 → 优化策略与训练配置、分割结果的 mIoU 评估方法以及将训练产物一键部署为 HTTP 分割服务的完整链路。文中所有示例均可在 demo/semantic_segmentation 目录中直接运行。1. 前置准备与环境依赖在开始微调前需要完成以下环境安装paddlepaddle 2.0.0动态图模式的深度学习框架本示例的模型、优化器与训练循环均基于 Paddle 2.0 的 API 构建paddlehub 2.0.0提供hub.Module、Trainer、数据集封装与 Serving 能力opencv-python用于图像读取BGR 格式与预处理segmentation_transforms底层大量依赖cv2。安装完成后进入示例目录执行python train.py即可开始使用ocrnet_hrnetw18_voc模型对 OpticDiscSeg 数据集进行微调。示例代码位于 demo/semantic_segmentation/train.py完整的四步微调流程解析如下。2. 微调四步走PaddleHub Fine-tune API 全流程PaddleHub 的 Fine-tune API 将训练流程抽象为 4 个清晰的步骤定义数据预处理、下载并使用数据集、加载预训练模型、选择优化策略与运行配置。Step 1定义数据预处理方式from paddlehub.vision.segmentation_transforms import Compose, Resize, Normalize transform Compose([Resize(target_size(512, 512)), Normalize()])segmentation_transforms是 PaddleHub 针对图像分割任务专门设计的预处理与数据增强模块其实现位于 paddlehub/vision/segmentation_transforms.py核心操作类包括类作用关键参数与默认值Compose将多个预处理操作串联执行输入数据形状为[height, width, channels]输出自动转置为[channels, height, width]transforms操作列表不能为空、to_rgb是否转为 RGB默认TrueResize缩放图像与标注图默认目标尺寸(512, 512)target_sizelist/tuple长度必须为 2、interp插值方式可选NEAREST/LINEAR/CUBIC/AREA/LANCZOS4/RANDOM默认LINEARNormalize图像归一化默认均值和标准差均为[0.5, 0.5, 0.5]mean、stdlist/tuplestd任一元素为 0 会抛异常Padding在图像右下角补边至目标尺寸图像默认补[128, 128, 128]标注默认补255即忽略像素target_size、im_padding_value、label_padding_value从源码细节看有两个值得注意的要点标注图插值方式固定为最近邻。Resize.__call__中图像按用户指定的interp缩放而标注label强制使用cv2.INTER_NEAREST见 segmentation_transforms.py避免线性插值在类别边界产生伪类别值。Normalize不会改变标注。它仅对图像调用F.normalize标注原样返回因此归一化可以安全地同时用于训练与验证/测试阶段这正是示例中eval_transforms Compose([Normalize()])的写法依据。Step 2下载数据集并使用from paddlehub.datasets import OpticDiscSeg train_reader OpticDiscSeg(transform, modetrain)transform数据预处理方式mode数据模式可选项为train、test、val默认为train。OpticDiscSeg数据集实现位于 paddlehub/datasets/opticdiscseg.py。该数据集源自 iChallenge-AMD眼底黄斑病变挑战赛任务是视盘Optic Disc区域分割。其核心机制类装饰器download_data(urlhttps://paddleseg.bj.bcebos.com/dataset/optic_disc_seg.zip)会在首次使用时自动从网络下载压缩包解压到用户目录$HOME/.paddlehub/dataset/optic_disc_seg下对应paddlehub.env.DATA_HOME二分类设定self.num_classes 2背景 视盘self.ignore_index 255根据mode读取train_list.txt/val_list.txt/test_list.txt每行格式为图像路径 标注路径modetest时标注可为空继承自 paddlehub/datasets/base_seg_dataset.py 的SegDatasetpaddle.io.Dataset子类__getitem__中train模式对图像和标注同时施加 transformval模式只对图像做变换并将标注扩为[1, h, w]test模式返回图像与图像路径。SegDataset同样支持自定义数据集传入dataset_root、num_classes、train_path/val_path/test_path文件列表、separator默认为空格与ignore_index默认 255即可复用整套训练流程适合替换为自己的分割数据。Step 3加载预训练模型model hub.Module(nameocrnet_hrnetw18_voc, num_classes2, pretrainedNone)name预训练模型名称此处为ocrnet_hrnetw18_vocnum_classes分割类别数目视盘分割为 2 类pretrained是否加载自己训练的模型权重为None时加载官方提供的默认预训练参数。该模型的实现位于 modules/image/semantic_segmentation/ocrnet_hrnetw18_voc其中 module.py 通过moduleinfo注册了名为ocrnet_hrnetw18_voc的 CV 分割模块网络结构要点骨干网络HRNet_W18高分辨率网络18 宽度实现见同目录 hrnet.py分割头OCRHeadObject-Contextual Representations出自论文 Object-Contextual Representations for Semantic Segmentation见模块 docstring通过ocr_mid_channels512、ocr_key_channels256等超参控制特征通道模型默认num_classes21PASCAL VOC 类别数微调时通过num_classes2覆盖分类头配合 PASCAL VOC 预训练权重实现迁移学习模型内部默认绑定T.Compose([T.Normalize()])作为预测时的输入变换self.transforms与文档示例中的Normalize()保持一致。Step 4选择优化策略和运行配置scheduler paddle.optimizer.lr.PolynomialDecay( learning_rate0.01, decay_steps1000, power0.9, end_lr0.0001) optimizer paddle.optimizer.Adam(learning_ratescheduler, parametersmodel.parameters()) trainer Trainer(model, optimizer, checkpoint_dirtest_ckpt_img_ocr, use_gpuTrue)优化策略本示例采用学习率多项式衰减 优化器的组合PolynomialDecay学习率从learning_rate0.01以power0.9的幂次曲线衰减经过decay_steps1000步后到达end_lr0.0001Adam优化器learning_rate全局学习率可传入LRScheduler实现动态调度parameters待优化的模型参数即model.parameters()。补充说明文档示例中使用Adam而示例工程 demo/semantic_segmentation/train.py 实际采用paddle.optimizer.Momentum两者 API 完全一致learning_rateparameters可根据训练习惯任选。训练过程会为模型补充分割任务所需的training_step/validation_step等回调由Trainer统一调度。运行配置Trainer 与 trainTrainer实现见 paddlehub/finetune/trainer.py主要控制 Fine-tune 的训练可配置参数包括参数说明model被优化模型必须为paddle.nn.Layer子类optimizer优化器选择use_gpu是否使用 GPU默认False内部调用paddle.set_device(gpu/cpu)use_vdl是否使用 VisualDL 可视化训练过程默认True日志写入checkpoint_dir/visualizationcheckpoint_dir保存模型参数的目录默认ckpt_{时间戳}构造时会自动从该目录恢复断点compare_metrics保存最优模型的衡量指标比较函数默认比较validation_step返回的第一个指标越大越好trainer.train控制具体训练过程可配置参数包括参数说明train_dataset训练集paddle.io.Datasetepochs训练轮数默认 1batch_size批大小使用 GPU 时请根据显存实际情况调整num_workers数据加载进程数默认为 0eval_dataset验证集非空时每save_interval轮执行一次评估log_interval打印日志的间隔单位为批训练的次数save_interval保存模型的间隔频次单位为训练轮数训练循环内部会自动处理training_step前向 loss.backward()、optimizer_step参数更新 学习率调度器step()与optimizer_zero_gradmodel.clear_gradients()的完整闭环见 trainer.py并在每轮评估后将最优模型保存至best_model目录。完整可运行的训练示例结合上述四步工程内提供了开箱即用的完整脚本 demo/semantic_segmentation/train.py其中还包含验证集上的mIoU 评估逻辑import paddle import numpy as np import paddlehub as hub from paddlehub.finetune.trainer import Trainer from paddlehub.datasets import OpticDiscSeg from paddlehub.vision.segmentation_transforms import Compose, Resize, Normalize from paddlehub.vision.utils import ConfusionMatrix if __name__ __main__: train_transforms Compose([Resize(target_size(512, 512)), Normalize()]) eval_transforms Compose([Normalize()]) train_reader OpticDiscSeg(train_transforms) eval_reader OpticDiscSeg(eval_transforms, modeval) model hub.Module(nameocrnet_hrnetw18_voc, num_classes2) scheduler paddle.optimizer.lr.PolynomialDecay( learning_rate0.01, decay_steps1000, power0.9, end_lr0.0001) optimizer paddle.optimizer.Momentum(learning_ratescheduler, parametersmodel.parameters()) trainer Trainer(model, optimizer, checkpoint_dirtest_ckpt_img_seg, use_gpuTrue) trainer.train(train_reader, epochs10, batch_size4, log_interval10, save_interval4) # 在验证集上计算 mIoU cfm ConfusionMatrix(eval_reader.num_classes, streamingTrue) model.eval() for imgs, labels in eval_reader: imgs imgs[np.newaxis, :, :, :] preds model(paddle.to_tensor(imgs))[0] preds paddle.argmax(preds, axis1, keepdimTrue).numpy() labels labels[np.newaxis, :, :, :] ignores labels ! eval_reader.ignore_index cfm.calculate(preds, labels, ignores) _, miou cfm.mean_iou() print(miou: {:.4f}.format(miou))评估部分使用了 paddlehub/vision/utils.py 中的ConfusionMatrixstreamingTrue表示每次调用calculate时累加混淆矩阵而非清零重算ignores labels ! eval_reader.ignore_index屏蔽255忽略像素只统计有效类别mean_iou()按类别计算IoU 对角线元素 / (行和 列和 - 对角线)后取平均得到最终 mIoU见 utils.py。3. 模型预测微调完成后训练过程中在验证集上表现最优的模型会被保存在${CHECKPOINT_DIR}/best_model目录下其中${CHECKPOINT_DIR}为 Fine-tune 时通过checkpoint_dir指定的目录对应源码 trainer.py 中的save_model(best_model_path)逻辑。此外每个save_interval轮还会以epoch_{n}子目录形式保存阶段性 checkpoint。使用最优模型进行预测的predict.py脚本如下完整版见 demo/semantic_segmentation/predict.pyimport paddle import cv2 import paddlehub as hub if __name__ __main__: model hub.Module(nameocrnet_hrnetw18_voc, pretrained/PATH/TO/CHECKPOINT) img cv2.imread(/PATH/TO/IMAGE) model.predict(images[img], visualizationTrue)参数配置正确后执行python predict.py。model.predict的可控参数实现见 paddlehub/module/cv_module.pyimages原始图像路径列表或 BGR 格式图片np.ndarraybatch_size预测批大小默认 1visualization是否保存可视化结果默认Truesave_path结果保存路径默认seg_result。从预测源码可以确认几个关键细节预处理对齐预测前先经self.transform即模型内置的Normalize处理输出经paddle.argmax取每个像素的最大概率类别作为分割掩码尺寸还原utils.reverse_transform将模型输出恢复到原始图像尺寸(h, w)可视化产物visualizationTrue时会生成两类文件——save_path/image/下的原图与预测掩码加权融合图权重 0.6即cv2.addWeighted(im, 0.6, pseudo_img, 0.4, 0)以及save_path/mask/下的伪彩色掩码图SegmentVisual/ColorMap的颜色映射逻辑位于 segmentation_transforms.py返回值为分割掩码数组列表uint8可直接二次处理。NOTE进行预测时所选择的module、checkpoint_dir、dataset必须与 Fine-tune 时保持一致尤其是num_classes要与训练时相同如本示例的 2 类。4. 服务部署PaddleHub Serving 在线分割服务PaddleHub Serving 可以将训练好的模型一键部署为在线图像分割服务。Step 1启动 PaddleHub Serving$ hub serving start -m ocrnet_hrnetw18_voc执行后即完成图像分割服务化 API 的部署默认监听端口号为8866。NOTE如果使用 GPU 预测需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量如export CUDA_VISIBLE_DEVICES0仅使用 CPU 则无需设置。Step 2发送预测请求服务端就绪后以下代码即可发送预测请求并获取分割结果base64 编解码 HTTP POSTimport 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)]} headers {Content-type: application/json} url http://127.0.0.1:8866/predict/ocrnet_hrnetw18_voc r requests.post(urlurl, headersheaders, datajson.dumps(data)) mask base64_to_cv2(r.json()[results][0])请求链路说明客户端将 BGR 图像编码为 base64 字符串以 JSON 形式 POST 到/predict/{模块名}端点服务端对应 cv_module.py 中的serving_method对 base64 解码后调用self.predict得到掩码再编码返回r.json()[results][0]即为分割掩码的 base64 字符串解码后的mask为uint8类型的分割结果图可直接展示或叠加到原图。5. 进阶自定义分割数据集与更多模型本文以OpticDiscSeg与ocrnet_hrnetw18_voc为例展开但整个流程具有通用性更换数据集参考 paddlehub/datasets/base_seg_dataset.py 的SegDataset将自己的数据整理为图像路径 标注路径格式的文件列表传入dataset_root、num_classes、train_path/val_path/test_path即可无缝替换更换模型仓库 modules/image/semantic_segmentation 下还收录了数十种分割模型模块如deeplabv3p_resnet50_voc、fcn_hrnetw18_voc、pspnet_resnet50_voc、humanseg_lite等将其名称传给hub.Module(name...)即可复用本文的四步流程、评估与部署方案评估指标mIoU 计算统一由ConfusionMatrix提供可扩展到任意多类分割任务。6. 依赖清单paddlepaddle 2.0.0paddlehub 2.0.0opencv-python图像读取与预处理依赖在 requirements.txt 中可查看仓库完整依赖声明示例工程 demo/semantic_segmentation 目录下还提供了可直接测试的样例图片N0007.jpg运行python predict.py前将脚本中的图片路径替换为实际文件即可。赞分享人工智能预训练微调模型推理服务【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址https://gitcode.com/gh_mirrors/pa/PaddleFormers点击查看免费下载相关推荐基于 PaddleHub 的图像语义分割实战用 ocrnet_hrnetw18_voc 完成 Fine-tune、预测与在线服务部署基于 PaddleHub 的图像语义分割实战用 ocrnet_hrnetw18_voc 完成 Fine tune、预测与在线服务部署 本技术指南以 demo/人工智能预训练微调模型推理服务PaddleHub 图像着色实战基于 user_guided_colorization 的 Fine-tune、预测与服务化部署PaddleHub 图像着色实战基于 user_guided_colorization 的 Fine tune、预测与服务化部署 本文围绕 PaddleHub人工智能预训练微调模型推理服务PaddleHub 实战基于 repvgg_a0_imagenet 的图像分类预测、Fine-tune 与 Serving 部署全指南PaddleHub 实战基于 repvgg_a0_imagenet 的图像分类预测、Fine tune 与 Serving 部署全指南 本文以 PaddleH人工智能预训练微调模型推理服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表