| import streamlit as st |
| import pickle |
| from scipy import spatial |
| import random |
| import os |
|
|
| |
| st.set_page_config(page_title="CastMatch AI", layout="wide") |
|
|
| |
| 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) |
|
|
| |
| @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 {} |
|
|
| |
| 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]} |
| } |
|
|
| |
| @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() |
|
|
| |
| 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 |
|
|
| |
| st.title("🎬 CastMatch AI") |
| st.markdown("---") |
|
|
| col_actor, col_match = st.columns([1, 2]) |
|
|
| |
| 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") |
| |
| actor = st.selectbox("Select / Seç:", names if names else ["-"], key="act_select") |
| |
| |
| 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) |