ESMATUGBA commited on
Commit
44edb92
·
verified ·
1 Parent(s): 0c80a7c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -48
app.py CHANGED
@@ -4,20 +4,22 @@ from scipy import spatial
4
  import random
5
  import os
6
 
7
- # 1. MODELİ YÜKLE
 
 
 
8
  @st.cache_resource
9
- def load_data():
10
  try:
11
- # Hugging Face ana dizinindeki pkl dosyasını okur
12
  with open('movie_model.pkl', 'rb') as f:
13
  return pickle.load(f)
14
- except:
15
  return None
16
 
17
- model_data = load_data()
18
  movie_dict = model_data['movie_dict'] if model_data else {}
19
 
20
- # 2. OYUNCU DNA VERİTABANI
21
  tum_unlu_verileri = {
22
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
23
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
@@ -58,90 +60,102 @@ tum_unlu_verileri = {
58
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
59
  }
60
 
61
- # --- DİNAMİK FİLTRELEME ---
62
- # Resimler klasörde değil, ana dizinde olduğu için "." (getcwd) kullanıyoruz
63
- resim_klasoru = os.getcwd()
 
 
 
64
 
65
- def klasordeki_unluleri_getir():
 
66
  mevcut_unlular = {}
67
- dosyalar = [f.lower() for f in os.listdir(resim_klasoru)]
68
- for isim, veri in tum_unlu_verileri.items():
69
- # Dosya isimlerindeki boşluk/alt tire farkını tolore ediyoruz
70
- search_pattern1 = isim.lower().replace(" ", "_")
71
- search_pattern2 = isim.lower()
72
- if any(search_pattern1 in d or search_pattern2 in d for d in dosyalar if d.endswith(('.jpg', '.png', '.jpeg'))):
73
- mevcut_unlular[isim] = veri
74
  return mevcut_unlular
75
 
76
- unlu_verileri = klasordeki_unluleri_getir()
77
 
78
- # --- ARAYÜZ AYARLARI ---
79
- st.set_page_config(page_title="CastMatch AI", layout="wide")
 
 
80
 
81
- # --- SOL PANEL (SIDEBAR) ---
82
  st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
83
- st.sidebar.markdown("---")
84
-
85
  gender_choice = st.sidebar.radio(
86
  "1. Select Category / Kategori Seçin:",
87
- ["Male / Erkek", "Female / Kadın"]
 
88
  )
89
 
90
  filtered_names = [name for name, data in unlu_verileri.items() if data['c'] == gender_choice]
91
 
92
- st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
93
  if not filtered_names:
94
- st.sidebar.warning("Bu kategoride resim bulunamadı. / No images found.")
95
- for n in filtered_names:
96
- st.sidebar.write(f"• {n}")
97
-
98
- # --- ANA EKRAN ---
99
- st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
100
- st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
101
- st.markdown("---")
102
 
 
103
  col_actor, col_match = st.columns([1, 2])
104
 
105
  with col_actor:
106
  st.subheader("👤 Pick an Actor / Oyuncu Seç")
107
- selected_actor = st.selectbox("Select from list / Listeden seçin:", filtered_names if filtered_names else ["Yok"])
 
 
 
 
 
 
 
108
 
109
  if selected_actor != "Yok":
110
- found_path = None
111
- search_targets = [selected_actor.lower().replace(" ", "_"), selected_actor.lower()]
 
 
112
 
113
- # Ana dizindeki tüm dosyaları tara
114
- for f in os.listdir(resim_klasoru):
115
- if any(f.lower().startswith(target) for target in search_targets):
116
- found_path = os.path.join(resim_klasoru, f)
117
  break
118
 
119
- if found_path:
120
- st.image(found_path, caption=f"Profile: {selected_actor}", use_container_width=True)
121
- else:
122
- st.error("Resim bulunamadı. / Image not found.")
 
123
 
124
  with col_match:
125
  st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
126
- st.write("Comparing the star's DNA with movie roles... / Yıldızın DNA'sı film rolleriyle karşılaştırılıyor...")
127
 
128
- if st.button("🚀 Match and Recommend / Eşleştir ve Öner") and selected_actor != "Yok":
129
  if movie_dict:
130
  actor_v = unlu_verileri[selected_actor]['v']
131
  results = []
132
  for i in movie_dict:
133
- noise = random.uniform(0, 0.0001)
 
134
  dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + noise
135
  results.append((movie_dict[i][0], dist))
136
 
137
  top_matches = sorted(results, key=lambda x: x[1])[:5]
 
138
  for i, (film, score) in enumerate(top_matches, 1):
139
  pct = round((1 - score) * 100, 1)
140
  st.success(f"**{i}. {film}**")
141
  st.write(f"Match Score / Uyum Skoru: **%{pct}**")
142
  st.progress(pct / 100)
143
  else:
144
- st.error("Model Error / Model Hatası")
145
 
146
  st.markdown("---")
147
  st.info("💡 **How it works? / Nasıl çalışır?**: This AI analyzes career vectors based on available local assets. / Bu yapay zeka, mevcut yerel varlıklara dayanarak kariyer vektörlerini analiz eder.")
 
4
  import random
5
  import os
6
 
7
+ # --- SAYFA AYARLARI ---
8
+ st.set_page_config(page_title="CastMatch AI", layout="wide")
9
+
10
+ # --- 1. MODEL VE VERİ YÜKLEME (ÖNBELLEKLİ) ---
11
  @st.cache_resource
12
+ def load_model():
13
  try:
 
14
  with open('movie_model.pkl', 'rb') as f:
15
  return pickle.load(f)
16
+ except Exception as e:
17
  return None
18
 
19
+ model_data = load_model()
20
  movie_dict = model_data['movie_dict'] if model_data else {}
21
 
22
+ # Oyuncu DNA Veritabanı
23
  tum_unlu_verileri = {
24
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
25
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
 
60
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
61
  }
62
 
63
+ # --- 2. DOSYA VE RESİM TARAMA (HIZ İÇİN ÖNBELLEKLİ) ---
64
+ @st.cache_data
65
+ def get_available_images():
66
+ current_dir = os.getcwd()
67
+ files = os.listdir(current_dir)
68
+ return [f for f in files if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
69
 
70
+ def filter_actors_by_images():
71
+ available_files = get_available_images()
72
  mevcut_unlular = {}
73
+ for name, data in tum_unlu_verileri.items():
74
+ search_target = name.lower().replace(" ", "_")
75
+ search_target_alt = name.lower()
76
+ if any(search_target in f.lower() or search_target_alt in f.lower() for f in available_files):
77
+ mevcut_unlular[name] = data
 
 
78
  return mevcut_unlular
79
 
80
+ unlu_verileri = filter_actors_by_images()
81
 
82
+ # --- 3. ARAYÜZ ---
83
+ st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
84
+ st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
85
+ st.markdown("---")
86
 
87
+ # SOL PANEL
88
  st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
 
 
89
  gender_choice = st.sidebar.radio(
90
  "1. Select Category / Kategori Seçin:",
91
+ ["Male / Erkek", "Female / Kadın"],
92
+ key="gender_radio"
93
  )
94
 
95
  filtered_names = [name for name, data in unlu_verileri.items() if data['c'] == gender_choice]
96
 
97
+ st.sidebar.markdown("### 📋 Available Cast / Mevcut Oyuncular")
98
  if not filtered_names:
99
+ st.sidebar.warning("No images found in this category / Bu kategoride resim bulunamadı.")
100
+ else:
101
+ for n in filtered_names:
102
+ st.sidebar.write(f"• {n}")
 
 
 
 
103
 
104
+ # ANA EKRAN KOLONLARI
105
  col_actor, col_match = st.columns([1, 2])
106
 
107
  with col_actor:
108
  st.subheader("👤 Pick an Actor / Oyuncu Seç")
109
+ selected_actor = st.selectbox(
110
+ "Select from list / Listeden seçin:",
111
+ filtered_names if filtered_names else ["Yok"],
112
+ key="actor_select"
113
+ )
114
+
115
+ # Resim Alanı (Titremeyi önlemek için container kullanıyoruz)
116
+ img_container = st.container()
117
 
118
  if selected_actor != "Yok":
119
+ # Resmi bulalım
120
+ all_images = get_available_images()
121
+ search_target = selected_actor.lower().replace(" ", "_")
122
+ search_target_alt = selected_actor.lower()
123
 
124
+ found_file = None
125
+ for f in all_images:
126
+ if f.lower().startswith(search_target) or f.lower().startswith(search_target_alt):
127
+ found_file = f
128
  break
129
 
130
+ with img_container:
131
+ if found_file:
132
+ st.image(found_file, caption=f"Profile: {selected_actor}", use_container_width=True)
133
+ else:
134
+ st.error("Image not found / Resim bulunamadı.")
135
 
136
  with col_match:
137
  st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
138
+ st.write("Comparing DNA with roles... / DNA film rolleriyle karşılaştırılıyor...")
139
 
140
+ if st.button("🚀 Match and Recommend / Eşleştir ve Öner", key="match_btn") and selected_actor != "Yok":
141
  if movie_dict:
142
  actor_v = unlu_verileri[selected_actor]['v']
143
  results = []
144
  for i in movie_dict:
145
+ # Küçük bir noise ekleyerek sıralamanın her seferinde sağlıklı olmasını sağlıyoruz
146
+ noise = random.uniform(0, 0.00001)
147
  dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + noise
148
  results.append((movie_dict[i][0], dist))
149
 
150
  top_matches = sorted(results, key=lambda x: x[1])[:5]
151
+
152
  for i, (film, score) in enumerate(top_matches, 1):
153
  pct = round((1 - score) * 100, 1)
154
  st.success(f"**{i}. {film}**")
155
  st.write(f"Match Score / Uyum Skoru: **%{pct}**")
156
  st.progress(pct / 100)
157
  else:
158
+ st.error("Model not loaded / Model yüklenemedi.")
159
 
160
  st.markdown("---")
161
  st.info("💡 **How it works? / Nasıl çalışır?**: This AI analyzes career vectors based on available local assets. / Bu yapay zeka, mevcut yerel varlıklara dayanarak kariyer vektörlerini analiz eder.")