Transformers documentation
Видео-текст-в-текст
Видео-текст-в-текст
Модели «видео-текст-в-текст», также известные как языковые модели для видео, — это модели, которые могут обрабатывать видео и выдавать текст в качестве результата. Такие модели способны решать различные задачи, от ответов на вопросы по видео до генерации описаний.
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. ']