Omost 图像生成工作流完整拆解:LLM 如何用 Canvas 代码构图
【免费下载链接】OmostYour image is almost there!项目地址: https://gitcode.com/GitHub_Trending/om/Omost
Omost 把 LLM 的"写代码"能力换成了可渲染的图像合成产物:模型不再直接吐长提示词,而是写一段操作虚拟 Canvas 的 Python 代码来构图。如果你想在本地跑通一套"对话式构图 + 扩散模型出图"的工作流,或想研究 LLM 与扩散模型怎么衔接,这个项目值得看。
它解决什么问题:不用手工拼接多模态管道
没有 Omost 之前,想让扩散模型按"左边站着一群人、中间是条龙"这样的空间关系出图,你得自己干三件事:把一句需求扩写成提示词、想办法把空间指令转成区域控制、再处理不满意时重新抽卡。这几块逻辑分散在不同项目里,胶水代码全靠自己写。
Omost 的做法是让一个专门训练过的 LLM 直接输出 Canvas 代码,把"描述 → 构图 → 出图"串成一条链:
| 传统多模态拼法 | Omost 工作流 | |
|---|---|---|
| 提示词来源 | 手工写长 prompt,区域靠运气 | LLM 生成带位置、深度、颜色的 Canvas 代码 |
| 空间控制 | 难以指定元素落点 | 9 位置 × 9 偏移 × 9 面积,共 729 种区域组合 |
| 修改画面 | 整图重抽,期望抽中 | 对话式编辑,只改单个元素的描述 |
核心机制怎么转:从一句话到一张图
整条链路是"输入 → 中间产物 → 输出"三段。
输入:你在聊天框里写一句自然语言,比如"战士与龙的激烈战斗"。
中间产物:LLM 不回答文字,而是写一段 Python 代码——先set_global_description定全局基调,再对每个元素调add_local_description,指定位置("on the left")、面积("a large horizontal area")、离观察者远近、甚至一块 HTML 颜色名。这段代码被执行后变成一个 Canvas 对象,process()把它整理成带 mask 的提示词包和按深度排好序的元素列表。Omost 这个名字读作 almost,O 取自 omni(多模态),most 意为"榨出最大价值"——合起来暗示每次跑完,图都只差临门一脚。
canvas = omost_canvas.Canvas.from_bot_response(last_assistant) # 从模型回复里取出 Canvas canvas_outputs = canvas.process() # 产出 mask、提示词包与层序输出:管道 lib_omost/pipeline.py 里的StableDiffusionXLOmostPipeline接住这些条件,跑 SDXL 采样出图。它内部把每个元素的提示词按"子提示词 <75 token"的约定贪心分袋编码,保证文本编码器不会截断语义;交叉注意力处理器则按每个元素的 mask 直接改写注意力分数,让对应区域真的"听到"自己的提示词。画布定义见 lib_omost/canvas.py,界面逻辑在 gradio_app.py 里。
三分钟跑起来:安装与启动指南
先克隆仓库,克隆完成后进入 Omost 目录,后面所有命令都在这个目录里执行:
git clone https://gitcode.com/GitHub_Trending/om/Omost cd Omost仓库要求 Python 3.10 环境,依赖里包含 torch、diffusers、gradio、bitsandbytes 等。装完依赖,GPU 显存约 8GB 就能跑默认的 4bit 量化 LLM:
pip install -r requirements.txt依赖装好后启动 Gradio 服务,首次运行会下载底模与 LLM 权重,耐心等日志走完:
python gradio_app.py浏览器打开本地 Gradio 地址、看到左侧聊天框和右侧出图区,就算跑通了。注意量化 LLM 依赖bitsandbytes,部分 9 系/10 系/20 系显卡会跑不起来,这种情况 README 建议直接用官方在线空间。
当前基线渲染器的边界
说实话,现在打开源码能看到的实现有两点比较"朴素"。
其一,区域引导用的是无参数注意力改写:OmostCrossAttnProcessor靠 mask 把区域外的注意力分数置为 -inf,没有训练过任何额外权重。作者自己定位为"标准基线",好处是不引入风格偏移,代价是控制精度停在"区域大致正确"这一层。
其二,默认底模在 gradio_app.py 里写死为 SDXL 的 RealVisXL_V4.0,默认 LLM 是 4bit 量化的 llama-3-8b;Canvas 其实能画出一张色块布局图当初始 latent,但diffusion_fn里use_initial_latent默认是关的,扩散始终从零噪声起步。另外distance_to_viewer的绝对数值并不可靠,代码里只拿它排序图层,别指望它当深度估计用。
什么时候该选 Omost
- 🎯 想让 LLM 帮你做"多元素、有空间关系"的画面构图,而不是抽一句长 prompt
- 💬 需要反复微调画面:改完一个元素重发对话,Canvas 代码会整体重生成
- 🔍 在研究 LLM 与扩散模型结合的方案,想读一套无参数的区域注意力基线实现
不适用的场景:你要像素级精确控制(指定具体坐标、像素对齐的布局),Canvas 的 729 种离散区域粒度不够用。
务实的下一步:先把 8GB 显存的本地环境跑通,用随机种子复现一个 README 里的对话样例,再决定要不要把它接进自己的工作流。
【免费下载链接】OmostYour image is almost there!项目地址: https://gitcode.com/GitHub_Trending/om/Omost
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考