comfyui 插件

Stable Diffusion ComfyUI 基础教程(一) ComfyUI安装与常用插件 - 知乎最近发现很多人在搬运我的文章,,,,那我也发 前言:相信大家玩 Stable Diffusion(以下简称SD)都是用的 web UI 操作界面吧,不知道有没有小伙伴听说过 ComfyUI。ComfyUI 是 一个基于节点流程的 Stable Diffusi…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/680844052安装comfyui的插件很简单,主要就是将其放置在custom_nodes目录下即可,实践一个简单的comfyui的插件,以GitHub - Layer-norm/comfyui-lama-remover: a simple lama remover为例,这是一个关于图像擦粗的算法。

在__init__.py中

from .nodes.remover import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']

nodes/remover.py中,

class LamaRemover:@classmethoddef INPUT_TYPES(s):return {"required": {"images": ("IMAGE",),"masks": ("MASK",),"mask_threshold": ("INT", {"default": 250, "min": 0, "max": 255, "step": 1, "display": "slider"}),"gaussblur_radius": ("INT", {"default": 8, "min": 0, "max": 20, "step": 1, "display": "slider"}),"invert_mask": ("BOOLEAN", {"default": False}),},}CATEGORY = "LamaRemover"RETURN_NAMES = ("images",)RETURN_TYPES = ("IMAGE",)FUNCTION = "lama_remover"def lama_remover(self, images, masks, mask_threshold, gaussblur_radius, invert_mask):mylama = model.BigLama()ten2pil = transforms.ToPILImage()results = []for image, mask in zip(images, masks):ori_image = tensor2pil(image)print(f"input image size :{ori_image.size}")w, h = ori_image.sizep_image = padimage(ori_image)pt_image = pil2tensor(p_image)mask = mask.unsqueeze(0)ori_mask = ten2pil(mask)ori_mask = ori_mask.convert('L')print(f"input mask size :{ori_mask.size}")p_mask = padmask(ori_mask)if p_mask.size != p_image.size:print("resize mask")p_mask = p_mask.resize(p_image.size)# invert mask# 反转遮罩if not invert_mask:p_mask = ImageOps.invert(p_mask)# gaussian Blur# 高斯模糊遮罩(模糊的是白色)p_mask = p_mask.filter(ImageFilter.GaussianBlur(radius=gaussblur_radius))# mask_threshold# 遮罩阈值,越大越强gray = p_mask.point(lambda x: 0 if x > mask_threshold else 255)pt_mask = pil2tensor(gray)# lama# lama模型result = mylama(pt_image, pt_mask)img_result = ten2pil(result)# crop into the original size# 裁剪成输入大小x, y = img_result.sizeif x > w or y > h:img_result = cropimage(img_result, w, h)# turn to comfyui tensor# 变成comfyui格式(i,h,w,c)i = pil2comfy(img_result)results.append(i)return (torch.cat(results, dim=0),)

在lama/model.py中

# reference from https://github.com/enesmsahin/simple-lama-inpaintingimport os
import torch
import numpy as np
from PIL import Image, ImageOps, ImageFilter
from ..utils import get_models_path
from comfy.model_management import get_torch_device
DEVICE = get_torch_device()class BigLama:def __init__(self):self.device = DEVICEmodel_path = get_models_path(filename="big-lama.pt")print(f"{model_path}")try:self.model = torch.jit.load(model_path, map_location=self.device)except:print(f"can't use comfy device")self.device = "cuda" if torch.cuda.is_available() else "cpu"self.model = torch.jit.load(model_path, map_location=self.device)self.model.eval()self.model.to(self.device)def __call__(self, image, mask):with torch.inference_mode():result = self.model(image, mask)return result[0]

以GitHub - kijai/ComfyUI-APISR: Node to use APISR upscale models in ComfyUI为例,也是一个很简单的例子。

代码结构上,architecture都是原作者的代码,最核心的在nodes.py中,requirements.txt中是需要安装的库, 

__init__.py:

from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"]

nodes.py:

import folder_paths
import os
import torch
import torch.nn.functional as F
from .architecture.rrdb import RRDBNet
from .architecture.grl import GRL
import comfy.model_management as mm
import comfy.utils
from contextlib import nullcontextclass APISR_upscale:@classmethoddef INPUT_TYPES(s):return {"required": {"ckpt_name": (folder_paths.get_filename_list("upscale_models"),),"images": ("IMAGE",),"per_batch": ("INT", {"default": 16, "min": 1, "max": 4096, "step": 1}),"dtype": (['fp32','fp16',], {"default": 'fp32'}),},}RETURN_TYPES = ("IMAGE",)RETURN_NAMES = ("images",)FUNCTION = "upscale"CATEGORY = "ASPIR"def upscale(self, ckpt_name, dtype, images, per_batch):device = mm.get_torch_device()model_path = folder_paths.get_full_path("upscale_models", ckpt_name)custom_config = {'dtype': dtype,'ckpt_name': ckpt_name,}dtype = (convert_dtype(dtype))if not hasattr(self, 'model') or self.model == None or custom_config != self.current_config:self.model = Noneself.current_config = custom_configif "RRDB" in ckpt_name:self.model = load_rrdb(model_path, scale=2)elif "GRL" in ckpt_name:self.model = load_grl(model_path, scale=4)self.model = self.model.to(dtype).to(device)images = images.permute(0, 3, 1, 2)B, C, H, W = images.shapeH = (H // 8) * 8W = (W // 8) * 8if images.shape[2] != H or images.shape[3] != W:images = F.interpolate(images, size=(H, W), mode="bicubic")images = images.to(device=device, dtype=dtype)self.model.to(device)pbar = comfy.utils.ProgressBar(B)t = []autocast_condition = not comfy.model_management.is_device_mps(device)with torch.autocast(comfy.model_management.get_autocast_device(device),dtype=dtype) if autocast_condition else nullcontext():for start_idx in range(0, B, per_batch):sub_images = self.model(images[start_idx:start_idx + per_batch])t.append(sub_images.cpu())# Calculate the number of images processed in this batchbatch_count = sub_images.shape[0]# Update the progress bar by the number of images processed in this batchpbar.update(batch_count)self.model.cpu()t = torch.cat(t, dim=0).permute(0, 2, 3, 1).cpu().to(torch.float32)return (t,)NODE_CLASS_MAPPINGS = {"APISR_upscale": APISR_upscale,
}
NODE_DISPLAY_NAME_MAPPINGS = {"APISR_upscale": "APISR Upscale",
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2906149.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

超全面!和弦图(Chord diagram) 的绘制方法汇总~~

今天这篇推文给大家介绍一下和弦图(Chord diagram) 的绘制方法,具体包括的内容如下: 和弦图(Chord diagram)简介 和弦图(Chord diagram)绘制方法(RPython) 更多详细的数据可视化教程,可订阅我们的店铺课程: 和弦图(Chord di…

5.11 Vue配置Element UI框架

Vue配置Element UI框架 目录一、 概要二、 开发前准备1. 搭建Vue框架 三、 安装 Element UI1. 引入 Element UI 依赖2. 在 mian.js 中引入 Element UI 和相关样式:3. 按需引入(非必须, 可忽略)4. 简单构建一个主页面 目录 一、 概要 Element UI 是一个基于 Vue.js …

Java学习记录第十三天

面向对象编程 核心思想就是OOP(面向对象编程) 面向过程&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么... 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式&…

基于Java在线考试系统系统设计与实现(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

WebGIS概述

1.地图组成 底图(Map): 所有信息的载体 图层(Layer):将不同地理信息分类形成的一个集合 要素(Feature):表示不同的地物 几何(Geometry): 信息的数据模型和抽象 2.地图容器Container 即在准备阶段所创建的指定了id的div对象,这个div将作为承载所有图层、点标记、矢量…

常用类(String)

目录 字符串相关的类1.1、String类的概述1.2、理解String的不可变性1.3、String不同实例化方式的对比1.4、String不同拼接操作的对比1.4.1、String使用陷阱 1.5、String的常用方法1.6、String与基本数据类型、包装类、char[]、byte[]的转换1.7、StringBuffer和StringBuilder的介…

EasyBoss ERP上线实时数据大屏,Shopee本土店铺数据实时监测

近日,灵隐寺PPT汇报用上数据大屏疯狂刷屏,有做东南亚本土电商的老板发现这种数据大屏的模式可以很好地展现店铺运营状况。 所以就有老板来问:EasyBoss能不能也上线实时数据大屏的功能?没问题!立马安排! 要有…

鸿蒙OS开发实例:【应用级别文件浏览器】

介绍 HarmonyOS的沙盒机制完全屏蔽了应用对手机公共存储空间的访问,安全性提高已不言而喻。 本篇文章的主要目的是为了能通过一个简单工具,可视化的让一个新手能相对轻松的学习文件&数据存储。HarmonyOS 应用开发工具DevEco Studio也没有提供读取存…

.NET CORE 分布式事务(二) DTM实现TCC

目录 引言: 1. TCC事务模式 2. TCC组成 3. TCC执行流程 3.1 TCC正常执行流程 3.2 TCC失败回滚 4. Confirm/Cancel操作异常 5. TCC 设计原则 5.1 TCC如何做到更好的一致性 5.2 为什么只适合短事务 6. 嵌套的TCC 7. .NET CORE结合DTM实现TCC分布式事务 …

【Linux多线程】线程的同步与互斥

【Linux多线程】线程的同步与互斥 目录 【Linux多线程】线程的同步与互斥分离线程Linux线程互斥进程线程间的互斥相关背景概念问题产生的原因: 互斥量mutex互斥量的接口互斥量实现原理探究对锁进行封装(C11lockguard锁) 可重入VS线程安全概念常见的线程不安全的情况…

查询优化-提升子查询-UNION类型

瀚高数据库 目录 文档用途 详细信息 文档用途 剖析UNION类型子查询提升的条件和过程 详细信息 注:图片较大,可在浏览器新标签页打开。 SQL: SELECT * FROM score sc, LATERAL(SELECT * FROM student WHERE sno 1 UNION ALL SELECT * FROM student…

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

Redis桌面客户端

3.4.Redis桌面客户端 安装完成Redis,我们就可以操作Redis,实现数据的CRUD了。这需要用到Redis客户端,包括: 命令行客户端图形化桌面客户端编程客户端 3.4.1.Redis命令行客户端 Redis安装完成后就自带了命令行客户端&#xff1…

MySQL Innodb 引擎中预防 Update 操作上升为表锁

一、MySQL 如何预防 Update 上升为表锁 在 MySQL 中,进行任何数据的 修改 操作都会进行一定的锁操作,而锁的不同直接导致性能的差异。例如 MyISAM 引擎,更新时采用表锁,并发性较差。而 Innodb 引擎支持事务,更新时采用…

关于RPC

初识RPC RPC VS REST HTTP Dubbo Dubbo 特性: 基于接口动态代理的远程方法调用 Dubbo对开发者屏蔽了底层的调用细节,在实际代码中调用远程服务就像调用一个本地接口类一样方便。这个功能和Fegin很类似,但是Dubbo用起来比Fegin还要简单很多&a…

C++超市商品管理系统

一、简要介绍 1.本项目为面向对象程序设计的大作业,基于Qt creator进行开发,Qt框架版本6.4.1,编译环境MINGW 11.2.0。 2.项目结构简介:关于系统逻辑部分的代码的头文件在head文件夹中,源文件在s文件夹中。与图形界面…

新电脑如何给C盘扩容?怎么分盘?搞定

如何给C盘扩容?怎么分盘?搞定 马上到了升学考试季了,好多小伙伴们结束完毕后都开始为自己后续的学习生涯制备装备了,新手机,新电脑等等。但是有一个问题就是大多数人都只考虑电脑的配置,而忽略了实际使用的…

Ubuntu20.04上,VTK9.3在QT5上的环境配置与开发测试

Ubuntu20.04上,VTK9.3在QT5上的环境配置与开发测试 1 背景介绍2 VTK9.3的编译安装2.1 安装ccmake 和 VTK 的依赖项:2.2 建立VTK编译文件夹并下载2.3 cmake配置VTK9.3的编译环境2.4 make编译安装VTK9.32.5 测试VTK安装是否成功 3 基于qmake的QT5的VTK9.3开…

鸿蒙实战开发-使用常用组件与布局实现登录、首页、我的三个页面

介绍 HarmonyOS ArkUI提供了丰富多样的UI组件,您可以使用这些组件轻松地编写出更加丰富、漂亮的界面。在本篇Codelab中,您将通过一个简单的购物社交应用示例,学习如何使用常用的基础组件和容器组件。 本示例主要包含:“登录”、…