ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于 PaddleHub 的 MSGNet 图像风格迁移实战:命令行预测、Fine-tune 与 Serving 服务部署

基于 PaddleHub 的 MSGNet 图像风格迁移实战:命令行预测、Fine-tune 与 Serving 服务部署 基于 PaddleHub 的 MSGNet 图像风格迁移实战命令行预测、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 仓库中的 风格迁移示例 为核心完整讲解如何在 PaddleHub 生态下使用预训练模型 msgnet 完成图像风格迁移覆盖命令行预测、Python 脚本预测、基于 MiniCOCO 数据集的 Fine-tune 四步流程、最优模型加载预测以及 PaddleHub Serving 在线服务化部署。读完本文你将能够独立把「内容图 风格图 → 风格化结果图」的完整链路跑通并理解 MSGNet 模型的内部结构与训练原理。下面两张图片正是本示例默认的输入样例左侧为内容图venice-boat.jpg威尼斯小船右侧为风格图candy.jpg糖果风格后续所有代码示例均以它们作为输入。一、风格迁移任务与 MSGNet 模型概览图像风格迁移Style Transfer的目标是在保持内容图content image语义结构不变的前提下将风格图style image的纹理、色彩与笔触迁移到内容图上生成一张新的风格化图像。本示例使用的 msgnet 是Multi-Style Generative Network其特点在于将风格迁移建模为一个可学习的前馈生成网络而不是像传统方法那样针对每张风格图做迭代优化因此推理速度快且支持对多种风格进行训练。在 PaddleFormers 仓库中msgnet 模块位于 modules/image/Image_gan/style_transfer/msgnet/module.py其模块元信息modules/image/Image_gan/style_transfer/msgnet/README.md标明项目说明模型名称msgnet类别图像-图像编辑网络msgnet数据集COCO2014是否支持 Fine-tuning是模型大小68MB最新更新日期2021-07-29从源码结构看MSGNet 由三部分核心组件构成生成网络Generator由ConvLayer、Bottleneck预激活残差块、UpBottleneck上采样残差块堆叠而成输入 3 通道内容图输出 3 通道风格化结果Inspiration LayerMSGNet 的核心创新通过 Gram Matrix 计算风格图的全局统计特征并以此为条件「调制」生成网络中间层的特征图VGG16 特征提取器仅取 VGG16 前四组卷积relu1_2、relu2_2、relu3_3、relu4_3作为感知损失perceptual loss的特征源。二、环境准备与依赖安装运行本示例需要以下依赖见 demo/style_transfer/README.md 末尾paddlepaddle 2.0.0rc paddlehub 2.0.0若尚未安装 msgnet 模块可执行$ hub install msgnet安装完成后即可在任意目录调用hub run、hub.Module等接口。该模块安装时会自动下载预训练权重style_paddle.pdparams以及 VGG16 特征提取权重vgg16.pdparams存放于 PaddleHub 的模块主目录MODULE_HOME下这一点可以从 module.py 与 module.py 中的os.path.join(MODULE_HOME, msgnet, ...)逻辑得到印证。三、命令行预测一条命令完成风格迁移最简单的方式是使用 PaddleHub 的命令行工具hub run无需编写任何代码$ hub run msgnet --input_path /PATH/TO/ORIGIN/IMAGE --style_path /PATH/TO/STYLE/IMAGE其中--input_path内容图路径--style_path风格图路径此外还支持--output_dir结果保存目录默认style_tranfer与--visualization是否保存输出图片默认True。该命令的底层实现位于 paddlehub/module/cv_module.py 的StyleTransferModule.run_cmd它解析命令行参数后调用self.predict(origin[args.input_path], styleargs.style_path, save_pathargs.output_dir, visualizationargs.visualization)完成推理。注意命令行传入的是路径字符串而脚本方式可以传入 BGR 格式的 numpy 数组。四、脚本预测PaddleHub Python API在 Python 脚本中调用方式如下对应仓库中的 demo/style_transfer/predict.pyimport paddle import paddlehub as hub if __name__ __main__: model hub.Module(namemsgnet) result model.predict(origin[venice-boat.jpg], stylecandy.jpg, visualizationTrue, save_pathstyle_tranfer)predict 方法参数说明参数类型说明默认值originlist[str | np.ndarray]原始内容图可传路径字符串或BGR 格式的 numpy 数组支持一次传入多张图必填stylestr | np.ndarray风格图路径或 BGR 图片必填batch_sizeint预测批大小1visualizationbool是否将结果保存为图片Truesave_pathstr结果保存目录style_tranfer从 cv_module.py 中的 predict 实现 可以看到其内部流程对风格图执行self.transform(style)预处理并转为paddle.Tensor增加 batch 维度对内容图逐批执行同样的预处理默认Resize((256, 256), interpolationLINEAR)调用self.setTarget(style)计算风格图的 Gram Matrix 并写入 Inspiration Layer前向推理得到输出将结果clip到[0, 255]并转为 BGR 的uint8数组若visualizationTrue则按时间戳命名style_timestamp.png写入save_path目录目录不存在时自动创建。五、Fine-tune 全流程四步走对预训练模型进行 Fine-tune 是让模型适配特定风格集合的常用手段。运行仓库中提供的 demo/style_transfer/train.py 即可一键开始训练$ python train.py使用 PaddleHub Fine-tune API 进行 Fine-tune 可以拆解为以下 4 个步骤。Step1定义数据预处理方式import paddlehub.vision.transforms as T transform T.Compose([T.Resize((256, 256), interpolationLINEAR)])paddlehub.vision.transforms模块定义了丰富的数据预处理与增强方式如Compose、Resize、CenterCrop、ResizeByLong等见 paddlehub/vision/transforms.py用户可按需替换。MSGNet 要求内容图与风格图统一缩放到256 × 256且采用LINEAR双线性插值以保持纹理平滑。Step2下载数据集并使用from paddlehub.datasets.minicoco import MiniCOCO styledata MiniCOCO(transformtransform, modetrain)参数说明transform数据预处理方式与 Step1 定义的保持一致mode数据模式可选train/test默认train。hub.datasets.MiniCOCO()会自动从网络下载数据集并解压到用户目录下的$HOME/.paddlehub/dataset目录对应源码中的hubenv.DATA_HOME。数据集实现见 paddlehub/datasets/minicoco.py训练集包含 2001 张图片、测试集包含 200 张图片均取自 COCO2014数据集中内置21styles目录包含 21 张不同风格图片__getitem__中通过style_idx idx % len(self.style)将内容图与风格图一一配对返回(内容图, 风格图)元组实现内容-风格配对训练。Step3加载预训练模型model hub.Module(namemsgnet, load_checkpointNone)参数说明name预训练模型名称此处为msgnetload_checkpoint是否加载自己训练得到的模型参数若为None则加载官方默认预训练参数。对应 module.py 中的加载逻辑传入load_checkpoint时调用paddle.load加载自定义权重否则加载模块目录下的style_paddle.pdparams并做一次 InstanceNorm 的scale/bias兼容处理将scale置 1、bias置 0。Step4选择优化策略与运行配置optimizer paddle.optimizer.Adam(learning_rate0.0001, parametersmodel.parameters()) trainer Trainer(model, optimizer, checkpoint_dirtest_style_ckpt) trainer.train(styledata, epochs101, batch_size4, eval_datasetstyledata, log_interval10, save_interval10)优化策略PaddlePaddle 2.x 提供了多种优化器如SGD、Adam、Adamax等。本示例选用Adamlearning_rate全局学习率默认 1e-4parameters待优化的模型参数即model.parameters()。Trainer 运行配置Trainer主要控制 Fine-tune 的训练流程其完整实现见 paddlehub/finetune/trainer.py参数说明model被优化模型须为paddle.nn.Layer子类optimizer优化器实例use_gpu是否使用 GPU 训练默认False内部执行paddle.set_device(gpu/cpu)use_vdl是否使用 VisualDL 可视化训练过程默认True日志写入checkpoint_dir/visualizationcheckpoint_dircheckpoint 保存目录默认ckpt_时间戳目录不存在时自动创建compare_metrics最优模型比较函数默认取validation_step返回的第一个指标值越大越好trainer.train 训练参数参数说明train_dataset训练数据集epochs训练轮数batch_size批大小使用 GPU 时请按显存实际情况调整num_workers数据加载子进程数量默认 0eval_dataset验证集若设置则每save_interval轮执行一次评估log_interval打印日志的间隔单位为 batch 训练次数save_interval保存 checkpoint 的间隔单位为训练轮数collate_fn自定义 mini-batch 拼接函数默认按第 0 维 stack从 trainer.py 的 train 实现 可以进一步看到训练采用DistributedBatchSampler自动支持多卡分布式训练每个save_interval轮会执行evaluate并依据compare_metrics决定是否将当前模型保存为best_model。完整训练脚本仓库中的 demo/style_transfer/train.py 完整代码如下import paddle import paddlehub as hub from paddlehub.finetune.trainer import Trainer from paddlehub.datasets.minicoco import MiniCOCO import paddlehub.vision.transforms as T if __name__ __main__: model hub.Module(namemsgnet) transform T.Compose([T.Resize((256, 256), interpolationLINEAR)]) styledata MiniCOCO(transform) optimizer paddle.optimizer.Adam(learning_rate0.0001, parametersmodel.parameters()) trainer Trainer(model, optimizer, checkpoint_dirtest_style_ckpt) trainer.train(styledata, epochs101, batch_size4, log_interval10, save_interval10)六、训练损失与模型原理为了帮助读者理解 Fine-tune 过程中「最优模型」的衡量标准这里结合 cv_module.py 中 StyleTransferModule.validation_step 说明 MSGNet 的训练目标内容损失content loss计算风格化输出与内容图在 VGG16 的relu2_2层特征上的 MSE 距离保证输出保留内容语义风格损失style loss分别在relu1_2、relu2_2、relu3_3、relu4_3四层上计算输出与风格图的 Gram Matrix再求和 MSE保证输出复现风格纹理总损失loss content_loss style_loss同时返回content gap与style gap两个指标用于监控二者即 Trainer 保存最优模型时的比较依据。Gram Matrix 与 ImageNet 均值减除分别实现在 paddlehub/vision/utils.py 与 paddlehub/vision/utils.py 中。而setTarget流程计算风格图在model1主干上的 Gram Matrix 并注入 Inspiration Layer见 module.pyGramMatrix层见 module.py。七、Fine-tune 后的模型预测当完成 Fine-tune 后验证集上表现最优的模型会被保存在${CHECKPOINT_DIR}/best_model目录下其中${CHECKPOINT_DIR}是训练时指定的 checkpoint 目录如test_style_ckpt目录中包含model.pdparams与model.pdopt两份权重保存逻辑见 trainer.py 的 save_model。使用 Fine-tune 得到的模型进行预测import paddle import paddlehub as hub if __name__ __main__: model hub.Module(namemsgnet, load_checkpoint/PATH/TO/CHECKPOINT) result model.predict(origin[venice-boat.jpg], stylecandy.jpg, visualizationTrue, save_pathstyle_tranfer)参数配置正确后执行python predict.py即可。其中load_checkpoint指向best_model目录中的model.pdparams文件路径。NOTE进行预测时所选择的 module、checkpoint 与 dataset 必须与 Fine-tune 时保持一致否则加载权重可能因结构不匹配而失败。八、服务部署PaddleHub Serving 在线风格迁移PaddleHub Serving 可以快速将 msgnet 部署为一个在线风格迁移服务。Step1启动 PaddleHub Serving$ hub serving start -m msgnet该命令会启动一个风格迁移服务化 API默认端口号为 8866。NOTE如使用 GPU 预测需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量纯 CPU 环境则无需设置。Step2发送预测请求服务端启动后以下代码即可发送预测请求并保存结果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/ORIGIN/IMAGE) style_im cv2.imread(/PATH/TO/STYLE/IMAGE) data {images:[[cv2_to_base64(org_im)], cv2_to_base64(style_im)]} headers {Content-type: application/json} url http://127.0.0.1:8866/predict/msgnet r requests.post(urlurl, headersheaders, datajson.dumps(data)) data base64_to_cv2(r.json()[results][data][0]) cv2.imwrite(style.png, data)请求体结构为{images: [[内容图base64], 风格图base64]}这一约定与 cv_module.py 中 serving_method 的实现 完全对应服务端将images[0]列表解码为内容图列表、images[1]解码为风格图调用self.predict(origin..., style...)后把每张结果图 base64 编码返回客户端解码后写盘即可得到style.png。九、源码阅读指引示例文档demo/style_transfer/README.md、demo/style_transfer/train.py、demo/style_transfer/predict.py模块定义与网络结构modules/image/Image_gan/style_transfer/msgnet/module.py模块使用说明modules/image/Image_gan/style_transfer/msgnet/README.md通用训练与预测基类StyleTransferModule、Trainerpaddlehub/module/cv_module.py、paddlehub/finetune/trainer.py数据集实现paddlehub/datasets/minicoco.py预处理与工具函数paddlehub/vision/transforms.py、paddlehub/vision/utils.py。十、常见注意事项依赖版本需paddlepaddle 2.0.0rc且paddlehub 2.0.0较低版本可能缺少hub run、Trainer等接口图片尺寸MSGNet 默认将输入统一Resize到256 × 256预测时内容图与风格图都会经过该预处理输出结果同样为 256×256结果保存save_path目录不存在时会自动创建结果文件以时间戳命名最优模型Fine-tune 过程中最优模型保存在${CHECKPOINT_DIR}/best_model加载预测时需保证模型结构一致服务端口Serving 默认监听 8866 端口若被占用可通过 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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表