ESMATUGBA commited on
Commit
b0baed5
·
verified ·
1 Parent(s): 6a2dfee

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +90 -58
app.py CHANGED
@@ -1,11 +1,10 @@
1
  import streamlit as st
2
  import pickle
3
  from scipy import spatial
 
4
  import os
5
 
6
- # -------------------------------
7
- # 1. MODELİ YÜKLE
8
- # -------------------------------
9
  @st.cache_resource
10
  def load_data():
11
  try:
@@ -17,9 +16,8 @@ def load_data():
17
  model_data = load_data()
18
  movie_dict = model_data['movie_dict'] if model_data else {}
19
 
20
- # -------------------------------
21
- # 2. TÜM OYUNCU DNA VERİTABANI
22
- # -------------------------------
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,63 +58,97 @@ tum_unlu_verileri = {
60
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
61
  }
62
 
63
- # -------------------------------
64
- # RESİM KLASÖRÜ
65
- # -------------------------------
66
- resim_klasoru = os.path.join(os.getcwd(), "40 resim")
67
-
68
- def klasordeki_unluleri_getir():
69
- mevcut_unlular = {}
70
- if os.path.exists(resim_klasoru):
71
- dosyalar = [f.lower() for f in os.listdir(resim_klasoru)]
72
- for isim, veri in tum_unlu_verileri.items():
73
- search_pattern1 = isim.lower().replace(" ", "_")
74
- search_pattern2 = isim.lower()
75
- if any(search_pattern1 in d or search_pattern2 in d for d in dosyalar):
76
- mevcut_unlular[isim] = veri
77
- return mevcut_unlular
78
-
79
- unlu_verileri = klasordeki_unluleri_getir()
80
-
81
- # -------------------------------
82
- # UI
83
- # -------------------------------
84
  st.set_page_config(page_title="CastMatch AI", layout="wide")
85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
 
87
 
88
  gender_choice = st.sidebar.radio(
89
- "Kategori Seçin / Select Category",
90
  ["Male / Erkek", "Female / Kadın"]
91
  )
92
 
93
- filtered_names = [name for name, data in unlu_verileri.items() if data['c'] == gender_choice]
94
-
95
- st.title("🎬 CastMatch AI")
96
-
97
- col1, col2 = st.columns([1,2])
98
-
99
- with col1:
100
- selected_actor = st.selectbox("Oyuncu Seç / Select Actor", filtered_names if filtered_names else ["Yok"])
101
-
102
- if selected_actor != "Yok":
103
- for f in os.listdir(resim_klasoru):
104
- if selected_actor.lower().replace(" ","_") in f.lower():
105
- st.image(os.path.join(resim_klasoru, f))
106
- break
107
-
108
- with col2:
109
- if st.button("🚀 Eşleştir / Match"):
110
- actor_v = unlu_verileri[selected_actor]['v']
111
- results = []
112
-
113
- for i in movie_dict:
114
- dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6])
115
- score = (1 - dist) * 100
116
- results.append((movie_dict[i][0], score))
117
-
118
- top = sorted(results, key=lambda x: x[1], reverse=True)[:5]
119
-
120
- for film, score in top:
121
- st.write(f"{film} → %{round(score,1)}")
122
- st.progress(score/100)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
  import pickle
3
  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:
 
16
  model_data = load_data()
17
  movie_dict = model_data['movie_dict'] if model_data else {}
18
 
19
+ # --- 2. OYUNCU DNA VERİTABANI ---
20
+ # Sıralama Stallone ile başlar
 
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
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
59
  }
60
 
61
+ # --- ARAYÜZ AYARLARI ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  st.set_page_config(page_title="CastMatch AI", layout="wide")
63
 
64
+ @st.cache_data
65
+ def get_image_path(actor_name):
66
+ if not actor_name or actor_name == "Choose... / Seçiniz...":
67
+ return None
68
+ ana_dizin = os.getcwd()
69
+ search_term = actor_name.lower().replace(" ", "_")
70
+ search_term_plain = actor_name.lower()
71
+ for f in os.listdir(ana_dizin):
72
+ f_lower = f.lower()
73
+ if f_lower.endswith(('.jpg', '.png', '.jpeg')):
74
+ if search_term in f_lower or search_term_plain in f_lower:
75
+ return os.path.join(ana_dizin, f)
76
+ return None
77
+
78
+ # --- SOL PANEL (BİLGİLER BURADA) ---
79
  st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
80
+ st.sidebar.markdown("---")
81
 
82
  gender_choice = st.sidebar.radio(
83
+ "1. Select Category / Kategori Seçin:",
84
  ["Male / Erkek", "Female / Kadın"]
85
  )
86
 
87
+ # Oyuncu listesi (Alfabetik değil, Stallone başa gelecek şekilde filtreleme)
88
+ filtered_names = [name for name in tum_unlu_verileri.keys() if tum_unlu_verileri[name]['c'] == gender_choice]
89
+
90
+ st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
91
+ for n in filtered_names:
92
+ st.sidebar.write(f"• {n}")
93
+
94
+ # --- ANA EKRAN ---
95
+ st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
96
+ st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
97
+ st.markdown("---")
98
+
99
+ col_actor, col_match = st.columns([1, 2])
100
+
101
+ with col_actor:
102
+ st.subheader("👤 Pick an Actor / Oyuncu Seç")
103
+ options = ["Choose... / Seçiniz..."] + filtered_names
104
+ selected_actor = st.selectbox("Select from list / Listeden seçin:", options)
105
+
106
+ # Brad Pitt ve diğerlerinde titremeyi önlemek için alanı ayırıyoruz
107
+ if selected_actor != "Choose... / Seçiniz...":
108
+ path = get_image_path(selected_actor)
109
+ if path:
110
+ st.image(path, caption=f"Profile: {selected_actor}", use_container_width=True)
111
+ else:
112
+ st.warning(f"⚠️ Resim bulunamadı: {selected_actor}")
113
+ else:
114
+ st.info("Please select an actor to see the profile. / Profili görmek için bir oyuncu seçin.")
115
+
116
+ with col_match:
117
+ st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
118
+ st.write("Comparing the star's DNA with movie roles... / Yıldızın DNA'sı film rolleriyle karşılaştırılıyor...")
119
+
120
+ if st.button("🚀 Match and Recommend / Eşleştir ve Öner"):
121
+ if selected_actor == "Choose... / Seçiniz...":
122
+ st.warning("Please pick an actor first! / Lütfen önce bir oyuncu seçin!")
123
+ elif movie_dict:
124
+ actor_v = tum_unlu_verileri[selected_actor]['v']
125
+ results = []
126
+
127
+ for i in movie_dict:
128
+ # Orijinal vektör analizi
129
+ dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6])
130
+
131
+ # 11.5 skoru hatasını engellemek için mesafeyi 0-1 arasına hapsediyoruz
132
+ dist = max(0, min(1, dist))
133
+
134
+ # Sıralama kararlılığı için minik bir gürültü
135
+ noise = random.uniform(0, 0.00001)
136
+ results.append((movie_dict[i][0], dist + noise))
137
+
138
+ # En iyi 5 eşleşmeyi (en küçük mesafe) al
139
+ top_matches = sorted(results, key=lambda x: x[1])[:5]
140
+
141
+ for i, (film, score) in enumerate(top_matches, 1):
142
+ # Skoru % cinsinden hesapla: (1 - mesafe) * 100
143
+ pct = (1 - score) * 100
144
+ # %0-%100 arası kalmasını garanti et
145
+ pct = max(0, min(100, pct))
146
+
147
+ st.success(f"**{i}. {film}**")
148
+ st.write(f"Match Score / Uyum Skoru: **%{pct:.1f}**")
149
+ st.progress(pct / 100)
150
+ else:
151
+ st.error("Model dosyası eksik!")
152
+
153
+ st.markdown("---")
154
+ st.info("💡 **How it works? / Nasıl çalışır?**: This AI analyzes career vectors based on available local assets. / Bu yapay zeka kariyer vektörlerini analiz eder.")