commit ColorNegative,MaskBoxExtend,FluxKontextImageScale nodes
This commit is contained in:
@@ -147,6 +147,9 @@ When this error has occurred, please check the network environment.
|
||||
|
||||
<font size="4">**If the dependency package error after updating, please double clicking ```repair_dependency.bat``` (for Official ComfyUI Protable) or ```repair_dependency_aki.bat``` (for ComfyUI-aki-v1.x) in the plugin folder to reinstall the dependency packages. </font><br />
|
||||
|
||||
* Commit [FluxKontextImageScale](#FluxKontextImageScale) node, based on official node modifications, used to resizes the image to one that is more optimal for flux kontext. For images with different aspect ratio, the scale will be adjusted appropriately to maintain all information.
|
||||
* Commit [MaskBoxExtend](#MaskBoxExtend) node, used to generate BBOX mask extension range and output as Mask.
|
||||
* Commit [ColorNegative](#ColorNegative) node, used to invert the color of image.
|
||||
* Commit [LoadImagesFromPath](#LoadImagesFromPath) and [ImageTaggerSaveV2](#ImageTaggerSaveV2) nodes, used to load a list of images from a folder and save images and tagger text file with corresponding file names.
|
||||
* Commit [LoadImageFromPath](LoadImageFromPath) node, The images in a folder can be loaded and output as image list, also supporting output of a list corresponding to a file name.
|
||||
* Commit [SegformerUltraV3](SegformerUltraV3), [LoadSegformerModel](LoadSegformerModel), [SegformerClothesSetting](SegformerClothesSetting) and [SegformerFashionSetting](SegformerFashionSetting) nodes, Separate the loading of models and settings to save resources when using multiple nodes.
|
||||
@@ -744,6 +747,14 @@ Node options:
|
||||
* S: S channel.
|
||||
* V: V channel.
|
||||
|
||||
### <a id="table1">ColorNegative</a>
|
||||
Change color to negative of image, you can choose RGB, Mono, or each channel of RGB to negative.
|
||||

|
||||
|
||||
Node Options:
|
||||

|
||||
* negative_channel: Select the channel for inversion.
|
||||
|
||||
# <a id="table1">LayerUtility</a>
|
||||
|
||||

|
||||
@@ -971,6 +982,20 @@ Node Options:
|
||||
* image: The input image.
|
||||
* icmask_data: Splicing information output from ICMask node.
|
||||
|
||||
### <a id="table1">FluxKontextImageScale</a>
|
||||
Based on official node modifications, used to resizes the image to one that is more optimal for flux kontext. For images with different aspect ratio, the scale will be adjusted appropriately to maintain all information.
|
||||
The following example uses this node to maintain the complete information of a 4K resolution image, changes the background of the image through the FluxKontext model inference, and then achieves 4K image quality detail restoration through the [HLFrequencyDetailRestore](#HLFrequencyDetailRestore) node.
|
||||
<font size="1">*this workflow (flux_kontext_image_scale_example.json) is in the workflow directory. </font><br />
|
||||

|
||||
|
||||
Node Options:
|
||||

|
||||
|
||||
* image: The input image.
|
||||
* method: Scaling sampling methods, including lanczos, bicubic, hamming, bilinear, box, and nearest.
|
||||
|
||||
Outputs:
|
||||
* image: The output image.
|
||||
|
||||
### <a id="table1">VQAPrompt</a>
|
||||
|
||||
@@ -1812,6 +1837,28 @@ Output:
|
||||
* x: The x-coordinate of the top left corner position.
|
||||
* y: The y-coordinate of the top left corner position.
|
||||
|
||||
### <a id="table1">MaskBoxExtend</a>
|
||||
Generate a BBOX mask to expand the range and output it as Mask. The expansion range can be set to positive or negative values, with positive values indicating expansion and negative values indicating contraction.
|
||||

|
||||
|
||||
Node Options:
|
||||

|
||||
* mask: The input mask.
|
||||
* crop_box: MaskBoxDetect node outputs mask BBOX data.
|
||||
* top_extend: Top extension range. 100 represents a 100% increase in BBOX height.
|
||||
* bottom_extend: Bottom extension range. 100 represents a 100% increase in BBOX height.
|
||||
* left_extend: Left extension range. 100 represents a 100% increase in BBOX width.
|
||||
* right_extend: Right extension range. 100 represents a 100% increase in BBOX width.
|
||||
|
||||
Outputs:
|
||||
* mask: Mask of BBOX extension.
|
||||
* x_percent: Horizontal position output in percentage.
|
||||
* y_percent: Vertical position output in percentage.
|
||||
* width: Width.
|
||||
* height: Height.
|
||||
* x: The x-coordinate of the top left corner position.
|
||||
* y: The y-coordinate of the top left corner position.
|
||||
|
||||
## <a id="table1">Ultra</a> Nodes
|
||||
|
||||

|
||||
|
||||
@@ -128,6 +128,9 @@ os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
|
||||
## 更新说明
|
||||
<font size="4">**如果本插件更新后出现依赖包错误,请双击运行插件目录下的```install_requirements.bat```(官方便携包),或 ```install_requirements_aki.bat```(秋叶整合包) 重新安装依赖包。
|
||||
|
||||
* 添加 [FluxKontextImageScale](#FluxKontextImageScale) 节点,基于官方节点修改,用于将图像大小调整为更适合FluxKontext的大小。对于非标准宽高比的图像,自动调整比例以保持所有画面信息。
|
||||
* 添加 [MaskBoxExtend](#MaskBoxExtend) 节点,用于生成遮罩BBOX扩展范围并输出为Mask。
|
||||
* 添加 [ColorNegative](#ColorNegative)节点,用于将图片颜色反转。
|
||||
* 添加 [LoadImagesFromPath](#LoadImagesFromPath) 和 [ImageTaggerSaveV2](#ImageTaggerSaveV2) 节点,用于从文件夹加载图片列表并保存对应文件名的图片和标签。
|
||||
* 添加 [SegformerUltraV3](SegformerUltraV3), [LoadSegformerModel](LoadSegformerModel), [SegformerClothesSetting](SegformerClothesSetting) 和 [SegformerFashionSetting](SegformerFashionSetting) 节点,将模型与设置分离加载,在使用多个节点时节省资源。
|
||||
* 添加多语言,除英语外,增加支持5种语言:中文、法语、日语、韩语和俄语。该功能使用[ComfyUI-Globalization-Node-Translation](https://github.com/yamanacn/ComfyUI-Globalization-Node-Translation)制作,感谢原作者。
|
||||
@@ -670,6 +673,14 @@ Color of Shadow & Highlight 节点的复制品,去掉了节点名称中的"&"
|
||||
* S: 图像的S通道。
|
||||
* V: 图像的V通道。
|
||||
|
||||
### <a id="table1">ColorNegative</a>
|
||||
对图像进行颜色反转,可以选择RGB反转,黑白反转,以及RGB的各通道单独反转。
|
||||

|
||||
|
||||
节点选项说明:
|
||||

|
||||
* negative_channel: 选择进行反转的通道。
|
||||
|
||||
# <a id="table1">LayerUtility</a>
|
||||

|
||||
|
||||
@@ -870,6 +881,20 @@ ImageScaleByAspectRatio的V2升级版
|
||||
* image: 图像输入。
|
||||
* icmask_data: 从ICMask输出的拼接信息。
|
||||
|
||||
### <a id="table1">FluxKontextImageScale</a>
|
||||
基于官方节点修改,用于将图像大小调整为更适合FluxKontext的大小。对于非标准宽高比的图像,自动调整比例以保持所有画面信息。
|
||||
下图示例对一张4K分辨率的图片使用该节点保持画面的完整信息,通过FluxKontext模型推理改变了图片背景,然后通过 [HLFrequencyDetailRestore](#HLFrequencyDetailRestore) 节点实现了4K画质的细节恢复。
|
||||
<font size="1">*此图工作流(flux_kontext_image_scale_example.json) 在 workflow 目录中. </font><br />
|
||||

|
||||
|
||||
节点选项说明:
|
||||

|
||||
|
||||
* image: 输入的图片。
|
||||
* method: 缩放的采样方法,包括lanczos、bicubic、hamming、bilinear、box和nearest。
|
||||
|
||||
输出:
|
||||
* image: 输出图像。
|
||||
|
||||
### <a id="table1">VQAPrompt</a>
|
||||
使用blip-vqa模型进行视觉问答。本节点的部分代码参考自[celoron/ComfyUI-VisualQueryTemplate](https://github.com/celoron/ComfyUI-VisualQueryTemplate),感谢原作者。
|
||||
@@ -1620,6 +1645,29 @@ mask为可选输入项,如果这里输入遮罩,将作用于输出结果。
|
||||
* x: 左上角位置x坐标输出。
|
||||
* y: 左上角位置y坐标输出。
|
||||
|
||||
### <a id="table1">MaskBoxExtend</a>
|
||||
生成遮罩BBOX扩展范围并输出为Mask,扩展范围可设置为正值或负值,正值是扩展,负值是收缩。
|
||||

|
||||
|
||||
节点选项说明:
|
||||

|
||||
* mask: 遮罩输入。
|
||||
* crop_box: MaskBoxDetect 节点输出的遮罩BBOX数据。
|
||||
* top_extend: 顶部扩展范围。100表示扩展100%的BBOX高度。
|
||||
* bottom_extend: 底部扩展范围。100表示扩展100%的BBOX高度。
|
||||
* left_extend: 左边扩展范围。100表示扩展100%的BBOX宽度。
|
||||
* right_extend: 右边扩展范围。100表示扩展100%的BBOX宽度。
|
||||
|
||||
输出:
|
||||
* mask: BBOX扩展后的Mask。
|
||||
* x_percent: 水平位置以百分比输出。
|
||||
* y_percent: 垂直位置以百分比输出。
|
||||
* width: 宽度输出。
|
||||
* height: 高度输出。
|
||||
* x: 左上角位置x坐标输出。
|
||||
* y: 左上角位置y坐标输出。
|
||||
|
||||
|
||||
## <a id="table1">Ultra</a>节点组
|
||||

|
||||
一组使用了超精细边缘遮罩处理方法的节点,最新版节点包括SegmentAnythingUltraV2, RmBgUltraV2, BiRefNetUltra, PersonMaskUltraV2, SegformerB2ClothesUltra 和 MaskEdgeUltraDetailV2。
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 513 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 89 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 810 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 434 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 143 KiB |
@@ -0,0 +1,101 @@
|
||||
import torch
|
||||
from .imagefunc import log, tensor2pil, pil2tensor
|
||||
from .imagefunc import image_channel_merge, RGB2RGBA
|
||||
|
||||
|
||||
|
||||
|
||||
negative_channel_list = ["RGB", "Mono", "R", "G", "B",]
|
||||
|
||||
|
||||
def invert_specific_channel(image: torch.Tensor, channels_to_invert: list) -> torch.Tensor:
|
||||
"""
|
||||
对图像中特定的通道进行颜色取反,其余通道保持不变。
|
||||
|
||||
参数:
|
||||
image (Tensor): 形状为 (B, H, W, 3),值在 [0.0, 1.0] 的 float 类型张量。
|
||||
channels_to_invert (list): 要取反的通道索引,例如 [0] 表示只取反 R 通道。
|
||||
|
||||
返回:
|
||||
Tensor: 修改后的图像张量。
|
||||
"""
|
||||
|
||||
result = image.clone()
|
||||
|
||||
for ch in channels_to_invert:
|
||||
if ch < 0 or ch > 2:
|
||||
raise ValueError(f"Invalid channel index: {ch}")
|
||||
result[..., ch] = 1.0 - result[..., ch]
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def rgb_to_grayscale(image: torch.Tensor) -> torch.Tensor:
|
||||
"""
|
||||
将 RGB 图像转换为灰度图。
|
||||
|
||||
参数:
|
||||
image (Tensor): 形状为 (B, H, W, 3),值在 [0.0, 1.0] 的 float 类型张量。
|
||||
|
||||
返回:
|
||||
Tensor: 形状为 (B, H, W, 1) 的灰度图张量。
|
||||
"""
|
||||
|
||||
# 定义加权系数
|
||||
weights = torch.tensor([0.2989, 0.5870, 0.1140], device=image.device).view(1, 1, 1, 3)
|
||||
|
||||
# 加权求和
|
||||
grayscale = (image * weights).sum(dim=-1, keepdim=True) # 结果 shape: (B, H, W, 1)
|
||||
|
||||
return grayscale.expand(-1,-1,-1,3)
|
||||
|
||||
class LS_ColorNegative:
|
||||
|
||||
def __init__(self):
|
||||
self.NODE_NAME = 'ColorNegative'
|
||||
|
||||
@classmethod
|
||||
def INPUT_TYPES(self):
|
||||
|
||||
return {
|
||||
"required": {
|
||||
"image": ("IMAGE", ), #
|
||||
"negative_channel" : (negative_channel_list,),
|
||||
},
|
||||
"optional": {
|
||||
}
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("IMAGE",)
|
||||
RETURN_NAMES = ("image",)
|
||||
FUNCTION = 'color_correct_negative'
|
||||
CATEGORY = '😺dzNodes/LayerColor'
|
||||
|
||||
def color_correct_negative(self, image, negative_channel,):
|
||||
if image.shape[3] == 4:
|
||||
rgb_image = image[..., :3]
|
||||
else:
|
||||
rgb_image = image
|
||||
|
||||
if negative_channel == "RGB":
|
||||
ret_image = invert_specific_channel(rgb_image, [0, 1, 2])
|
||||
elif negative_channel == "Mono":
|
||||
mono_image = rgb_to_grayscale(rgb_image)
|
||||
ret_image = invert_specific_channel(mono_image, [0, 1, 2])
|
||||
elif negative_channel == "R":
|
||||
ret_image = invert_specific_channel(rgb_image, [0])
|
||||
elif negative_channel == "G":
|
||||
ret_image = invert_specific_channel(rgb_image, [1])
|
||||
elif negative_channel == "B":
|
||||
ret_image = invert_specific_channel(rgb_image, [2])
|
||||
|
||||
return (ret_image,)
|
||||
|
||||
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
"LayerColor: Negative": LS_ColorNegative
|
||||
}
|
||||
|
||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||
"LayerColor: Negative": "LayerColor: Negative"
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
import torch
|
||||
from PIL import Image
|
||||
from .imagefunc import log, tensor2pil, pil2tensor, fit_resize_image
|
||||
|
||||
|
||||
PREFERED_KONTEXT_RESOLUTIONS = [
|
||||
(672, 1568),
|
||||
(688, 1504),
|
||||
(720, 1456),
|
||||
(752, 1392),
|
||||
(800, 1328),
|
||||
(832, 1248),
|
||||
(880, 1184),
|
||||
(944, 1104),
|
||||
(1024, 1024),
|
||||
(1104, 944),
|
||||
(1184, 880),
|
||||
(1248, 832),
|
||||
(1328, 800),
|
||||
(1392, 752),
|
||||
(1456, 720),
|
||||
(1504, 688),
|
||||
(1568, 672),
|
||||
]
|
||||
|
||||
|
||||
class LS_FluxKontextImageScale:
|
||||
@classmethod
|
||||
def INPUT_TYPES(s):
|
||||
method_mode = ['lanczos', 'bicubic', 'hamming', 'bilinear', 'box', 'nearest']
|
||||
return {"required": {"image": ("IMAGE", ),
|
||||
"method": (method_mode,),
|
||||
},
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("IMAGE",)
|
||||
FUNCTION = "scale"
|
||||
|
||||
CATEGORY = '😺dzNodes/LayerUtility'
|
||||
DESCRIPTION = "This node resizes the image to one that is more optimal for flux kontext. For images with different aspect ratio, the scale will be adjusted appropriately to maintain all information"
|
||||
|
||||
def scale(self, image, method):
|
||||
ret_images = []
|
||||
|
||||
width = image.shape[2]
|
||||
height = image.shape[1]
|
||||
aspect_ratio = width / height
|
||||
_, target_width, target_height = min((abs(aspect_ratio - w / h), w, h) for w, h in PREFERED_KONTEXT_RESOLUTIONS)
|
||||
# image = comfy.utils.common_upscale(image.movedim(-1, 1), width, height, "lanczos", "center").movedim(1, -1)
|
||||
|
||||
resize_sampler = Image.LANCZOS
|
||||
if method == "bicubic":
|
||||
resize_sampler = Image.BICUBIC
|
||||
elif method == "hamming":
|
||||
resize_sampler = Image.HAMMING
|
||||
elif method == "bilinear":
|
||||
resize_sampler = Image.BILINEAR
|
||||
elif method == "box":
|
||||
resize_sampler = Image.BOX
|
||||
elif method == "nearest":
|
||||
resize_sampler = Image.NEAREST
|
||||
|
||||
for img in image:
|
||||
_image = torch.unsqueeze(img, 0)
|
||||
_image = tensor2pil(img).convert('RGB')
|
||||
resized_image = fit_resize_image(_image, target_width, target_height, 'fill', resize_sampler)
|
||||
ret_images.append(pil2tensor(resized_image))
|
||||
|
||||
return (torch.cat(ret_images, dim=0),)
|
||||
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
"LayerUtility: FluxKontextImageScale": LS_FluxKontextImageScale
|
||||
}
|
||||
|
||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||
"LayerUtility: FluxKontextImageScale": "LayerUtility: Flux Kontext Image Scale"
|
||||
}
|
||||
+74
-6
@@ -24,8 +24,8 @@ class MaskBoxDetect:
|
||||
}
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("IMAGE", "FLOAT", "FLOAT", "INT", "INT", "INT", "INT",)
|
||||
RETURN_NAMES = ("box_preview", "x_percent", "y_percent", "width", "height", "x", "y",)
|
||||
RETURN_TYPES = ("IMAGE", "FLOAT", "FLOAT", "INT", "INT", "INT", "INT", "BOX",)
|
||||
RETURN_NAMES = ("box_preview", "x_percent", "y_percent", "width", "height", "x", "y", "crop_box",)
|
||||
FUNCTION = 'mask_box_detect'
|
||||
CATEGORY = '😺dzNodes/LayerMask'
|
||||
|
||||
@@ -39,7 +39,7 @@ class MaskBoxDetect:
|
||||
|
||||
_mask = mask2image(mask).convert('RGB')
|
||||
|
||||
_mask = gaussian_blur(_mask, 20).convert('L')
|
||||
_mask = gaussian_blur(_mask, 5).convert('L')
|
||||
x = 0
|
||||
y = 0
|
||||
width = 0
|
||||
@@ -67,12 +67,80 @@ class MaskBoxDetect:
|
||||
preview_image = draw_rect(preview_image, x - x_adjust, y - y_adjust, width, height, line_color="#F00000", line_width=int(preview_image.height / 60))
|
||||
preview_image = draw_rect(preview_image, x, y, width, height, line_color="#00F000", line_width=int(preview_image.height / 40))
|
||||
log(f"{self.NODE_NAME} Processed.", message_type='finish')
|
||||
return ( pil2tensor(preview_image), round(x_percent, 2), round(y_percent, 2), _width, _height, x, y,)
|
||||
return ( pil2tensor(preview_image), round(x_percent, 2), round(y_percent, 2), _width, _height, x, y, list((x, y, x + width, y + height)))
|
||||
|
||||
|
||||
class MaskBoxExtend:
|
||||
|
||||
def __init__(self):
|
||||
self.NODE_NAME = 'MaskBoxExtend'
|
||||
|
||||
@classmethod
|
||||
def INPUT_TYPES(self):
|
||||
detect_mode = ['min_bounding_rect', 'max_inscribed_rect', 'mask_area']
|
||||
return {
|
||||
"required": {
|
||||
"mask": ("MASK",),
|
||||
"crop_box": ("BOX",),
|
||||
"top_extend": ("FLOAT", {"default": 10, "min": -9999, "max": 9999, "step": 0.1}),
|
||||
"bottem_extend": ("FLOAT", {"default": 10, "min": -9999, "max": 9999, "step": 0.1}),
|
||||
"left_extend": ("FLOAT", {"default": 10, "min": -9999, "max": 9999, "step": 0.1}),
|
||||
"right_extend": ("FLOAT", {"default": 10, "min": -9999, "max": 9999, "step": 0.1}),
|
||||
},
|
||||
"optional": {
|
||||
}
|
||||
}
|
||||
|
||||
RETURN_TYPES = ("MASK", "FLOAT", "FLOAT", "INT", "INT", "INT", "INT", "BOX",)
|
||||
RETURN_NAMES = ("mask", "x_percent", "y_percent", "width", "height", "x", "y", "crop_box",)
|
||||
FUNCTION = 'mask_box_detect'
|
||||
CATEGORY = '😺dzNodes/LayerMask'
|
||||
|
||||
def mask_box_detect(self, mask, crop_box, top_extend, bottem_extend, left_extend, right_extend):
|
||||
|
||||
|
||||
# print(f"mask={mask},shape is {mask.shape}")
|
||||
# shape = b, h, w
|
||||
orig_width = mask.shape[2]
|
||||
orig_height = mask.shape[1]
|
||||
|
||||
x1, y1, x2, y2 = crop_box
|
||||
|
||||
mask_width = x2 - x1
|
||||
mask_height = y2 - y1
|
||||
|
||||
top_offset = int(top_extend * mask_height / 100)
|
||||
bottem_offset = int(bottem_extend * mask_height / 100)
|
||||
left_offset = int(left_extend * mask_width / 100)
|
||||
right_offset = int(right_extend * mask_width / 100)
|
||||
|
||||
new_x1 = x1 - left_offset
|
||||
new_x2 = x2 + right_offset
|
||||
new_y1 = y1 - top_offset
|
||||
new_y2 = y2 + bottem_offset
|
||||
|
||||
x1_clip = max(0, min(orig_width, new_x1))
|
||||
x2_clip = max(0, min(orig_width, new_x2))
|
||||
y1_clip = max(0, min(orig_height, new_y1))
|
||||
y2_clip = max(0, min(orig_height, new_y2))
|
||||
|
||||
ret_mask = torch.zeros((1, orig_height, orig_width))
|
||||
if x2_clip > x1_clip and y2_clip > y1_clip:
|
||||
ret_mask[0, y1_clip:y2_clip, x1_clip:x2_clip] = 1.0
|
||||
|
||||
x_percent = (new_x1 + (new_x2 - new_x1) / 2) / orig_width * 100
|
||||
y_percent = (new_y1 + (new_y2 - new_y1) / 2) / orig_height * 100
|
||||
|
||||
return (ret_mask, round(x_percent, 2), round(y_percent, 2), new_x2 - new_x1, new_y2 - new_y1, new_x1, new_y1,
|
||||
list((new_y1, new_y1, new_x2, new_y2)))
|
||||
|
||||
|
||||
NODE_CLASS_MAPPINGS = {
|
||||
"LayerMask: MaskBoxDetect": MaskBoxDetect
|
||||
"LayerMask: MaskBoxDetect": MaskBoxDetect,
|
||||
"LayerMask: MaskBoxExtend": MaskBoxExtend,
|
||||
}
|
||||
|
||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||
"LayerMask: MaskBoxDetect": "LayerMask: MaskBoxDetect"
|
||||
"LayerMask: MaskBoxDetect": "LayerMask: Mask Box Detect",
|
||||
"LayerMask: MaskBoxExtend": "LayerMask: Mask Box Extend",
|
||||
}
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
[project]
|
||||
name = "comfyui_layerstyle"
|
||||
description = "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress."
|
||||
version = "2.0.22"
|
||||
version = "2.0.23"
|
||||
license = {text = "MIT License"}
|
||||
dependencies = ["numpy", "pillow", "torch", "matplotlib", "Scipy", "scikit_image", "scikit_learn", "opencv-contrib-python", "pymatting", "timm", "colour-science", "transformers", "blend_modes", "huggingface_hub", "loguru"]
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user