import streamlit as st from PIL import Image from core.inference import load_deepfake_model from ui.styles import apply_custom_styles from ui.components import render_header, render_result, render_footer # --- Page Config --- st.set_page_config( page_title="Deepfake Image Detector", page_icon="🕵️", layout="centered", initial_sidebar_state="collapsed", ) # --- Apply UI --- apply_custom_styles() render_header() # ✅ FIX 1: Use cache instead of session_state + spinner @st.cache_resource def get_model(): return load_deepfake_model() classifier = get_model() # --- Upload --- st.markdown("### 📤 Image Upload") uploaded_file = st.file_uploader( "Select or Drag & Drop an Image (JPG, JPEG, PNG)", type=["jpg", "jpeg", "png"], label_visibility="collapsed" ) if uploaded_file is not None: try: image = Image.open(uploaded_file).convert("RGB") except Exception as e: st.error(f"Image loading error: {e}") st.stop() col1, col2, col3 = st.columns([1, 2, 1]) with col2: st.image(image, caption="Uploaded Image", use_container_width=True) # --- Analyze Button --- if st.button("Analyze Image"): try: # ✅ FIX 2: Safe spinner (only during inference) with st.spinner("Running Deepfake Detection..."): results = classifier(image) top_result = results[0] label = top_result['label'].lower() score = top_result['score'] is_fake = "fake" in label confidence_percentage = round(score * 100, 2) # --- Show Result --- render_result(is_fake, confidence_percentage) except Exception as e: st.error(f"Error: {e}") # --- Footer --- render_footer()