Transformers documentation

Video-metinden-metne

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Video-metinden-metne

Video-metne-metin olarak da bilinen video dil modelleri, video işleyip metin üretebilen modellerdir. Bu modeller, video soru-cevaptan video altyazılamaya kadar çeşitli görevlerle uğraşabilir.

Bu modeller, görsel-metin-metne modelleriyle neredeyse aynı mimariye sahiptir; ancak video verisi temelde zamansal bağımlılıklara sahip görsel karelerden oluştuğu için, video verisini kabul edebilmek amacıyla bazı değişiklikler yapılmıştır. Bazı görsel-metin-metne modelleri birden fazla görsel alır, ancak bu tek başına bir modelin video kabul etmesi için yeterli değildir.

Bununla birlikte, video-metin-metin modelleri genellikle tüm görme modaliteleriyle eğitilir. Her örnek videolar, birden fazla video, görseller ve birden fazla görsel içerebilir. Bu modellerden bazıları ayrıca aralıklı (interleaved) girdileri de kabul edebilir. Örneğin, metin dizisine “Bu videoda ne oluyor? <video>” gibi bir video belirteci ekleyerek metin içindeki belirli bir videoya atıfta bulunabilirsiniz.

Bu modellerin ses içermeyen videoları işlediğini unutmayın. Öte yandan Any-to-any modelleri, ses içeren videoları da işleyebilir.

Bu kılavuzda, video LM'lerinin kısa bir genel bakışını sunuyor ve bunların Transformers ile çıkarım (inference) için nasıl kullanılacağını gösteriyoruz.

Başlamak için, video LM'lerinin birden fazla türü vardır:

  • ince ayar için kullanılan temel modeller
  • sohbet için ince ayar yapılmış modeller
  • talimatla ince ayar yapılmış modeller

Bu kılavuz, llava-hf/llava-onevision-qwen2-0.5b-ov-hf gibi karışık veri alabilen talimatla ayarlanmış bir modelle çıkarım (inference) üzerine odaklanmaktadır. Donanımınız 7B parametreli bir modeli çalıştırmaya izin vermiyorsa, llava-interleave-qwen-0.5b-hf modelini deneyebilirsiniz.

Bağımlılıkları kurmaya başlayalım.

pip install -q transformers accelerate flash_attn torchcodec

Modeli ve işlemciyi başlatalım.

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)

İki video ile çıkarım yapacağız, her ikisinde de kediler var.

Videolar, görüntü karelerinin bir dizisidir. Donanım sınırlamalarına bağlı olarak örnekleme azaltma (downsampling) gereklidir. Örnekleme azaltılmış kare sayısı çok azsa, tahminler düşük kalitede olacaktır.

Video-text-to-text modelleri, içinde soyutlanmış bir video işlemciye sahip işlemcilere sahiptir. Video çıkarımına ilişkin argümanları apply_chat_template() fonksiyonuna iletebilirsiniz.

Video işleyicileri hakkında daha fazla bilgiyi burada bulabilirsiniz.

Aşağıdaki gibi bir URL ile videoyu geçirerek sohbet geçmişimizi tanımlayabiliriz.

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."},
        ],
    }
]

Videoları, do_sample_frames değerini True olarak ayarlayıp num_frames parametresini ileterek ön işleme tabi tutabilirsiniz. Burada 10 kare örnekliyoruz.

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)

Girdiler, tokenize edilmiş metin için input_ids, 10 kare için pixel_values_videos ve hangi tokenlar için olduğunu belirtmek üzere attention_mask içerir.

Artık ön işlenmiş girdilerimizle çıkarım yapabilir ve onları çözebiliriz.

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"

Aşağıdaki gibi, sohbet şablonunda metinle birlikte birden fazla videoyu doğrudan iç içe geçirebilirsiniz.

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."},
        ],
    }
]

Çıkarım, önceki örnekle aynı kalır.

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