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://www.hqwc.cn/news/576049.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【有芯职说】数字芯片BES工程师

一、 数字芯片BES工程师简介 今天来聊聊数字芯片BES工程师,其中BES是Back End Support的缩写,就是后端支持的意思。其实这个岗位是数字IC前端设计和数字IC后端设计之间的一座桥,完成从寄存器传输级设计到具体工艺的mapping和实现。这个岗位在…

a = 3中的3在栈中还是堆中?

1、栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等。 2、堆区(heap) 是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),在j…

踏上机器学习之路:探索数据科学的奥秘与魅力

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

国外的Java面试题和国内的相比谁更卷

前言 有很多朋友很好奇国外的Java面试题长啥样,今天我们就去找5道国外的面试来和国内的对比一下看看谁难一些! 面试题分享 1. Is Java Platform Independent if then how?( Java平台是独立的吗?) Yes, Java is a…

verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言 多比特一般为数据,其在跨时钟域传输的过程中有多种处理方式,比如DMUX,异步FIFO,双口RAM,握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器,该方…

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…

Docker进阶:使用Docker部署Harbor私有镜像仓库

Docker进阶:使用Docker部署Harbor私有镜像仓库 1、安装Docker和Docker Compose1、安装Docker、Docker Compose2、验证Docker和Docker Compose是否成功安装3、先启动运行docker服务 2、下载并配置Harbor1、下载最新版本的Harbor离线安装包2、配置Harbor的主机名和管理…

小程序利用WebService跟asp.net交互过程发现的问题并处理

最近在研究一个项目,用到asp.net跟小程序交互,简单的说就是小程序端利用wx.request发起请求。获取asp.net 响应回来的数据。但经常会报错。点击下图的测试按钮 出现如下错误: 百思不得其解,试了若干方法,都不行。 因为…

web学习笔记(四十九)

目录 1. 初识 Express 1.1 什么是 Express 1.2 Express 能做什么 1.3 Express 的基本使用 1.4 如何把内容响应给客户端 2. 托管静态资源 2.1 express.static() 1. 初识 Express 1.1 什么是 Express 之前我们有讲过可以通过node.js内置的http模块来创建服务器&#x…

迭代器模式(统一对集合的访问方式)

目录 前言 UML plantuml 类图 实战代码 Iterator ArrayList Client 自定义迭代器 TreeNode TreeUtils Client 前言 在实际开发过程中,常用各种集合来存储业务数据并处理,比如使用 List,Map,Set 等等集合来存储业务数…

Ubuntu下使用vscode进行C/C++开发:进阶篇

在vscode上进行C/C++开发的进阶需求: 1) 编写及调试源码时,可进行断点调试、可跨文件及文件夹进行函数调用。 2) 可生成库及自动提取对应的头文件和库文件。 3) 可基于当前工程资源一键点击验证所提取的库文件的正确性。 4) 可结合find_package实现方便的调用。 对于第一…

【C语言】预处理常见知识详解(宏详解)

文章目录 1、预定义符号2、define2.1 define 定义常量2.2 define 定义宏 3、#和##3.1 **#**3.2 **##** 4、条件编译(开关) 1、预定义符号 在C语言中内置了一些预定义符号,可以直接使用,这些符号实在预处理期间处理的,…