Две опоры: первый и последний кадр

<!-- lesson: video-flf -->

Урок «video-flf» в группе Видео: опорная картинка списка уроков. Шагов: 17.

Сначала согласие

Оживлять так можно только того, кто на это согласен: себя, придуманного героя или человека, который разрешил. Получите разрешение на исходные материалы и учитывайте местные законы. Для взрослого (18+) содержимого получите согласие участников и учитывайте местные законы. См. Правила содержимого.

Чему вы научитесь

Даёте две картинки, и модель рисует ролик, который идёт от первой к последней.

Что понадобится

  • Урок продолжает Стартовая картинка как опора. Карточка говорит об этом; это подсказка, а не замок.
  • Файлы моделей, которые урок проверяет:
    • для поля unet_name ноды Load Diffusion Model (первый проход): файл, в имени которого есть i2v и high;
    • для поля unet_name ноды Load Diffusion Model (второй проход): файл, в имени которого есть i2v и low;
    • для поля clip_name ноды Load CLIP: файл, в имени которого есть umt5;
    • для поля vae_name ноды Load VAE: файл, в имени которого есть wan_2.1_vae.
  • Ноды: Load Diffusion Model, Load CLIP, Load VAE, CLIP Text Encode (Prompt), ModelSamplingSD3, Load Image, WanFirstLastFrameToVideo, KSampler (Advanced), VAE Decode / VAE Decode (Tiled), Create Video, Save Video.
  • Приложение ничего не скачивает и не устанавливает. Тексты шагов ниже говорят, какие файлы, в какие папки и какой шаблон ComfyUI их называет.

Шаги

Слова каждого шага, как их показывает урок. Имена нод выделены.

  1. Сначала о цене (чтение)

    Оживлять так можно только того, кто на это согласен: себя, придуманного героя или человека, который разрешил. Получите разрешение на исходные материалы и учитывайте местные законы. Для взрослого (18+) содержимого получите согласие участников и учитывайте местные законы. Исключайте тех, кто младше 18 лет или так выглядит; обозначайте синтетические изображения, чтобы не вводить людей в заблуждение. Уроки учат технике без откровенных подробностей.

    Ролик начинается одной картинкой и заканчивается другой, движение между ними модель придумывает сама. Так хорошо получаются превращения, поворот камеры, день, переходящий в ночь.

    Это большая пара Wan 2.2: две модели 14B в файлах i2v, около 14 ГБ каждая в fp8, плюс текстовый энкодер umt5_xxl и wan_2.1_vae. Удобно с картой на 24 ГБ; с меньшей ComfyUI переносит части в оперативную память, и запуск идёт намного дольше. 81 кадр за 20 шагов на средней карте делается десятки минут. Урок «Быстрое видео за четыре шага» сокращает это в разы и подходит и к этому графу.

    Если на холсте уже есть другой граф, начните с пустого: «Файл ▸ Новый проект».

  2. Загрузите две модели «картинка в видео»

    Добавьте две ноды Load Diffusion Model. В unet_name одной выберите файл i2v со словом high_noise, в другой файл i2v со словом low_noise.

    Первая раскладывает движение, вторая дорабатывает детали. Файлы t2v картинок не берут.

    Если нужного файла в списке нет, значит, его нет в вашем ComfyUI. Приложение ничего не скачивает. Проще всего открыть в самом ComfyUI шаблон «Wan 2.2 14B First-Last Frame to Video»: он покажет, каких файлов не хватает и куда их положить. Потом выберите здесь в меню «Синхронизация ▸ Синхронизировать сейчас», и файлы появятся в списках.

  3. Загрузите текстовый энкодер

    Добавьте ноду Load CLIP. В clip_name выберите файл umt5_xxl, в type поставьте wan.

    Текстовый энкодер превращает промпт в то, что читает модель. Версия файла fp8 занимает вдвое меньше памяти, чем полная, и её берут официальные шаблоны.

  4. Загрузите VAE

    Добавьте ноду Load VAE и выберите в vae_name файл wan_2.1_vae. Модели Wan 2.2 на 14B работают с VAE версии 2.1.

  5. Опишите путь от кадра к кадру

    Добавьте две ноды CLIP Text Encode (Prompt) и подключите выход CLIP ноды Load CLIP ко входу clip каждой. В поле text одной опишите, что происходит между картинками: как одна становится другой, как движется камера. Вторая для негативного промпта.

  6. Задайте сдвиг обеих моделей

    Добавьте две ноды ModelSamplingSD3 и пропустите каждую модель через свою: выход MODEL загрузчика ко входу model. В поле shift обеих поставьте 8.

  7. Загрузите две картинки

    Добавьте две ноды Load Image. В поле image одной выберите картинку, с которой ролик начинается, в другой ту, которой заканчивается.

    У картинок должны быть одни пропорции и одна сцена или один герой. Чем сильнее они различаются, тем страннее движение между ними.

  8. Подготовьте начало и конец

    Добавьте ноду WanFirstLastFrameToVideo и подключите к ней:

    • к positive и negative два промпта;
    • к vae выход ноды Load VAE;
    • к start_image первую картинку, к end_image последнюю.

    Поставьте width и height 640, length 81. Пропорции размера должны совпадать с картинками.

  9. Первый проход

    Добавьте ноду KSampler (Advanced). Её вход model берёт модель high_noise через её ноду ModelSamplingSD3; входы positive, negative и latent_image берут три выхода ноды WanFirstLastFrameToVideo.

  10. Второй проход

Добавьте вторую ноду KSampler (Advanced). Её вход model берёт модель low_noise через её ноду сдвига; positive и negative те же выходы ноды WanFirstLastFrameToVideo; latent_image выход первого сэмплера.

  1. Разделите шаги между двумя

В первом сэмплере: add_noise enable, steps 20, cfg 4, start_at_step 0, end_at_step 10, return_with_leftover_noise enable.

Во втором: add_noise disable, те же steps и cfg, start_at_step 10 (где остановился первый), return_with_leftover_noise disable.

Первый делает половину из двадцати шагов и отдаёт оставшийся шум, второй продолжает с того же шага.

  1. Превратите результат в кадры

Добавьте ноду VAE Decode. Ко входу samples подключите выход сэмплера, ко входу vae выход ноды Load VAE.

Сэмплер выдаёт ролик в сжатом виде, латенте. Эта нода разворачивает его в кадры.

  1. Соберите и сохраните ролик

Добавьте ноды Create Video и Save Video. Кадры из ноды VAE Decode идут во вход images ноды Create Video, а её выход во вход video ноды Save Video. В поле fps поставьте 16.

Модели Wan 14B рисуют 16 кадров в секунду. С другим числом ролик пойдёт быстрее или медленнее, чем задумано.

  1. Что модель придумывает между опорами (чтение)

Две опоры закрепляют первый и последний кадр. Всё между ними придумывает модель: путь движения, поворот головы, то, что скрыто за предметом. Ваш голос здесь только промпт, поэтому описывайте путь, а не снова две картинки.

Чем ближе картинки (тот же свет, те же пропорции, перемена, которую можно сделать одним движением), тем правдоподобнее середина. Две картинки, различные во всём, дают наплыв или резкий скачок вместо движения.

  1. Петля (чтение)

Поставьте одну и ту же картинку в обе ноды Load Image и опишите движение, которое возвращается: покачивание, вдох, волны, вращение колеса. Ролик закончится там, где начался, и пойдёт по кругу без шва.

В этом уроке приложение просит два разных файла; для петли скопируйте картинку под вторым именем.

  1. Если результат не тот (чтение)
  • Ролик в конце перескакивает на последний кадр: поставьте length 121 или опишите более медленную перемену.
  • В середине каша: картинки слишком разные; сблизьте их или подробнее опишите путь между ними.
  • Плывут цвета: берите картинки с одинаковым светом.
  1. Граф готов (чтение)

Сохраните граф через «Файл ▸ Сохранить workflow для ComfyUI…», откройте файл в ComfyUI и запустите там. Само приложение в ComfyUI ничего не запускает.

Что проверяет урок

Шаг для чтения сделан, когда вы нажимаете Понятно, дальше. Шаг с делом отмечается сам, когда на холсте есть:

  • Шаг 2, Загрузите две модели «картинка в видео»:
    • нода Load Diffusion Model.
    • нода Load Diffusion Model.
    • в поле unet_name ноды Load Diffusion Model (первый проход) стоит файл, в имени которого есть i2v и high (заглавные буквы, точки и дефисы не важны).
    • unet_name ноды Load Diffusion Model (второй проход): не тот же файл, что в поле unet_name ноды Load Diffusion Model (первый проход).
    • в поле unet_name ноды Load Diffusion Model (второй проход) стоит файл, в имени которого есть i2v и low (заглавные буквы, точки и дефисы не важны).
  • Шаг 3, Загрузите текстовый энкодер:
    • нода Load CLIP.
    • в поле clip_name ноды Load CLIP стоит файл, в имени которого есть umt5 (заглавные буквы, точки и дефисы не важны).
    • type ноды Load CLIP: wan.
  • Шаг 4, Загрузите VAE:
    • нода Load VAE.
    • в поле vae_name ноды Load VAE стоит файл, в имени которого есть wan_2.1_vae (заглавные буквы, точки и дефисы не важны).
  • Шаг 5, Опишите путь от кадра к кадру:
    • нода CLIP Text Encode (Prompt).
    • нода CLIP Text Encode (Prompt).
    • CLIP ноды Load CLIP во вход clip ноды CLIP Text Encode (Prompt) (промпт).
    • CLIP ноды Load CLIP во вход clip ноды CLIP Text Encode (Prompt) (негатив).
    • text ноды CLIP Text Encode (Prompt) (промпт): не меньше 3 знаков.
  • Шаг 6, Задайте сдвиг обеих моделей:
    • нода ModelSamplingSD3.
    • нода ModelSamplingSD3.
    • MODEL ноды Load Diffusion Model (первый проход) во вход model ноды ModelSamplingSD3 (сдвиг первого прохода) (можно через LoraLoaderModelOnly или EasyCache).
    • MODEL ноды Load Diffusion Model (второй проход) во вход model ноды ModelSamplingSD3 (сдвиг второго прохода) (можно через LoraLoaderModelOnly или EasyCache).
    • shift ноды ModelSamplingSD3 (сдвиг первого прохода): от 5 до 8; «Сделать за меня» ставит 8.
    • shift ноды ModelSamplingSD3 (сдвиг второго прохода): от 5 до 8; «Сделать за меня» ставит 8.
  • Шаг 7, Загрузите две картинки:
    • нода Load Image.
    • нода Load Image.
    • image ноды Load Image (первый кадр): значение выбрано.
    • image ноды Load Image (последний кадр): не тот же файл, что в поле image ноды Load Image (первый кадр).
  • Шаг 8, Подготовьте начало и конец:
    • нода WanFirstLastFrameToVideo.
    • CONDITIONING ноды CLIP Text Encode (Prompt) (промпт) во вход positive ноды WanFirstLastFrameToVideo.
    • CONDITIONING ноды CLIP Text Encode (Prompt) (негатив) во вход negative ноды WanFirstLastFrameToVideo.
    • VAE ноды Load VAE во вход vae ноды WanFirstLastFrameToVideo.
    • IMAGE ноды Load Image (первый кадр) во вход start_image ноды WanFirstLastFrameToVideo (можно через Upscale Image или Upscale Image By или ImageFromBatch или ImageResizeKJv2 или Resize Image или GetImageRangeFromBatch или ResizeImageMaskNode).
    • IMAGE ноды Load Image (последний кадр) во вход end_image ноды WanFirstLastFrameToVideo (можно через Upscale Image или Upscale Image By или ImageFromBatch или ImageResizeKJv2 или Resize Image или GetImageRangeFromBatch или ResizeImageMaskNode).
    • width ноды WanFirstLastFrameToVideo: от 480 до 1280; «Сделать за меня» ставит 640.
    • height ноды WanFirstLastFrameToVideo: от 480 до 1280; «Сделать за меня» ставит 640.
    • length ноды WanFirstLastFrameToVideo: от 49 до 121; «Сделать за меня» ставит 81.
  • Шаг 9, Первый проход:
    • нода KSampler (Advanced).
    • MODEL ноды ModelSamplingSD3 (сдвиг первого прохода) во вход model ноды KSampler (Advanced) (первый проход) (можно через LoraLoaderModelOnly или EasyCache).
    • positive ноды WanFirstLastFrameToVideo во вход positive ноды KSampler (Advanced) (первый проход).
    • negative ноды WanFirstLastFrameToVideo во вход negative ноды KSampler (Advanced) (первый проход).
    • latent ноды WanFirstLastFrameToVideo во вход latent_image ноды KSampler (Advanced) (первый проход).
  • Шаг 10, Второй проход:
    • нода KSampler (Advanced).
    • MODEL ноды ModelSamplingSD3 (сдвиг второго прохода) во вход model ноды KSampler (Advanced) (второй проход) (можно через LoraLoaderModelOnly или EasyCache).
    • positive ноды WanFirstLastFrameToVideo во вход positive ноды KSampler (Advanced) (второй проход).
    • negative ноды WanFirstLastFrameToVideo во вход negative ноды KSampler (Advanced) (второй проход).
    • LATENT ноды KSampler (Advanced) (первый проход) во вход latent_image ноды KSampler (Advanced) (второй проход).
  • Шаг 11, Разделите шаги между двумя:
    • add_noise ноды KSampler (Advanced) (первый проход): enable.
    • steps ноды KSampler (Advanced) (первый проход): от 10 до 40; «Сделать за меня» ставит 20.
    • cfg ноды KSampler (Advanced) (первый проход): от 1 до 5; «Сделать за меня» ставит 4.
    • start_at_step ноды KSampler (Advanced) (первый проход): 0.
    • end_at_step ноды KSampler (Advanced) (первый проход): от 1 до 20; «Сделать за меня» ставит 10.
    • return_with_leftover_noise ноды KSampler (Advanced) (первый проход): enable.
    • add_noise ноды KSampler (Advanced) (второй проход): disable.
    • steps ноды KSampler (Advanced) (второй проход) равно полю steps ноды KSampler (Advanced) (первый проход).
    • cfg ноды KSampler (Advanced) (второй проход) равно полю cfg ноды KSampler (Advanced) (первый проход).
    • start_at_step ноды KSampler (Advanced) (второй проход) равно полю end_at_step ноды KSampler (Advanced) (первый проход).
    • return_with_leftover_noise ноды KSampler (Advanced) (второй проход): disable.
  • Шаг 12, Превратите результат в кадры:
    • нода VAE Decode или VAE Decode (Tiled).
    • LATENT ноды KSampler (Advanced) (второй проход) во вход samples ноды VAE Decode или VAE Decode (Tiled).
    • VAE ноды Load VAE во вход vae ноды VAE Decode или VAE Decode (Tiled).
  • Шаг 13, Соберите и сохраните ролик:
    • нода Create Video.
    • нода Save Video.
    • IMAGE ноды VAE Decode или VAE Decode (Tiled) во вход images ноды Create Video.
    • VIDEO ноды Create Video во вход video ноды Save Video.
    • fps ноды Create Video: 16.

Что дальше

Этот урок продолжают: Образец на весь ролик: Wan VACE, Длинное видео частями.

См. также

Страница перенесена из wiki репозитория приложения (docs/wiki/lessons/First-And-Last-Frame.ru.md, ревизия b8e3f71). То же руководство встроено в приложение: «Справка ▸ Руководство».

Чтобы обновить её, выполните npm run import, а затем npm run build в папке сайта.