| import os |
| import streamlit as st |
| import requests |
| from PIL import Image |
| from dotenv import load_dotenv |
| import google.generativeai as genai |
|
|
| |
| load_dotenv() |
| api_key = os.getenv("GEMINI_API_KEY") |
| model = genai.GenerativeModel("gemini-1.5-flash") |
|
|
| |
| def get_gemini_response(prompt, image): |
| try: |
| return model.generate_content([prompt, image]).text |
| except Exception as e: |
| st.error(f"Gemini API error: {e}") |
| return None |
|
|
| |
| def fetch_met_data(object_id): |
| try: |
| url = f"https://collectionapi.metmuseum.org/public/collection/v1/objects/{object_id}" |
| response = requests.get(url) |
| return response.json() if response.status_code == 200 else None |
| except Exception as e: |
| st.error(f"Error fetching MET data: {e}") |
| return None |
|
|
| |
| st.set_page_config(layout="wide") |
| st.title('π¨ AI-Assisted Art Authenticity and Style Analysis') |
| st.write("Upload an artwork image to analyze its authenticity, brushstroke, color palette, and composition.") |
|
|
| uploaded_image = st.file_uploader("Upload Artwork", type=["jpg", "jpeg", "png"]) |
|
|
| if uploaded_image: |
| image = Image.open(uploaded_image).resize((200, 200)) |
|
|
| |
| met_id = 436121 |
| met_data = fetch_met_data(met_id) |
| met_image = None |
| if met_data and met_data.get("primaryImage"): |
| met_image = Image.open(requests.get(met_data['primaryImage'], stream=True).raw).resize((512, 512)) |
|
|
| col1, col2 = st.columns(2) |
| with col1: |
| st.image(image, caption="π₯ Uploaded Artwork", use_container_width=True) |
| with col2: |
| if met_image: |
| st.image(met_image, caption=f"πΌοΈ {met_data['title']}", use_container_width=True) |
| st.markdown(f"**π¨βπ¨ Artist:** {met_data['artistDisplayName']}") |
| st.markdown(f"**π
Year:** {met_data['objectDate']}") |
| st.markdown(f"**π¨ Medium:** {met_data['medium']}") |
| else: |
| st.warning("Could not load MET comparison image.") |
|
|
| st.divider() |
| st.markdown("## π§ Comparative Art Analysis") |
|
|
| prompt_uploaded = ( |
| "Analyze this artwork. Focus on: " |
| "1. Brushstroke technique, 2. Color palette, 3. Composition style and structure. " |
| "Identify any stylistic clues for authenticity or imitation." |
| ) |
| prompt_met = ( |
| "Analyze this famous artwork from the MET collection. Focus on: " |
| "1. Brushstroke technique, 2. Color palette, 3. Composition style and structure." |
| ) |
|
|
| col3, col4 = st.columns(2) |
| with col3: |
| st.markdown("### π¨ Uploaded Artwork") |
| analysis_uploaded = get_gemini_response(prompt_uploaded, image) |
| st.write(analysis_uploaded or "No analysis returned.") |
| with col4: |
| st.markdown("### πΌοΈ MET Artwork") |
| if met_image: |
| analysis_met = get_gemini_response(prompt_met, met_image) |
| st.write(analysis_met or "No analysis returned.") |
|
|
| st.divider() |
| st.subheader("π Expert Feedback") |
|
|
| |
| with st.form("feedback_form"): |
| feedback_text = st.text_area("Your feedback on the analysis:") |
| submitted = st.form_submit_button("Send") |
|
|
| if submitted and feedback_text.strip(): |
| st.success("Thanks for your feedback!") |
| st.markdown(f"> {feedback_text}") |
| |
| st.rerun() |
| else: |
| st.info("Please upload an image to begin analysis.") |
|
|