Transformers documentation
Video-teks-ke-teks
Video-teks-ke-teks
Video-text-to-text, yang juga dikenal sebagai model bahasa video, adalah model yang dapat memproses video dan menghasilkan teks. Model-model ini dapat menangani berbagai tugas, mulai dari menjawab pertanyaan tentang video hingga membuat keterangan video.
Model-model ini memiliki arsitektur yang hampir sama dengan model image-text-to-text, kecuali beberapa perubahan untuk menerima data video, karena data video pada dasarnya adalah bingkai gambar dengan dependensi temporal. Beberapa model image-text-to-text menerima beberapa gambar, tetapi hal ini saja tidak memadai agar model dapat menerima video.
Selain itu, model video-teks-ke-teks sering dilatih dengan semua modalitas visual. Setiap contoh mungkin memiliki video, beberapa video, gambar, dan beberapa gambar. Beberapa model ini juga dapat menerima input yang berselang-seling. Misalnya, Anda dapat merujuk ke video tertentu di dalam rangkaian teks dengan menambahkan token video di dalam teks seperti “Apa yang terjadi di video ini? <video>“.
Perhatikan bahwa model-model ini memproses video tanpa audio. Di sisi lain, model Any-to-any dapat memproses video yang mengandung audio.
Dalam panduan ini, kami memberikan gambaran singkat tentang video LM dan menunjukkan cara menggunakannya dengan Transformers untuk inferensi.
Sebagai permulaan, terdapat beberapa jenis LM video:
- model dasar yang digunakan untuk fine-tuning
- model chat yang telah dihaluskan (fine-tuned) untuk percakapan
- model yang telah dihaluskan instruksi
Panduan ini berfokus pada inferensi dengan model yang telah diinstruksikan, llava-hf/llava-onevision-qwen2-0.5b-ov-hf yang dapat menerima data yang diselang-seling. Sebagai alternatif, Anda dapat mencoba llava-interleave-qwen-0.5b-hf jika perangkat keras Anda tidak memungkinkan untuk menjalankan model 7B.
Mari kita mulai dengan menginstal dependensi.
pip install -q transformers accelerate flash_attn torchcodec
Mari kita inisialisasi model dan prosesor.
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)Kami akan melakukan inferensi dengan dua video, keduanya menampilkan kucing.
Video adalah rangkaian bingkai gambar. Terbatasnya perangkat keras mengharuskan adanya downsampling. Jika jumlah bingkai yang di-downsample terlalu sedikit, kualitas prediksi akan rendah.
Model video-ke-teks memiliki prosesor yang memuat abstraksi video processor. Anda dapat meneruskan argumen terkait inferensi video ke fungsi apply_chat_template().
Anda dapat mempelajari lebih lanjut tentang video processor di sini.
Kita dapat mendefinisikan riwayat chat kita, dengan memasukkan video menggunakan URL seperti di bawah ini.
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."},
],
}
]Anda dapat memproses pralayar video dengan meneruskan pesan, mengatur do_sample_frames ke True, dan meneruskan num_frames. Di sini, kami mengambil sampel 10 frame.
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 berisi input_ids untuk teks yang ditokenisasi, pixel_values_videos untuk 10 frame, dan attention_mask untuk token mana saja.
Sekarang kita dapat melakukan inferensi dengan input yang telah dipreprocess dan meng-decode-nya.
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"Anda juga dapat menyisipkan beberapa video dengan teks secara langsung di dalam template chat seperti di bawah ini.
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."},
],
}
]Inferensi tetap sama seperti contoh sebelumnya.
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. ']