体验comfy ui
春节里用老婆电脑试用了下comfy ui, 记录下试用的感受.
comfy ui是什么
stable diffusion 是 CompVis 与 Stability AI 和 Runaway 合作的文生图模型, 对用户提供了一些 py 脚本, 比如文生图, 图生图, 部分改图, knn生图, 调用方式是 py 脚本, 还有一系列复杂的参数, 像这样: python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms .
为了适合更多的用户和扩展更多的功能, 就有了 webui 和 comfyui 这两个 gui.
webui是表单型, 选择各种模型, 各种参数后执行任务, 有各种主流的任务表单.
comfyui是工作流型, 可以创建不同的工作流来表现各种主流任务. 这种 visual program 的形式有点像低代码, 所以可以完成比 webui 更多的功能, 虽然实际上 webui 已经能满足绝大多数用户的需求.
webui 和 comfyui 的启动方式都是执行 py 脚本, 前后端会同时起, 然后用浏览器访问前端. comfyui 去年开始做了个客户端包装了下.
工作流和生图基本概念
comfyui 的工作流是对 jsonschema 的展示与修改, 一个工作流对应一个 json.
工作流的物料是”节点”, 每个节点是一个函数, 完成一些功能. 函数的输入和返回可以与其他节点串起来, 串的方式就是拖动节点的”输入”和”输出”. 输入和返回都有自己的类型的, 所以要类型相同才可以拖动连接. 除了输入和输出, 节点还有自己的属性, 其实就是函数的配置项, 有些配置可能还是根据输入来产生的.
节点和低代码的物料一样, 分为系统自带和扩展, 也支持开发. 编写或下载完放到指定文件夹, 或者用 comfyui manager 来管理.
把节点都连接起来后, 就形成了一个程序, 可以直接执行, 或者选择部分流程执行, 当然需要部分流程本身也是完整流程.
另外可以把部分流程组成”子流程”, 成为一个新节点, 节点的输入和输出可以自定义, 就类似于包装函数, 所以这种工作流形式是一种 program.
基本生成流程和对应工作流
虽然看起来工作流很灵活, 但核心功能还是生图. diffusion 模型的生图流程是降噪(reverse diffusion).
由一个纯噪音的初始图像, 和输入的提示词结合, 通过 diffusion 模型(diffusion 模型很大是因为模型是文字图片的关联, 所以有很多图片), 产生一个清晰一些的图像, 经过多次重复这个步骤, 就产生了最后的图像.
这个核心步骤的节点叫 KSampler, 重复的次数可以在 step 属性设置, 重复次数越多图像越好, 花的时间越长.
另外, 程序其实不擅长处理像素图, 为了提高处理的速度和减少占用的空间, 核心步骤的原材料”图片”和”提示词”都是经过处理后, 适合程序处理的形式.
其中, 我们认识的图片(像素图)会被转化为 latent 格式(名字其实没有具体意义, 只是个代号). 而提示词会被处理为语义化向量(semantic vectors).
这里的”像素图”(image), “latent图”(latent), “semantic vectors”(conditioning)都是工作流中节点输入/输出的类型, 之前提过, 类型符合的才能在工作流里被连接起来.
转化图像和提示词的工具在工作流中也会被作为参数在各个节点中传输, 转化图像工具是 VAE (Variational AutoEncoder) (不是许嵩), 转换提示词的工具叫 CLIP Text Encoder(CLIP).
所以一个文生图的基本工作流是这样的:
- 从 checkpoint 里取出 model(降噪用模型), CLIP(用来转化提示词), VAE(用来转化图像).
- 使用model, CLIP处理过的提示词, 空 latent 进行降噪, 产生处理后的 latent. (图生图的场景就用 VAE 把上传的图片转化为 latent, 来替代文生图的空 latent)
- 用第一步取到的 VAE 处理上个步骤获得的最终 latent, 得到像素图.
辅助模型和对应工作流
上面说的 diffusion 模型来文生图, 图生图, 还有几类常用的辅助模型.
inpainting
这类模型用来处理图生图的特殊场景, 只需要重绘部分原图, 或把原图作为生成图的一小部分来扩绘.
和基础工作流对比, 除了选择的模型油 diffusion 模型换成 inpainting 模型, 只有 KSampler 入参的 latent 是不同的:
- 文生图, 是空 latent. 指定尺寸的纯高斯噪音.
- 图生图, 是使用 VAE 把图片转换为 latent.
- 部分绘图, 是使用 comfyui 的抠图工具获得部分透明的像素图, 再使用 inpaiting 的 encode 节点, 通过 VAE 转换为 latent.
- 扩展绘图, 是使用 pad image 节点来把原图放到一个指定尺寸的透明像素图里, 结果就是”部分绘图”的状态, 把原图周边都扣了, 只剩中间的效果, 所以后续流程和部分绘图一样.
upscale
这类模型是让图片变清晰, 修复低像素, 工作流非常简单, 加载模型和原图, 通过 upscale image 节点, 就会得到新图片.
这个流程可以和其他流程拼接, 也可以自己多执行几次, 因为这类模型没有参数来选择放大几倍, 如果2倍模型, 目标是放大4倍, 重复2次流程就可以. 这样的 upscale 流程也非常适合抽取到一个”子流程”, 作为一个节点来用.
lora
Low-Rank Adaptation, 微调模型, 而不是重新训练整个模型, lora的体积小, 训练也快, 我理解为模型的补丁.
lora 节点的输入和输出都是 model 和 clip, 自然就知道他在工作流里的位置是在加载 checkpoint 之后, 效果是增强主模型.
因为输入输出相同, 所以可以加载多个lora.
controlnet
controlnet是指导绘图结构的, 如果有特定的绘图目标, 反复生成来得到指定的结果是非常累的, 于是有了controlnet.
比如简笔画作为骨架, 动作骨架, 深度骨架, 还有二维码骨架.
controlnet 是作用在 semantic vectors 上的插件, 他在工作流中, 通过 controlnet 模型, 上传的骨架图片, 来修改从提示词生成的 semantic vectors.
感受
玩了2天后, 最大的感受是无力, 以自己的能力, 是只能”使用”的, comfy-ui 所谓的工作流构造, 上限非常低.
其实在尝试的时候, 给自己的目标是做一个可扫的漂亮的二维码, 而在过程中, 除了重试, 能做的就只有换模型, 看别人的视频, 文章, 如果想要更多参与, 要自己训练model, lora, controlnet, 这个对知识, 电脑配置和硬盘, 时间的消耗是很大的, model, lora, controlnet的训练方式还是不同的.
试模型的成本也不小, huggingface, civitai 都是墙外的, 模型大, 消耗流量也大, 下到本地还占硬盘.
我能想到的 ai 绘图的使用点, 是完成一些平面设计师的日常的重复工作, 只需要找到个合适的模型就可以了. 我打算 ai 绘画体验到此为止, 如果下次又有兴趣了, 会尽量尝试模型训练, 来主动满足自己的需求.
(本文完)
如果你可以 点击这个链接打赏我5毛来鼓励我, 非常感谢.
本文遵循 cc协议
你可以在注明出处和非商用的前提下任意复制及演绎
