Tojichok commited on
Commit
2f100f2
·
verified ·
1 Parent(s): 4f21d5b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -18
app.py CHANGED
@@ -1,51 +1,64 @@
1
- import os, io, requests
 
 
2
  import gradio as gr
3
  from PIL import Image
4
  import torch
5
  from transformers import Blip2Processor, Blip2ForConditionalGeneration
6
 
7
- # 1) Загружаем BLIP-2
8
- model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b", torch_dtype=torch.float16).to("cuda")
 
 
 
 
 
 
 
 
9
  processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
10
 
11
- # 2) TMDb API
12
  TMDB_KEY = os.environ.get("TMDB_API_KEY", "")
13
  TMDB_SEARCH_URL = "https://api.themoviedb.org/3/search/movie"
14
 
15
  def caption_and_search(image: Image.Image, dummy):
16
  """
17
- 1) Генерируем описательную подпись BLIP-2
18
- 2) По этой подписи ищем в TMDb title + ссылку
19
  """
20
- # ——— Генерация подписи ———
21
- inputs = processor(images=image, return_tensors="pt").to(model.device)
22
- gen = model.generate(**inputs, max_new_tokens=50)
 
23
  caption = processor.decode(gen[0], skip_special_tokens=True)
24
 
25
- # ——— Поиск по TMDb ———
26
  params = {"api_key": TMDB_KEY, "query": caption}
27
  resp = requests.get(TMDB_SEARCH_URL, params=params).json()
28
  results = []
29
  for m in resp.get("results", [])[:3]:
30
- title = m.get("title")
31
- url = f"https://www.themoviedb.org/movie/{m['id']}"
32
- results.append({"title": title, "url": url})
 
 
33
  return {"caption": caption, "results": results}
34
 
35
- # 3) Интерфейс Gradio
36
  iface = gr.Interface(
37
  fn=caption_and_search,
38
  inputs=[
39
  gr.Image(type="pil", label="Постер/кадр фильма"),
40
- gr.Textbox(visible=False) # второй аргумент не нужен, но Gradio требует
41
  ],
42
  outputs=[
43
  gr.Textbox(label="Generated Caption"),
44
  gr.JSON(label="Top 3 Matches (title + link)")
45
  ],
46
- title="Movie Poster Caption & Search",
47
- description="BLIP-2 TMDb search: получаем описание и ссылки на фильмы"
48
  )
49
 
50
  if __name__ == "__main__":
51
- iface.launch()
 
 
1
+ import os
2
+ import io
3
+ import requests
4
  import gradio as gr
5
  from PIL import Image
6
  import torch
7
  from transformers import Blip2Processor, Blip2ForConditionalGeneration
8
 
9
+ # 1) Определяем устройство: CUDA, если доступно, иначе CPU
10
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
11
+ print(f"Using device: {device}")
12
+
13
+ # 2) Загружаем BLIP-2 в float32 и сразу в нужное устройство
14
+ model = Blip2ForConditionalGeneration.from_pretrained(
15
+ "Salesforce/blip2-opt-2.7b",
16
+ torch_dtype=torch.float32, # float16 убираем
17
+ low_cpu_mem_usage=True # помогает снизить пиковую нагрузку CPU
18
+ ).to(device)
19
  processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
20
 
21
+ # 3) TMDb API
22
  TMDB_KEY = os.environ.get("TMDB_API_KEY", "")
23
  TMDB_SEARCH_URL = "https://api.themoviedb.org/3/search/movie"
24
 
25
  def caption_and_search(image: Image.Image, dummy):
26
  """
27
+ 1) Генерируем подпись BLIP-2 на CPU
28
+ 2) По этой подписи ищем в TMDb top-3 фильма
29
  """
30
+ # — Конвертируем PIL.Image в тензор
31
+ inputs = processor(images=image, return_tensors="pt").to(device)
32
+ with torch.no_grad():
33
+ gen = model.generate(**inputs, max_new_tokens=50)
34
  caption = processor.decode(gen[0], skip_special_tokens=True)
35
 
36
+ # — Поиск по TMDb
37
  params = {"api_key": TMDB_KEY, "query": caption}
38
  resp = requests.get(TMDB_SEARCH_URL, params=params).json()
39
  results = []
40
  for m in resp.get("results", [])[:3]:
41
+ results.append({
42
+ "title": m.get("title"),
43
+ "url": f"https://www.themoviedb.org/movie/{m['id']}"
44
+ })
45
+
46
  return {"caption": caption, "results": results}
47
 
 
48
  iface = gr.Interface(
49
  fn=caption_and_search,
50
  inputs=[
51
  gr.Image(type="pil", label="Постер/кадр фильма"),
52
+ gr.Textbox(visible=False) # второй аргумент обязателен, но не используется
53
  ],
54
  outputs=[
55
  gr.Textbox(label="Generated Caption"),
56
  gr.JSON(label="Top 3 Matches (title + link)")
57
  ],
58
+ title="Movie Poster Caption & Search (CPU‑Only)",
59
+ description="BLIP2 на CPU + TMDb описание и ссылки на фильмы"
60
  )
61
 
62
  if __name__ == "__main__":
63
+ # Для публичной ссылки
64
+ iface.launch(share=True)