ESMATUGBA commited on
Commit
6cbfd2e
·
verified ·
1 Parent(s): 29b4938

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -54
app.py CHANGED
@@ -4,36 +4,31 @@ from scipy import spatial
4
  import random
5
  import os
6
 
7
- # --- 1. SAYFA YAPISI VE CSS (Titremeyi Engellemek İçin En Önemli Kısım) ---
8
  st.set_page_config(page_title="CastMatch AI", layout="wide")
9
-
10
- # Resim kutusunun zıplamasını engelleyen özel CSS
11
  st.markdown("""
12
  <style>
13
- .stImage > img {
14
- border-radius: 10px;
15
- max-height: 450px;
16
- object-fit: cover;
17
- }
18
- div[data-testid="stVerticalBlock"] > div:has(div.stImage) {
19
- min-height: 450px;
20
  }
21
  </style>
22
  """, unsafe_allow_html=True)
23
 
24
- # --- 2. VERİ VE MODEL (Cache/Önbellek) ---
25
  @st.cache_resource
26
- def load_model():
27
  try:
28
  with open('movie_model.pkl', 'rb') as f:
29
  return pickle.load(f)
30
  except:
31
  return None
32
 
33
- model_data = load_model()
34
  movie_dict = model_data['movie_dict'] if model_data else {}
35
 
36
- # Veritabanı (Sabit tutuldu)
37
  tum_unlu_verileri = {
38
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
39
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
@@ -74,57 +69,88 @@ tum_unlu_verileri = {
74
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
75
  }
76
 
77
- # --- 3. DOSYA TARAMA (Cache/Önbellek) ---
78
- @st.cache_data
79
- def get_images():
80
- return [f for f in os.listdir(os.getcwd()) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
 
82
- all_images = get_images()
83
 
84
- # Mevcut olanları filtrele
85
- unlu_verileri = {}
86
- for n, v in tum_unlu_verileri.items():
87
- if any(n.lower().replace(" ","_") in f.lower() or n.lower() in f.lower() for f in all_images):
88
- unlu_verileri[n] = v
89
 
90
- # --- 4. ARAYÜZ ---
91
- st.title("🎬 CastMatch AI")
 
92
  st.markdown("---")
93
 
94
  col_actor, col_match = st.columns([1, 2])
95
 
96
- # Sidebar Kategorisi
97
- gender = st.sidebar.radio("Category / Kategori:", ["Male / Erkek", "Female / Kadın"], key="g_radio")
98
- names = [n for n, d in unlu_verileri.items() if d['c'] == gender]
99
-
100
  with col_actor:
101
- st.subheader("👤 Cast / Oyuncu")
102
- # INDEX kullanarak seçimi sabitlemek titremeyi azaltır
103
- actor = st.selectbox("Select / Seç:", names if names else ["-"], key="act_select")
104
-
105
- # Resim alanı için sabit bir placeholder
106
- placeholder = st.empty()
107
 
108
- if actor != "-":
109
- target = actor.lower().replace(" ","_")
110
- target_alt = actor.lower()
111
- img_file = next((f for f in all_images if f.lower().startswith(target) or f.lower().startswith(target_alt)), None)
112
-
113
- if img_file:
114
- placeholder.image(img_file, use_container_width=True)
 
 
 
 
 
 
 
115
 
116
  with col_match:
117
- st.subheader("🎯 Matches / Eşleşmeler")
118
- if st.button("🚀 Match / Eşleştir", key="m_btn") and actor != "-":
 
 
 
119
  if movie_dict:
120
- vec = unlu_verileri[actor]['v']
121
- res = []
122
  for i in movie_dict:
123
- d = spatial.distance.cosine(vec, movie_dict[i][1][:6]) + random.uniform(0, 0.00001)
124
- res.append((movie_dict[i][0], d))
 
125
 
126
- top = sorted(res, key=lambda x: x[1])[:5]
127
- for i, (f, s) in enumerate(top, 1):
128
- p = round((1-s)*100, 1)
129
- st.success(f"**{i}. {f}** (%{p})")
130
- st.progress(p/100)
 
 
 
 
 
 
 
4
  import random
5
  import os
6
 
7
+ # --- TİTREMEYİ ÖNLEYİCİ CSS (Arayüz yapını bozmaz, sadece sabitler) ---
8
  st.set_page_config(page_title="CastMatch AI", layout="wide")
 
 
9
  st.markdown("""
10
  <style>
11
+ /* Resim kutusunun boyutunu sabitleyerek sayfanın zıplamasını engeller */
12
+ [data-testid="stImage"] img {
13
+ max-height: 400px;
14
+ object-fit: contain;
 
 
 
15
  }
16
  </style>
17
  """, unsafe_allow_html=True)
18
 
19
+ # 1. MODELİ YÜKLE (Cache eklendi: Dosyayı her saniye okumasını engeller)
20
  @st.cache_resource
21
+ def load_data():
22
  try:
23
  with open('movie_model.pkl', 'rb') as f:
24
  return pickle.load(f)
25
  except:
26
  return None
27
 
28
+ model_data = load_data()
29
  movie_dict = model_data['movie_dict'] if model_data else {}
30
 
31
+ # 2. TÜM OYUNCU DNA VERİTABANI (Senin orijinal verilerin)
32
  tum_unlu_verileri = {
33
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
34
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
 
69
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
70
  }
71
 
72
+ # --- DİNAMİK FİLTRELEME ---
73
+ resim_klasoru = os.getcwd() # Hugging Face için ana dizine ayarlandı
74
+
75
+ @st.cache_data # Dosya sistemini sürekli taramasını engeller
76
+ def klasordeki_unluleri_getir():
77
+ mevcut_unlular = {}
78
+ dosyalar = [f.lower() for f in os.listdir(resim_klasoru)]
79
+ for isim, veri in tum_unlu_verileri.items():
80
+ search_pattern1 = isim.lower().replace(" ", "_")
81
+ search_pattern2 = isim.lower()
82
+ if any(search_pattern1 in d or search_pattern2 in d for d in dosyalar if d.endswith(('.jpg', '.png', '.jpeg'))):
83
+ mevcut_unlular[isim] = veri
84
+ return mevcut_unlular
85
+
86
+ unlu_verileri = klasordeki_unluleri_getir()
87
+
88
+ # --- SOL PANEL (SIDEBAR) ---
89
+ st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
90
+ st.sidebar.markdown("---")
91
+
92
+ gender_choice = st.sidebar.radio(
93
+ "1. Select Category / Kategori Seçin:",
94
+ ["Male / Erkek", "Female / Kadın"],
95
+ key="gender_radio" # Sabit key titremeyi azaltır
96
+ )
97
 
98
+ filtered_names = [name for name, data in unlu_verileri.items() if data['c'] == gender_choice]
99
 
100
+ st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
101
+ if not filtered_names:
102
+ st.sidebar.warning("Bu kategoride resim bulunamadı.")
103
+ for n in filtered_names:
104
+ st.sidebar.write(f"• {n}")
105
 
106
+ # --- ANA EKRAN ---
107
+ st.title("🎬 CastMatch AI: Talent Matching System")
108
+ st.markdown("#### Discover the perfect roles for global stars!")
109
  st.markdown("---")
110
 
111
  col_actor, col_match = st.columns([1, 2])
112
 
 
 
 
 
113
  with col_actor:
114
+ st.subheader("👤 Pick an Actor / Oyuncu Seç")
115
+ selected_actor = st.selectbox("Select from list:", filtered_names if filtered_names else ["Yok"], key="actor_select")
 
 
 
 
116
 
117
+ # Resim kutusu (boşluk titremesini engellemek için container içine alındı)
118
+ with st.container():
119
+ if selected_actor != "Yok":
120
+ found_path = None
121
+ search_target = selected_actor.replace(" ", "_").lower()
122
+ for f in os.listdir(resim_klasoru):
123
+ if f.lower().startswith(search_target) or selected_actor.lower() in f.lower():
124
+ found_path = os.path.join(resim_klasoru, f)
125
+ break
126
+
127
+ if found_path:
128
+ st.image(found_path, caption=f"Profile: {selected_actor}", use_container_width=True)
129
+ else:
130
+ st.error("Resim yüklenemedi.")
131
 
132
  with col_match:
133
+ st.subheader("🎯 Best Career Matches")
134
+ st.write("Comparing the star's DNA with movie roles...")
135
+
136
+ # Buton ve sonuçlar
137
+ if st.button("🚀 Match and Recommend", key="match_button") and selected_actor != "Yok":
138
  if movie_dict:
139
+ actor_v = unlu_verileri[selected_actor]['v']
140
+ results = []
141
  for i in movie_dict:
142
+ noise = random.uniform(0, 0.0001)
143
+ dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + noise
144
+ results.append((movie_dict[i][0], dist))
145
 
146
+ top_matches = sorted(results, key=lambda x: x[1])[:5]
147
+ for i, (film, score) in enumerate(top_matches, 1):
148
+ pct = round((1 - score) * 100, 1)
149
+ st.success(f"**{i}. {film}**")
150
+ st.write(f"Match Score: **%{pct}**")
151
+ st.progress(pct / 100)
152
+ else:
153
+ st.error("Model dosyası eksik!")
154
+
155
+ st.markdown("---")
156
+ st.info("💡 **How it works?**: This AI analyzes career vectors based on available local assets.")