Transformers documentation

Видео-текст-в-текст

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Видео-текст-в-текст

Модели «видео-текст-в-текст», также известные как языковые модели для видео, — это модели, которые могут обрабатывать видео и выдавать текст в качестве результата. Такие модели способны решать различные задачи, от ответов на вопросы по видео до генерации описаний.

These models have nearly the same architecture as image-text-to-text models except for some changes to accept video data, since video data is essentially image frames with temporal dependencies. Some image-text-to-text models take in multiple images, but this alone is inadequate for a model to accept videos.

Более того, модели «видео-текст-в-текст» часто обучаются на данных со всеми визуальными модальностями. В каждом примере могут присутствовать видео, несколько видео, изображения и несколько изображений. Некоторые из этих моделей также поддерживают чередующиеся входные данные. Например, вы можете сослаться на конкретное видео внутри текстовой строки, добавив в текст токен видео, как в следующем примере: «Что происходит в этом видео? <video>».

Обратите внимание, что эти модели обрабатывают видео без звука. Any-to-any модели, в свою очередь, способны обрабатывать видео со звуком.

В этом руководстве мы кратко рассматриваем видео-языковые модели и показываем, как использовать их с Transformers для инференса.

Для начала стоит отметить, что существует несколько типов видео-языковых моделей:

  • базовые модели, используемые для дообучения
  • модели, дообученные для диалогов
  • модели, дообученные на инструкциях

В этом руководстве рассматривается инференс с использованием модели, обученной по инструкциям, llava-hf/llava-onevision-qwen2-0.5b-ov-hf, которая может принимать данные в смешанном формате. Альтернативно, вы можете использовать llava-interleave-qwen-0.5b-hf, если ваше оборудование не позволяет запускать модель 7B.

Начнем с установки зависимостей.

pip install -q transformers accelerate flash_attn torchcodec

Инициализируем модель и процессор.

from transformers import AutoProcessor, LlavaOnevisionForConditionalGeneration
import torch
model_id = "llava-hf/llava-onevision-qwen2-0.5b-ov-hf"

device = torch.accelerator.current_accelerator().type if torch.accelerator.is_available() else "cpu"
processor = AutoProcessor.from_pretrained(model_id, device=device)

model = LlavaForConditionalGeneration.from_pretrained(model_id, device_map="auto", dtype=torch.float16)

Мы выполним инференс на двух видео, на обоих присутствуют кошки.

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

Модели video-text-to-text имеют процессоры, в которых абстрагирован видео-процессор. Вы можете передавать аргументы, связанные с видео-инференсом, в функцию apply_chat_template().

Подробнее о процессорах видео можно узнать здесь.

Мы можем определить историю чата, передав видео по URL, как показано ниже.

messages = [
    {
        "role": "user",
        "content": [
            {"type": "video", "video": "https://huggingface.co/spaces/merve/llava-interleave/resolve/main/cats_1.mp4"},
            {"type": "text", "text": "Describe what is happening in this video."},
        ],
    }
]

Вы можете предобработать видео, передав сообщения, установив do_sample_frames в True и передав num_frames. Здесь мы выбираем 10 кадров.

inputs = processor.apply_chat_template(
    messages,
    tokenize=True,
    add_generation_prompt=True,
    return_dict=True,
    return_tensors="pt",
    num_frames=10,
    do_sample_frames=True
)
inputs.to(model.device)

Во входных данных содержатся input_ids для токенизированного текста, pixel_values_videos для 10 кадров и attention_mask для токенов.

Теперь мы можем выполнить инференс с предварительно обработанными входными данными и декодировать их.

generated_ids = model.generate(**inputs, max_new_tokens=128)
input_length = len(inputs["input_ids"][0])
output_text = processor.batch_decode(
    generated_ids[:, input_length:], skip_special_tokens=True, clean_up_tokenization_spaces=False
)
output_text = processor.batch_decode(
    generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text[0])

#"The video features a fluffy, long-haired cat with a mix of brown and white fur, lying on a beige carpeted floor. The cat's eyes are wide open, and its whiskers are prominently visible. The cat appears to be in a relaxed state, with its head slightly"

Вы также можете чередовать несколько видео с текстом непосредственно в шаблоне чата, как показано ниже.

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Here's a video."},
            {"type": "video", "video": "https://huggingface.co/spaces/merve/llava-interleave/resolve/main/cats_1.mp4"},
            {"type": "text", "text": "Here's another video."},
            {"type": "video", "video": "https://huggingface.co/spaces/merve/llava-interleave/resolve/main/cats_2.mp4"},
            {"type": "text", "text": "Describe similarities in these videos."},
        ],
    }
]

Процесс инференса остаётся таким же, как в предыдущем примере.

inputs = processor.apply_chat_template(
    messages,
    tokenize=True,
    add_generation_prompt=True,
    return_dict=True,
    return_tensors="pt",
    num_frames=100,
    do_sample_frames=True
)
inputs.to(model.device)

generated_ids = model.generate(**inputs, max_new_tokens=50)
input_length = len(inputs["input_ids"][0])
output_text = processor.batch_decode(
    generated_ids[:, input_length:], skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)
#['Both videos feature a cat with a similar appearance, characterized by a fluffy white coat with black markings, a pink nose, and a pink tongue. The cat\'s eyes are wide open, and it appears to be in a state of alertness or excitement. ']
Update on GitHub