File size: 4,571 Bytes
9ebd40b
cd004be
 
9ebd40b
 
cd004be
 
a4ed643
9ebd40b
cd004be
9ebd40b
 
a4ed643
cd004be
9ebd40b
cd004be
 
 
 
 
 
 
9ebd40b
cd004be
 
 
 
 
 
 
9ebd40b
cd004be
a4ed643
 
 
 
 
 
 
 
cd004be
 
 
 
a4ed643
 
 
 
 
 
 
cd004be
 
 
9ebd40b
cd004be
 
 
9ebd40b
cd004be
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ebd40b
cd004be
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ebd40b
cd004be
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import streamlit as st
import tensorflow as tf
import numpy as np
from PIL import Image
import cv2
import openai
import os
import io

# Set up OpenAI API key
openai.api_key = "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"

# Load pre-trained model for face detection
face_detection_model = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

def detect_face(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_detection_model.detectMultiScale(gray, 1.3, 5)
    if len(faces) > 0:
        (x, y, w, h) = faces[0]
        return image[y:y+h, x:x+w]
    return None

def analyze_symmetry(face):
    height, width = face.shape[:2]
    left_half = face[:, :width//2]
    right_half = cv2.flip(face[:, width//2:], 1)
    diff = cv2.absdiff(left_half, right_half)
    symmetry_score = 1 - (np.sum(diff) / (255 * height * (width//2)))
    return symmetry_score

def analyze_aesthetic_quality(image):
    # Convert the image to a byte stream
    img_byte_arr = io.BytesIO()
    Image.fromarray(image).save(img_byte_arr, format='PNG')
    img_byte_arr = img_byte_arr.getvalue()

    # Encode the image
    encoded_image = base64.b64encode(img_byte_arr).decode('ascii')

    prompt = f"Analyze the aesthetic quality of this image, focusing on lighting, composition, and overall visual appeal. Provide a brief description and a score out of 10."
    response = openai.ChatCompletion.create(
        model="gpt-4-vision-preview",
        messages=[
            {
                "role": "user", 
                "content": [
                    {"type": "text", "text": prompt},
                    {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{encoded_image}"}}
                ]
            }
        ]
    )
    return response.choices[0].message.content

def compare_photos(image1, image2):
    face1 = detect_face(image1)
    face2 = detect_face(image2)
    
    if face1 is None or face2 is None:
        return "Error: Face not detected in one or both images."
    
    symmetry1 = analyze_symmetry(face1)
    symmetry2 = analyze_symmetry(face2)
    
    aesthetic1 = analyze_aesthetic_quality(image1)
    aesthetic2 = analyze_aesthetic_quality(image2)
    
    return {
        "Image 1": {
            "Symmetry": symmetry1,
            "Aesthetic Quality": aesthetic1
        },
        "Image 2": {
            "Symmetry": symmetry2,
            "Aesthetic Quality": aesthetic2
        }
    }

def main():
    st.title("AttraVision")
    st.write("Compare two photos based on attractiveness parameters")
    
    uploaded_file1 = st.file_uploader("Choose the first image", type=["jpg", "jpeg", "png"])
    uploaded_file2 = st.file_uploader("Choose the second image", type=["jpg", "jpeg", "png"])
    
    if uploaded_file1 is not None and uploaded_file2 is not None:
        image1 = Image.open(uploaded_file1)
        image2 = Image.open(uploaded_file2)
        
        col1, col2 = st.columns(2)
        with col1:
            st.image(image1, caption="Image 1", use_column_width=True)
        with col2:
            st.image(image2, caption="Image 2", use_column_width=True)
        
        if st.button("Compare Photos"):
            with st.spinner("Analyzing..."):
                results = compare_photos(np.array(image1), np.array(image2))
                
                st.subheader("Comparison Results")
                col1, col2 = st.columns(2)
                with col1:
                    st.write("Image 1")
                    st.write(f"Symmetry: {results['Image 1']['Symmetry']:.2f}")
                    st.write(f"Aesthetic Quality: {results['Image 1']['Aesthetic Quality']}")
                with col2:
                    st.write("Image 2")
                    st.write(f"Symmetry: {results['Image 2']['Symmetry']:.2f}")
                    st.write(f"Aesthetic Quality: {results['Image 2']['Aesthetic Quality']}")
                
                st.write("Note: Beauty is subjective, and this tool is for entertainment purposes only.")
    
    st.sidebar.title("About AttraVision")
    st.sidebar.info("AttraVision uses machine learning to analyze and compare photos based on predefined attractiveness parameters. This tool is designed for fun and should not be used for serious judgment.")
    st.sidebar.warning("Privacy Notice: Your photos are processed securely and are not stored after analysis.")

if __name__ == "__main__":
    main()