metek7 commited on
Commit
a0ec7ec
1 Parent(s): 9924877

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +103 -58
app.py CHANGED
@@ -1,104 +1,149 @@
 
 
1
  import subprocess
2
- import sys
3
-
4
- def install(package):
5
- subprocess.check_call([sys.executable, "-m", "pip", "install", package])
6
 
7
- # Gerekli kütüphaneleri yükle
8
- required_packages = [
9
- "torch",
10
- "gradio",
11
- "transformers",
12
- "pillow",
13
- "decord",
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
- title = "# 📸 Instagram Reels Analiz Aracı"
37
- description = """Bu araç, yüklenen Instagram Reels videolarını analiz eder ve içeriği özetler.
38
- Video hakkında genel bir açıklama yapar ve klipte neler olup bittiğini adım adım anlatır."""
39
 
40
- def load_video(video_path, max_frames_num=64, fps=1):
41
- vr = VideoReader(video_path, ctx=cpu(0))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  total_frame_num = len(vr)
43
- frame_idx = list(range(0, total_frame_num, int(vr.get_avg_fps() / fps)))
44
-
45
- if len(frame_idx) > max_frames_num:
46
- frame_idx = np.linspace(0, total_frame_num - 1, max_frames_num, dtype=int).tolist()
47
-
48
- video_frames = vr.get_batch(frame_idx).asnumpy()
49
- return video_frames, len(frame_idx)
 
 
 
 
 
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="auto")
58
  model.eval()
59
  print("Model başarıyla yüklendi!")
60
 
61
- def analyze_reel(video_path):
62
- video_frames, frame_count = load_video(video_path)
63
- video = image_processor.preprocess(video_frames, return_tensors="pt")["pixel_values"].to(device).bfloat16()
 
 
 
 
 
 
64
 
65
- prompt = f"{DEFAULT_IMAGE_TOKEN}Bu Instagram Reels videosunu analiz et. Önce videonun genel içeriğini özetle, ardından klipte neler olup bittiğini adım adım açıkla. Video {frame_count} kareye bölünmüştür."
 
 
66
 
67
- conv = copy.deepcopy(conv_templates["qwen_1_5"])
68
- conv.append_message(conv.roles[0], prompt)
69
  conv.append_message(conv.roles[1], None)
70
- prompt = conv.get_prompt()
71
 
72
- input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(device)
73
 
74
  with torch.no_grad():
75
  output = model.generate(
76
  input_ids,
77
- images=[video],
78
  modalities=["video"],
79
  do_sample=False,
80
  temperature=0,
81
- max_new_tokens=1024,
82
  )
83
 
84
  response = tokenizer.batch_decode(output, skip_special_tokens=True)[0].strip()
85
- return response
 
 
 
86
 
87
- def gradio_interface(video_file):
88
  if video_file is None:
89
  return "Lütfen bir video dosyası yükleyin."
90
- return analyze_reel(video_file)
 
91
 
92
  with gr.Blocks() as demo:
93
  gr.Markdown(title)
94
- gr.Markdown(description)
95
-
96
  with gr.Row():
97
- video_input = gr.Video(label="Instagram Reels Videosu")
98
- output = gr.Textbox(label="Analiz Sonucu", lines=10)
 
 
 
 
 
 
 
 
 
 
99
 
100
- analyze_button = gr.Button("Reels'i Analiz Et")
101
- analyze_button.click(fn=gradio_interface, inputs=video_input, outputs=output)
 
 
 
102
 
103
  if __name__ == "__main__":
104
- demo.launch(share=True)
 
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)