html5结构的网站,杭州建筑网页设计,佛山网站建设公司如何组建,php企业网站开发教程DeOldify模型微调教程#xff1a;使用自定义数据集训练专属上色风格 你是不是觉得DeOldify默认的上色效果虽然不错#xff0c;但总感觉少了点“味道”#xff1f;比如#xff0c;你想给一批老照片上色#xff0c;希望它们能统一呈现出一种温暖的复古色调#xff1b;或者…DeOldify模型微调教程使用自定义数据集训练专属上色风格你是不是觉得DeOldify默认的上色效果虽然不错但总感觉少了点“味道”比如你想给一批老照片上色希望它们能统一呈现出一种温暖的复古色调或者你手头有一批黑白漫画想训练一个专门针对漫画线条和色块的着色模型。这时候用别人训练好的通用模型效果可能就不那么精准了。今天我们就来聊聊怎么给DeOldify模型“开小灶”用你自己的数据集训练出一个带有专属风格的上色模型。这个过程听起来有点复杂但别担心我会带你一步步走完从准备数据到最终导出模型整个过程都在星图GPU平台上完成你只需要跟着做就行。1. 准备工作理解微调与搭建环境在开始动手之前我们先花几分钟搞清楚两件事我们到底要做什么以及需要准备哪些“工具”。1.1 什么是模型微调你可以把预训练好的DeOldify模型想象成一个已经学了成千上万张图片上色技巧的“绘画学徒”。它学会了基本的色彩搭配、光影规律。模型微调就是让这个“学徒”再专门学习你提供的一批特定风格的图片从而掌握你想要的独特“笔触”和“色调”。比如你给它看100张20世纪初的老上海月份牌画它就能学会那种柔和、淡雅的配色风格。之后你再给它一张新的黑白月份牌线稿它上出来的颜色就会更贴近那个年代的美学而不是现代照片的风格。这就是微调的价值——让AI更懂你的特定需求。1.2 环境与数据准备工欲善其事必先利其器。我们需要一个强大的“画室”和合适的“颜料”。首先你需要一个带GPU的运算环境。在星图镜像广场你可以找到预装了PyTorch等深度学习框架的GPU镜像一键部署非常方便。选择一块显存足够建议8GB以上的GPU能大大缩短训练时间。接下来是最关键的一步准备你的专属数据集。这需要你花些心思去收集和整理。理想的数据集是“黑白-彩色”配对好的图片。也就是说每一张黑白图都有一张对应的、你希望模型学习到的彩色结果图。数据来源你可以从网上寻找公开的配对数据集或者自己制作。比如将彩色图片通过去色处理得到黑白图原图就是彩色目标。注意去色时要尽量模拟老照片的灰度质感而不是简单的RGB转灰度。数据要求数量至少需要几百对越多越好模型学到的特征会更稳定。质量图片要清晰色彩目标明确。模糊或色彩失真的图片会让模型学歪。一致性数据集最好围绕一个明确的风格如“水墨画”、“赛博朋克”、“复古广告”。风格混杂的数据集训练出的模型效果可能不伦不类。数据格式建议将黑白图片和彩色图片分别放在两个文件夹里并且保证文件名一一对应。例如/path/to/your/dataset/ ├── bw/ # 存放黑白图片 │ ├── image1.jpg │ ├── image2.jpg │ └── ... └── color/ # 存放对应的彩色图片 ├── image1.jpg ├── image2.jpg └── ...准备好环境和数据我们就可以进入核心环节了。2. 数据预处理与项目结构搭建直接拿原始图片去训练效果不会好我们需要对它们进行一番“梳妆打扮”同时把项目架子搭好。2.1 数据预处理脚本编写我们需要写一个小脚本把图片处理成模型喜欢的格式。主要是调整大小、归一化并创建训练所需的文件列表。# preprocess_data.py import os from PIL import Image import argparse def preprocess_images(bw_dir, color_dir, output_dir, size(256, 256)): 预处理黑白-彩色配对图像。 调整大小并生成记录文件路径的txt文件。 os.makedirs(output_dir, exist_okTrue) bw_files sorted([f for f in os.listdir(bw_dir) if f.endswith((.png, .jpg, .jpeg))]) color_files sorted([f for f in os.listdir(color_dir) if f.endswith((.png, .jpg, .jpeg))]) # 确保文件一一对应 assert bw_files color_files, 黑白和彩色图片文件名不匹配 pair_list [] for idx, (bw_file, color_file) in enumerate(zip(bw_files, color_files)): # 处理黑白图 bw_path os.path.join(bw_dir, bw_file) bw_img Image.open(bw_path).convert(L).resize(size, Image.Resampling.BICUBIC) bw_save_path os.path.join(output_dir, bw_processed, f{idx:04d}.png) os.makedirs(os.path.dirname(bw_save_path), exist_okTrue) bw_img.save(bw_save_path) # 处理彩色图 color_path os.path.join(color_dir, color_file) color_img Image.open(color_path).convert(RGB).resize(size, Image.Resampling.BICUBIC) color_save_path os.path.join(output_dir, color_processed, f{idx:04d}.png) os.makedirs(os.path.dirname(color_save_path), exist_okTrue) color_img.save(color_save_path) # 记录配对路径相对路径便于后续加载 pair_list.append(fbw_processed/{idx:04d}.png\tcolor_processed/{idx:04d}.png) if idx % 100 0: print(f已处理 {idx1}/{len(bw_files)} 对图片) # 保存文件列表 list_file_path os.path.join(output_dir, train_pairs.txt) with open(list_file_path, w) as f: f.write(\n.join(pair_list)) print(f预处理完成共处理 {len(bw_files)} 对图片。) print(f文件列表已保存至: {list_file_path}) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--bw_dir, typestr, requiredTrue, help原始黑白图片目录) parser.add_argument(--color_dir, typestr, requiredTrue, help原始彩色图片目录) parser.add_argument(--output_dir, typestr, default./processed_data, help处理后的输出目录) parser.add_argument(--size, typeint, default256, help统一调整的图片尺寸) args parser.parse_args() preprocess_images(args.bw_dir, args.color_dir, args.output_dir, (args.size, args.size))运行这个脚本你会得到一个规整的processed_data文件夹里面包含了调整好尺寸的图片和一个指明了配对关系的train_pairs.txt文件。2.2 获取与修改DeOldify训练代码接下来我们需要DeOldify的训练源码。你可以从GitHub上克隆官方仓库。git clone https://github.com/jantic/DeOldify.git cd DeOldify官方代码可能不是最新或最适用于微调我们需要关注几个关键文件dataloader.py: 负责加载数据。我们需要修改它使其能读取我们生成的train_pairs.txt。train.py: 主训练脚本。我们需要修改模型加载、数据路径、损失函数和训练参数。models.py: 包含模型定义。通常微调时我们直接使用预训练权重所以可能不需要动。关键修改示例在dataloader中我们需要创建一个新的Dataset类来读取我们的配对数据。这里假设你修改了原有的数据加载部分# 在自定义的数据加载模块中例如 my_data.py import torch from torch.utils.data import Dataset from PIL import Image class PairedImageDataset(Dataset): def __init__(self, list_file, transformNone): self.pairs [] with open(list_file, r) as f: for line in f: bw_path, color_path line.strip().split(\t) self.pairs.append((bw_path, color_path)) self.transform transform def __len__(self): return len(self.pairs) def __getitem__(self, idx): bw_path, color_path self.pairs[idx] bw_img Image.open(bw_path).convert(L) # 保持单通道 color_img Image.open(color_path).convert(RGB) if self.transform: # 注意需要确保transform能同时处理单通道和RGB图像或分别处理 bw_img self.transform(bw_img) color_img self.transform(color_img) else: # 简单的ToTensor转换 bw_img torch.from_numpy(np.array(bw_img)).float().unsqueeze(0) / 255.0 color_img torch.from_numpy(np.array(color_img)).permute(2,0,1).float() / 255.0 return bw_img, color_img然后在主训练脚本train.py中将原来的数据加载器换成我们这个PairedImageDataset。3. 配置训练参数与启动训练环境、数据、代码都准备好了现在我们来“设置烤箱的温度和时间”。3.1 关键超参数解析训练模型就像烤蛋糕参数设不对结果要么不熟要么烤焦。这几个参数你需要重点关注学习率 (Learning Rate): 这是最重要的参数之一。微调时我们通常使用一个比从头训练小得多的学习率例如1e-5到1e-4因为模型已经具备很好的基础我们只想对它进行小幅调整。太大的学习率会“冲掉”它之前学到的通用知识。批大小 (Batch Size): 取决于你的GPU显存。在显存允许的情况下大一点的Batch Size如8, 16通常更稳定。在星图GPU实例上你可以根据选择的机型调整这个值。训练轮数 (Epochs): 你的数据集要反复看多少遍。数据集小的话轮数可以多一些如50-100数据集大轮数可以少一些。要配合验证集观察防止过拟合模型只记住了训练图片不会泛化到新图。优化器 (Optimizer): DeOldify常用Adam或AdamW。微调时保持与预训练模型一致的优化器通常是个好起点。损失函数 (Loss Function): DeOldify通常结合多种损失如感知损失、GAN损失等。微调时除非你很有经验否则建议先保持原样。3.2 编写训练启动脚本我们可以创建一个配置文件如config.yaml和启动脚本让参数管理更清晰。# config_finetune.yaml data: train_list: ./processed_data/train_pairs.txt val_list: ./processed_data/val_pairs.txt # 记得从数据中分出一部分做验证集 image_size: 256 model: pretrained_weights: ./pretrained_models/DeOldify_Artistic.pth # 预训练权重路径 freeze_backbone: false # 是否冻结主干网络微调通常不冻结 training: epochs: 30 batch_size: 8 learning_rate: 3e-5 optimizer: adamw checkpoint_dir: ./checkpoints_finetune# train_finetune.py (简化版核心逻辑) import yaml import torch from torch.utils.data import DataLoader from my_data import PairedImageDataset # 你修改后的数据加载类 from deoldify import models # 假设的模型导入方式 from deoldify.loss import PerceptualLoss # 假设的损失函数 def main(config_path): with open(config_path, r) as f: config yaml.safe_load(f) # 1. 准备数据 train_dataset PairedImageDataset(config[data][train_list], transform...) train_loader DataLoader(train_dataset, batch_sizeconfig[training][batch_size], shuffleTrue) # 2. 加载模型 model models.build_deoldify_model(archartistic) state_dict torch.load(config[model][pretrained_weights], map_locationcpu) model.load_state_dict(state_dict, strictFalse) # strictFalse允许部分权重不匹配 model model.cuda() # 3. 设置优化器和损失 optimizer torch.optim.AdamW(model.parameters(), lrconfig[training][learning_rate]) criterion PerceptualLoss().cuda() # 4. 训练循环 for epoch in range(config[training][epochs]): model.train() for i, (bw_imgs, color_imgs) in enumerate(train_loader): bw_imgs, color_imgs bw_imgs.cuda(), color_imgs.cuda() optimizer.zero_grad() output_imgs model(bw_imgs) loss criterion(output_imgs, color_imgs) loss.backward() optimizer.step() if i % 10 0: print(fEpoch [{epoch1}/{config[training][epochs]}], Step [{i}], Loss: {loss.item():.4f}) # 每个epoch结束后保存检查点 torch.save(model.state_dict(), f{config[training][checkpoint_dir]}/epoch_{epoch1}.pth) print(训练完成) if __name__ __main__: main(config_finetune.yaml)在星图平台的终端中使用以下命令启动训练python train_finetune.py训练过程会持续一段时间你可以通过观察损失值下降情况和定期查看验证集的上色效果来判断训练是否正常。4. 模型评估、导出与应用训练完成后我们得检验一下这个“学徒”学得怎么样然后把它打包好方便以后随时使用。4.1 效果评估与可视化不要只看训练损失一定要在模型没见过的图片验证集上测试。写一个简单的测试脚本# evaluate.py import torch from PIL import Image import numpy as np from my_data import PairedImageDataset # 同样使用你的数据集类 from deoldify import models def evaluate_model(model, val_loader, save_dir./results): import os os.makedirs(save_dir, exist_okTrue) model.eval() with torch.no_grad(): for idx, (bw_img, color_gt) in enumerate(val_loader): if idx 5: # 只看前5个样例 break bw_img bw_img.cuda() output model(bw_img) # 将Tensor转回图片并保存 output_np output.squeeze().cpu().numpy().transpose(1,2,0) output_np np.clip(output_np * 255, 0, 255).astype(np.uint8) Image.fromarray(output_np).save(f{save_dir}/pred_{idx}.png) # 同时保存输入和真实彩色图用于对比 bw_np bw_img.squeeze().cpu().numpy() * 255 Image.fromarray(bw_np.astype(np.uint8)).save(f{save_dir}/bw_{idx}.png) # ... 保存color_gt print(f评估结果已保存至 {save_dir}) # 加载训练好的最佳模型 model models.build_deoldify_model(archartistic) model.load_state_dict(torch.load(./checkpoints_finetune/best_model.pth)) model.cuda() val_dataset PairedImageDataset(./processed_data/val_pairs.txt, transform...) val_loader DataLoader(val_dataset, batch_size1, shuffleFalse) evaluate_model(model, val_loader)打开./results文件夹对比模型上色结果和真实彩色图直观感受效果。如果颜色风格符合你的预期且细节处理得当说明微调是成功的。4.2 模型导出与部署训练好的模型需要保存下来。PyTorch通常保存为.pth文件。为了便于在不同环境中使用可以考虑将模型转换为TorchScript格式。# export_model.py import torch from deoldify import models # 加载最终模型 model models.build_deoldify_model(archartistic) model.load_state_dict(torch.load(./checkpoints_finetune/epoch_30.pth)) model.eval().cuda() # 示例转换为TorchScript example_input torch.randn(1, 1, 256, 256).cuda() # 单通道256x256输入 traced_script_module torch.jit.trace(model, example_input) traced_script_module.save(deoldify_finetuned_custom.pt) print(模型已导出为 deoldify_finetuned_custom.pt)导出的模型文件你就可以像使用原始DeOldify模型一样在星图平台或其他支持PyTorch的环境中加载它为你专属风格的黑白图像上色了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。