150 lines
5.4 KiB
Markdown
150 lines
5.4 KiB
Markdown
|
|
# Documentation
|
|
- Class name: WeightScheduleConvert
|
|
- Category: KJNodes
|
|
- Output node: False
|
|
- Repo Ref: https://github.com/comfyanonymous/ComfyUI
|
|
|
|
WeightScheduleConvert节点旨在转换权重调度,使其适应不同的场景或需求。该节点抽象了权重调度的转换过程,聚焦于权重调度在各种应用中的灵活性和适应性。
|
|
|
|
# Input types
|
|
## Required
|
|
- input_values
|
|
- 表示用于转换的初始值,作为主要输入。它在定义转换过程的起点方面起着关键作用。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
- output_type
|
|
- 指定转换所需的输出格式,影响输出的结构和格式。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
- invert
|
|
- 一个布尔标志,用于确定在转换过程中是否应该反转输入值。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
- repeat
|
|
- 定义输入值在输出中应重复的次数,影响结果的长度和组成。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
|
|
## Optional
|
|
- remap_to_frames
|
|
- 可选参数,允许将输出重新映射到特定数量的帧,调整转换以适应预定的帧数。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- interpolation_curve
|
|
- 可选参数,指定转换过程中用于插值的曲线,影响输出值的平滑度和分布。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
|
|
# Output types
|
|
- float
|
|
- 输出按指定格式转换后的值,反映了转换过程中所做的调整。
|
|
- Comfy dtype: FLOAT
|
|
- Python dtype: float
|
|
|
|
|
|
## Usage tips
|
|
- Infra type: `CPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class WeightScheduleConvert:
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {
|
|
"required": {
|
|
"input_values": ("FLOAT", {"default": 0.0, "forceInput": True}),
|
|
"output_type": (
|
|
[
|
|
'match_input',
|
|
'list',
|
|
'pandas series',
|
|
'tensor',
|
|
],
|
|
{
|
|
"default": 'list'
|
|
}),
|
|
"invert": ("BOOLEAN", {"default": False}),
|
|
"repeat": ("INT", {"default": 1,"min": 1, "max": 255, "step": 1}),
|
|
},
|
|
"optional": {
|
|
"remap_to_frames": ("INT", {"default": 0}),
|
|
"interpolation_curve": ("FLOAT", {"forceInput": True}),
|
|
},
|
|
|
|
}
|
|
RETURN_TYPES = ("FLOAT",)
|
|
FUNCTION = "execute"
|
|
CATEGORY = "KJNodes"
|
|
DESCRIPTION = """
|
|
Converts different value lists/series to another type.
|
|
"""
|
|
|
|
def detect_input_type(self, input_values):
|
|
import pandas as pd
|
|
if isinstance(input_values, list):
|
|
return 'list'
|
|
elif isinstance(input_values, pd.Series):
|
|
return 'pandas series'
|
|
elif isinstance(input_values, torch.Tensor):
|
|
return 'tensor'
|
|
else:
|
|
raise ValueError("Unsupported input type")
|
|
|
|
def execute(self, input_values, output_type, invert, repeat, remap_to_frames=0, interpolation_curve=None):
|
|
import pandas as pd
|
|
input_type = self.detect_input_type(input_values)
|
|
|
|
if input_type == 'pandas series':
|
|
float_values = input_values.tolist()
|
|
elif input_type == 'tensor':
|
|
float_values = input_values
|
|
else:
|
|
float_values = input_values
|
|
|
|
if invert:
|
|
float_values = [1 - value for value in float_values]
|
|
|
|
if interpolation_curve is not None:
|
|
interpolated_pattern = []
|
|
orig_float_values = float_values
|
|
for value in interpolation_curve:
|
|
min_val = min(orig_float_values)
|
|
max_val = max(orig_float_values)
|
|
# Normalize the values to [0, 1]
|
|
normalized_values = [(value - min_val) / (max_val - min_val) for value in orig_float_values]
|
|
# Interpolate the normalized values to the new frame count
|
|
remapped_float_values = np.interp(np.linspace(0, 1, int(remap_to_frames * value)), np.linspace(0, 1, len(normalized_values)), normalized_values).tolist()
|
|
interpolated_pattern.extend(remapped_float_values)
|
|
float_values = interpolated_pattern
|
|
else:
|
|
# Remap float_values to match target_frame_amount
|
|
if remap_to_frames > 0 and remap_to_frames != len(float_values):
|
|
min_val = min(float_values)
|
|
max_val = max(float_values)
|
|
# Normalize the values to [0, 1]
|
|
normalized_values = [(value - min_val) / (max_val - min_val) for value in float_values]
|
|
# Interpolate the normalized values to the new frame count
|
|
float_values = np.interp(np.linspace(0, 1, remap_to_frames), np.linspace(0, 1, len(normalized_values)), normalized_values).tolist()
|
|
|
|
float_values = float_values * repeat
|
|
|
|
if output_type == 'list':
|
|
return float_values,
|
|
elif output_type == 'pandas series':
|
|
return pd.Series(float_values),
|
|
elif output_type == 'tensor':
|
|
if input_type == 'pandas series':
|
|
return torch.tensor(float_values.values, dtype=torch.float32),
|
|
else:
|
|
return torch.tensor(float_values, dtype=torch.float32),
|
|
elif output_type == 'match_input':
|
|
return float_values,
|
|
else:
|
|
raise ValueError(f"Unsupported output_type: {output_type}")
|
|
|
|
```
|