Видео из картинки

<!-- lesson: video-image -->

Урок «video-image» в группе Видео списка уроков. Шагов: 15.

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

Оживите готовую картинку: она станет первым кадром ролика.

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

  • Урок продолжает Видео из текста. Карточка говорит об этом; это подсказка, а не замок.
  • Файлы моделей, которые урок проверяет:
    • половина high_noise модели Wan 2.2 «картинка в видео» (i2v): models/diffusion_models, например wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors;
    • половина low_noise модели Wan 2.2 «картинка в видео» (i2v): models/diffusion_models, например wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors;
    • чтение текста Wan, umt5-xxl: models/text_encoders, например umt5_xxl_fp8_e4m3fn_scaled.safetensors;
    • VAE от Wan 2.1 (wan_2.1_vae): models/vae, например wan_2.1_vae.safetensors.
  • Ноды: Load Diffusion Model, Load CLIP, Load VAE, CLIP Text Encode (Prompt), ModelSamplingSD3, Load Image, WanImageToVideo, KSampler (Advanced), VAE Decode, Create Video, Save Video.
  • Приложение ничего не скачивает и не устанавливает. Тексты шагов ниже говорят, какие файлы, в какие папки и какой шаблон ComfyUI их называет.

Шаги

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

  1. Чем это отличается (чтение)

    Здесь ролик начинается с вашей картинки. Промпт говорит уже не о том, что в кадре, а о том, что в нём происходит.

    Граф почти тот же, что в уроке «Видео из текста». Если он у вас на холсте, большая часть шагов уже сделана, и приложение сразу перейдёт к новым.

    Меняются три вещи: файлы моделей, нода с картинкой и нода, которая готовит старт.

  2. Выберите модели для картинки

    Нужны две ноды Load Diffusion Model. В поле unet_name одной выберите файл i2v со словами high_noise, в другой файл i2v со словами low_noise. i2v значит «картинка в видео».

    Модели t2v из прошлого урока картинку на вход не принимают.

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

  3. Чтение текста

    Нужна нода Load CLIP с файлом umt5_xxl в поле clip_name и значением wan в поле type. Она та же, что для видео из текста.

  4. VAE

    Нужна нода Load VAE с файлом wan_2.1_vae в поле vae_name.

    Здесь она работает дважды: читает вашу картинку в начале и собирает кадры в конце.

  5. Опишите движение

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

    То, что и так видно на картинке, повторять не обязательно.

  6. Сдвиг шума

    Нужны две ноды ModelSamplingSD3, по одной на каждую модель, со значением shift от 5 до 8. Выход MODEL каждого загрузчика идёт во вход model своей ноды.

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

    Добавьте ноду Load Image и выберите в поле image свою картинку. В списке видны файлы из папки input вашего ComfyUI.

    Эта картинка станет первым кадром. Модель лучше всего держит её, когда пропорции ролика совпадают с пропорциями картинки.

  8. Подготовьте старт

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

    • ко входам positive и negative два текста;
    • ко входу vae выход ноды Load VAE;
    • ко входу start_image выход IMAGE ноды Load Image.

    В полях поставьте width 832, height 480 и length 81.

    Эта нода вкладывает вашу картинку в заготовку ролика и в оба текста. Поэтому дальше сэмплеры берут тексты с её выходов, а не напрямую.

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

    Нужна нода KSampler (Advanced). Ко входу model идёт модель high_noise через свою ноду ModelSamplingSD3. Входы positive, negative и latent_image берут три выхода ноды WanImageToVideo: positive, negative и latent.

    Если сэмплер остался подключён к текстам напрямую, он не узнает о картинке и нарисует ролик с нуля.

    Нода с заготовкой из урока «Видео из текста» после этого ни к чему не подключена. Её можно удалить.

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

Нужна вторая нода KSampler (Advanced). Ко входу model идёт модель low_noise через ноду ModelSamplingSD3. Входы positive и negative берут те же выходы ноды WanImageToVideo, а latent_image берёт выход первого сэмплера.

  1. Настройте первый сэмплер

В первом сэмплере поставьте:

  • add_noise: enable;
  • steps: 20;
  • cfg: 3.5;
  • start_at_step: 0 и end_at_step: 10;
  • return_with_leftover_noise: enable.

Он делает первую половину из двадцати шагов и отдаёт ролик вместе с оставшимся шумом. Без последней настройки второй сэмплер получит уже очищенный ролик, и дорабатывать ему будет нечего.

  1. Настройте второй сэмплер

Во втором сэмплере поставьте:

  • add_noise: disable;
  • steps и cfg: как в первом;
  • start_at_step: 10, то же число, на котором остановился первый;
  • return_with_leftover_noise: disable.

Шум уже есть, второй раз добавлять его нельзя. Если start_at_step не совпадёт с end_at_step первого сэмплера, часть шагов пропадёт или сделается дважды.

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

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

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

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

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

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

  1. Граф готов (чтение)

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

Если ролик стоит на месте, добавьте в промпт действие и движение камеры. Если фигура или лицо плывут к концу, сократите length или опишите движение спокойнее.

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

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

  • Шаг 2, Выберите модели для картинки:
    • нода Load Diffusion Model.
    • нода Load Diffusion Model.
    • в поле unet_name ноды Load Diffusion Model (первый проход) стоит файл такого вида: половина high_noise модели Wan 2.2 «картинка в видео» (i2v); такой файл лежит в models/diffusion_models, например wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors.
    • unet_name ноды Load Diffusion Model (второй проход): не тот же файл, что в поле unet_name ноды Load Diffusion Model (первый проход).
    • в поле unet_name ноды Load Diffusion Model (второй проход) стоит файл такого вида: половина low_noise модели Wan 2.2 «картинка в видео» (i2v); такой файл лежит в models/diffusion_models, например wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors.
  • Шаг 3, Чтение текста:
    • нода Load CLIP.
    • в поле clip_name ноды Load CLIP стоит файл такого вида: чтение текста Wan, umt5-xxl; такой файл лежит в models/text_encoders, например umt5_xxl_fp8_e4m3fn_scaled.safetensors.
    • type ноды Load CLIP: wan. Почему: поле type говорит ноде, для какой модели этот текст. С другим значением Wan получит бессмыслицу.
  • Шаг 4, VAE:
    • нода Load VAE.
    • в поле vae_name ноды Load VAE стоит файл такого вида: VAE от Wan 2.1 (wan_2.1_vae); такой файл лежит в models/vae, например wan_2.1_vae.safetensors.
  • Шаг 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 знаков и 2 настоящих слов.
  • Шаг 6, Сдвиг шума:
    • нода ModelSamplingSD3.
    • нода ModelSamplingSD3.
    • MODEL ноды Load Diffusion Model (первый проход) во вход model ноды ModelSamplingSD3 (сдвиг первого прохода) (можно через LoraLoaderModelOnly).
    • MODEL ноды Load Diffusion Model (второй проход) во вход model ноды ModelSamplingSD3 (сдвиг второго прохода) (можно через LoraLoaderModelOnly).
    • shift ноды ModelSamplingSD3 (сдвиг первого прохода): от 5 до 8; «Сделать за меня» ставит 8. Почему: у Wan при маленьком сдвиге хуже держатся композиция и движение, ролик выходит вялым.
    • shift ноды ModelSamplingSD3 (сдвиг второго прохода): от 5 до 8; «Сделать за меня» ставит 8. Почему: у Wan при маленьком сдвиге хуже держатся композиция и движение, ролик выходит вялым.
  • Шаг 7, Загрузите картинку:
    • нода Load Image.
    • image ноды Load Image: значение выбрано.
  • Шаг 8, Подготовьте старт:
    • нода WanImageToVideo.
    • CONDITIONING ноды CLIP Text Encode (Prompt) (промпт) во вход positive ноды WanImageToVideo.
    • CONDITIONING ноды CLIP Text Encode (Prompt) (негатив) во вход negative ноды WanImageToVideo.
    • VAE ноды Load VAE во вход vae ноды WanImageToVideo.
    • IMAGE ноды Load Image во вход start_image ноды WanImageToVideo.
    • length ноды WanImageToVideo: от 49 до 121, число кадров вида 4n + 1; «Сделать за меня» ставит 81. Почему: wan берёт число кадров вида 4n + 1: 49, 81, 121. 81 кадр при 16 в секунду даёт пять секунд.
  • Шаг 9, Первый проход:
    • нода KSampler (Advanced).
    • MODEL ноды ModelSamplingSD3 (сдвиг первого прохода) во вход model ноды KSampler (Advanced) (первый проход) (можно через LoraLoaderModelOnly).
    • positive ноды WanImageToVideo во вход positive ноды KSampler (Advanced) (первый проход).
    • negative ноды WanImageToVideo во вход negative ноды KSampler (Advanced) (первый проход).
    • latent ноды WanImageToVideo во вход latent_image ноды KSampler (Advanced) (первый проход).
  • Шаг 10, Второй проход:
    • нода KSampler (Advanced).
    • MODEL ноды ModelSamplingSD3 (сдвиг второго прохода) во вход model ноды KSampler (Advanced) (второй проход) (можно через LoraLoaderModelOnly).
    • positive ноды WanImageToVideo во вход positive ноды KSampler (Advanced) (второй проход).
    • negative ноды WanImageToVideo во вход negative ноды KSampler (Advanced) (второй проход).
    • LATENT ноды KSampler (Advanced) (первый проход) во вход latent_image ноды KSampler (Advanced) (второй проход).
  • Шаг 11, Настройте первый сэмплер:
    • add_noise ноды KSampler (Advanced) (первый проход): enable. Почему: первый сэмплер начинает с чистого шума, поэтому шум добавляет он.
    • steps ноды KSampler (Advanced) (первый проход): от 4 до 60; «Сделать за меня» ставит 20. Почему: двадцать шагов делятся на два прохода; с другим числом граница между ними сдвинется.
    • cfg ноды KSampler (Advanced) (первый проход): от 1 до 4; «Сделать за меня» ставит 3.5. Почему: для Wan 2.2 большой cfg выжигает ролик. Шаблоны ComfyUI ставят 3.5.
    • start_at_step ноды KSampler (Advanced) (первый проход): 0. Почему: первый сэмплер начинает с самого начала, с шага 0.
    • end_at_step ноды KSampler (Advanced) (первый проход): от 1 до 15; «Сделать за меня» ставит 10. Почему: на этом шаге первая модель отдаёт ролик второй. Шаблоны ComfyUI делят двадцать шагов пополам.
    • end_at_step ноды KSampler (Advanced) (первый проход) меньше поля steps ноды KSampler (Advanced) (первый проход). Почему: если первый сэмплер остановится не раньше последнего шага, он сделает всё сам и второму нечего будет доводить.
    • return_with_leftover_noise ноды KSampler (Advanced) (первый проход): enable. Почему: без оставшегося шума второй сэмплер получит уже очищенный ролик, и дорабатывать ему будет нечего.
  • Шаг 12, Настройте второй сэмплер:
    • add_noise ноды KSampler (Advanced) (второй проход): disable. Почему: шум уже есть в ролике от первого сэмплера, второй раз добавлять его нельзя.
    • steps ноды KSampler (Advanced) (второй проход) равно полю steps ноды KSampler (Advanced) (первый проход). Почему: оба сэмплера считают одни и те же шаги, иначе граница между проходами не сойдётся.
    • cfg ноды KSampler (Advanced) (второй проход): от 1 до 4; «Сделать за меня» ставит 3.5. Почему: для Wan 2.2 большой cfg выжигает ролик. Шаблоны ComfyUI ставят 3.5.
    • start_at_step ноды KSampler (Advanced) (второй проход) равно полю end_at_step ноды KSampler (Advanced) (первый проход). Почему: второй сэмплер продолжает с того шага, на котором остановился первый. Иначе часть шагов пропадёт или сделается дважды.
    • return_with_leftover_noise ноды KSampler (Advanced) (второй проход): disable. Почему: второй сэмплер доводит ролик до конца, остаток шума отдавать некому.
  • Шаг 13, Превратите результат в кадры:
    • нода VAE Decode.
    • LATENT ноды KSampler (Advanced) (второй проход) во вход samples ноды VAE Decode.
    • VAE ноды Load VAE во вход vae ноды VAE Decode.
  • Шаг 14, Соберите и сохраните ролик:
    • нода Create Video.
    • нода Save Video.
    • IMAGE ноды VAE Decode во вход images ноды Create Video.
    • VIDEO ноды Create Video во вход video ноды Save Video.
    • fps ноды Create Video: 16. Почему: wan рисует 16 кадров в секунду. С другим числом ролик пойдёт быстрее или медленнее, чем задумано.

Частые ошибки

  • Файлы t2v: картинка не учитывается.
  • Сэмплеры всё ещё подключены прямо к текстовым нодам: ролик рисуется из ничего.
  • Вертикальная картинка в горизонтальный ролик: края обрезаются. Совмещайте пропорции.
  • Повторять в промпте описание картинки: лучше скажите, что движется.

Что дальше

Этот урок продолжают: Две модели в одном графе, Портрет, который говорит: HuMo.

См. также

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

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