
线稿上色在漫画工业、插画辅助、老照片修复和游戏原画设计里是刚需但传统工具和单模态模型用起来都挺别扭画师手绘几百张线稿、再逐张指定颜色方案工作量巨大文本提示容易“翻车”参考图又往往抓不住构图结构。ECCV 2026 上的 OmniColor 把文本、参考图、调色板、局部涂鸦等不同模态条件统一到一个线稿上色框架里思路比较有代表性。本文围绕这个方向做一次系统拆解先讲清楚多模态统一设计要解决什么问题再给出可运行的简化工程示例最后总结落地时常见的坑和效率优化手段。无论你是刚接触生成模型还是已经在用扩散模型做图像编辑这篇文章都能帮你快速理解这类“统一框架”的原理和实操路径。1. 背景与核心概念1.1 什么是线稿上色线稿上色英文常叫 Sketch Colorization输入是一张只有轮廓、没有颜色的黑白线条图输出是一张拥有合理颜色分布的彩色图像。传统做法主要有三类。人工处理画师在 Photoshop、SAI、Clip Studio 中通过图层、选区、笔刷逐块上色质量最高但单张耗时可能从十几分钟到数小时。参考图颜色迁移给定一张彩色参考图把参考图的颜色分布迁移到线稿上。这类方法依赖参考图与线稿在语义和构图上的相似度参考图不匹配时颜色会很奇怪。用户笔触引导用户在线稿上用色块或彩色笔触涂抹算法把局部颜色扩展到全局。这种方式可控性好但需要用户具备一定绘画和色彩基础。基于深度学习的方法早期多用 CNN 和 GAN 实现后来扩散模型逐步成为主流。这类模型一般会将“上色”看作条件生成任务根据线稿结构、文本描述、参考图、调色板等条件生成一张符合结构和语义的彩色图像。1.2 单模态模型的局限性过去很多线稿上色系统只支持一种条件输入。例如只支持调色板输入一组颜色网络按区域着色只支持参考图从参考图中提取颜色主题只支持文本用户输入“一个穿红色裙子的女孩”模型生成对应颜色只支持局部涂鸦用户手动在关键区域画几笔。这种方式最大的问题是工程成本高。同一个项目里如果既要支持文本又要支持参考图就需要集成多个模型特征空间不统一后处理逻辑也无法共享。而且不同模态模型的表现很难对齐同一张线稿文本模型可能把头发画成黑色参考图模型又可能把头发画成棕色产品侧很难给用户一致体验。1.3 OmniColor 的“统一”思维OmniColor 的出发点很简单能不能把文本、参考图、调色板、涂鸦这些不同模态的条件统一编码成同一种内部表示再通过同一条生成网络完成上色这个思路在近两年多模态大模型领域其实很常见。OmniColor 的典型做法是为每种输入模态设计一个编码器把不同模态数据映射到同一特征空间在生成网络中增加一个统一的条件注入模块使所有模态共享特征注入路径训练时同时使用多种模态数据让模型学到“条件与线稿结构之间的通用对齐关系”推理时可以选择单个模态也可以多模态条件按权重组合。这样做的好处很明显多模态能力集中在同一个框架内不需要维护多套模型不同模态之间可以互相补足比如文本描述角色身份参考图决定整体色调调色板约束颜色集合多个条件同时生效。2. OmniColor 的多模态统一设计思路2.1 整体架构拆解从工程角度看这类统一框架大致包含四个核心模块。第一个是结构编码器。线稿是结构信息的主要载体一般用卷积网络或轻量级 Transformer 提取输出若干层不同分辨率的特征图。结构编码器输出的特征图会作为生成网络的主干输入。第二个是条件编码器。条件编码器负责接收不同类型的辅助条件文本通过 CLIP 文本编码器得到 token 序列或全局向量参考图通过 CLIP 图像编码器或自监督编码器得到图像特征调色板把颜色列表编码成颜色直方图或颜色序列特征局部涂鸦通过小卷积网络得到带位置信息的颜色笔触特征。第三个是条件融合模块。这是 OmniColor 这类框架的核心。不同模态的特征在这里被转换成统一的 embedding并注入生成网络的关键层。常见实现包括 FiLM、AdaIN、SPADE、Cross-Attention 等设计。第四个是生成网络主体。生成网络是解码器部分输入结构特征接收来自融合模块的条件经过多层上采样输出彩色图像。可以用 GAN 架构也可以用潜在扩散模型架构。2.2 多模态条件如何融合多模态融合是这类框架最容易出错的地方。思路大致如下。如果每种模态都单独设计一个控制分支框架就退化成“多个模型共享一个骨架”本质上没有统一。真正统一的框架应做到条件编码器输出后先通过一个 Projection Layer 把特征维度对齐到同一个语义空间再按权重融合最后注入到生成网络的多个层。例如文本描述“夕阳下的女孩”会得到 CLIP 文本特征参考图特征也会经过投影层映射到相近位置。在网络中间层通过 Cross-Attention 让线稿特征去查询条件特征这样结构特征能动态决定“哪个区域应该参考哪种颜色信息”。2.3 与扩散模型的关系现有开源社区里线稿上色更常用的是扩散模型方案典型做法是 ControlNet Stable Diffusion线稿作为 ControlNet 条件控制生成结构文本作为 Stable Diffusion 的文本提示参考图则通过 IP-Adapter 或 Reference-only 方式注入。OmniColor 和这套方案的区别在于OmniColor 更强调“在一个框架里同时承接多种条件输入且条件之间可以灵活组合”。扩散模型路线也能实现类似效果借助 ControlNet、IP-Adapter、LoRA 等多个插件叠加但工程集成复杂度高不同插件之间的特征空间并不完全一致。OmniColor 这类从模型训练阶段就统一多模态特征的做法在推理一致性和维护成本上通常更有优势。3. 环境准备与依赖说明3.1 运行环境建议如果你想复现或验证这类框架建议准备一台带有 NVIDIA GPU 的开发机。显存至少 8GB推荐 16GB 以上因为多模态特征提取和生成网络都比较吃显存。操作系统Ubuntu 20.04 / 22.04Windows WSL2 也可以Python3.9 或更高版本深度学习框架PyTorch 2.xGPU 驱动CUDA 11.8 或 12.x其他依赖OpenCV、NumPy、Hugging Face Transformers、CLIP。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。3.2 创建示例项目结构为了便于理解我们先把工程结构列出来。omnicolor_demo/ ├── models/ │ ├── encoder.py # 结构编码器 │ ├── conditions.py # 多模态条件编码 │ ├── fusion.py # 条件融合模块 │ └── decoder.py # 图像解码器 ├── data/ │ └── prepare_sketch.py # 线稿预处理 ├── train.py # 简化训练流程 ├── infer.py # 推理脚本 └── requirements.txt这个结构并不代表 OmniColor 的原始工程布局而是为了方便讲解将核心模块拆分成独立文件。实际论文复现时通常还需要包含评估、数据增强、日志记录等模块。3.3 安装依赖示例依赖文件如下。torch2.0.0 torchvision0.15.0 opencv-python numpy pillow transformers4.30.0 ftfy regex安装命令pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install opencv-python numpy pillow transformers ftfy regex如果你需要加载 CLIP 模型也可以用 openai 官方 CLIP 包pip install githttps://github.com/openai/CLIP.git这里需要注意的是不同版本的 Transformers 和 PyTorch 之间存在兼容性问题尤其是加载 CLIP 模型时。建议先在一个虚拟环境里安装并跑通最小示例再逐步添加功能。4. 核心代码实现简化版多模态线稿上色流程下面代码基于 PyTorch 和 Hugging Face Transformers 实现一个便于理解的简化版本目的是演示多模态条件注入的核心思路并非 OmniColor 原始代码。重点学习四部分线稿预处理、条件特征提取、条件融合模块、生成网络骨架。4.1 线稿预处理线稿预处理是上色任务中很容易被忽略但影响很大的环节。输入图片可能是灰度图、彩色图或扫描线稿统一处理成干净的白底黑线图比较合适。# 文件路径data/prepare_sketch.py import cv2 import numpy as np def load_sketch(path: str, size: int 512) - np.ndarray: img cv2.imread(path, cv2.IMREAD_GRAYSCALE) if img is None: raise FileNotFoundError(f无法读取图像: {path}) img cv2.resize(img, (size, size), interpolationcv2.INTER_AREA) # 高斯去噪减少扫描线稿中的杂点 img cv2.GaussianBlur(img, (3, 3), 0) # 增加对比度强化线条 _, img cv2.threshold(img, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # 转为 float 并归一化到 [-1, 1]白色背景为 -1黑色线条为 1 img img.astype(np.float32) / 127.5 - 1.0 return img if __name__ __main__: sk load_sketch(example_sketch.jpg) print(sk.shape, sk.min(), sk.max())输出应该类似(512, 512) -1.0 1.0预处理时使用 Otsu 阈值能把扫描线稿中常见的浅灰色噪声去除避免模型把背景误判为内容区域。4.2 多模态条件编码模块条件编码层的目标是把不同模态输入统一成相同维度的条件向量。这里展示三种条件文本、参考图、调色板。# 文件路径models/conditions.py import torch import torch.nn as nn import clip from transformers import CLIPModel, CLIPProcessor class MultiModalConditionEncoder(nn.Module): 多模态条件编码器。 将文本、参考图、调色板统一编码为维度为 dim 的向量。 def __init__(self, clip_model_name: str openai/clip-vit-base-patch32, dim: int 512): super().__init__() # 使用 Hugging Face 的 CLIP 模型作为统一特征提取器 self.clip_model CLIPModel.from_pretrained(clip_model_name) self.clip_processor CLIPProcessor.from_pretrained(clip_model_name) # 调色板编码器 self.palette_encoder nn.Sequential( nn.Linear(16 * 3, 256), nn.ReLU(), nn.Linear(256, dim), ) # 投影层 self.text_proj nn.Linear(512, dim) self.image_proj nn.Linear(512, dim) def encode_text(self, text: str) - torch.Tensor: inputs self.clip_processor(text[text], return_tensorspt, paddingTrue) features self.clip_model.get_text_features(**inputs) return self.text_proj(features) # shape: [1, dim] def encode_reference_image(self, image_tensor: torch.Tensor) - torch.Tensor: # image_tensor 需要是已经预处理成 CLIP 输入格式的 tensor features self.clip_model.get_image_features(pixel_valuesimage_tensor) return self.image_proj(features) def encode_palette(self, palette: torch.Tensor) - torch.Tensor: palette: shape [B, 16, 3]最多 16 个 RGB 颜色不足部分补 0。 b palette.shape[0] flat palette.reshape(b, -1) # [B, 48] return self.palette_encoder(flat)文本和参考图通过 CLIP 编码后会落在同一个语义空间这是实现“文本描述角色参考图提供色板互不冲突”的关键。调色板则直接通过一个小 MLP 映射到相同维度方便后续统一融合。4.3 条件融合模块条件融合模块使用 FiLM 方式。FiLM 的核心思想是通过条件向量生成每个通道的缩放因子与偏置项对特征图做仿射变换。相比直接拼接特征向量FiLM 的计算开销更小也更容易控制不同条件的影响强度。# 文件路径models/fusion.py import torch import torch.nn as nn class FiLMFusion(nn.Module): 将多模态条件向量注入到特征图。 支持多条件按权重相加后再生成调制参数。 def __init__(self, condition_dim: int, channels: int): super().__init__() self.fc_gamma nn.Linear(condition_dim, channels) self.fc_beta nn.Linear(condition_dim, channels) def forward(self, x: torch.Tensor, condition_vectors: list[torch.Tensor], weights: list[float] | None None): x: 特征图shape [B, C, H, W] condition_vectors: 条件向量列表每个元素 shape [B, condition_dim] weights: 每个条件的权重如果为 None 则等权相加 if weights is None: weights [1.0] * len(condition_vectors) cond torch.zeros_like(condition_vectors[0]) for vec, w in zip(condition_vectors, weights): cond cond w * vec gamma self.fc_gamma(cond).unsqueeze(-1).unsqueeze(-1) beta self.fc_beta(cond).unsqueeze(-1).unsqueeze(-1) return gamma * x beta这个模块的核心价值在于“多条件可以按权重自由组合”。如果你希望文本主导而参考图只辅助只需要把文本条件的权重调大、参考图权重调小即可。实际生产时权重可以由用户通过滑块控制也可以由一个小网络自动预测。4.4 简化生成网络骨架生成网络采用 U-Net 风格编码器部分使用简单卷积块解码器部分通过 FiLM 模块注入条件。为了控制篇幅这里只展示核心结构。# 文件路径models/decoder.py import torch import torch.nn as nn from .fusion import FiLMFusion class ConvBlock(nn.Module): def __init__(self, in_ch, out_ch): super().__init__() self.conv nn.Sequential( nn.Conv2d(in_ch, out_ch, 3, padding1), nn.BatchNorm2d(out_ch), nn.ReLU(inplaceTrue), ) def forward(self, x): return self.conv(x) class OmniColorDecoder(nn.Module): def __init__(self, condition_dim: int 512): super().__init__() self.enc1 ConvBlock(3, 64) self.enc2 ConvBlock(64, 128) self.enc3 ConvBlock(128, 256) self.fusion3 FiLMFusion(condition_dim, 256) self.fusion2 FiLMFusion(condition_dim, 128) self.fusion1 FiLMFusion(condition_dim, 64) self.dec2 ConvBlock(256 128, 128) self.dec1 ConvBlock(128 64, 64) self.out nn.Conv2d(64, 3, 3, padding1) def forward(self, x, condition_vectors, weightsNone): # x 是拼接了线稿和初始噪声的输入[B, 3, H, W] e1 self.enc1(x) e2 self.enc2(e1) e3 self.enc3(e2) d3 self.fusion3(e3, condition_vectors, weights) d2_input torch.cat([d3, e2], dim1) d2 self.fusion2(self.dec2(d2_input), condition_vectors, weights) d1_input torch.cat([d2, e1], dim1) d1 self.fusion1(self.dec1(d1_input), condition_vectors, weights) return torch.tanh(self.out(d1))这个生成网络结构非常简化真实项目里会加入 Self-Attention、更深的 ResBlock、多尺度跳跃连接甚至把解码器替换为扩散模型的 UNet。这里的重点是在 U-Net 的多个层级分别注入条件而不是只在最后一层注入。低层注入颜色风格高层注入语义信息颜色分辨率才能兼顾。4.5 训练流程简化版训练时的关键点有两个一是多种模态条件混合使用二是在损失函数中加入感知损失和结构一致性约束。# 文件路径train.py 核心片段 import torch import torch.nn.functional as F from models.conditions import MultiModalConditionEncoder from models.decoder import OmniColorDecoder device cuda if torch.cuda.is_available() else cpu cond_encoder MultiModalConditionEncoder().to(device) decoder OmniColorDecoder().to(device) optimizer torch.optim.AdamW( list(decoder.parameters()) list(cond_encoder.parameters()), lr1e-4 ) def color_loss(pred, target): # 颜色直方图损失让生成图的颜色分布在统计意义上接近目标 pred_hsv rgb_to_hsv(pred) target_hsv rgb_to_hsv(target) pred_hist histogram(pred_hsv[:, 0]) target_hist histogram(target_hsv[:, 0]) return F.mse_loss(pred_hist, target_hist) for step, batch in enumerate(train_loader): sketch batch[sketch].to(device) # [B, 1, 512, 512] target batch[target].to(device) # [B, 3, 512, 512] text batch[text] ref_image batch[ref_image].to(device) text_feat cond_encoder.encode_text(text) ref_feat cond_encoder.encode_reference_image(ref_image) conds [text_feat, ref_feat] weights [0.8, 0.6] input_x torch.cat([sketch, target.new_zeros((sketch.size(0), 2, sketch.size(2), sketch.size(3)))], dim1) pred decoder(input_x, conds, weights) l_pixel F.l1_loss(pred, target) l_color color_loss(pred, target) loss l_pixel 0.2 * l_color optimizer.zero_grad() loss.backward() optimizer.step() if step % 100 0: print(fstep {step} loss {loss.item():.4f})为了简化上面代码里的rgb_to_hsv和histogram方法没有展开实现实际项目可以用 torchvision 的rgb_to_hsv替换或用现成的感知损失库如lpips。真实训练时还需要加入感知损失避免生成图像在边缘区域出现模糊和伪影。4.6 推理与结果说明推理脚本的核心逻辑是读取线稿、读取条件、编码条件、调用 decoder 输出彩色图。# 文件路径infer.py 核心片段 import torch from PIL import Image import numpy as np from models.conditions import MultiModalConditionEncoder from models.decoder import OmniColorDecoder device cuda cond_encoder MultiModalConditionEncoder().to(device) decoder OmniColorDecoder().to(device) # 加载权重 checkpoint torch.load(checkpoint.pth, map_locationdevice) decoder.load_state_dict(checkpoint[decoder]) cond_encoder.load_state_dict(checkpoint[cond_encoder]) sketch torch.from_numpy(load_sketch(test_sketch.png)).unsqueeze(0).unsqueeze(0).to(device) text a girl in red dress, sunset background ref_img Image.open(ref_color.png).convert(RGB) ref_tensor cond_encoder.clip_processor(imagesref_img, return_tensorspt).to(device) text_feat cond_encoder.encode_text(text) ref_feat cond_encoder.encode_reference_image(ref_tensor[pixel_values]) input_x torch.cat([sketch, torch.zeros((1, 2, 512, 512), devicedevice)], dim1) out decoder(input_x, [text_feat, ref_feat], [0.9, 0.5]) out_img (out.squeeze(0).permute(1, 2, 0).detach().cpu().numpy() 1) / 2 * 255 out_img out_img.astype(np.uint8) Image.fromarray(out_img).save(output.png)预期输出是得到一张 512x512 的彩色图像。如果文本和参考图不冲突输出效果会比较自然如果文本说“红色裙子”参考图却是蓝色调最终颜色会按权重折中颜色可能偏向权重更高的条件。5. 常见问题与排查思路5.1 高频问题速查表下面整理了多模态线稿上色框架在开发和训练中常见的问题。问题现象常见原因解决思路生成图颜色发灰、饱和度低训练损失只用了 L1/L2缺少感知损失加入 LPIPS 感知损失和对抗损失文本提示完全不生效条件向量没有注入到网络或投影层维度不对检查 FiLM 模块是否在多层注入检查条件编码输出维度参考图颜色迁移后结构混乱参考图特征与线稿结构没有对齐使用 CLIP 空间做相似度匹配或增加空间注意力层显存不足输入分辨率高模型层数深降低 batch size使用混合精度尝试梯度累积线稿噪声太多上色后边缘脏预处理不够干净使用 XDoG 或 Otsu 形态学开运算多条件同时输入时互相冲突条件权重分配不合理为不同条件设置可学习权重而不是固定权重训练 loss 下降但生成图模糊解码器太浅或缺少跳层连接加深 U-Net增加多尺度特征融合模型只学会了复制线稿灰度结构分支和解码器耦合不足引入结构感知判别器或者在输入阶段将线稿编码为结构图5.2 文本提示不生效的排查步骤文本提示不生效是最常遇到的问题。可以按以下顺序排查。确认 CLIP 文本编码器本身能否正确生成文本特征打印特征向量与图像相似度。检查条件向量是否成功传入了 decoder 的 fusion 层。将weights中文本权重调高到 1.5 以上看输出是否明显变化。检查训练数据中文本描述是否与图像内容匹配描述不准确会导致模型忽略文本。检查投影层是否有requires_grad关闭的情况。5.3 显存优化建议多模态模型输入的张量比较多每个条件特征都会占用显存。优化方向如下。使用混合精度训练PyTorch 自带torch.cuda.amp。结构编码器和条件编码器可以冻结部分参数只训练融合模块和解码器。输入分辨率从 512 降到 256验证效果后再逐步放大。使用torch.utils.checkpoint激活检查点技术用计算换显存。5.4 常见数据问题线稿上色的训练数据存在两类典型问题一类是“线稿-彩图”配对数据数量少另一类是扫描线稿噪声大。解决思路一般是先从彩色图中用边缘检测算法生成伪线稿增加配对数据量再用形态学操作和 XDoG 滤波器对真实扫描线稿进行清洗过滤掉大块噪声和文字水印。配好数据再训练往往比调网络结构更有效。6. 最佳实践与工程建议6.1 多模态条件要统一到同一个语义空间这是 OmniColor 这类框架的命门。文本和参考图都从 CLIP 中提取特征本身就在同一空间。调色板和局部涂鸦则要自己训练一个投影层。建议在投影层后面接一个 LayerNorm把不同来源的条件特征分布拉齐否则权重融合时不同模态特征的数值范围不一致会导致某个模态经常主导输出。6.2 条件注入要分层不要只在 bottleneck 注入只在网络最深处注入条件可以改变图像的整体色调但难以控制局部区域的细节颜色。更推荐在 U-Net 的 2 到 4 个分辨率层级分别注入条件让浅层特征控制高频纹理深层特征控制语义和配色。这也是 ControlNet 能保持结构又支持风格控制的原因之一。6.3 训练时使用混合条件策略训练时不要每个 batch 只给一种条件而是随机组合。例如30% 的 batch 只给文本条件30% 的 batch 只给参考图条件30% 的 batch 同时给文本和参考图10% 的 batch 加入调色板或涂鸦。这样可以避免模型对某一种条件形成路径依赖。推理时即使某一种条件缺失模型也能稳定输出。6.4 评估指标要兼顾像素与感知线稿上色不能只看 PSNR 和 SSIM因为颜色差异会被像素损失严重惩罚但感知上可能很自然。建议同时看FID衡量生成图像的分布与真实图像分布的差异适合评估整体颜色风格LPIPS衡量感知相似度对结构和纹理更敏感颜色直方图距离衡量颜色分布是否接近真实结果用户调研上色任务主观性很强最好做 A/B 测试。6.5 数据处理与质量过滤训练集的质量直接决定最终效果。建议做这几步过滤删除完全灰度化的图片这类图片颜色信息为 0删除带明显水印的图片去除低分辨率图片避免训练时颜色细节丢失按内容类型分类例如人物、风景、建筑等方便按需微调。6.6 工程化部署建议推理速度方面如果使用扩散模型做后端单张 512 分辨率上色可能需要几秒到十几秒生产环境建议用 TensorRT 或 ONNX Runtime 加速。如果是 GAN 类模型速度很快但细节可能不如扩散模型。交互体验方面建议用 Gradio 做个 Web Demo提供“文本输入框 参考图上传 调色板选择 权重滑块”的界面。这样既能快速验证模型效果也能方便非技术用户测试。基础实现代码如下。import gradio as gr def colorize_web(sketch_img, text, ref_img, text_weight, ref_weight): # 实际调用推理函数 result run_inference(sketch_img, text, ref_img, text_weight, ref_weight) return result demo gr.Interface( fncolorize_web, inputs[ gr.Image(label线稿, typepil), gr.Textbox(label文本描述), gr.Image(label参考图, typepil), gr.Slider(0, 2, value1.0, label文本权重), gr.Slider(0, 2, value0.5, label参考图权重), ], outputsgr.Image(label上色结果), ) demo.launch()6.7 关于生成式能力的边界多模态线稿上色框架本质是一个生成模型它无法保证生成结果在事实层面正确。比如给一张历史人物线稿模型可能会生成现代服装颜色给一张手绘线稿模型也无法准确还原作者原本设想的颜色。因此在实际产品中应该提供“人工修正”入口让用户可以在生成结果上继续用笔刷微调而不是把模型输出当作最终答案。这也意味着在设计系统时不要把上色模型做成一个封闭模型而是留出“AI 生成 人工精修”的闭环链路。7. 总结与下一步学习方向这篇文章围绕 ECCV 2026 的 OmniColor 方向拆解了统一多模态线稿上色框架的核心思路和工程落地路径。重点可以回顾为以下几点多模态条件要统一到同一特征空间条件注入要分层进行训练数据质量比网络结构更值得优先投入评估时要兼顾像素指标和感知指标。同时代码示例给出了一个可运行的简化流程包含线稿预处理、CLIP 条件编码、FiLM 融合模块和 U-Net 解码骨架帮助你建立从论文到工程的最小闭环。如果你已经在跑 Stable Diffusion 或 ControlNet建议下一步重点学习两类技术一类是 IP-Adapter 这类参考图注入方法另一类是 FiLM、SPADE、Cross-Attention 等条件注入机制的对比分析。这些技术比单纯堆叠网络层更能提升多模态生成效果。实际项目落地时优先关注三个风险文本条件不生效、多条件冲突、训练数据质量差。建议先用小模型、低分辨率跑通全链路再逐步扩大到目标分辨率。如果只是做个人练习可以先用开源数据集做测试如果用于商业项目则要确认训练数据版权和生成内容版权边界。如果在实践过程中遇到“文本提示不生效”或者“显存不足”这类具体问题欢迎在评论区带上你的环境配置和报错日志我会根据常见的工程经验帮你一起排查。