这次我们来看一个很有意思的 AI 创作项目:“秦良玉-甲骨文”。它不是一个正式发布的大体积模型,而是一个 AI 萌新用 100 天时间,围绕秦良玉这个历史人物和甲骨文元素做主题创作的技术实践记录。项目名字里带着“萌新”两个字,但里面涉及的链路并不简单:本地模型部署、提示词工程、文生图、图生图、API 接口调用、批量生成、显存控制,再到结果管理和效果复盘,几乎把一套本地 AI 绘画工作流全部串起来了。这篇文章就以这个项目为线索,给你梳理一条可以照做的本地 AI 生成工作流,读完可以直接在你的电脑上复刻验证。
先说结论,降低大家的上手成本:这个项目本身不要求你写复杂代码,主要门槛在本地硬件和模型选择。如果你有一张 NVIDIA 独立显卡,显存 8G 以上,跑 512 分辨率下的常规开源绘图模型会比较顺畅;如果显卡显存只有 4G 到 6G,也能跑,但建议使用轻量化模型或开启低显存模式,并在生成时控制分辨率和批量大小。完全用 CPU 也能出图,不过速度会慢很多,适合用来验证流程,不适合做批量生产。启动方式上,推荐从 Stable Diffusion WebUI 或 ComfyUI 入手,两个方案都有一键启动脚本,并且都提供 HTTP 接口,方便后期接脚本做批量任务。从材料看,这个项目并没有提供统一的一键整合包,所以需要自己准备绘图模型和提示词模板,这也是本文要重点解决的部分。
如果你正准备做类似的“历史人物+古文字元素”主题创作,或者只是想把本地 AI 绘画从“能出图”推进到“稳定批量出图”,这篇博客可以收藏备用。我会从核心能力、适用边界、环境准备、安装部署、功能测试、API 批量调用、资源占用、问题排查和最佳实践几个方面,完整展开这套流程。
1. 秦良玉-甲骨文 AI 项目核心能力速览
在进入实操前,先用一个表格看清这个项目的定位和能力边界。这里的描述基于常见的本地部署方案,具体参数需要按你实际拉取的模型和机器配置来验证。
| 能力项 | 说明 |
|---|---|
| 项目类型 | 个人 AI 创作实践项目,历史人物 + 甲骨文元素主题 |
| 主要技术方向 | 文生图、图生图、批量生成、API 接口调用 |
| 模型方向 | 基于开源 Stable Diffusion 系列绘图模型 / ComfyUI 工作流 |
| 启动方式 | WebUI 启动、ComfyUI 启动、命令行 API 服务启动 |
| 推荐硬件 | NVIDIA 显卡优先,显存 8G 以上体验更稳;低显存可开 medvram |
| CPU 推理 | 支持,但速度慢,适合小图测试 |
| 接口能力 | 通过 /sdapi/v1/* 或 ComfyUI 接口提交任务并取回结果 |
| 批量任务 | 支持,通过脚本循环调用 API 实现 |
| 输出格式 | PNG / JPEG 图片,批次记录建议用 JSON 或 CSV |
| 适合场景 | 历史题材插画、科普配图、个人作品集、AI 绘画入门记录 |
从这张表可以看出来,这个项目适合的不是“纯零基础看热闹”,而是“有一张普通显卡,想把 AI 绘画做稳、做批量、做到可以接脚本”的技术读者。如果你是第一次接触本地绘画模型,建议先跑通一个最小流程,再慢慢加参数。
2. 适用场景与使用边界
任何和真实历史人物、真实文物元素相关的 AI 创作项目,都不能只谈技术,还要先想清楚使用边界。
比较理想的适用场景是:创作秦良玉主题的概念插画,做历史科普文章的配图,生成带有甲骨文纹理装饰的海报背景,或者作为 AI 绘画 100 天练习项目的题材。这个方向对画面风格要求很统一,非常适合用来练习提示词控制,因为“水墨国风、青铜纹样、甲骨文纹理”这些视觉要素,在开源绘图模型里已经有很强的先验知识,提示词写对了,出图稳定性会明显提升。
不太适合的场景也很明确:不能用 AI 生成的结果做严肃的考古或文字学考证。AI 模型并不真的认识甲骨文,它只是把“类似甲骨文线条”的视觉纹理拼接出来,生成结果里经常会出现字形错误、结构混乱、缺笔多笔的情况。如果项目目标是做甲骨文识别,那应该去用 OCR 或视觉理解模型,而不是用绘画生成模型。另外,在商用之前必须确认素材版权。
合法合规方面要特别注意:秦良玉是真实历史人物,创作时应当尊重历史形象,不能恶意丑化或猎奇化;如果参考了博物馆公开的甲骨文拓片、青铜器照片,需要确认这些素材是否允许二次创作;生成的甲骨文文字不能冒充文物真迹,不能在拍卖、鉴定等场景中使用。把 AI 作品当作个人学习记录或科普示意,风险会小很多。
3. 本地部署环境准备
在开始部署之前,先把系统环境检查一遍。下面的清单是通用检查项,具体版本号要以你下载的项目仓库要求为准。
3.1 操作系统
优先使用 Windows 10/11 或 Ubuntu 20.04/22.04。Windows 上大多数整合包和 WebUI 的 bat 启动脚本最方便;Linux 上跑 API 服务和长期批量任务更稳定。这个项目属于图像生成方向,建议主环境直接用 Windows 即可。
3.2 GPU 与驱动
建议使用 NVIDIA 独立显卡,并确保显卡驱动更新到较新版本。显存低于 4G 时会比较吃力,即使能启动,也基本只能跑小分辨率、少步数;显存 8G 以上,512 分辨率下的常规流程会比较舒服。AMD 显卡不是不能用,但在主流开源绘图工具链里需要额外配置,不推荐萌新第一台机器用 A 卡入门。
要查看显卡信息,Windows 任务管理器里“性能- GPU”可以看到型号和显存;命令行也可以用nvidia-smi查看驱动版本和显存状态。
3.3 Python 与环境管理
Stable Diffusion WebUI 这类项目通常会自己创建 Python 虚拟环境,不一定需要你手动装依赖。但如果你准备写批量脚本,建议本机有 Python 3.10 或 3.11。多个项目共存的机器上,推荐安装 Miniconda,可以隔离出不同的 Python 环境:
conda create -n ai100 python=3.10 conda activate ai1003.4 磁盘空间
一个开源绘图模型一般是 2G 到 7G 不等,再加上 VAE、LoRA、ControlNet 模型和临时缓存,建议预留至少 40G 磁盘空间。如果你打算做批量生成,输出图会很占空间,要提前规划输出目录。
3.5 端口准备
WebUI 默认使用 7860 端口,ComfyUI 默认使用 8188 端口。如果你本机有其他的服务占用了这两个端口,启动时会报错,需要提前查一下端口状态:
netstat -ano | findstr 7860 netstat -ano | findstr 8188如果有进程占用,要么关掉,要么在启动参数里改掉端口。
4. 安装部署与启动方式
下面分别给出 WebUI 和 ComfyUI 两条路线。需要说明的是,下面的命令是通用模板,实际路径和启动参数请以你仓库里的 README 为准。
4.1 路线一:Stable Diffusion WebUI
适合第一次接触本地 AI 绘画的萌新,页面直观,扩展多,排查简单。
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git cd stable-diffusion-webui python launch.py --xformers --api启动后浏览器访问:
http://127.0.0.1:7860--api参数非常关键,如果之后要用 Python 脚本批量生成,必须带上这个参数。低显存机器建议加:
python launch.py --xformers --medvram --api启动完毕后,需要把绘图模型文件放到models/Stable-diffusion/目录下。模型的后缀一般是.safetensors或.ckpt,放进去后回到页面左上角刷新模型列表就能看到。
4.2 路线二:ComfyUI
如果你已经有一定基础,想追求更高的控制精度和更低显存占用,可以用 ComfyUI。它对节点式工作流支持更好,适合把“秦良玉-甲骨文”这种特定风格做成可复用的工作流文件。
git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI python main.py --port 8188启动后浏览器访问:
http://127.0.0.1:8188模型文件放到ComfyUI/models/checkpoints/目录下。ComfyUI 的页面以节点图为主,第一次用需要花一点时间理解“加载模型-输入提示词-采样器-解码-保存图片”这几块节点。好处是流程完全可视化,调好一次后可以导出为workflow.json文件,下次直接拖进去复用风格。
4.3 模型与提示词准备
本项目主题是“秦良玉-甲骨文”,建议准备两类素材:
- 通用绘图模型:例如基于 Stable Diffusion 1.5 的开源模型,或是质量更高的新架构模型,以你本机显存为准。
- 风格参考图:几张水墨国风、青铜器纹样、甲骨文拓片图片,用于图生图或 ControlNet 控制风格。
提示词层面,如果用的是英文提示词为主的模型,建议把关键词写成英文描述。比如:
Qin Liangyu, ancient Chinese female general, Ming dynasty armor, holding spear, ink wash painting style, bronze pattern, oracle bone script texture, rice paper background, historical illustration负面提示词可以写常见的崩坏项:
watermark, text, blurry, low quality, extra fingers, deformed hands, bad anatomy4.4 启动后的验证
启动完成后,先在 WebUI 页面手动生成一张 512x768 的测试图,确认模型加载正常、输出目录可写。如果页面能正常出图,说明基础环境没问题。
5. 功能测试与效果验证
部署完成只是第一步。下面按功能维度给出测试内容,每一步都说明输入、操作、预期结果和失败排查方向。
5.1 文生图测试
测试目的:确认模型能理解“秦良玉 + 甲骨文元素”的提示词,并且输出风格稳定的作品。
操作步骤:
- 在 WebUI 的 txt2img 页面输入提示词。
- 设置宽度 512,高度 768,步数 20,批次数量 1。
- 点击 Generate。
预期结果:
- 画面中出现符合中国古代女将形象的人物,服装带有明代铠甲特征。
- 背景或纹理中包含类似甲骨文、青铜纹样的装饰性图案。
- 人物结构基本完整,没有严重崩坏。
判断标准:连续生成 4 张,至少有 2 张在主题表达上可接受。
如果画面完全看不出“甲骨文”元素,优先检查提示词里的英文关键词是否写完整。很多模型对中文关键词理解很弱,建议全部翻译成英文后再试。
5.2 图生图测试
测试目的:验证已有的参考图能否用于风格迁移。这里可以准备一张甲骨文拓片的线稿或一张水墨人物线稿,作为输入素材。
操作步骤:
- 切到 img2img 页面。
- 上传参考图。
- 提示词保持和文生图一致。
- Denoising strength 先设置为 0.4 到 0.5。
- 点击 Generate。
预期结果:
- 输出图保留参考图的构图或纹理结构,同时具有“秦良玉-甲骨文”提示词的风格。
- Denoising strength 太低时画面变化小,太高时容易破坏参考结构。
失败排查:
- 如果参考图被完全忽略,检查是否上传成功,以及 Denoising strength 是否设置过高。
- 如果输出图糊成一片,把 Denoising strength 降到 0.3 左右再试。
5.3 风格一致性测试
这个项目最大的特点之一,是“秦良玉 + 甲骨文”是一个固定视觉主题。要保持统一风格,可以把提示词拆成固定段和变化段:
固定段:
Qin Liangyu, ancient Chinese female general, oracle bone script texture, bronze pattern, ink wash style变化段:根据构图需要替换,例如standing pose、riding horse、reading scroll。
操作建议:
- 固定一个随机种子,分别生成 5 张不同姿态的图。
- 把固定种子取消,再批量生成 5 张。
- 对比两组结果的风格一致性。
这个测试能帮你判断,当前模型对这个主题的“风格锁定能力”是否足够。如果风格漂移明显,可以考虑训练 LoRA 或用 ControlNet 固定线稿构图。
5.4 高分辨率测试
512x768 出图稳定后,可以试更高分辨率。但要注意,高分辨率直接生成会显著增加显存占用,萌新可以先采用“小图生成 + 高清放大”的方式。
推荐流程:
- 先生成一张 512x768 的满意图。
- 使用 Hires. fix 或 Extras 里的 Upscale 功能放大 1.5 倍到 2 倍。
- 观察放大后细节是否被破坏。
如果显存不足,不要强行拉升,可以先保持 512,后续再用脚本分块放大。
6. 接口 API 调用与批量任务
当手动生成已经稳定,下一步就是接 API,把整个 100 天项目的进度从“一张张点按钮”升级成“跑批处理脚本”。
6.1 如何确认 API 服务已开启
WebUI 启动时带了--api参数后,访问:
http://127.0.0.1:7860/sdapi/v1/txt2img可以用 curl 做一个最简单的测试:
curl -X POST http://127.0.0.1:7860/sdapi/v1/txt2img \ -H "Content-Type: application/json" \ -d '{"prompt":"test","steps":10}'如果返回 JSON,说明接口服务已正常启动。
6.2 Python 调用 API 生成单张图
下面是一个最小的 Python 调用示例。请按实际项目的端口、模型名和输出路径调整。
import requests import base64 import os api_url = "http://127.0.0.1:7860/sdapi/v1/txt2img" payload = { "prompt": "Qin Liangyu, ancient Chinese female general, oracle bone script texture, bronze pattern, ink wash style, rice paper background", "negative_prompt": "watermark, text, blurry, low quality, extra fingers", "steps": 20, "width": 512, "height": 768, "batch_size": 1 } response = requests.post(api_url, json=payload, timeout=180) data = response.json() os.makedirs("outputs", exist_ok=True) for i, img_base64 in enumerate(data.get("images", [])): img_bytes = base64.b64decode(img_base64) file_path = os.path.join("outputs", f"qinliangyu_{i}.png") with open(file_path, "wb") as f: f.write(img_bytes) print(f"saved: {file_path}")这段代码的关键点在于,返回值中的images字段是 base64 编码的字符串列表,必须解码后才能写入图片。如果返回里没有images,说明请求失败,需要把data整体打印出来看报错信息。
6.3 批量任务脚本思路
批量生成的需求会出现在“多姿态、多构图、多风格微调”的场景。建议准备一个 CSV 参数文件,比如prompt_list.csv:
id,prompt,negative_prompt,steps,width,height 001,Qin Liangyu standing,watermark,20,512,768 002,Qin Liangyu riding horse,watermark,20,512,768 003,Qin Liangyu reading scroll,watermark,20,512,768然后写一个循环脚本逐行读取并调用 API:
import csv import requests import base64 import os import time api_url = "http://127.0.0.1:7860/sdapi/v1/txt2img" output_dir = "outputs" os.makedirs(output_dir, exist_ok=True) with open("prompt_list.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: payload = { "prompt": row["prompt"], "negative_prompt": row["negative_prompt"], "steps": int(row["steps"]), "width": int(row["width"]), "height": int(row["height"]), "batch_size": 1 } try: resp = requests.post(api_url, json=payload, timeout=300) data = resp.json() for i, img_base64 in enumerate(data.get("images", [])): img_bytes = base64.b64decode(img_base64) file_name = f"{row['id']}_{i}.png" with open(os.path.join(output_dir, file_name), "wb") as out: out.write(img_bytes) print(f"saved: {file_name}") except Exception as e: print(f"failed: {row['id']}, error: {e}") time.sleep(1)批量脚本建议加日志记录。每次生成的参数、结果文件名、耗时都写进一个日志文件,方便出问题时回溯。
import logging logging.basicConfig( filename="batch.log", level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s" ) logging.info(f"generated: {row['id']}")6.4 失败重试机制
批量任务最怕中途卡住。稳妥的做法是给每次请求设置 timeout,然后对失败任务做简单重试。重试次数建议 2 到 3 次,超过后把任务写入failed_ids.txt,方便后续补跑。
for attempt in range(3): try: resp = requests.post(api_url, json=payload, timeout=300) if resp.status_code == 200: # 处理结果 break else: print(f"attempt {attempt + 1} failed, status: {resp.status_code}") except Exception as e: print(f"attempt {attempt + 1} error: {e}") time.sleep(5)7. 资源占用与性能观察
资源占用是本地部署和批量生成逃不开的问题。这里给出观察方法和常见调优思路,具体数字请以你自己机器上的nvidia-smi输出为准。
7.1 启动阶段
在命令行窗口启动 WebUI 或 ComfyUI 后,日志会打印是否成功加载 CUDA。如果日志里出现 CPU 运行字样,说明显卡没有被正确识别。检查显卡驱动和 PyTorch 版本是否匹配。
启动服务占用的显存不多,真正上涨是在加载模型之后。模型加载完成,显存会被占用一部分,之后生成图片时会继续增加。
7.2 生成阶段观察
生成图片时,在另一个终端执行:
nvidia-smi重点看Memory-Usage和GPU-Util两列。如果显存占用接近上限,说明当前参数偏激进,需要降低分辨率、步数或批量大小;如果显存占用很低但出图很慢,可能是使用了 CPU 推理,需要检查环境配置。
7.3 参数对性能的影响
影响显存和速度的关键参数有:
- 分辨率:512 相对稳妥,1024 会带来明显更高的显存压力。
- 步数:20 步和 30 步的主要差异在耗时,显存影响相对小。
- 批量大小:
batch_size设为 2 或更高,单张图生成时间会缩短,但显存会成倍增加。 - 放大模型:二次高分辨率放大时显存占用会比普通生成明显提高。
如果显存不足,建议把batch_size固定为 1,优先靠队列批量处理,而不是一次生成多张。
7.4 低显存调优方案
低显存机器可以尝试以下方式,但效果和兼容性需要实测验证:
- WebUI 启动参数加
--medvram或--lowvram。 - 使用
--xformers优化注意力计算。 - 选择轻量模型或使用量化版本。
- 固定使用 512 分辨率,出图后用独立放大脚本处理。
7.5 端口冲突和进程残留
服务使用完不要直接关浏览器,要回到命令行按Ctrl+C停止进程。如果进程残留导致端口占用,可以用下面的命令查找并结束进程:
netstat -ano | findstr 7860 taskkill /PID 进程号 /F8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后浏览器打不开 | 端口被占用或服务未启动 | 查看命令行日志,检查端口 | 关闭占用进程,或换端口重新启动 |
| 日志报错 CUDA out of memory | 显存不足 | 查看 nvidia-smi 显存占用 | 降低分辨率、步数、批量大小,或加 --medvram |
| 显卡未被识别,跑得很慢 | 驱动或 PyTorch 版本不匹配 | 检查 nvidia-smi 和 Python 环境 | 更新驱动,重装匹配的 PyTorch 版本 |
| 中文提示词不出效果 | 模型对中文理解弱 | 检查提示词是否被正确编码 | 将提示词翻译成英文关键词 |
| 生成的甲骨文是乱码形状 | AI 本身不识别甲骨文 | 观察字形结构是否错乱 | 只当纹理装饰使用,不用于学术考证 |
| API 请求返回 404 或报错 | 启动时没加 --api | 检查启动参数 | 重启服务并加上 --api |
| 批量脚本卡住不输出 | 单张生成时间过长或网络超时 | 查看日志和 task 状态 | 增加 timeout,使用 3 次重试机制 |
| 图片风格不稳定 | 种子不固定,或提示词强度不够 | 多次生成对比 | 固定 seed,统一固定段提示词 |
| 高清放大后崩坏 | 放大算法和重绘幅度不合适 | 对比不同放大参数 | 降低重绘幅度,或改用独立放大流程 |
这里补充一个和本项目主题高度相关的常见误区:AI 生成的甲骨文字样看起来像,但仔细看笔画经常是错误的。如果你准备做历史科普内容,建议把 AI 生成图明确标注为“AI 风格创作”,不要误导读者认为是真实甲骨文拓片。
9. 最佳实践与使用建议
根据“秦良玉-甲骨文”这类项目的实践特点,我整理了几条工程化建议,可以让你少走弯路。
第一,第一次跑测试不要直接上高分辨率。先把步数控制在 20 步,分辨率固定在 512,确认模型加载和出图逻辑没问题,再逐步提高。这样可以避免把显存不足当成“项目本身有问题”。
第二,模型文件、输入素材、输出结果分目录管理。推荐的项目目录结构如下:
ai100-project/ ├── models/ # 绘图模型文件 ├── refs/ # 参考图、线稿、拓片素材 ├── prompts/ # 提示词 CSV / JSON 文件 ├── outputs/ # 生成结果 │ ├── raw/ # 原始输出 │ └── selected/ # 筛选后的可用作品 ├── logs/ # 批量任务日志 └── scripts/ # Python 批量脚本第三,批量任务一定要加日志。不要只把图片保存下来就结束,每次生成后记录任务 ID、提示词、参数、耗时和结果文件路径。100 天项目跨度很长,没有日志,后期根本不知道某些“灵光一现”的图是用什么参数生成的。
第四,固定种子可以极大提升可复现性。在测试提示词阶段,固定 seed,先调提示词;提示词稳定后再取消固定 seed,增加随机性。这样能区分“提示词不好”和“随机采样波动”这两种情况。
第五,接口服务不要随意暴露到公网。API 调用只允许本机局域网使用时,WebUI 默认绑定在127.0.0.1,已经比较安全。如果在服务器上跑批量任务,建议用防火墙限制访问来源,设置访问密码或使用反向代理做认证。
第六,涉及历史人物和文物元素的合规问题要做到位。无论是秦良玉的人物插画,还是甲骨文元素的装饰纹理,都不要用于不尊重历史、不尊重文物的场景。如果需要商用,先确认模型权属、素材授权和生成内容是否存在风险。
10. 总结与下一步
“秦良玉-甲骨文”这个项目最值得尝试的地方,不是它能直接给你一套完整可用的艺术设定,而是它能逼着你把本地 AI 绘画的完整工作流走一遍。从装环境、下模型、调提示词,到手动出图、接 API、写批量脚本,每一步踩的坑都是通用的。你在这个项目里积累的流程,换到其他任何主题也一样适用。
建议你先验证两件事:第一,文生图能否稳定输出“秦良玉 + 甲骨文纹理”这个组合,这是主题成立的关键;第二,API 接口能否成功返回图片,这决定了你能不能从手动生成切换到批量任务。最容易踩的坑是两个:一是低显存机器强行跑高分辨率导致 CUDA out of memory,二是中文提示词不生效导致生成结果完全跑题。这两个问题解决后,后续工作会顺利很多。
下一步可以继续扩展的方向也比较明确:加入 ControlNet 控制线稿构图,训练一个固定风格的 LoRA,把工作流迁移到 ComfyUI 实现更精细的节点控制,或者把生成的系列图片做成短剧分镜、视频脚本的视觉参考。以“秦良玉-甲骨文”为主题,真正的玩法空间很大。建议把这套流程收藏备用,第一次跑通一个最小模型,再慢慢迭代参数,最后再接批量任务和接口调用,整个过程会比想象中更快。