PaddleHub 图像着色实战:基于 user_guided_colorization 的 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 提供的user_guided_colorization预训练图像着色模型,完整讲解从命令行预测、基于 Canvas 油画数据集的两阶段 Fine-tune、checkpoint 预测,到 PaddleHub Serving 在线服务化部署的全流程。读完本文,你将掌握 PaddleHub Fine-tune API 的四步标准用法(数据预处理、数据集加载、模型加载、优化与训练配置),并能独立复现"输入灰度图、输出彩色图"的完整应用链路。文中所有代码与参数说明均以仓库 demo/colorization 下的示例脚本和 paddlehub 源码实现为准。
背景与依赖
user_guided_colorization是一种"用户引导"(user-guided)图像着色模型,其算法实现参考了开源社区的 colorization-pytorch 方案。PaddleHub 将其封装为可直接通过hub.Module(name='user_guided_colorization')加载的预训练模型,并配套了 Fine-tune 与 Serving 能力。
在开始之前,请确保环境满足以下依赖(见 demo/colorization/README.md 与仓库 requirements.txt):
paddlepaddle >= 2.0.0rcpaddlehub >= 2.0.0
命令行预测:一行命令体验着色效果
安装好 PaddlePaddle 与 PaddleHub 后,无需编写任何代码,即可通过hub run命令直接对一张图片执行着色预测:
$ hub run user_guided_colorization --input_path "/PATH/TO/IMAGE"从 paddlehub/commands/run.py 的RunCommand.execute实现可以看到,hub run会加载指定名称的 Module 并调用其_run_func;对于 CV 类模块,--input_path用于指定输入图片/视频路径(见 paddlehub/commands/run.py)。这是体验模型效果最快捷的方式。
如何开始 Fine-tune
在完成 PaddlePaddle 与 PaddleHub 安装后,进入示例目录并执行:
$ python train.py即可使用user_guided_colorization模型对Canvas等数据集进行 Fine-tune。训练脚本的完整内容见 demo/colorization/train.py,它展示了 PaddleHub 推荐的完整训练流程。
代码步骤:PaddleHub Fine-tune API 四步走
使用 PaddleHub Fine-tune API 进行训练,可以拆解为 4 个步骤:定义数据预处理 → 下载并使用数据集 → 加载预训练模型 → 选择优化策略与运行配置。下面逐一展开。
Step1:定义数据预处理方式
import paddlehub.vision.transforms as T transform = T.Compose([T.Resize((256, 256), interpolation='NEAREST'), T.RandomPaddingCrop(crop_size=176), T.RGB2LAB()], to_rgb=True)transforms数据增强模块提供了丰富的数据预处理算子,用户可按照需求自由组合替换。从 paddlehub/vision/transforms.py 的源码可以进一步理解本示例三个关键算子的行为:
T.Compose(transforms, to_rgb=False, channel_first=True):按顺序串行执行各预处理算子。to_rgb决定是否将输入从 BGR 转为 RGB,channel_first决定是否在最后把[H, W, C]转为[C, H, W](见 paddlehub/vision/transforms.py)。注意:本例必须将to_rgb设为True,否则颜色空间转换会出错。T.Resize(target_size, interpolation='LINEAR'):将图像缩放到目标尺寸,支持NEAREST、LINEAR、CUBIC、AREA、LANCZOS4、RANDOM六种插值模式(见 paddlehub/vision/transforms.py)。着色任务对边缘敏感,因此示例选用NEAREST最近邻插值,避免引入颜色渗色。T.RandomPaddingCrop(crop_size=176, im_padding_value=[127.5, 127.5, 127.5]):当裁剪尺寸大于原图时先按填充值补边,再随机裁剪到 176×176(见 paddlehub/vision/transforms.py),用于训练数据增强。T.RGB2LAB():将图像从 RGB 颜色空间转换到 LAB 颜色空间,内部依次完成 RGB→XYZ→LAB 的转换,并对 L、a、b 通道做归一化(L 通道(L-50)/100,ab 通道/110),实现细节见 paddlehub/vision/transforms.py。
需要说明的是,着色模型在 LAB 空间下工作:模型接收 L(亮度)通道,回归预测 a、b(颜色)通道,因此RGB2LAB是训练与预测链路中不可或缺的一环。
Step2:下载数据集并使用
from paddlehub.datasets import Canvas color_set = Canvas(transform=transform, mode='train')参数说明:
transform:数据预处理方式,即 Step1 中定义的Compose对象。mode:数据模式,可选train、test,默认为train。
Canvas数据集的实现位于 paddlehub/datasets/canvas.py。其类装饰器@download_data(url='https://paddlehub.bj.bcebos.com/dygraph/datasets/canvas.tar.gz')会在首次使用时自动从网络下载数据集并解压到用户目录下的$HOME/.paddlehub/dataset目录(即DATA_HOME,该路径定义见 paddlehub/env.py,可通过HUB_HOME环境变量修改根目录)。数据集包含 1193 张 Monet(莫奈)风格与 400 张 Vango(梵高)风格画作,数据源自公开的 CycleGAN 数据集。从 paddlehub/datasets/canvas.py 可以看到,train模式读取train子目录、test模式读取test子目录中的图片文件列表。
Step3:加载预训练模型
model = hub.Module(name='user_guided_colorization', load_checkpoint=None) model.set_config(classification=True, prob=1)参数说明:
name:加载模型的名称,即user_guided_colorization。load_checkpoint:是否加载自己训练的模型权重;若为None,则加载模型自带的默认预训练参数。
set_config中的两个关键配置直接决定训练阶段的行为:
classification:着色模型分两部分训练。开始阶段应设为True,用于浅层网络(特征提取层)训练;训练后期将classification设为False,用于训练网络的输出层(颜色回归层)。这一"先分类后回归"的两阶段策略在 demo/colorization/train.py 中有完整体现,详见下文"两阶段训练策略"。prob:每张输入图不加入先验彩色块的概率,默认为 1,即完全不加入先验彩色块。例如当prob设为 0.9 时,一张图上出现两个先验彩色块的概率为(1-0.9)*(1-0.9)*0.9=0.009。prob越小,训练/预测时越倾向于利用用户涂抹的彩色块作为引导信息。
Step4:选择优化策略和运行配置
optimizer = paddle.optimizer.Adam(learning_rate=0.0001, parameters=model.parameters()) trainer = Trainer(model, optimizer, checkpoint_dir='img_colorization_ckpt_cls_1') trainer.train(color_set, epochs=201, batch_size=25, eval_dataset=color_set, log_interval=10, save_interval=10)优化策略
Paddle 2.0-rc 提供了多种优化器(如SGD、Adam、Adamax等),示例选用Adam:
learning_rate:全局学习率,默认 1e-4。训练阶段一使用0.0001,进入阶段二后降低为0.00001(见 demo/colorization/train.py),以更小的步长精调输出层。parameters:待优化的模型参数,直接传入model.parameters()。
运行配置
Trainer主要控制 Fine-tune 的训练过程,构造参数包括:
model:被优化模型;optimizer:优化器;use_gpu:是否使用 GPU 运行(默认False,设为True时内部会调用paddle.set_device('gpu'));use_vdl:是否使用 VisualDL 可视化训练过程(默认True,日志写入checkpoint_dir/visualization);checkpoint_dir:保存模型参数的目录;compare_metrics:保存最优模型的衡量指标比较函数,默认取validation_step返回的第一个指标、值越大越好(默认实现见 paddlehub/finetune/trainer.py)。
上述参数的默认值与行为均可在 paddlehub/finetune/trainer.py 的Trainer.__init__中找到对应实现。另外值得说明的是,Trainer会自动断点续训:启动时会扫描checkpoint_dir下epoch_*目录并恢复模型与优化器状态(见 paddlehub/finetune/trainer.py)。
trainer.train控制具体的训练过程,参数包括:
train_dataset:训练数据集;epochs:训练轮数;batch_size:批大小,若使用 GPU 请根据显存实际情况调整;num_workers:数据加载子进程数量,默认为 0;eval_dataset:验证数据集;一旦设置,Trainer会在每个save_interval轮结束时执行验证(见 paddlehub/finetune/trainer.py),要求模型实现validation_step方法;log_interval:打印日志的间隔,单位为执行批训练的次数;save_interval:保存模型的间隔频次,单位为执行的训练轮数;collate_fn:自定义 mini-batch 组装函数,默认对样本各字段按 axis 0 堆叠。
两阶段训练策略(源码级补充)
仓库中的 demo/colorization/train.py 展示了比 README 更完整的实战配置——真正的训练被拆成两个阶段:
# 阶段一:浅层网络(分类任务)训练 model.set_config(classification=True, prob=1) optimizer = paddle.optimizer.Adam(learning_rate=0.0001, parameters=model.parameters()) trainer = Trainer(model, optimizer, checkpoint_dir='img_colorization_ckpt_cls_1') trainer.train(color_set, epochs=201, batch_size=25, eval_dataset=color_set, log_interval=10, save_interval=10) # 阶段二:输出层(回归任务)训练 model.set_config(classification=False, prob=0.125) optimizer = paddle.optimizer.Adam(learning_rate=0.00001, parameters=model.parameters()) trainer = Trainer(model, optimizer, checkpoint_dir='img_colorization_ckpt_reg_1') trainer.train(color_set, epochs=101, batch_size=25, log_interval=10, save_interval=10)阶段一以classification=True训练浅层网络 201 轮,checkpoint 保存在img_colorization_ckpt_cls_1;阶段二切换为classification=False并用更小的学习率1e-5精调输出层 101 轮,checkpoint 保存在img_colorization_ckpt_reg_1,同时将prob调低到0.125以引入先验彩色块参与训练。两份 checkpoint 目录相互独立,这正是load_checkpoint与checkpoint_dir需要配对使用的原因。
模型预测
Fine-tune 过程中,验证集上表现最优的模型会被保存到${CHECKPOINT_DIR}/best_model目录(${CHECKPOINT_DIR}即训练时指定的 checkpoint 目录)。该逻辑由 paddlehub/finetune/trainer.py 实现:每当验证指标优于历史最优值,就会把模型权重model.pdparams与优化器状态model.pdopt写入best_model目录,并通过metrics.pkl记录最优指标。
使用最优模型进行预测,脚本见 demo/colorization/predict.py:
import paddle import paddlehub as hub if __name__ == '__main__': model = hub.Module(name='user_guided_colorization', load_checkpoint='/PATH/TO/CHECKPOINT') model.set_config(prob=0.1) result = model.predict(images=['house.png'])参数配置正确后,执行python predict.py即可得到着色结果。
model.predict支持的关键参数:
images:原始图像路径,或 BGR 格式的图片数组;visualization:是否可视化结果,默认为True;save_path:结果保存路径,默认为result。
NOTE(重要约束):进行预测时,所选择的module、checkpoint_dir、dataset必须与 Fine-tune 时保持一致,否则输入特征分布不匹配会导致预测效果异常。若想直接获得油画风着色效果,可下载官方提供的油画风预训练参数文件canvas_rc.pdparams作为load_checkpoint传入;预测时同样可结合prob参数(如设为0.1)控制先验彩色块的参与程度。
服务部署:PaddleHub Serving 在线着色服务
PaddleHub Serving 可以一键部署在线着色任务服务,整个过程分为两步。
Step1:启动 PaddleHub Serving
运行启动命令:
$ hub serving start -m user_guided_colorization这样就完成了一个着色任务服务化 API 的部署,默认端口号为 8866。从 paddlehub/commands/serving.py 的实现可以看到,hub serving start支持-m指定模块、-p指定端口(默认 8866)、-i指定 GPU 设备、-c指定 JSON 配置文件等参数。
NOTE:如使用 GPU 预测,需在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量,否则无需设置。
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/IMAGE') data = {'images':[cv2_to_base64(org_im)]} headers = {"Content-type": "application/json"} url = "http://127.0.0.1:8866/predict/user_guided_colorization" r = requests.post(url=url, headers=headers, data=json.dumps(data)) data = base64_to_cv2(r.json()["results"]['data'][0]['fake_reg']) cv2.imwrite('color.png', data)请求要点:
- 图片需先经
cv2_to_base64编码为 base64 字符串后放入images字段; - 请求 URL 为
http://127.0.0.1:8866/predict/user_guided_colorization,其中8866为默认服务端口,user_guided_colorization为模块名; - 返回结果位于
results.data[0].fake_reg,即模型输出的着色图(回归结果),解码后通过cv2.imwrite保存为color.png。
结语
本文以 demo/colorization 为完整示例,走通了 PaddleHub 图像着色从hub run命令行预测、Trainer两阶段 Fine-tune、best_model权重预测到hub serving在线部署的全链路。核心要点可以归纳为三条:其一,着色任务必须在 LAB 颜色空间下训练与预测,to_rgb=True与RGB2LAB缺一不可;其二,模型采用"分类(浅层)→ 回归(输出层)"两阶段训练,需要分别设置classification与学习率;其三,预测、Fine-tune 与 Serving 三者的 module、checkpoint 与数据集必须保持一致。掌握这套方法论后,你可以基于 paddlehub/finetune/trainer.py 的Trainer接口,将同样的四步流程迁移到其他视觉任务的微调实践中。
【免费下载链接】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),仅供参考