ESMATUGBA's picture
Update app.py
29b4938 verified
Raw
History Blame
5.98 kB
import streamlit as st
import pickle
from scipy import spatial
import random
import os
# --- 1. SAYFA YAPISI VE CSS (Titremeyi Engellemek İçin En Önemli Kısım) ---
st.set_page_config(page_title="CastMatch AI", layout="wide")
# Resim kutusunun zıplamasını engelleyen özel CSS
st.markdown("""
<style>
.stImage > img {
border-radius: 10px;
max-height: 450px;
object-fit: cover;
}
div[data-testid="stVerticalBlock"] > div:has(div.stImage) {
min-height: 450px;
}
</style>
""", unsafe_allow_html=True)
# --- 2. VERİ VE MODEL (Cache/Önbellek) ---
@st.cache_resource
def load_model():
try:
with open('movie_model.pkl', 'rb') as f:
return pickle.load(f)
except:
return None
model_data = load_model()
movie_dict = model_data['movie_dict'] if model_data else {}
# Veritabanı (Sabit tutuldu)
tum_unlu_verileri = {
"Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
"Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
"Johnny Depp": {"c": "Male / Erkek", "v": [0.1, 0.9, 0.8, 0.4, 0.1, 0.1]},
"Jason Statham": {"c": "Male / Erkek", "v": [0.95, 0.3, 0.1, 0.1, 0.1, 0.7]},
"Keanu Reeves": {"c": "Male / Erkek", "v": [0.9, 0.4, 0.1, 0.2, 0.9, 0.6]},
"Brad Pitt": {"c": "Male / Erkek", "v": [0.7, 0.5, 0.3, 0.8, 0.2, 0.4]},
"Tom Cruise": {"c": "Male / Erkek", "v": [0.9, 0.8, 0.2, 0.1, 0.4, 0.5]},
"Anthony Hopkins": {"c": "Male / Erkek", "v": [0.1, 0.1, 0.1, 0.95, 0.1, 0.9]},
"Arnold Schwarzenegger": {"c": "Male / Erkek", "v": [0.95, 0.6, 0.2, 0.1, 0.8, 0.1]},
"Bruce Willis": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.3, 0.4, 0.7]},
"Christian Bale": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
"Tom Hanks": {"c": "Male / Erkek", "v": [0.2, 0.6, 0.5, 0.9, 0.1, 0.1]},
"Morgan Freeman": {"c": "Male / Erkek", "v": [0.1, 0.3, 0.1, 0.9, 0.1, 0.6]},
"Al Pacino": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.95, 0.1, 0.8]},
"Cillian Murphy": {"c": "Male / Erkek", "v": [0.4, 0.1, 0.1, 0.9, 0.4, 0.8]},
"Jackie Chan": {"c": "Male / Erkek", "v": [0.9, 0.7, 0.9, 0.1, 0.1, 0.1]},
"Denzel Washington": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
"George Clooney": {"c": "Male / Erkek", "v": [0.3, 0.4, 0.5, 0.8, 0.1, 0.6]},
"Jake Gyllenhaal": {"c": "Male / Erkek", "v": [0.6, 0.1, 0.1, 0.9, 0.2, 0.8]},
"Pierce Brosnan": {"c": "Male / Erkek", "v": [0.8, 0.7, 0.3, 0.4, 0.1, 0.6]},
"Angelina Jolie": {"c": "Female / Kadın", "v": [0.9, 0.7, 0.1, 0.8, 0.1, 0.6]},
"Natalie Portman": {"c": "Female / Kadın", "v": [0.3, 0.2, 0.1, 0.9, 0.6, 0.7]},
"Scarlett Johansson": {"c": "Female / Kadın", "v": [0.9, 0.6, 0.2, 0.7, 0.8, 0.5]},
"Charlize Theron": {"c": "Female / Kadın", "v": [0.8, 0.3, 0.1, 0.9, 0.2, 0.7]},
"Milla Jovovich": {"c": "Female / Kadın", "v": [0.9, 0.4, 0.1, 0.1, 0.9, 0.3]},
"Sandra Bullock": {"c": "Female / Kadın", "v": [0.2, 0.1, 0.9, 0.8, 0.1, 0.6]},
"Nicole Kidman": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.1, 0.95, 0.1, 0.7]},
"Jennifer Lawrence": {"c": "Female / Kadın", "v": [0.7, 0.8, 0.3, 0.9, 0.4, 0.2]},
"Meryl Streep": {"c": "Female / Kadın", "v": [0.1, 0.1, 0.4, 0.95, 0.1, 0.1]},
"Salma Hayek": {"c": "Female / Kadın", "v": [0.6, 0.3, 0.5, 0.8, 0.1, 0.1]},
"Anne Hathaway": {"c": "Female / Kadın", "v": [0.2, 0.7, 0.8, 0.8, 0.1, 0.1]},
"Keira Knightley": {"c": "Female / Kadın", "v": [0.1, 0.8, 0.1, 0.95, 0.1, 0.1]},
"Julia Roberts": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.9, 0.9, 0.1, 0.1]},
"Penelope Cruz": {"c": "Female / Kadın", "v": [0.2, 0.3, 0.6, 0.9, 0.1, 0.6]},
"Monica Bellucci": {"c": "Female / Kadın", "v": [0.6, 0.1, 0.1, 0.8, 0.5, 0.3]},
"Emily Blunt": {"c": "Female / Kadın", "v": [0.7, 0.6, 0.1, 0.8, 0.5, 0.6]},
"Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
}
# --- 3. DOSYA TARAMA (Cache/Önbellek) ---
@st.cache_data
def get_images():
return [f for f in os.listdir(os.getcwd()) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
all_images = get_images()
# Mevcut olanları filtrele
unlu_verileri = {}
for n, v in tum_unlu_verileri.items():
if any(n.lower().replace(" ","_") in f.lower() or n.lower() in f.lower() for f in all_images):
unlu_verileri[n] = v
# --- 4. ARAYÜZ ---
st.title("🎬 CastMatch AI")
st.markdown("---")
col_actor, col_match = st.columns([1, 2])
# Sidebar Kategorisi
gender = st.sidebar.radio("Category / Kategori:", ["Male / Erkek", "Female / Kadın"], key="g_radio")
names = [n for n, d in unlu_verileri.items() if d['c'] == gender]
with col_actor:
st.subheader("👤 Cast / Oyuncu")
# INDEX kullanarak seçimi sabitlemek titremeyi azaltır
actor = st.selectbox("Select / Seç:", names if names else ["-"], key="act_select")
# Resim alanı için sabit bir placeholder
placeholder = st.empty()
if actor != "-":
target = actor.lower().replace(" ","_")
target_alt = actor.lower()
img_file = next((f for f in all_images if f.lower().startswith(target) or f.lower().startswith(target_alt)), None)
if img_file:
placeholder.image(img_file, use_container_width=True)
with col_match:
st.subheader("🎯 Matches / Eşleşmeler")
if st.button("🚀 Match / Eşleştir", key="m_btn") and actor != "-":
if movie_dict:
vec = unlu_verileri[actor]['v']
res = []
for i in movie_dict:
d = spatial.distance.cosine(vec, movie_dict[i][1][:6]) + random.uniform(0, 0.00001)
res.append((movie_dict[i][0], d))
top = sorted(res, key=lambda x: x[1])[:5]
for i, (f, s) in enumerate(top, 1):
p = round((1-s)*100, 1)
st.success(f"**{i}. {f}** (%{p})")
st.progress(p/100)