| import streamlit as st |
| import pickle |
| from scipy import spatial |
| import os |
|
|
| |
| @st.cache_resource |
| def load_data(): |
| try: |
| with open('movie_model.pkl', 'rb') as f: |
| return pickle.load(f) |
| except: |
| return None |
|
|
| model_data = load_data() |
| movie_dict = model_data['movie_dict'] if model_data else {} |
|
|
| |
| 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]} |
| } |
|
|
| |
| resim_klasoru = os.path.join(os.getcwd(), "40 resim") |
|
|
| def klasordeki_unluleri_getir(): |
| mevcut_unlular = {} |
| if os.path.exists(resim_klasoru): |
| dosyalar = [f.lower() for f in os.listdir(resim_klasoru)] |
| for isim, veri in tum_unlu_verileri.items(): |
| if any(isim.lower().replace(" ", "_") in d or isim.lower() in d for d in dosyalar): |
| mevcut_unlular[isim] = veri |
| return mevcut_unlular |
|
|
| unlu_verileri = klasordeki_unluleri_getir() |
|
|
| |
| st.set_page_config(page_title="CastMatch AI", layout="wide") |
|
|
| st.sidebar.title("🔍 Control Panel / Kontrol Paneli") |
| gender_choice = st.sidebar.radio( |
| "Select Category / Kategori:", |
| ["Male / Erkek", "Female / Kadın"] |
| ) |
|
|
| filtered_names = [n for n, d in unlu_verileri.items() if d['c'] == gender_choice] |
|
|
| st.title("🎬 CastMatch AI") |
|
|
| col1, col2 = st.columns([1,2]) |
|
|
| with col1: |
| selected_actor = st.selectbox("Actor / Oyuncu", filtered_names) |
|
|
| if selected_actor: |
| for f in os.listdir(resim_klasoru): |
| if selected_actor.lower().replace(" ","_") in f.lower(): |
| st.image(os.path.join(resim_klasoru, f)) |
| break |
|
|
| with col2: |
| if st.button("🚀 Match"): |
| actor_v = unlu_verileri[selected_actor]['v'] |
| results = [] |
|
|
| for i in movie_dict: |
| dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) |
| results.append((movie_dict[i][0], dist)) |
|
|
| top = sorted(results, key=lambda x: x[1])[:5] |
|
|
| for film, score in top: |
| pct = max(0, min(100, (1 - score) * 100)) |
| st.write(f"{film} → %{round(pct,1)}") |
| st.progress(pct/100) |