From f688b4fa265604bdfd483d06d12d3ab879bc2ac7 Mon Sep 17 00:00:00 2001 From: peteromallet Date: Tue, 13 Feb 2024 23:34:28 +0100 Subject: [PATCH] Fixes --- SteerableMotion.py | 27 +- demo/creative_interpolation_example.json | 824 +++++++++++------------ 2 files changed, 427 insertions(+), 424 deletions(-) diff --git a/SteerableMotion.py b/SteerableMotion.py index 5e71c8e..80774ca 100644 --- a/SteerableMotion.py +++ b/SteerableMotion.py @@ -44,7 +44,7 @@ class BatchCreativeInterpolationNode: "linear_strength_value": ("STRING", {"multiline": False, "default": "(0.3,0.4)"}), "dynamic_strength_values": ("STRING", {"multiline": True, "default": "(0.0,1.0),(0.0,1.0),(0.0,1.0),(0.0,1.0)"}), "soft_scaled_cn_weights_multiplier": ("FLOAT", {"default": 0.85, "min": 0.0, "max": 10.0, "step": 0.1}), - "buffer": ("INT", {"default": 4, "min": 0, "max": 16, "step": 1}), + "buffer": ("INT", {"default": 4, "min": 1, "max": 16, "step": 1}), "relative_cn_strength": ("FLOAT", {"default": 0.1, "min": 0.0, "max": 10.0, "step": 0.01}), "relative_ipadapter_strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01}), "ipadapter_noise": ("FLOAT", {"default": 0.3, "min": 0.0, "max": 1.0, "step": 0.01}), @@ -205,20 +205,22 @@ class BatchCreativeInterpolationNode: return [linear_key_frame_influence_value for _ in range(number_of_outputs)] def calculate_weights(batch_index_from, batch_index_to, strength_from, strength_to, interpolation,revert_direction_at_midpoint, last_key_frame_position,i, number_of_items,buffer): - + # Initialize variables based on the position of the keyframe range_start = batch_index_from range_end = batch_index_to # if it's the first value, set influence range from 1.0 to 0.0 + ''' if buffer > 0: if i == 0: range_start = 0 - elif i == 1: - range_start = buffer + else: + if batch_index_from <= buffer: + range_start = buffer else: if i == 1: range_start = 0 - + ''' if i == number_of_items - 1: range_end = last_key_frame_position @@ -346,15 +348,15 @@ class BatchCreativeInterpolationNode: elif i == 1: # first image # GET IMAGE AND KEYFRAME INFLUENCE VALUES - image = images[0] - key_frame_influence_from, key_frame_influence_to = key_frame_influence_values[0] - start_strength, mid_strength, end_strength = strength_values[0] + image = images[i-1] + key_frame_influence_from, key_frame_influence_to = key_frame_influence_values[i-1] + start_strength, mid_strength, end_strength = strength_values[i-1] keyframe_position = keyframe_positions[i] next_key_frame_position = keyframe_positions[i+1] - + batch_index_from = keyframe_position - batch_index_to_excl = calculate_influence_frame_number(keyframe_position, next_key_frame_position, key_frame_influence_to) + batch_index_to_excl = calculate_influence_frame_number(keyframe_position, next_key_frame_position, key_frame_influence_to) weights, frame_numbers = calculate_weights(batch_index_from, batch_index_to_excl, mid_strength, end_strength, interpolation, False, last_key_frame_position, i, len(keyframe_positions), buffer) # interpolation = "ease-in" @@ -368,9 +370,10 @@ class BatchCreativeInterpolationNode: keyframe_position = keyframe_positions[i] previous_key_frame_position = keyframe_positions[i-1] - + batch_index_from = calculate_influence_frame_number(keyframe_position, previous_key_frame_position, key_frame_influence_from) - batch_index_to_excl = keyframe_position + + batch_index_to_excl = keyframe_position weights, frame_numbers = calculate_weights(batch_index_from, batch_index_to_excl, start_strength, mid_strength, interpolation, False, last_key_frame_position, i, len(keyframe_positions), buffer) # interpolation = "ease-out" diff --git a/demo/creative_interpolation_example.json b/demo/creative_interpolation_example.json index 6b9e6bd..4afee72 100644 --- a/demo/creative_interpolation_example.json +++ b/demo/creative_interpolation_example.json @@ -179,7 +179,7 @@ "hidden": false, "paused": false, "params": { - "filename": "AD__00602.mp4", + "filename": "AD__00686.mp4", "subfolder": "steerable-motion", "type": "output", "format": "video/h264-mp4" @@ -312,72 +312,6 @@ "Node name for S&R": "GetImageSize+" } }, - { - "id": 401, - "type": "VHS_LoadImagesPath", - "pos": [ - -1426.3693935183685, - -1835.5733992417513 - ], - "size": [ - 320, - 194 - ], - "flags": {}, - "order": 5, - "mode": 0, - "outputs": [ - { - "name": "IMAGE", - "type": "IMAGE", - "links": [ - 737, - 881, - 908, - 975 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "MASK", - "type": "MASK", - "links": null, - "shape": 3 - }, - { - "name": "INT", - "type": "INT", - "links": [], - "shape": 3, - "slot_index": 2 - } - ], - "properties": { - "Node name for S&R": "VHS_LoadImagesPath" - }, - "widgets_values": { - "directory": "/workspace/ComfyUI/input//Dance into shadow/", - "image_load_cap": 0, - "skip_first_images": 0, - "select_every_nth": 1, - "choose folder to upload": "image", - "videopreview": { - "hidden": false, - "paused": false, - "params": { - "frame_load_cap": 0, - "skip_first_images": 0, - "filename": "/workspace/ComfyUI/input//Dance into shadow/", - "type": "path", - "format": "folder", - "select_every_nth": 1 - } - } - }, - "color": "#332922", - "bgcolor": "#593930" - }, { "id": 541, "type": "PromptSchedule", @@ -569,7 +503,7 @@ "1": 58 }, "flags": {}, - "order": 6, + "order": 5, "mode": 0, "inputs": [ { @@ -608,7 +542,7 @@ "1": 365.04229736328125 }, "flags": {}, - "order": 7, + "order": 6, "mode": 0, "inputs": [ { @@ -668,7 +602,7 @@ "1": 300 }, "flags": {}, - "order": 8, + "order": 7, "mode": 0, "inputs": [], "outputs": [], @@ -794,46 +728,6 @@ "split_index": 4 } }, - { - "id": 552, - "type": "ADE_AnimateDiffLoRALoader", - "pos": [ - 2603, - -1261 - ], - "size": { - "0": 316.65606689453125, - "1": 82 - }, - "flags": {}, - "order": 9, - "mode": 4, - "inputs": [ - { - "name": "prev_motion_lora", - "type": "MOTION_LORA", - "link": null - } - ], - "outputs": [ - { - "name": "MOTION_LORA", - "type": "MOTION_LORA", - "links": [ - 1007 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "ADE_AnimateDiffLoRALoader" - }, - "widgets_values": [ - "400_woman_dancing_temporal_unet.safetensors", - 0.65 - ] - }, { "id": 451, "type": "Note Plus (mtb)", @@ -854,7 +748,7 @@ "1": 147.40196228027344 }, "flags": {}, - "order": 10, + "order": 8, "mode": 0, "inputs": [], "outputs": [], @@ -889,7 +783,7 @@ "1": 163.1022491455078 }, "flags": {}, - "order": 11, + "order": 9, "mode": 0, "inputs": [], "outputs": [], @@ -924,7 +818,7 @@ "1": 390 }, "flags": {}, - "order": 12, + "order": 10, "mode": 0, "inputs": [], "outputs": [], @@ -1037,59 +931,6 @@ 0.675 ] }, - { - "id": 548, - "type": "BatchValueScheduleLatentInput", - "pos": [ - 2057, - -2119 - ], - "size": { - "0": 352.79998779296875, - "1": 140 - }, - "flags": {}, - "order": 33, - "mode": 0, - "inputs": [ - { - "name": "num_latents", - "type": "LATENT", - "link": 1006 - } - ], - "outputs": [ - { - "name": "FLOAT", - "type": "FLOAT", - "links": [ - 998 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "INT", - "type": "INT", - "links": null, - "shape": 3, - "slot_index": 1 - }, - { - "name": "LATENT", - "type": "LATENT", - "links": null, - "shape": 3 - } - ], - "properties": { - "Node name for S&R": "BatchValueScheduleLatentInput" - }, - "widgets_values": [ - "0:(1.3)", - true - ] - }, { "id": 547, "type": "ADE_UseEvolvedSampling", @@ -1258,46 +1099,6 @@ ], "shape": 2 }, - { - "id": 536, - "type": "ADE_AnimateDiffLoRALoader", - "pos": [ - 3002, - -1263 - ], - "size": { - "0": 308.66558837890625, - "1": 82 - }, - "flags": {}, - "order": 25, - "mode": 4, - "inputs": [ - { - "name": "prev_motion_lora", - "type": "MOTION_LORA", - "link": 1007 - } - ], - "outputs": [ - { - "name": "MOTION_LORA", - "type": "MOTION_LORA", - "links": [ - 1004 - ], - "shape": 3, - "slot_index": 0 - } - ], - "properties": { - "Node name for S&R": "ADE_AnimateDiffLoRALoader" - }, - "widgets_values": [ - "400_woman_dancing_temporal_unet.safetensors", - 0.4 - ] - }, { "id": 436, "type": "PreviewImage", @@ -1332,7 +1133,7 @@ ], "size": { "0": 785.2230224609375, - "1": 213.7488555908203 + "1": 246 }, "flags": {}, "order": 23, @@ -1368,7 +1169,7 @@ "1": 260 }, "flags": {}, - "order": 13, + "order": 11, "mode": 0, "inputs": [], "outputs": [], @@ -1403,7 +1204,7 @@ "1": 256.3551330566406 }, "flags": {}, - "order": 14, + "order": 12, "mode": 0, "inputs": [], "outputs": [], @@ -1438,7 +1239,7 @@ "1": 347.8489685058594 }, "flags": {}, - "order": 15, + "order": 13, "mode": 0, "inputs": [], "outputs": [], @@ -1473,7 +1274,7 @@ "1": 265.0110778808594 }, "flags": {}, - "order": 16, + "order": 14, "mode": 0, "inputs": [], "outputs": [], @@ -1508,7 +1309,7 @@ "1": 147.5499725341797 }, "flags": {}, - "order": 17, + "order": 15, "mode": 0, "inputs": [], "outputs": [], @@ -1523,62 +1324,6 @@ "bgcolor": "#335", "shape": 1 }, - { - "id": 470, - "type": "LoraLoader", - "pos": [ - -725, - -1357 - ], - "size": { - "0": 314.343994140625, - "1": 126 - }, - "flags": {}, - "order": 22, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "MODEL", - "link": 896 - }, - { - "name": "clip", - "type": "CLIP", - "link": 893 - } - ], - "outputs": [ - { - "name": "MODEL", - "type": "MODEL", - "links": [ - 909 - ], - "shape": 3, - "slot_index": 0 - }, - { - "name": "CLIP", - "type": "CLIP", - "links": [ - 994, - 996 - ], - "shape": 3, - "slot_index": 1 - } - ], - "properties": { - "Node name for S&R": "LoraLoader" - }, - "widgets_values": [ - "v3_sd15_adapter.ckpt", - 0.4, - 0.25 - ] - }, { "id": 467, "type": "ACN_SparseCtrlLoaderAdvanced", @@ -1675,6 +1420,233 @@ "Node name for S&R": "ACN_SparseCtrlRGBPreprocessor" } }, + { + "id": 556, + "type": "Note Plus (mtb)", + "pos": { + "0": -780, + "1": -1948, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 411.70318603515625, + "1": 196.17578125 + }, + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "## Tweak Sparse Ctrl end_percent to improve adherence ⮕\n
\nI'd recommend that you increase the `end_percent` to the right to improve adherence. Higher values tend to cause flickering. However, increase the adapter strength below along with it below to fix this to an extend. Increasing `end_percent` above 0.5 will also cause issues.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 445, + "type": "Note Plus (mtb)", + "pos": { + "0": -1594, + "1": -1461, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 650, + "1": 1040 + }, + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "# A brief guide\n\n
\n\n## Philosophy for getting the most from this:\n\n
\n\nThis isn’t a tool like text to video that will perform well out of the box - it’s more like a paint brush, an artistic tool that you need to figure out how to get the best from. \n\n
\n\nThrough trial and error, you'll need to build an understanding of how the motion and settings work, what its limitations are, which inputs work best with it, etc.\n\n
\n\nIf you can figure out how to wield it, this approach can provide enough control for you to make beautiful things that match your imagination precisely.\n\n
\n\n## How to use this:\n
\n1.Select a folder with the images in them above. The most important thing that will influence the quality of your creation is the input images.\n\n
\n\n2.Try the basic settings to start. Based on the resulting generation, try to understand what happened - you can learn about the settings and observe the graphs to the right.\n\n
\n\n3.Tweak the settings until you achieve your desired effect. \n\n
\n\n## What this will & won't be suitable for:\n\nI believe that this will be good for a wide range of storytelling-driven and abstract motion.\n\nHowever, it probably won't be good for complex motion - other approaches like vid2vid are far more suitable for this.\n\n## If you're having problems:\n\n
\n\nFirst, download the latest version of this workflow from [here](https://raw.githubusercontent.com/peteromallet/steerable-motion/main/demo/creative_interpolation_example.json) and get the latest version of the node from Comfy Manager.\n\n
\n\nIf that doesn't work, drop into [our Discord](https://discord.gg/V72vk8T67n) and share your problem and I'll try to help ASAP.\n\n
\n\n\n## Want to join a community of people who are pushing open source models to their technical and artistic limits?\n\n
\n\nYou're welcome to join [our Discord](https://discord.gg/UJf6aum7WZ).\n\n
\n\nPlease share anything you generate in the steerable-motion channel.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 456, + "type": "Note Plus (mtb)", + "pos": { + "0": 212, + "1": -940, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 210, + "1": 186.09225463867188 + }, + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "## ⬅ Download the models from Comfy Manager\n
\nSee details on where to find them on the left.", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, + { + "id": 470, + "type": "LoraLoader", + "pos": [ + -725, + -1357 + ], + "size": { + "0": 314.343994140625, + "1": 126 + }, + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 896 + }, + { + "name": "clip", + "type": "CLIP", + "link": 893 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 909 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 994, + 996 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LoraLoader" + }, + "widgets_values": [ + "v3_sd15_adapter.ckpt", + 0.05, + 0.25 + ] + }, + { + "id": 401, + "type": "VHS_LoadImagesPath", + "pos": [ + -1426, + -1836 + ], + "size": [ + 320, + 194 + ], + "flags": {}, + "order": 19, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 737, + 881, + 908, + 975 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null, + "shape": 3 + }, + { + "name": "INT", + "type": "INT", + "links": [], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "VHS_LoadImagesPath" + }, + "widgets_values": { + "directory": "/workspace/ComfyUI/input//Disappearing/", + "image_load_cap": 0, + "skip_first_images": 0, + "select_every_nth": 1, + "choose folder to upload": "image", + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "frame_load_cap": 0, + "skip_first_images": 0, + "filename": "/workspace/ComfyUI/input//Disappearing/", + "type": "path", + "format": "folder", + "select_every_nth": 1 + } + } + }, + "color": "#332922", + "bgcolor": "#593930" + }, { "id": 468, "type": "ACN_AdvancedControlNetApply", @@ -1770,154 +1742,14 @@ "widgets_values": [ 0.6, 0, - 0.2 + 0.05 ] }, - { - "id": 556, - "type": "Note Plus (mtb)", - "pos": { - "0": -780, - "1": -1948, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 411.70318603515625, - "1": 196.17578125 - }, - "flags": {}, - "order": 18, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "## Tweak Sparse Ctrl end_percent to improve adherence ⮕\n
\nI'd recommend that you increase the `end_percent` to the right to improve adherence. Higher values tend to cause flickering. However, increase the adapter strength below along with it below to fix this to an extend. Increasing `end_percent` above 0.5 will also cause issues.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 445, - "type": "Note Plus (mtb)", - "pos": { - "0": -1594, - "1": -1461, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 650, - "1": 1040 - }, - "flags": {}, - "order": 19, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "# A brief guide\n\n
\n\n## Philosophy for getting the most from this:\n\n
\n\nThis isn’t a tool like text to video that will perform well out of the box - it’s more like a paint brush, an artistic tool that you need to figure out how to get the best from. \n\n
\n\nThrough trial and error, you'll need to build an understanding of how the motion and settings work, what its limitations are, which inputs work best with it, etc.\n\n
\n\nIf you can figure out how to wield it, this approach can provide enough control for you to make beautiful things that match your imagination precisely.\n\n
\n\n## How to use this:\n
\n1.Select a folder with the images in them above. The most important thing that will influence the quality of your creation is the input images.\n\n
\n\n2.Try the basic settings to start. Based on the resulting generation, try to understand what happened - you can learn about the settings and observe the graphs to the right.\n\n
\n\n3.Tweak the settings until you achieve your desired effect. \n\n
\n\n## What this will & won't be suitable for:\n\nI believe that this will be good for a wide range of storytelling-driven and abstract motion.\n\nHowever, it probably won't be good for complex motion - other approaches like vid2vid are far more suitable for this.\n\n## If you're having problems:\n\n
\n\nFirst, download the latest version of this workflow from [here](https://raw.githubusercontent.com/peteromallet/steerable-motion/main/demo/creative_interpolation_example.json) and get the latest version of the node from Comfy Manager.\n\n
\n\nIf that doesn't work, drop into [our Discord](https://discord.gg/V72vk8T67n) and share your problem and I'll try to help ASAP.\n\n
\n\n\n## Want to join a community of people who are pushing open source models to their technical and artistic limits?\n\n
\n\nYou're welcome to join [our Discord](https://discord.gg/UJf6aum7WZ).\n\n
\n\nPlease share anything you generate in the steerable-motion channel.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 456, - "type": "Note Plus (mtb)", - "pos": { - "0": 212, - "1": -940, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 210, - "1": 186.09225463867188 - }, - "flags": {}, - "order": 20, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "## ⬅ Download the models from Comfy Manager\n
\nSee details on where to find them on the left.", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, - { - "id": 551, - "type": "Note Plus (mtb)", - "pos": { - "0": 3001, - "1": -1142, - "2": 0, - "3": 0, - "4": 0, - "5": 0, - "6": 0, - "7": 0, - "8": 0, - "9": 0 - }, - "size": { - "0": 322.51995849609375, - "1": 163.89112854003906 - }, - "flags": {}, - "order": 21, - "mode": 0, - "inputs": [], - "outputs": [], - "title": "Note+ (mtb)", - "properties": {}, - "widgets_values": [ - "## You can add Motion LoRAs above\n
\nThese are great for complex movements. Just un-bypass the nodes. You can learn more about training them [here](https://github.com/ExponentialML/AnimateDiff-MotionDirector).", - "markdown", - "" - ], - "color": "#223", - "bgcolor": "#335", - "shape": 1 - }, { "id": 207, "type": "KSampler Adv. (Efficient)", "pos": [ - 1455, + 1460, -2190 ], "size": { @@ -2030,12 +1862,180 @@ "bgcolor": "#333355", "shape": 1 }, + { + "id": 548, + "type": "BatchValueScheduleLatentInput", + "pos": [ + 2057, + -2119 + ], + "size": { + "0": 352.79998779296875, + "1": 140 + }, + "flags": {}, + "order": 33, + "mode": 0, + "inputs": [ + { + "name": "num_latents", + "type": "LATENT", + "link": 1006 + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 998 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "INT", + "type": "INT", + "links": null, + "shape": 3, + "slot_index": 1 + }, + { + "name": "LATENT", + "type": "LATENT", + "links": null, + "shape": 3 + } + ], + "properties": { + "Node name for S&R": "BatchValueScheduleLatentInput" + }, + "widgets_values": [ + "0:(1.3)", + true + ] + }, + { + "id": 552, + "type": "ADE_AnimateDiffLoRALoader", + "pos": [ + 2603, + -1261 + ], + "size": { + "0": 316.65606689453125, + "1": 82 + }, + "flags": {}, + "order": 20, + "mode": 4, + "inputs": [ + { + "name": "prev_motion_lora", + "type": "MOTION_LORA", + "link": null + } + ], + "outputs": [ + { + "name": "MOTION_LORA", + "type": "MOTION_LORA", + "links": [ + 1007 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ADE_AnimateDiffLoRALoader" + }, + "widgets_values": [ + "400_woman_dancing_temporal_un222et.safetensors", + 0 + ] + }, + { + "id": 536, + "type": "ADE_AnimateDiffLoRALoader", + "pos": [ + 3000, + -1268 + ], + "size": { + "0": 308.66558837890625, + "1": 82 + }, + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "prev_motion_lora", + "type": "MOTION_LORA", + "link": 1007 + } + ], + "outputs": [ + { + "name": "MOTION_LORA", + "type": "MOTION_LORA", + "links": [ + 1004 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ADE_AnimateDiffLoRALoader" + }, + "widgets_values": [ + "400_woman_dancing_temporal_unet.safetensors", + 0.3 + ] + }, + { + "id": 551, + "type": "Note Plus (mtb)", + "pos": { + "0": 3001, + "1": -1142, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0 + }, + "size": { + "0": 322.51995849609375, + "1": 163.89112854003906 + }, + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "Note+ (mtb)", + "properties": {}, + "widgets_values": [ + "## You can add Motion LoRAs above\n
\nThese are great for complex movements. Just un-bypass the nodes. You can learn more about training them [here](https://github.com/ExponentialML/AnimateDiff-MotionDirector).", + "markdown", + "" + ], + "color": "#223", + "bgcolor": "#335", + "shape": 1 + }, { "id": 473, "type": "BatchCreativeInterpolation", "pos": [ - -271, - -608 + -260, + -651 ], "size": { "0": 378.3703308105469,