在实际的 AI 绘画或图像生成项目中,我们经常会遇到需要根据特定、详细的文本描述来生成图像的需求。这类需求可能来自产品设计、游戏角色设定、概念艺术创作,或是像输入材料中提到的,为一个虚构角色生成肖像。用户提供的描述虽然口语化且零散,但其中包含了非常具体的关键视觉元素:一位女性角色、眼下有泪痣、一边眼睛被刘海遮住。这恰恰是测试和展示文本到图像(Text-to-Image)模型理解与生成能力的绝佳案例。
本文的目标读者是希望将 AI 绘画技术应用于实际项目中的开发者、设计师或技术爱好者。我们将不局限于简单地使用一个在线工具,而是深入技术栈,从零开始,构建一个能够稳定、可控地根据复杂文本描述生成图像的工作流。你将学习到如何搭建环境、选择模型、编写精准的提示词(Prompt)、调整生成参数,并最终获得符合描述的图像。更重要的是,我们会探讨当生成结果不理想时,如何进行系统性的排查和优化,确保技术方案的可复现性和工程实用性。
1. 理解文本到图像生成的核心工作流
在开始写代码之前,必须先理清从一段文字描述到一张图片的完整技术链路。这不仅仅是调用一个 API 那么简单,它涉及模型选择、提示词工程、参数调优和后期处理等多个环节。
1.1 文本到图像模型的基本原理
当前主流的文本到图像生成模型,如 Stable Diffusion、DALL-E 3、Midjourney 等,大多基于扩散模型(Diffusion Model)。其核心思想是一个“去噪”过程:
- 编码:首先,一个文本编码器(如 CLIP)将你的文字描述(例如:“a portrait of a woman with a tear mole under her eye, bangs covering one eye”)转换成一个高维的数值向量,这个向量被称为“文本嵌入”(Text Embedding)。它捕捉了描述的语义信息。
- 扩散:模型从一个完全随机的噪声图开始。
- 去噪:在每一步中,模型根据“文本嵌入”的指导,预测当前噪声图中应该去除哪些部分以逐渐形成与描述相关的图像。这个过程会重复很多步(例如20-50步)。
- 解码:最后,一个解码器将去噪后的潜空间表示转换回我们能看到的高清像素图像。
理解这个过程很重要,因为它解释了为什么以下因素至关重要:
- 提示词质量:文本嵌入的质量直接决定了去噪的方向。
- 迭代步数:步数太少,去噪不充分,图像模糊或不符合描述;步数太多,可能过度拟合或引入不必要的细节,且耗时增长。
- 随机种子:初始噪声的随机性决定了生成的多样性,固定种子可以复现相同的结果。
1.2 从需求描述到可执行提示词
用户原始描述:“有人给此女画无偿吗。。后面例图,替孩子谢谢你们了眼下有颗泪痣,一边眼睛刘海遮住,谢谢” 这是一个典型的口语化、带有情感色彩的需求。我们需要将其“翻译”成模型能更好理解的、结构化的提示词。这个过程称为“提示词工程”(Prompt Engineering)。
一个有效的提示词通常包含:
- 主体:明确要生成的对象。
a portrait of a young woman - 细节描述:具体的外观特征。
with a beauty mole under her eye, long black hair with bangs covering her left eye - 风格与质量:设定艺术风格和画面质量。
digital art, character design, highly detailed, sharp focus, studio lighting - 负面提示词:明确不希望出现的内容。
blurry, bad anatomy, extra fingers, mutated hands, poorly drawn face
根据输入材料,我们可以构建如下提示词:
正向提示词:masterpiece, best quality, 1girl, solo, portrait, looking at viewer, beautiful detailed eyes, tear mole under eye, long black hair, bangs covering left eye, dark academy style, intricate details, sharp focus 负面提示词:worst quality, low quality, normal quality, blurry, text, watermark, signature, username, bad anatomy, extra limbs, missing limbs, disfigured, malformed hands, mutation, mutated, ugly, disgusting, amputation关键解释:
1girl, solo:强调画面中只有一位女性,这是很多模型训练时使用的标签,能稳定主体。tear mole under eye:直接对应“泪痣”。使用“mole”比“spot”更准确。bangs covering left eye:明确是“刘海遮住左眼”。方向性越明确,生成越可控。dark academy style:添加一种风格导向,使画面更具统一感和艺术性,而非纯粹的写实照片。- 负面提示词列表用于排除常见低质量生成结果,如畸形的手、模糊、水印等。
2. 环境准备与工具选型
我们将以开源的 Stable Diffusion WebUI(AUTOMATIC1111 版)作为本地实践环境。它集成了模型管理、图形界面和丰富的插件,非常适合学习和原型开发。
2.1 基础环境要求
| 组件 | 要求 | 说明 |
|---|---|---|
| 操作系统 | Windows 10/11, Linux, macOS | 推荐 Windows 或 Linux。macOS 可能性能受限。 |
| Python | 3.10.6 - 3.10.11 | 必须严格使用此范围版本,其他版本可能导致依赖冲突。 |
| Git | 最新版 | 用于克隆项目仓库。 |
| CUDA | 11.8 (NVIDIA GPU) | 如果你有 NVIDIA 显卡并希望使用 GPU 加速。 |
| VRAM | 至少 4GB | 用于运行基础模型。生成高分辨率图像需要更多显存。 |
| 磁盘空间 | 至少 20GB | 用于安装程序、模型和生成图片。 |
注意:如果你的电脑没有 NVIDIA GPU 或显存不足,可以使用 CPU 模式运行,但生成速度会非常慢。另一种方案是使用 Google Colab 等在线平台,它们提供免费的 GPU 资源。
2.2 安装 Stable Diffusion WebUI
我们将通过命令行完成安装。打开终端(Windows 用 PowerShell 或 CMD,Linux/macOS 用 Terminal)。
克隆仓库:
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git cd stable-diffusion-webui运行安装脚本:
- Windows:双击运行
webui-user.bat。脚本会自动创建 Python 虚拟环境并安装所有依赖。首次运行会下载数个 GB 的依赖包,请保持网络通畅。 - Linux/macOS:在终端中执行
./webui.sh。
- Windows:双击运行
等待启动:安装完成后,脚本会自动启动 WebUI 服务。在终端中看到类似
Running on local URL: http://127.0.0.1:7860的输出时,表示启动成功。访问界面:打开浏览器,访问
http://127.0.0.1:7860,你将看到 Stable Diffusion WebUI 的界面。
2.3 下载基础模型
WebUI 安装后不包含任何生成模型,需要手动下载。我们将使用一个流行且效果较好的基础模型chilloutmix。
- 访问模型下载网站(如 Civitai 或 Hugging Face)。
- 搜索
chilloutmix,下载其.safetensors格式的文件。 - 将下载的模型文件(例如
chilloutmix_NiPrunedFp32Fix.safetensors)放入stable-diffusion-webui/models/Stable-diffusion/目录下。 - 回到 WebUI 界面,点击左上角模型选择下拉框旁边的刷新按钮,然后选择
chilloutmix模型。
3. 构建并执行生成任务
环境就绪后,我们开始在 WebUI 中实现针对“泪痣遮眼女性”描述的生成任务。
3.1 界面核心参数配置
在 WebUI 的txt2img标签页下,配置以下关键参数:
- Prompt(正向提示词):输入我们在 1.2 节构建的详细提示词。
- Negative prompt(负面提示词):输入对应的负面提示词列表。
- Sampling method(采样方法):选择
Euler a或DPM++ 2M Karras。前者速度快,后者质量通常更高。我们先选Euler a。 - Sampling steps(采样步数):设置为
20。这是一个平衡速度和质量的起点。 - Width & Height(宽高):设置为
512x768或768x512。肖像更适合竖版。注意:宽高必须是 64 的倍数,这是模型结构决定的。 - Batch count(批次数量):设置为
4。这意味着一次生成 4 张图,便于我们从中挑选最佳结果。 - CFG Scale(分类器自由引导尺度):设置为
7。这个值控制模型遵循提示词的程度。太低则偏离描述,太高则图像可能饱和失真。7-9 是常用范围。 - Seed(种子):设置为
-1,表示随机。如果某次生成结果不错,可以将其种子值固定下来,以便微调。
配置完成后,界面大致如下:(示意图:展示了提示词、负面提示词、采样方法、步数、尺寸等参数的填写位置)
3.2 生成与初步结果分析
点击“Generate”按钮,等待生成完成。你会得到4张基于同一组参数但不同随机种子的图像。
第一次生成结果可能遇到的问题:
- 泪痣位置不准:可能出现在脸颊、眼角,而不是正下方。
- 刘海遮眼效果不理想:可能只遮住一部分,或者头发结构奇怪。
- 画风不一致:可能偏向动漫或过于写实,与“dark academy”风格不符。
- 面部畸形:虽然用了负面提示词,但仍可能出现轻微的眼睛或嘴巴不对称。
这是正常现象,说明我们的初次提示词和参数还不够精确。接下来进入迭代优化阶段。
4. 提示词与参数精细化调优
AI 绘画是一个迭代过程。我们需要根据初次结果,有针对性地调整提示词和参数。
4.1 针对性的提示词强化
如果泪痣位置不准,可以强化描述:
- 原描述:
tear mole under eye - 强化描述:
small black beauty mole directly under right eye, on cheek(在右眼正下方、脸颊上的小黑痣) - 组合使用:可以将强化描述放在提示词靠前的位置,因为模型对提示词前部的权重可能更高。
如果刘海遮眼效果不好:
- 原描述:
bangs covering left eye - 强化描述:
asymmetrical hairstyle, long straight bangs completely covering left eye, right eye visible(不对称发型,长直刘海完全遮住左眼,右眼可见)
为了稳定画风,可以添加更具体的风格艺术家或术语:
by artgerm, by wlop, concept art(添加知名数字艺术家的风格倾向)elegant, mysterious atmosphere(添加氛围词)
4.2 使用 LoRA 模型进行特征控制
对于非常特定、难以用文字精确描述的特征(如某种特定的泪痣形状、发型),可以使用 LoRA(Low-Rank Adaptation)模型。LoRA 是一个小型网络附加层,可以在不改变基础大模型的情况下,微调其生成特定概念或风格的能力。
- 寻找合适 LoRA:在模型社区搜索
mole,tear mole,specific hairstyle等关键词,可能会找到专门训练“泪痣”或“遮眼发型”的 LoRA。 - 下载与放置:下载
.safetensors格式的 LoRA 文件,放入stable-diffusion-webui/models/Lora/目录。 - 在 WebUI 中激活:
- 点击生成按钮下方的“Show extra networks”图标(通常是一个立方体)。
- 切换到
Lora标签页。 - 找到你下载的 LoRA,点击它。这会在提示词框中自动添加一个触发词,如
<lora:eyemole_v1:0.8>。 0.8是权重,表示 LoRA 的影响强度。通常从 0.5-0.8 开始尝试。
4.3 关键生成参数深度解析
| 参数 | 作用 | 调优建议 | 与本文案例的关联 |
|---|---|---|---|
| Sampling Steps | 去噪迭代次数。 | 肖像生成 20-30 步通常足够。增加步数可能提升细节,但收益递减且更耗时。如果面部细节模糊,可尝试增加到 30。 | 确保泪痣、发丝等细节清晰。 |
| CFG Scale | 提示词相关性强度。 | 默认 7。如果图像过于平淡或不符合描述,可提高到 9-10。如果图像色彩失真、线条生硬,可降低到 5-6。 | 控制模型对“泪痣”、“遮眼刘海”等描述的服从程度。 |
| Seed | 生成随机性的源头。 | -1为随机。遇到一张构图好但细节差的图,固定其 Seed,然后微调其他参数或提示词,可以在保持构图的基础上优化细节。 | 固定一张“刘海遮眼”构图好的图的种子,然后专门优化“泪痣”的表现。 |
| Hires. fix | 高分辨率修复。 | 在基础生成(如512x768)后,启用此功能,用另一套算法放大并补充细节。对于肖像画提升明显。 | 使泪痣、眼睛、头发等局部特写更精细。 |
| Denoising strength | (Hires. fix 中)重绘幅度。 | 建议 0.3-0.5。太低则放大后细节模糊,太高则可能改变原图构图。 | 在放大时,保持泪痣和发型特征不变。 |
4.4 利用图生图进行微调
如果文本生成始终无法达到理想效果,可以结合“图生图”(img2img)功能。
- 从 txt2img 的结果中,选一张构图和大致特征最接近的图(例如刘海遮眼的感觉对了,但泪痣不对)。
- 切换到
img2img标签页,上传这张图。 - 保持或微调提示词(例如,更强调泪痣)。
- 关键参数Denoising strength设置为一个较低的值(如 0.2-0.4)。这表示在原有图像的基础上,只进行小幅度的修改以匹配新提示词。
- 点击生成。这样可以在保留原有良好构图的基础上,修正特定的细节。
5. 结果评估与常见问题排查
生成出图像后,需要系统性地评估其是否符合要求,并对出现的问题进行归因和解决。
5.1 生成结果检查清单
对照原始需求,逐一检查:
- [ ]主体正确:生成的是女性肖像,而非风景、物体或多人物。
- [ ]泪痣存在:眼睛下方有明显的痣状特征。
- [ ]泪痣位置:痣位于下眼睑下方附近的脸颊上,而非眼角、鼻翼等其他位置。
- [ ]刘海遮眼:有明显的头发遮挡住一只眼睛(根据提示词是左眼)。
- [ ]画面质量:无明显的面部畸形、多余肢体、模糊、水印或扭曲。
- [ ]风格符合:整体画风与“dark academy”、“digital art”等描述有契合度。
5.2 问题现象、原因与解决方案
| 问题现象 | 可能原因 | 排查与解决步骤 |
|---|---|---|
| 完全无法生成人脸或人形 | 1. 基础模型损坏或未正确加载。 2. 提示词冲突或包含强烈负面元素。 | 1. 检查 WebUI 顶部确认已选择chilloutmix模型。2. 简化提示词,仅保留 1girl, portrait,看是否能生成人像。 |
| 泪痣完全没出现 | 1. 提示词权重太低或描述不清。 2. CFG Scale 值太低。 3. 模型对该概念理解弱。 | 1. 将tear mole提到提示词前部,或使用(tear mole:1.3)增加权重。2. 将 CFG Scale 从 7 提高到 9-10。 3. 尝试使用 LoRA 模型强化该特征。 |
| 泪痣位置随机、大小不一 | 模型对“under eye”的空间关系理解不稳定。 | 1. 使用更精确的描述:beauty mole on upper cheek, directly below the center of the eye。2. 结合图生图,先生成一张无痣的好图,再用低 Denoising strength 添加泪痣。 |
| 刘海未能完全遮住眼睛 | “covering”一词可能被理解为“掠过”或“部分遮挡”。 | 1. 使用更强动词:bangs obscuring left eye,hair veil over left eye。2. 添加发型细节: straight across bangs,heavy fringe。3. 在负面提示词中加入 both eyes visible。 |
| 生成图像模糊、细节不足 | 1. 采样步数不足。 2. 生成分辨率太低。 3. 模型本身能力限制。 | 1. 将 Sampling steps 增加到 30。 2. 启用 Hires. fix,使用 2x 放大,Denoising strength 约 0.3。 3. 尝试其他更擅长细节的模型,如 Realistic Vision。 |
| 面部畸形(多手指、歪嘴等) | 1. 模型在复杂姿态下易出错。 2. 负面提示词未生效。 | 1. 在负面提示词中强化:bad anatomy, extra fingers, fewer fingers, mutated hands, poorly drawn face。2. 尝试不同的采样方法,如 DPM++ 2M Karras可能更稳定。3. 使用 ADetailer 等面部修复插件进行后处理。 |
5.3 高级排查:使用 XYZ 脚本对比测试
当不确定哪个参数最优时,可以使用 WebUI 内置的X/Y/Z plot脚本进行网格化对比测试。
- 在
txt2img页面底部,找到Script下拉框,选择X/Y/Z plot。 - X 轴:可以比较不同
Sampling method。 - Y 轴:可以比较不同
CFG Scale(如 5, 7, 9, 11)。 - 点击生成,你会得到一张网格图,直观展示不同参数组合下的生成效果,从而科学地选择最佳参数。
6. 工程化实践与扩展方向
当单次生成满足要求后,我们需要考虑如何将这个过程工程化,以便在真实项目中稳定、批量地处理类似需求。
6.1 构建可复用的生成配置
在 WebUI 中,可以将一套成功的参数保存为“预设”(Preset)。
- 调整好所有参数(提示词、负面提示词、步数、CFG、尺寸、Hires. fix 参数等)。
- 点击界面上的
Save按钮(在Settings标签页或快速设置区),为配置命名,例如portrait_tear_mole。 - 下次需要生成类似风格的肖像时,直接加载此预设,然后只需微调角色描述即可。
对于开发者,可以通过 WebUI 的 API 接口进行调用,实现自动化。
# 示例:使用 curl 调用 WebUI API 进行生成 curl -X POST http://127.0.0.1:7860/sdapi/v1/txt2img \ -H 'Content-Type: application/json' \ -d '{ "prompt": "masterpiece, portrait of a woman, tear mole under eye, bangs covering left eye...", "negative_prompt": "worst quality, low quality...", "steps": 20, "width": 512, "height": 768, "cfg_scale": 7, "seed": -1, "sampler_name": "Euler a" }'API 返回的是包含生成图片 base64 编码的 JSON,可以方便地集成到其他应用中。
6.2 生产环境考量
在个人学习或原型阶段,上述流程足够。但对于生产环境(如需要服务多用户、高并发生成),则需要更多考虑:
- 性能与资源:
- GPU 内存:高分辨率或批量生成需要大显存。考虑使用
--medvram或--lowvram启动参数优化显存使用,或升级硬件。 - 推理速度:使用更快的采样器(如
UniPC),或考虑模型量化、使用 TensorRT 等加速库。
- GPU 内存:高分辨率或批量生成需要大显存。考虑使用
- 稳定性与可复现性:
- 模型版本锁定:确保生产环境使用的模型文件版本与测试时一致。
- 依赖隔离:使用 Docker 容器化部署,避免因系统环境变化导致的问题。
- 内容安全:
- 内容过滤:集成 NSFW(不适宜内容)检测模型,在输出前对生成图像进行过滤,避免产生违规内容。
- 提示词审核:对用户输入的提示词进行审核,防止滥用。
- 工作流扩展:
- ControlNet:用于精确控制姿态、构图、线稿上色等。例如,可以先画一个简单的草图指定人物姿势和刘海位置,再用 ControlNet 引导生成,实现极高精度的控制。
- Inpainting:用于局部修改。生成图若只有泪痣颜色不对,可以用蒙版单独重绘泪痣区域。
6.3 从生成到后期
AI 生成的图像通常是起点。可以导入到 Photoshop、GIMP 或 Krita 等软件中进行后期:
- 颜色校正:调整色调、饱和度、对比度,使其更符合“dark academy”的暗调风格。
- 细节强化:手动绘制,让泪痣更精致,发丝更有质感。
- 背景处理:如果生成时背景杂乱,可以抠图后更换背景。
通过本文的流程,你不仅能够完成“为有泪痣、遮眼刘海的女性生成肖像”这一具体任务,更重要的是掌握了一套应对复杂文本到图像生成需求的方法论:从需求分析、提示词工程、环境搭建、参数调优到问题排查和工程化扩展。核心在于理解模型的工作原理,并学会与之进行有效的“对话”(通过提示词和参数)。下次面对“生成一个穿着机甲的古风侠客”或“设计一个赛博朋克风格的宠物店”这类需求时,你便可以沿用同样的思路,拆解特征、构建提示词、迭代优化,最终得到满意的可视化了。