前几天,controlnet作者-lllyasviel,放出一个源码Omost。该项目的作用,让用户只需要输入一个简单的主题,AI就可以根据这个主题,对画面自动进行自动补全,最终输出细节丰富且符合意图的图片。
官方效果
看看官方放出效果:
a ragged man wearing a tattered jacket in the nineteenth century:
the greatest escape after the apocalypse, the hope of all humanity:
jurassic dinosaur battle:
可以看到,输出的效果是非常好的,基本上,用上这个技术,普通人不需要煞费心思地去思考提示词,也可以输出质量不错且符合意图的图片了。
但似乎作者并不是简单地把LLM引入,而是做了一定的算法处理。
在使用前,我们也看看大致原理,懂不懂不重要,知道牛🐂 🍺就行😂
Omost技术原理
我尝试根据作者的项目,整理一下,如果有出入,请大家指正。
规范LLM参数
所有 Omost LLM 都经过训练以遵守以下符号。这样LLM就可以根据格式规范,进行语言理解和输出。
class Canvas: def set_global_description( self, description: str, detailed_descriptions: list[str], tags: str, HTML_web_color_name: str ): pass def add_local_description( self, location: str, offset: str, area: str, distance_to_viewer: float, description: str, detailed_descriptions: list[str], tags: str, atmosphere: str, style: str, quality_meta: str, HTML_web_color_name: str ): assert location in [ "in the center", "on the left", "on the right", "on the top", "on the bottom", "on the top-left", "on the top-right", "on the bottom-left", "on the bottom-right" ] assert offset in [ "no offset", "slightly to the left", "slightly to the right", "slightly to the upper", "slightly to the lower", "slightly to the upper-left", "slightly to the upper-right", "slightly to the lower-left", "slightly to the lower-right" ] assert area in [ "a small square area", "a small vertical area", "a small horizontal area", "a medium-sized square area", "a medium-sized vertical area", "a medium-sized horizontal area", "a large square area", "a large vertical area", "a large horizontal area" ] assert distance_to_viewer > 0 pass
规范的范围有如下:
-
功能:Canvas.set_global_description和Canvas.add_local_description
-
参数:描述和detailed_descriptions
-
参数:位置、偏移量、面积
-
参数:distance_to_viewer和HTML_web_color_name
-
参数:标签和氛围以及风格和quality_meta
参数:位置、偏移量、面积
作者把画布分为3x3=9个位置。
然后进一步将每个位置划分为 3_3 个偏移量,得到 9_9=81 个位置:
以这些位置为中心,进一步定义了 9 种类型的边界框:
这种方法允许 9_9_9=729 个不同的边界框,几乎涵盖了图像中对象的所有常见可能位置。
这样的目的是在于让LLM绘制各个区域的画面细节,从而达到丰富画面的效果。
不得不说,真是高明 👍
参数:distance_to_viewer和HTML_web_color_name
这个参数,我理解是把深度参数转化为LLM可以描述和识别的方式。
distance_to_viewer
可以看作是相对深度。请注意,此值的绝对数根本不可靠(因为开源 LLM 不太擅长生成图像空间数字),它应该只用于将元素排序到背景到前景层。
在使用扩散模型渲染所有局部元素之前,始终可以使用 distance_to_viewer 对它们进行排序。全局描述始终可以被视为最远的背景图层。
通过结合distance_to_viewer
和HTML_web_color_name
,您可以绘制出非常粗糙的构图图像。例如,如果 LLM 运行良好,"在黑暗的房间里,木桌上的红瓶子前面有一个绿色瓶子"应该可以让你计算出如下图像:
参数:标签和氛围以及风格和quality_meta
这些标签
被设计为描述
的可能替代品,因为许多扩散模型更喜欢标签。如果与动漫模型一起使用,可能会对一些逻辑进行硬编码,以将所有"女孩"替换为"1女孩"。如果与 Pony 一起使用,那么可能总是硬编码添加"score_9,score_8…"对此。氛围
、风格
和quality_meta
是一些实验参数,没有非常具体的用例。目前,我们可以将它们视为子提示,并将它们参与到子提示包的贪婪合并中。在我的实验中,这将稍微改善气氛和质量。
基线渲染器
通过注意力评分机制,引导LLM产出更符合意图的元素。
Omost提供了基于注意力操作的 Omost LLM 的基线渲染。作者基于**注意力评分操作**
的方法:
这是一种更高级的方法。它直接操纵注意力分数,以确保鼓励掩蔽每个区域的激活,并阻止掩蔽之外的激活。该公式类似于
y=softmax(modify(q@k))@v
其中modify()
是一个复杂的非线性函数,具有许多归一化和改变分数分布的技巧。这种方法超越了简单的屏蔽注意力,真正确保这些层得到想要的激活。一个典型的例子是密集扩散。
编写了一个新的基线公式。他认为这种无参数公式是一个非常标准的基线实现,几乎会引入零样式偏移或质量下降。
区域提示器
原理大致如下:
让我们考虑一个只有 2*2=4 像素的极其简化的图像
然后我们有三个提示"两只猫"、“一只黑猫”、“一只白猫”,我们有他们的面具:
然后我们可以画出这个注意力得分表:
其中,上面的箭头表示我们想要鼓励激活,而下面的箭头表示我们想要摆脱这些激活。
此操作直接修改注意力分数,并在单个 SDP 注意力传递中计算所有提示条件。
提示前缀树
这个算法,是整合提示语链路关系并分别加工细节,提升准确性。
作者还加入了另一个技巧,这个技巧可以大大提高提示理解,称它为提示前缀树。其动机是,既然现在我们所有的提示都是可以任意合并的子提示(回想一下,所有子提示严格少于 75 个标记,通常少于 40 个标记,描述独立的概念,并且可以任意合并为剪辑编码的常见提示),找到一种更好的方法来合并这些子提示可能会改善结果并提示解释。
例如,下面是全局/局部整体/详细描述的树结构。
这个想法是,由于所有子提示都可以任意合并,因此我们可以将此树形图中的路径用作提示。
例如,下面的路径将给出提示"一只猫和一只狗。沙发上的猫。
好复杂,看不懂没关系,作为设计师,知道怎么用就可以了。
如何使用
目前作者提供源码方式,可以直接拉取下来部署使用。当然,也可以用抱脸上的地址进行快速体验。https://huggingface.co/spaces/lllyasviel/Omost
可以使用以下方式部署(需要 8GB Nvidia VRAM):
git clone https://github.com/lllyasviel/Omost.git cd Omost conda create -n omost python=3.10 conda activate omost pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 pip install -r requirements.txt python gradio_app.py
需要下载很多的模型:
测试效果
我们使用普通的SDXL工作流,输入同一个提示语,看两者有什么差别。以下图片,左边为普通SDXL输出,右边为Omost输出。
吉普赛女孩
A gypsy girl
南非节日
South American festivals
窗台上的猫
a cat on the windowsill
翩翩起舞的中国女孩
Chinese girls dancing gracefully
丰盛的水果餐
A sumptuous fruit meal
画面的细节和氛围感,Omost是非常好了,无脑出好图
指日可待!期待大神们整合到ComfyUI工作流,或者webui中。
感兴趣的小伙伴,赠送全套AIGC学习资料,包含AI绘画、AI人工智能等前沿科技教程和软件工具,具体看这里。
AIGC技术的未来发展前景广阔,随着人工智能技术的不断发展,AIGC技术也将不断提高。未来,AIGC技术将在游戏和计算领域得到更广泛的应用,使游戏和计算系统具有更高效、更智能、更灵活的特性。同时,AIGC技术也将与人工智能技术紧密结合,在更多的领域得到广泛应用,对程序员来说影响至关重要。未来,AIGC技术将继续得到提高,同时也将与人工智能技术紧密结合,在更多的领域得到广泛应用。
一、AIGC所有方向的学习路线
AIGC所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、AIGC必备工具
工具都帮大家整理好了,安装就可直接上手!
三、最新AIGC学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、AIGC视频教程合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。