nodes: add model router

This commit is contained in:
yada
2023-03-31 21:54:18 -04:00
parent 0a53a963bb
commit a610618938
6 changed files with 129 additions and 2 deletions
+8
View File
@@ -22,3 +22,11 @@ image_layering:
color_correction: color_correction:
- Adjusts the color of the target image according to another image; ported from stable diffusion WebUI - Adjusts the color of the target image according to another image; ported from stable diffusion WebUI
## External Nodes
[WAS Node suite](https://civitai.com/models/20793/was-node-suites-comfyui)
- Image Blend by Mask: Blend two images by a mask (but all nodes are very good)
and even look this: https://civitai.com/models/24869/comfyui-custom-nodes-by-xss
+3
View File
@@ -1,9 +1,12 @@
import custom_nodes.comfy_nodes_trojblue.image_layering as image_layering import custom_nodes.comfy_nodes_trojblue.image_layering as image_layering
import custom_nodes.comfy_nodes_trojblue.color_correction as color_correction import custom_nodes.comfy_nodes_trojblue.color_correction as color_correction
import custom_nodes.comfy_nodes_trojblue.model_router as model_router
NODE_CLASS_MAPPINGS = { NODE_CLASS_MAPPINGS = {
"layering": image_layering.Layering, # Layering "layering": image_layering.Layering, # Layering
"color_correction": color_correction.ColorCorrectionNode, # ColorCorrectionNode "color_correction": color_correction.ColorCorrectionNode, # ColorCorrectionNode
"trRouter": model_router.ModelRouterPlugin, # ModelRouterPlugin
} }
+2 -1
View File
@@ -13,11 +13,12 @@ class ColorCorrectionNode:
"original_image": ("IMAGE",), "original_image": ("IMAGE",),
"target_image": ("IMAGE",), "target_image": ("IMAGE",),
}, },
} }
RETURN_TYPES = ("IMAGE",) RETURN_TYPES = ("IMAGE",)
FUNCTION = "color_correct" FUNCTION = "color_correct"
CATEGORY = "trojblue_folder" CATEGORY = "trNodes"
def tensor_to_pil(self, img): def tensor_to_pil(self, img):
if img is not None: if img is not None:
+64
View File
@@ -0,0 +1,64 @@
# import torch
# from PIL import Image
# import numpy as np
#
#
# jpg_quality_input = ("INT", {"default": 95,
# "min": 50,
# "max": 100,
# "step": 1})
# class JpgConvertNode:
# @classmethod
# def INPUT_TYPES(s):
# return {
# "required": {
# "original_image": ("IMAGE",),
# "jpg_quality": jpg_quality_input
# },
#
# }
#
# RETURN_TYPES = ("IMAGE",)
# FUNCTION = "to_jpg"
# CATEGORY = "trNodes"
#
# def tensor_to_pil(self, img):
# if img is not None:
# i = 255. * img.cpu().numpy().squeeze()
# img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
# return img
#
# def apply_color_correction(self, correction, original_image):
#
# # https://github.com/AUTOMATIC1111/stable-diffusion-webui/blob/22bcc7be428c94e9408f589966c2040187245d81/modules/processing.py#L44
#
# correction_target = cv2.cvtColor(np.asarray(correction.copy()), cv2.COLOR_RGB2LAB)
#
# image = Image.fromarray(cv2.cvtColor(exposure.match_histograms(
# cv2.cvtColor(
# np.asarray(original_image),
# cv2.COLOR_RGB2LAB
# ),
# correction_target,
# channel_axis=2
# ), cv2.COLOR_LAB2RGB).astype("uint8"))
#
# image = blendLayers(image, original_image, BlendType.LUMINOSITY)
# return image
#
# def png_to_jpg(self, png_file, jpg_file, quality=75):
# with Image.open(png_file) as img:
# img = img.convert('RGB')
# img.save(jpg_file, format='JPEG', quality=quality)
# def color_correct(self, original_image, jpg_quality):
# original_image = self.tensor_to_pil(original_image)
#
#
# target_image = self.tensor_to_pil(target_image)
#
#
# return (target_image,)
#
# NODE_CLASS_MAPPINGS = {
# "JpgConvertNode": JpgConvertNode
# }
+1 -1
View File
@@ -37,7 +37,7 @@ class Layering:
RETURN_TYPES = ("IMAGE",) RETURN_TYPES = ("IMAGE",)
FUNCTION = "apply_blend" FUNCTION = "apply_blend"
CATEGORY = "trojblue_folder" CATEGORY = "trNodes"
def tensor_to_pil(self, img): def tensor_to_pil(self, img):
if img is not None: if img is not None:
+51
View File
@@ -0,0 +1,51 @@
class ModelRouterPlugin:
"""
An example node
Class methods
-------------
INPUT_TYPES (dict):
Tell the main program input parameters of nodes.
Attributes
----------
RETURN_TYPES (`tuple`):
The type of each element in the output tulple.
FUNCTION (`str`):
The name of the entry-point method. For example, if `FUNCTION = "execute"` then it will run Example().execute()
OUTPUT_NODE ([`bool`]):
If this node is an output node that outputs a result/image from the graph. The SaveImage node is an example.
The backend iterates on these output nodes and tries to execute all their parents if their parent graph is properly connected.
Assumed to be False if not present.
CATEGORY (`str`):
The category the node should appear in the UI.
execute(s) -> tuple || None:
The entry point method. The name of this method must be the same as the value of property `FUNCTION`.
For example, if `FUNCTION = "execute"` then this method's name must be `execute`, if `FUNCTION = "foo"` then it must be `foo`.
"""
FUNCTION = "execute"
CATEGORY = "trNodes"
RETURN_TYPES = ("MODEL", "CLIP", "VAE", "CONDITIONING", "CONDITIONING")
@classmethod
def INPUT_TYPES(s):
return {
"optional": {
"model": ("MODEL",),
"clip": ("CLIP",),
"vae": ("VAE",),
"conditioning1": ("CONDITIONING",),
"conditioning2": ("CONDITIONING",),
}
}
def execute(self, model=None, clip=None, vae=None, conditioning1=None, conditioning2=None):
return model, clip, vae, conditioning1, conditioning2
# A dictionary that contains all nodes you want to export with their names
# NOTE: names should be globally unique
NODE_CLASS_MAPPINGS = {
"trRouter": ModelRouterPlugin
}