Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -1,104 +1,149 @@
|
|
|
|
|
|
1 |
import subprocess
|
2 |
-
import
|
3 |
-
|
4 |
-
def install(package):
|
5 |
-
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
|
6 |
|
7 |
-
# Gerekli
|
8 |
-
|
9 |
-
"
|
10 |
-
"
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
"flash-attn",
|
15 |
-
"git+https://github.com/LLaVA-VL/LLaVA-NeXT.git"
|
16 |
-
]
|
17 |
|
18 |
-
print("Gerekli kütüphaneler yükleniyor...")
|
19 |
-
for package in required_packages:
|
20 |
-
try:
|
21 |
-
install(package)
|
22 |
-
except Exception as e:
|
23 |
-
print(f"{package} yüklenirken hata oluştu: {e}")
|
24 |
-
|
25 |
-
# Kütüphaneleri içe aktar
|
26 |
-
import gradio as gr
|
27 |
import torch
|
28 |
from llava.model.builder import load_pretrained_model
|
29 |
from llava.mm_utils import get_model_name_from_path, process_images, tokenizer_image_token
|
30 |
-
from llava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN
|
31 |
-
from llava.conversation import conv_templates
|
32 |
import copy
|
|
|
33 |
from decord import VideoReader, cpu
|
34 |
import numpy as np
|
35 |
|
36 |
-
|
37 |
-
|
38 |
-
Video hakkında genel bir açıklama yapar ve klipte neler olup bittiğini adım adım anlatır."""
|
39 |
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
total_frame_num = len(vr)
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
|
|
|
|
|
|
|
|
|
|
50 |
|
51 |
# Model yükleme
|
52 |
pretrained = "lmms-lab/LLaVA-Video-7B-Qwen2"
|
53 |
model_name = "llava_qwen"
|
54 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
|
55 |
|
56 |
print("Model yükleniyor...")
|
57 |
-
tokenizer, model, image_processor, max_length = load_pretrained_model(pretrained, None, model_name, torch_dtype="bfloat16", device_map=
|
58 |
model.eval()
|
59 |
print("Model başarıyla yüklendi!")
|
60 |
|
61 |
-
|
62 |
-
|
63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
|
65 |
-
|
|
|
|
|
66 |
|
67 |
-
conv = copy.deepcopy(conv_templates[
|
68 |
-
conv.append_message(conv.roles[0],
|
69 |
conv.append_message(conv.roles[1], None)
|
70 |
-
|
71 |
|
72 |
-
input_ids = tokenizer_image_token(
|
73 |
|
74 |
with torch.no_grad():
|
75 |
output = model.generate(
|
76 |
input_ids,
|
77 |
-
images=
|
78 |
modalities=["video"],
|
79 |
do_sample=False,
|
80 |
temperature=0,
|
81 |
-
max_new_tokens=
|
82 |
)
|
83 |
|
84 |
response = tokenizer.batch_decode(output, skip_special_tokens=True)[0].strip()
|
85 |
-
|
|
|
|
|
|
|
86 |
|
87 |
-
def gradio_interface(video_file):
|
88 |
if video_file is None:
|
89 |
return "Lütfen bir video dosyası yükleyin."
|
90 |
-
|
|
|
91 |
|
92 |
with gr.Blocks() as demo:
|
93 |
gr.Markdown(title)
|
94 |
-
gr.Markdown(description)
|
95 |
-
|
96 |
with gr.Row():
|
97 |
-
|
98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
|
100 |
-
|
101 |
-
|
|
|
|
|
|
|
102 |
|
103 |
if __name__ == "__main__":
|
104 |
-
demo.launch(
|
|
|
1 |
+
import spaces
|
2 |
+
import gradio as gr
|
3 |
import subprocess
|
4 |
+
from googletrans import Translator
|
|
|
|
|
|
|
5 |
|
6 |
+
# Gerekli kütüphanelerin kurulumu
|
7 |
+
subprocess.run(
|
8 |
+
"pip install flash-attn --no-build-isolation",
|
9 |
+
env={"FLASH_ATTENTION_SKIP_CUDA_BUILD": "TRUE"},
|
10 |
+
shell=True,
|
11 |
+
)
|
12 |
+
subprocess.run("pip install googletrans==3.1.0a0", shell=True)
|
|
|
|
|
|
|
13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
import torch
|
15 |
from llava.model.builder import load_pretrained_model
|
16 |
from llava.mm_utils import get_model_name_from_path, process_images, tokenizer_image_token
|
17 |
+
from llava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX
|
18 |
+
from llava.conversation import conv_templates, SeparatorStyle
|
19 |
import copy
|
20 |
+
import warnings
|
21 |
from decord import VideoReader, cpu
|
22 |
import numpy as np
|
23 |
|
24 |
+
# Çevirmen nesnesi oluştur
|
25 |
+
translator = Translator()
|
|
|
26 |
|
27 |
+
title = "# 🙋🏻♂️🌟Tonic'in 🌋📹LLaVA-Video'suna Hoş Geldiniz!"
|
28 |
+
description1 = """**🌋📹LLaVA-Video-7B-Qwen2**, 🌋📹LLaVA-Video-178K veri seti ve LLaVA-OneVision veri seti üzerinde eğitilmiş 7B parametreli bir modeldir. [**Qwen2 dil modeline dayanmaktadır**](https://huggingface.co/collections/Qwen/qwen2-6659360b33528ced941e557f) ve 32K tokene kadar bağlam penceresini destekler. Model, görüntüleri, çoklu görüntüleri ve videoları işleyebilir ve bunlarla etkileşime girebilir, video analizi için özel optimizasyonlara sahiptir.
|
29 |
+
Bu model, görsel girdi için **SO400M görüş omurgasını** ve dil işleme için Qwen2'yi kullanır, bu da onu görsel ve video tabanlı görevler de dahil olmak üzere çoklu modal akıl yürütmede oldukça verimli kılar.
|
30 |
+
🌋📹LLaVA-Video'nun [32B](https://huggingface.co/lmms-lab/LLaVA-NeXT-Video-32B-Qwen) ve [72B](https://huggingface.co/lmms-lab/LLaVA-Video-72B-Qwen2) daha büyük varyantları ve [sadece yeni sentetik veriler üzerinde eğitilmiş bir varyantı](https://huggingface.co/lmms-lab/LLaVA-Video-7B-Qwen2-Video-Only) bulunmaktadır.
|
31 |
+
Daha fazla detay için lütfen [Proje Sayfasını](https://github.com/LLaVA-VL/LLaVA-NeXT) ziyaret edin veya ilgili [araştırma makalesine](https://arxiv.org/abs/2410.02713) göz atın.
|
32 |
+
- **Mimari**: `LlavaQwenForCausalLM`
|
33 |
+
- **Dikkat Başlıkları**: 28
|
34 |
+
- **Gizli Katmanlar**: 28
|
35 |
+
- **Gizli Boyut**: 3584
|
36 |
+
"""
|
37 |
+
description2 = """
|
38 |
+
- **Ara Boyut**: 18944
|
39 |
+
- **Desteklenen Maksimum Kare Sayısı**: 64
|
40 |
+
- **Desteklenen Diller**: İngilizce, Çince
|
41 |
+
- **Görüntü En-Boy Oranı**: `anyres_max_9`
|
42 |
+
- **Görüntü Çözünürlüğü**: Çeşitli ızgara çözünürlükleri
|
43 |
+
- **Maksimum Konum Gömmeleri**: 32,768
|
44 |
+
- **Kelime Dağarcığı Boyutu**: 152,064
|
45 |
+
- **Model Hassasiyeti**: bfloat16
|
46 |
+
- **Eğitim İçin Kullanılan Donanım**: 256 * Nvidia Tesla A100 GPU'ları
|
47 |
+
"""
|
48 |
+
|
49 |
+
join_us = """
|
50 |
+
## Bize Katılın:
|
51 |
+
🌟TeamTonic🌟 her zaman harika demolar yapıyor! Aktif geliştirici 🛠️topluluğumuza 👻 katılın [![Discord'da bize katılın](https://img.shields.io/discord/1109943800132010065?label=Discord&logo=discord&style=flat-square)](https://discord.gg/qdfnvSPcqP) 🤗Huggingface'de:[MultiTransformer](https://huggingface.co/MultiTransformer) 🌐Github'da: [Tonic-AI](https://github.com/tonic-ai) & 🌟 [Build Tonic](https://git.tonic-ai.com/contribute)'e katkıda bulunun 🤗 Yuvi Sharma ve Huggingface'deki herkese topluluk hibesi için çok teşekkürler 🤗
|
52 |
+
"""
|
53 |
+
|
54 |
+
def load_video(video_path, max_frames_num, fps=1, force_sample=False):
|
55 |
+
if max_frames_num == 0:
|
56 |
+
return np.zeros((1, 336, 336, 3))
|
57 |
+
vr = VideoReader(video_path, ctx=cpu(0), num_threads=1)
|
58 |
total_frame_num = len(vr)
|
59 |
+
video_time = total_frame_num / vr.get_avg_fps()
|
60 |
+
fps = round(vr.get_avg_fps()/fps)
|
61 |
+
frame_idx = [i for i in range(0, len(vr), fps)]
|
62 |
+
frame_time = [i/fps for i in frame_idx]
|
63 |
+
if len(frame_idx) > max_frames_num or force_sample:
|
64 |
+
sample_fps = max_frames_num
|
65 |
+
uniform_sampled_frames = np.linspace(0, total_frame_num - 1, sample_fps, dtype=int)
|
66 |
+
frame_idx = uniform_sampled_frames.tolist()
|
67 |
+
frame_time = [i/vr.get_avg_fps() for i in frame_idx]
|
68 |
+
frame_time = ",".join([f"{i:.2f}s" for i in frame_time])
|
69 |
+
spare_frames = vr.get_batch(frame_idx).asnumpy()
|
70 |
+
return spare_frames, frame_time, video_time
|
71 |
|
72 |
# Model yükleme
|
73 |
pretrained = "lmms-lab/LLaVA-Video-7B-Qwen2"
|
74 |
model_name = "llava_qwen"
|
75 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
76 |
+
device_map = "auto"
|
77 |
|
78 |
print("Model yükleniyor...")
|
79 |
+
tokenizer, model, image_processor, max_length = load_pretrained_model(pretrained, None, model_name, torch_dtype="bfloat16", device_map=device_map)
|
80 |
model.eval()
|
81 |
print("Model başarıyla yüklendi!")
|
82 |
|
83 |
+
@spaces.GPU
|
84 |
+
def process_video(video_path, question):
|
85 |
+
max_frames_num = 64
|
86 |
+
video, frame_time, video_time = load_video(video_path, max_frames_num, 1, force_sample=True)
|
87 |
+
video = image_processor.preprocess(video, return_tensors="pt")["pixel_values"].to(device).bfloat16()
|
88 |
+
video = [video]
|
89 |
+
|
90 |
+
conv_template = "qwen_1_5"
|
91 |
+
time_instruction = f"Video {video_time:.2f} saniye sürmektedir ve {len(video[0])} kare uniform olarak örneklenmiştir. Bu kareler {frame_time} konumlarında bulunmaktadır. Lütfen bu videoyla ilgili aşağıdaki soruları cevaplayın."
|
92 |
|
93 |
+
# Soruyu İngilizce'ye çevir
|
94 |
+
question_en = translator.translate(question, dest='en').text
|
95 |
+
full_question = DEFAULT_IMAGE_TOKEN + f"{time_instruction}\n{question_en}"
|
96 |
|
97 |
+
conv = copy.deepcopy(conv_templates[conv_template])
|
98 |
+
conv.append_message(conv.roles[0], full_question)
|
99 |
conv.append_message(conv.roles[1], None)
|
100 |
+
prompt_question = conv.get_prompt()
|
101 |
|
102 |
+
input_ids = tokenizer_image_token(prompt_question, tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(device)
|
103 |
|
104 |
with torch.no_grad():
|
105 |
output = model.generate(
|
106 |
input_ids,
|
107 |
+
images=video,
|
108 |
modalities=["video"],
|
109 |
do_sample=False,
|
110 |
temperature=0,
|
111 |
+
max_new_tokens=4096,
|
112 |
)
|
113 |
|
114 |
response = tokenizer.batch_decode(output, skip_special_tokens=True)[0].strip()
|
115 |
+
|
116 |
+
# Cevabı Türkçe'ye çevir
|
117 |
+
response_tr = translator.translate(response, dest='tr').text
|
118 |
+
return response_tr
|
119 |
|
120 |
+
def gradio_interface(video_file, question):
|
121 |
if video_file is None:
|
122 |
return "Lütfen bir video dosyası yükleyin."
|
123 |
+
response = process_video(video_file, question)
|
124 |
+
return response
|
125 |
|
126 |
with gr.Blocks() as demo:
|
127 |
gr.Markdown(title)
|
|
|
|
|
128 |
with gr.Row():
|
129 |
+
with gr.Group():
|
130 |
+
gr.Markdown(description1)
|
131 |
+
with gr.Group():
|
132 |
+
gr.Markdown(description2)
|
133 |
+
with gr.Accordion("Bize Katılın", open=False):
|
134 |
+
gr.Markdown(join_us)
|
135 |
+
with gr.Row():
|
136 |
+
with gr.Column():
|
137 |
+
video_input = gr.Video()
|
138 |
+
question_input = gr.Textbox(label="🙋🏻♂️Kullanıcı Sorusu", placeholder="Video hakkında bir soru sorun...")
|
139 |
+
submit_button = gr.Button("🌋📹LLaVA-Video'ya Sor")
|
140 |
+
output = gr.Textbox(label="🌋📹LLaVA-Video")
|
141 |
|
142 |
+
submit_button.click(
|
143 |
+
fn=gradio_interface,
|
144 |
+
inputs=[video_input, question_input],
|
145 |
+
outputs=output
|
146 |
+
)
|
147 |
|
148 |
if __name__ == "__main__":
|
149 |
+
demo.launch(show_error=True)
|