Генерация видео теперь open source? Наконец-то я нашёл время, чтобы добавить генерацию видео из текста и изображений в свой open source проект Wunjo CE. В этой статье мы рассмотрим, как это работает, сравним его с похожими решениями, изучим основы подхода и его альтернативы.
Wunjo CE — это приложение (пет‑проект), которое можно установить одним кликом и во второй клик развернуть приложение как серверное, чтобы использовать его с мобильного устройства или планшета в локальной сети или интернете. Вам не нужно разбираться в тонкостях скачивания из GitHub и установки зависимостей (при этом никто не запрещает это сделать, открытый код и всё такое) — программа всё сделает за вас.
Ранее я писал о Wunjo CE на Хабре. Приложение позволяет изменять лицо, цвет кожи, пол на фото и видео, синхронизировать губы, делать рестайлинг видео с помощью текста, удалять объекты, клонировать голос для озвучки, разделять аудио. Вы можете проверить оригинальность контента в приложении, является ли изображение и видео дипфейком или аудио содержит клонированный голос из Wunjo.
И вот, генерация изображений и видео добавлены в функционал проекта. Я собираю всё, чем пользуюсь сам, и делаю это максимально простым и доступным. В том числе и на слабых устройствах.
Если вам интересно ознакомиться с полным функционалом, объяснением параметров и инструкциями по работе с приложением, я прикреплю видео в конце статьи. Также, если вам не хочется вникать в технические детали, в конце статьи будет видео, показывающее, как пользоваться генерацией видео и сравнение с Pika и Gen.
Анатоль Франс писал: «Учиться можно только весело... Чтобы переварить знания, надо поглощать их с аппетитом.»
Эти слова лучше всего описывают, что для каждого человека есть своё ценное в материале, и некоторые подробности можно упустить.
Видео может быть сгенерировано из текста и изображений с помощью моделей Stable Diffusion. Вы можете добавить кастомные модели версии 1.5, а также расширить до версии XL. Однако, на мой взгляд, это не имеет особого смысла, так как модель для генерации видео не передаст такое качество, какое можно получить моделями Stable Diffusion XL, а мощности потребуется больше.
FPS: Максимальное значение — 24 FPS, что позволяет получить 4 секунды видео. Уменьшая FPS, вы увеличиваете длительность видео.
VRAM: Генерация видео возможна на 8 ГБ VRAM.
Форматы: Доступны популярные соотношения сторон для генерации из текста: 16:9 (YouTube), 9:16 (Shorts), 1:1, 5:2, 4:5, 4:3. Сохраняется соотношение сторон для генерации из изображения.
Сначала генерируется изображение в выбранном вами формате. Вы можете видеть изображение, перегенерировать его или изменить детали перед созданием видео.
Используется соотношение сторон исходного изображения, при этом вы можете доработать его элементы перед генерацией видео.
Если автоматическое скачивание необходимых репозиториев не удалось, вам потребуется около 85-90 Гб места на жестком диске. Место хранения моделей можно выбрать самостоятельно, подробнее об этом в документации.
Программа скачивает все репозитории и модели автоматически, но возможны проблемы со скачиванием с Hugging Face без VPN. В таком случае необходимо перейти в директорию .wunjo/all_models
.
Runwayml: Это репозиторий, включающий необходимые модели, такие как vae, safety_checker, text_encoder, unet и другие. Вам нужно создать директорию runwayml и скачать модели в соответствующие папки.
Вы также можете воспользоваться консольной командой для автоматизации этого процесса.
git clone https://huggingface.co/runwayml/stable-diffusion-v1-5
Перед началом скачивания убедитесь, что у вас есть возможность скачивать крупные файлы.
git lfs install
В директорию .wunjo/all_models/diffusion
вы можете скачать различные модели Stable Diffusion 1.5, которые будут использоваться при генерации изображений. Эти модели можно найти в открытом доступе, например, на Hugging Face или Civitai.
В файле .wunjo/all_models/custom_diffusion.json
вы указываете пути до ваших моделей. Пример настройки:
[
{
"name": "Fantasy World", "model": "fantasyWorld_v10.safetensors", "img": "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/2e321e71-c144-4ba6-8b55-3f62756fc0a1/width=1024,quality=90/01828-3669354034-giant%20pink%20balloon,cities%20floating%20on%20balloons,magnificent%20clouds,pink%20theme,.jpeg", "url": ""
}
]
Если вы укажете url, тогда модель скачивается автоматически.
Этот шаг можно пропустить, так как по умолчанию включены две модели Stable Diffusion 1.5, которые достаточно для создания как реалистичного, так и рисованного контента.
Ранее код работал только с необходимыми частями генеративных моделей, что экономило время и уменьшало количество ненужного кода. Однако для расширения функционала я решил перейти на библиотеку diffusers
. Конкретно репозиторий runwayml
используется для генерации изображений.
Пример кода из проекта:
# Определяю компоненты модели runwayml
vae = AutoencoderKL.from_pretrained(sd_path, subfolder="vae", torch_dtype=torch.float16)
text_encoder = CLIPTextModel.from_pretrained(sd_path, subfolder="text_encoder", torch_dtype=torch.float16)
tokenizer = CLIPTokenizer.from_pretrained(sd_path, subfolder="tokenizer")
unet = UNet2DConditionModel.from_pretrained(sd_path, subfolder="unet", torch_dtype=torch.float16)
safety_checker = StableDiffusionSafetyChecker.from_pretrained(sd_path, subfolder="safety_checker", torch_dtype=torch.float16) # to filter naked content
feature_extractor = CLIPImageProcessor.from_pretrained(sd_path, subfolder="feature_extractor")
# Если указана кастомная модель 1.5, подгружаю её веса.
if weights_path:
weights = load_file(weights_path) # weights_path
unet.load_state_dict(weights, strict=False)
Вы можете изменить Stable Diffusion 1.5 на более мощную модель, так как используются pipelines из библиотеки diffusers
. Для этого достаточно изменить sd_path
и StableDiffusionPipeline
.
pipe = StableDiffusionPipeline(
vae=vae,
text_encoder=text_encoder,
tokenizer=tokenizer,
unet=unet,
scheduler=DDIMScheduler.from_pretrained(sd_path, subfolder="scheduler"),
safety_checker=safety_checker, # Значение None отключает цензуру модели SD
requires_safety_checker=False,
feature_extractor=feature_extractor,
).to(device)
И ссылки на документацию по Stable Diffusion XL и Turbo.
Для изменения элементов изображения в приложении используется ControlNet и соответствующие pipelines. Пример настройки:
def make_canny_condition(image):
image = np.array(image)
image = cv2.Canny(image, 100, 200)
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
image = Image.fromarray(image)
return image
if controlnet_type == "canny":
control_image = make_canny_condition(init_image)
else:
control_image = init_image
controlnet = ControlNetModel.from_pretrained(controlnet_path, torch_dtype=torch.float16).to(device)
По умолчанию доступен метод canny, но вы можете расширить приложение, добавив различные методы ControlNet. Например, для XL моделей можно заменить controlnet на IP-Adapter или T2I-Adapter.
В директорию .wunjo/all_models
необходимо создать директорию controlnet_canny
и скачать модели из репозитория sd controlnet canny.
git clone https://huggingface.co/lllyasviel/sd-controlnet-canny
Также создайте директорию controlnet_tile
и скачайте модели из репозитория control_v11f1e_sd15_tile.
git clone https://huggingface.co/lllyasviel/control_v11f1e_sd15_tile
Для генерации видео я использую репозиторий stabilityai и соответствующий Pipeline. Возникает вопрос: если модель ограничена на изображения форматом 576x1024 и генерирует не более 25 кадров, как использовать любой формат в модели и получать 4 секунды видео при 24 FPS?
# Определяем компоненты
vae = AutoencoderKLTemporalDecoder.from_pretrained(sd_path, subfolder="vae", torch_dtype=torch.float16)
image_encoder = CLIPVisionModelWithProjection.from_pretrained(sd_path, subfolder="image_encoder", torch_dtype=torch.float16)
scheduler = EulerDiscreteScheduler.from_pretrained(sd_path, subfolder="scheduler")
unet = UNetSpatioTemporalConditionModel.from_pretrained(sd_path, subfolder="unet", torch_dtype=torch.float16)
feature_extractor = CLIPImageProcessor.from_pretrained(sd_path, subfolder="feature_extractor")
# Инициализируем
pipe = StableVideoDiffusionPipeline(
vae=vae,
image_encoder=image_encoder,
scheduler=scheduler,
unet=unet,
feature_extractor=feature_extractor
)
pipe.enable_model_cpu_offload()
pipe.unet.enable_forward_chunking()
pipe.enable_xformers_memory_efficient_attention()
Перед подачей изображения в модель для генерации видео, я достраиваю его до формата 576x1024, не меняя содержание пользовательского кадра. После outpaint использую controlnet_tile
с соответствующей маской для улучшения качества добавленных зон. Чем лучше качество достроенных зон, тем лучше анимация. Генерация лучше сосредоточена на движении объектов, а не на созданных зонах.
Видео нельзя генерировать до бесконечности, так как на каждый конечный кадр модель добавляет шум. После третьей итерации получается мессиво из пикселей. Поэтому я генерирую первые две итерации, делаю реверс, снова генерирую итерации и соединяю все, делая кадрирование под соотношение сторон для пользователя. Эти ухищрения расширяют возможности для stabilityai
.
Вы можете заменить репозиторий stable-video-diffusion-img2vid-xt
на stable-video-diffusion-img2vid-xt-1-1
для получения лучшего качества видео, чем используемая мной модель.
Для вас я собрал в одном видео различные примеры генерации в сравнении с Pika и Gen-2. Я не включил модели Gen-3, Luma, Sora, так как open source модели не могут с ними конкурировать. Из всего списка мне удалось бесплатно воспользоваться только Luma, и то с ограничениями — например, не более 5 генераций в день. В этом сравнении я сосредоточился на подходах, которые дают приблизительно одинаковое время генерации. Важно понимать, что Wunjo CE — это полностью бесплатное и безлимитное open source решение.
По расположению результата на видео.
Pika: Модель не добавляет много движения, но сглаживает результат, иногда даже слишком. Может добавить звук в видео.
Wunjo CE: Сохраняет исходное качество картинки и добавляет интересные движения для некоторых объектов. Однако, направления этих движений могут случайно меняться в кадре и генерация одного видео занимает 15 минут на NVIDIA GeForce RTX 3070 8 Гб VRAM.
Gen-2: Добавляет больше реалистичности, но может создавать искажения для необычных объектов. Есть возможность увеличить длительность результата, но качество с каждой итерацией падает,
Промты были простыми, например, "кот сидит" или "собаки едут в машине". Я использовал только по одной генерации видео для каждого подхода, специально не подбирая и не улучшая результаты, чтобы продемонстрировать реальный потенциал моделей.
Эта генерация меня рассмешила: модель так интересно сгенерировала кадры, что кажется, будто девочка ругается на жизнь по каким-то своим причинам.
Для подробного объяснения параметров генерации видео и использования приложения я снял туториал, в котором мы получаем следующие результаты:
Посмотрите само видео, чтобы увидеть все результаты генерации.
Про остальной функционал Wunjo CE можно узнать из видео в плейлисте. Там есть обзоры на основной функционал, инструкции по установке из кода и установщика, а также как использовать API для ваших проектов.
Если хотите поддержать проект, переходите на GitHub, сохраняйте в закладки, чтобы не потерять и не пропустить обновления. В планах — добавление генерации аудио для видео и анимации говорящей головы из изображения. Скачать установщики можно с официального сайта wunjo.online и из Boosty. На Boosty можно голосовать за то, какой код функционала будет открыт и доступен на GitHub. Всё зависит от вашего интереса.
Как и в любой статье про генерацию видео, нельзя не упомянуть альтернативы. Один из интересных open source проектов — ToonCrafter, который генерирует рисованные анимации. Он создает движения только между первым и последним кадром, а не из текста или одного изображения. Разрешение довольно низкое — 320x512, и я не проверял, сколько требуется видеопамяти для запуска этого решения. Однако это хорошая альтернатива с потенциалом для улучшения. Модель ToonCrafter добавляет движения для анимации, что мне очень нравится. Все интересные решения по видео, клонированию голоса, итд., я собираю здесь.
Обязательно пишите в комментариях свои альтернативы open source для генерации видео. Это поможет улучшить текущий подход и собрать базу знаний про это новое и захватывающее направление.
Генерация видео из текста и изображений — это не просто технологическое достижение, а новая форма творчества и самовыражения. Благодаря open source и коммерческим проектам создается новая форма выражения мыслей, когда одним текстом можно создать ролик с тем, что даже трудно и затратно снять технологически.
Звучит интересно и то, что одним запросом можно будет адаптировать один ролик для различных стран и регионов, меняя цвет кожи, лица, объекты и надписи, добавляя новые элементы и видео. Будущее обещает ещё более реалистичные и детализированные модели. Генерация видео становится не просто инструментом, а новой философией в творчестве, объединяющей технологии, простоту и искусство.