File size: 2,970 Bytes
ec77159
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3e3826e
ec77159
 
3e3826e
ec77159
 
 
3e3826e
ec77159
3e3826e
ec77159
 
 
4f1cce6
27e355a
ec77159
4f1cce6
27e355a
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
from tensorflow import keras
from keras.preprocessing import image
import pickle
from sklearn.metrics.pairwise import cosine_similarity
import streamlit as st
from PIL import Image
import os
import cv2
from mtcnn import MTCNN
import numpy as np


#keras.applications.resnet50.ResNet50

#VGGFace(model='resnet50',include_top=False,input_shape=(224,224,3),pooling='avg')

#st.text("Hello Welcome")
detector = MTCNN()
model = keras.applications.resnet50.ResNet50(
    include_top=False,
    input_shape=(224,224,3),
    pooling='avg',
    weights='imagenet'
)
feature_list = pickle.load(open('embedding.pkl', 'rb'))
filenames = pickle.load(open('filenames.pkl', 'rb'))

filenames = [sub.replace('/kaggle/input/bollywood-celeb-localized-face-dataset/', 'https://technirmitisoftwares.com/img_data/data/') for sub in filenames]

def save_uploaded_image(uploaded_image):
    try:
        with open(uploaded_image.name, 'wb') as f:
            f.write(uploaded_image.getbuffer())
        return True
    except:
        return False


def extract_features(img_path, model, detector):
    img = cv2.imread(img_path)
    results = detector.detect_faces(img)

    x, y, width, height = results[0]['box']

    face = img[y:y + height, x:x + width]

    #  extract its features
    image = Image.fromarray(face)
    image = image.resize((224, 224))

    face_array = np.asarray(image)

    face_array = face_array.astype('float32')

    expanded_img = np.expand_dims(face_array, axis=0)
    preprocessed_img = keras.applications.resnet50.preprocess_input(expanded_img)
    result = model.predict(preprocessed_img).flatten()
    return result


def recommend(feature_list,features):
    similarity = []
    for i in range(len(feature_list)):
        similarity.append(cosine_similarity(features.reshape(1, -1), feature_list[i].reshape(1, -1))[0][0])

    index_pos = sorted(list(enumerate(similarity)), reverse=True, key=lambda x: x[1])[0][0]
    return index_pos

    

st.title('Which bollywood celebrity are you?')

uploaded_image = st.file_uploader('Choose an image')

if uploaded_image is not None:
    # save the image in a directory
    if save_uploaded_image(uploaded_image):
        display_image = Image.open(uploaded_image)
        st.header("Image Uploded!, Processing...")
        
        # extract the features
        features = extract_features(uploaded_image.name, model, detector)
        
        # recommend
        index_pos = recommend(feature_list,features)
        predicted_actor = filenames[index_pos]
        
        # display
        display_image_resized = display_image.resize((150,150))
        col1,col2 = st.columns(2)

        with col1:
            st.subheader('Your uploaded image')
            st.image(display_image_resized,width=150, caption='Uploaded Image')
        with col2:
            st.subheader("Look Like: " + predicted_actor.split("/")[7])
            st.image(filenames[index_pos],width=150, caption='Predicted Look Alike Image')