富文本到图像
项目主页 | 论文 | 视频 | HuggingFace 演示 | A1111 扩展
简述: 我们利用富文本中的各种格式信息,包括字体大小、颜色、样式和脚注,来增强对文本到图像生成的控制。我们的方法实现了显式的词元重新加权、精确的颜色渲染、局部样式控制和详细区域合成。
富文本实现表现力强的文本到图像生成
葛松伟, 朴泰成, 朱俊彦, 黄嘉斌
马里兰大学, Adobe, 卡内基梅隆大学
ICCV 2023
更新
- [09/26] 我们启动了A1111 WebUI 扩展的实现,用于集成富文本编辑器进行文本到图像生成。
- [09/24] 我们现在支持 LoRA 检查点。请在此分支中查看演示和最新代码。
- [08/09] 我们的方法现在支持 SD-XL,使用
--model SDXL
,以及各种微调模型,如使用--model AnimeXL
的 ANIMAGINE-XL。 - [07/14] 我们的论文被 ICCV 2023 接收。
- [05/03] 我们更新了方法以获得更稳健和准确的词元映射,并改进了对纯文本结果的结构保持。以下图像是使用新方法生成的,提示词取自此问题。
- [04/17] 我们在 HuggingFace Space 上发布了富文本到图像演示。感谢 HuggingFace 团队对演示的帮助!
- [04/13] 我们发布了富文本到图像生成,利用富文本编辑器的格式选项来帮助控制文本到图像的生成。
设置
此代码使用 Python 3.8、Pytorch 1.11 进行测试,并通过 hugginface 支持 Stable Diffusion v1-5 或 Stable Diffusion XL 或 ANIMAGINE-XL。
git clone https://github.com/SongweiGe/rich-text-to-image.git
cd rich-text-to-image/
conda env create -f environment.yaml
pip install git+https://github.com/openai/CLIP.git
conda activate rich-text
使用方法
一般来说,我们的流程包含两个步骤。首先,我们将纯文本提示输入扩散模型并计算交叉注意力图,以将每个词元与空间区域关联起来。从编辑器获得的富文本提示以 JSON 格式存储,为每个词元跨度提供属性。我们使用新的基于区域的扩散来将每个区域的属性渲染成全局一致的图像。以下我们提供各种字体格式的基本用法。
富文本到 JSON
我们将富文本编码为 JSON 格式,并将其用作富文本条件采样脚本 sample.py
的输入。要根据富文本自动生成 JSON 字符串,您可以使用我们的富文本到 JSON界面,这是一个纯静态网页,可以轻松集成到任何基于富文本的应用程序中。
富文本 JSON 到图像
您可以通过我们的本地 gradio 演示开始生成富文本 JSON 的图像:
python gradio_app.py
或通过命令行:
python sample.py --rich_text_json '您的富文本 json 在这里'
字体颜色
我们使用字体颜色来控制生成对象的精确颜色。例如,以下脚本生成"日落时分的哥特式教堂(颜色为 #b26b00),背景是美丽的风景。"
python sample.py --rich_text_json '{"ops":[{"insert":"a Gothic "},{"attributes":{"color":"#fd6c9e"},"insert":"church"},{"insert":" in a sunset with a beautiful landscape in the background.\n"}]}' --num_segments 10 --segment_threshold 0.4 --inject_selfattn 0.5 --inject_background 0.5 --color_guidance_weight 1 --seed 7 --run_dir results/color_example_xl --model SDXL
脚注
我们使用脚注为选定的文本元素提供补充描述。以下脚本生成一只戴着太阳镜和头巾的猫,这是一个困难的案例,正如eDiffi中提到的。
python sample.py --rich_text_json '{"ops":[{"insert":"一张特写的4K单反照片,拍摄的是一只"},{"attributes":{"link":"一只戴着太阳镜和脖子上系着头巾的猫。"},"insert":"猫"},{"insert":"骑着滑板车。背景是棕榈树。\n"}]}' --seed 3 --inject_background 0.5 --inject_selfattn 0.3 --num_segments 5 --run_dir results/footnote_example_xl --model SDXL
字体样式
就像字体样式区分了个别文本元素的样式一样,我们建议使用它来定义生成中特定区域的艺术风格。这里是一个示例脚本,用于生成"一个美丽的花园(克劳德·莫奈风格)和背景中的雪山(浮世绘风格)"。
python sample.py --rich_text_json '{"ops":[{"insert":"一个美丽的"},{"attributes":{"font":"mirza"},"insert":"花园"},{"insert":",背景是一座"},{"attributes":{"font":"roboto"},"insert":"雪山"}]}' --num_segments 10 --segment_threshold 0.5 --inject_background 0.4 --seed 5 --run_dir results/style_example_xl --model SDXL
字体大小
字体大小表示每个标记在最终生成中的权重。这是通过在每个交叉注意力层的softmax之前重新加权指数注意力分数来实现的。以下示例在生成的披萨上增加了更多的菠萝:
python sample.py --rich_text_json '{"ops": [{"insert": "一个披萨上面有菠萝、意大利辣香肠和"}, {"attributes": {"size": "60px"}, "insert": "蘑菇"}]}' --seed 3 --run_dir results/size_example_xl --model SDXL
评估
局部风格生成
为了评估在局部区域生成特定风格的能力,我们计算每个风格化区域与其区域提示(包含该风格名称)之间的CLIP相似度。我们提供了一个评估脚本,并将我们的方法与Prompt-to-Prompt中提出的AttentionRefine方法进行比较:
python evaluation/benchmark_style.py --save_img --folder eval_style
精确颜色生成
我们提出了三个难度级别的颜色名称,以衡量一种方法理解和生成特定颜色的能力。我们通过计算区域和目标RGB值之间的平均L2距离来评估颜色准确性。报告了朝目标颜色变化的距离。
python evaluation/benchmark_color.py --category html --folder eval_color_html
python evaluation/benchmark_color.py --category rgb --folder eval_color_rgb
python evaluation/benchmark_color.py --category common --folder eval_color_common
可视化标记图
每次调用get_token_maps()
函数时,生成的分割和标记图也会被可视化并本地保存以便调试。否则,您可以使用以下脚本手动可视化文本提示中的标记图。
python visualize_token_maps.py --text_prompt "一台三脚架上的相机正在给一只猫拍照。" --token_ids 1 4 10 --num_segments 15 --segment_threshold 0.45 --model SDXL
引用
@inproceedings{ge2023expressive,
title={Expressive text-to-image generation with rich text},
author={Ge, Songwei and Park, Taesung and Zhu, Jun-Yan and Huang, Jia-Bin},
booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision},
year={2023}
}
致谢
我们感谢Mia Tang、Aaron Hertzmann、Nupur Kumari、Gaurav Parmar、Ruihan Gao和Aniruddha Mahapatra的有益讨论和论文阅读。我们感谢AK、Radamés Ajna和其他HuggingFace团队成员对在线演示的帮助和支持。我们的富文本编辑器基于Quill构建。我们的模型代码基于huggingface / diffusers构建。