rafael1994s commited on
Commit
f56e13c
·
verified ·
1 Parent(s): 07301ed

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -45
app.py CHANGED
@@ -1,7 +1,9 @@
 
1
  import sys
2
  import torchvision.transforms.functional as F
3
  sys.modules['torchvision.transforms.functional_tensor'] = F
4
 
 
5
  import os
6
  import torch
7
  import spaces
@@ -9,23 +11,21 @@ import gradio as gr
9
  from PIL import Image
10
  from transformers import AutoModelForCausalLM, AutoProcessor
11
 
 
12
  MODEL_ID = "zai-org/VisionReward-Video"
13
 
14
- # Загружаем процессор
15
  processor = AutoProcessor.from_pretrained(MODEL_ID, trust_remote_code=True)
16
 
17
- @spaces.GPU(duration=180)
18
- def analyze_app_screenshot(image, prompt):
19
- if image is None: return "Загрузите скриншот!"
20
-
21
- # Промпт для глубокого анализа (Checklist)
22
- system_prompt = (
23
- "Analyze this mobile app screenshot based on: "
24
- "1. Visual Quality (Aesthetics), 2. Usability (UI/UX), 3. Text Clarity. "
25
- "Provide a score for each."
26
- )
27
- if not prompt: prompt = system_prompt
28
 
 
29
  model = AutoModelForCausalLM.from_pretrained(
30
  MODEL_ID,
31
  dtype=torch.bfloat16,
@@ -33,50 +33,48 @@ def analyze_app_screenshot(image, prompt):
33
  device_map="cuda"
34
  )
35
 
 
36
  inputs = processor(images=image, text=prompt, return_tensors="pt").to("cuda")
37
 
 
38
  with torch.no_grad():
39
- # Генерируем ответ (т.к. это CausalLM, она должна "написать" вердикт)
40
- output_ids = model.generate(
41
- **inputs,
42
- max_new_tokens=150,
43
- do_sample=False,
44
- temperature=0.1
45
- )
46
- # Убираем входные токены из ответа
47
- response = processor.decode(output_ids[0][inputs['input_ids'].shape[1]:], skip_special_tokens=True)
48
-
49
- # Также пробуем достать чистый Reward Score (для общего рейтинга)
50
  try:
51
- reward_score = model.get_reward(**inputs).mean().item()
52
- final_reward = f"{reward_score:.4f}"
53
- except:
54
- final_reward = "N/A"
55
-
56
- # Форматируем вывод
57
- result = f"### 🏆 Общий Score: {final_reward}\n\n"
58
- result += f"### 📝 Детальный разбор:\n{response}"
59
-
60
- return result
 
 
61
 
62
- # Интерфейс
63
- with gr.Blocks(theme=gr.themes.Soft()) as demo:
64
- gr.Markdown("# 📱 VisionReward: App Store Optimization Analyzer")
65
- gr.Markdown("Модель оценивает ваш скриншот по критериям качества, юзабилити и читаемости.")
66
 
67
  with gr.Row():
68
  with gr.Column():
69
- img_input = gr.Image(type="pil", label="Скриншот вашего приложения")
70
- custom_prompt = gr.Textbox(
71
- label="Доп. инструкции (необязательно)",
72
- placeholder="На чем сфокусироваться?",
73
- value=""
74
  )
75
- btn = gr.Button("Запустить глубокий анализ", variant="primary")
76
 
77
  with gr.Column():
78
- output_md = gr.Markdown(label="Анализ нейросети")
79
 
80
- btn.click(fn=analyze_app_screenshot, inputs=[img_input, custom_prompt], outputs=output_md)
 
 
 
 
81
 
 
82
  demo.launch()
 
1
+ # === 1. ПАТЧ ДЛЯ ИСПРАВЛЕНИЯ ОШИБКИ PYTORCHVIDEO (НЕ ДВИГАТЬ!) ===
2
  import sys
3
  import torchvision.transforms.functional as F
4
  sys.modules['torchvision.transforms.functional_tensor'] = F
5
 
6
+ # === 2. ОСНОВНЫЕ ИМПОРТЫ ===
7
  import os
8
  import torch
9
  import spaces
 
11
  from PIL import Image
12
  from transformers import AutoModelForCausalLM, AutoProcessor
13
 
14
+ # === 3. НАСТРОЙКИ ===
15
  MODEL_ID = "zai-org/VisionReward-Video"
16
 
17
+ # Загружаем процессор один раз (он легкий и скачается быстро)
18
  processor = AutoProcessor.from_pretrained(MODEL_ID, trust_remote_code=True)
19
 
20
+ # === 4. ФУНКЦИЯ ИНФЕРЕНСА (ZeroGPU) ===
21
+ @spaces.GPU(duration=180) # 3 минуты на загрузку 25ГБ и расчет
22
+ def predict_ctr(image, prompt):
23
+ if image is None:
24
+ return "Ошибка: загрузите изображение"
25
+ if not prompt:
26
+ prompt = "high quality mobile app screenshot"
 
 
 
 
27
 
28
+ # Загружаем тяжелую модель прямо в видеокарту
29
  model = AutoModelForCausalLM.from_pretrained(
30
  MODEL_ID,
31
  dtype=torch.bfloat16,
 
33
  device_map="cuda"
34
  )
35
 
36
+ # Подготовка картинки и текста
37
  inputs = processor(images=image, text=prompt, return_tensors="pt").to("cuda")
38
 
39
+ # Расчет Score
40
  with torch.no_grad():
 
 
 
 
 
 
 
 
 
 
 
41
  try:
42
+ # Специфичный метод для VisionReward
43
+ score = model.get_reward(**inputs)
44
+ except Exception:
45
+ # Если get_reward не сработал, пробуем стандартный прогон
46
+ outputs = model(**inputs)
47
+ score = outputs.logits if hasattr(outputs, 'logits') else outputs[0]
48
+
49
+ # Пытаемся вернуть красивое число
50
+ try:
51
+ return f"Скор (чем выше, тем лучше): {float(score):.4f}"
52
+ except Exception:
53
+ return f"Скор (сырой формат): {score}"
54
 
55
+ # === 5. ИНТЕРФЕЙС GRADIO ===
56
+ with gr.Blocks() as demo:
57
+ gr.Markdown("# 🚀 VisionReward ASO Predictor")
58
+ gr.Markdown("Оценка скриншотов для App Store. Модель весит 25 ГБ, первый расчет может занять около минуты.")
59
 
60
  with gr.Row():
61
  with gr.Column():
62
+ img_input = gr.Image(type="pil", label="Скриншот приложения")
63
+ prompt_input = gr.Textbox(
64
+ label="Что мы оцениваем? (Prompt)",
65
+ placeholder="Напр: clean UI, high conversion",
66
+ value="high quality mobile app screenshot with clean UI"
67
  )
68
+ submit_btn = gr.Button("Рассчитать привлекательность", variant="primary")
69
 
70
  with gr.Column():
71
+ output_text = gr.Textbox(label="Результат нейросети")
72
 
73
+ submit_btn.click(
74
+ fn=predict_ctr,
75
+ inputs=[img_input, prompt_input],
76
+ outputs=output_text
77
+ )
78
 
79
+ # Запуск
80
  demo.launch()