dvieri commited on
Commit
a046c35
·
verified ·
1 Parent(s): f47674d

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +119 -0
app.py ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import streamlit as st
3
+ import tempfile
4
+ import torch
5
+ from torchvision import transforms
6
+ from mtcnn import MTCNN
7
+ from skimage import hog
8
+ import pickle
9
+ import torch.nn as nn
10
+ from torchvision.models import resnet50
11
+
12
+ def preprocess_image_siamese(img):
13
+ transform = transforms.Compose([
14
+ transforms.Resize((224, 224)),
15
+ transforms.ToTensor()
16
+ ])
17
+
18
+ img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
19
+ return transform(img)
20
+
21
+ def preprocess_image_svm(img):
22
+ img= cv2.resize(img, (224, 224))
23
+ img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
24
+
25
+ return img
26
+
27
+ def extract_hog_features(img):
28
+ hog_features = hog(img, orientations=9,
29
+ pixels_per_cell=(8, 8),
30
+ cells_per_block=(2, 2))
31
+ return hog_features
32
+
33
+ def get_face(img):
34
+ detector = MTCNN()
35
+ faces = detector.detect_faces(img)
36
+
37
+ x1,y1,w,h = faces[0]['box']
38
+ x1, y1 = abs(x1), abs(y1)
39
+ x2 = abs(x1+w)
40
+ y2 = abs(y1+h)
41
+
42
+ store_face = img[y1:y2,x1:x2]
43
+
44
+ return store_face
45
+
46
+ def verify(img1, img2, model_type):
47
+
48
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as temp_img1:
49
+ temp_img1.write(img1.read())
50
+ temp_img1_path = temp_img1.name
51
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as temp_img2:
52
+ temp_img2.write(img2.read())
53
+ temp_img2_path = temp_img2.name
54
+
55
+ img1p = cv2.imread(temp_img1_path)
56
+ img2p = cv2.imread(temp_img2_path)
57
+
58
+ face1 = get_face(img1p)
59
+ face2 = get_face(img2p)
60
+
61
+ if face1 and face2:
62
+
63
+ st.image([face1, face2], caption=["Image 1", "Image 2"], width=200)
64
+
65
+ # if model_type == "Siamese":
66
+ # face1 = preprocess_image_siamese(face1)
67
+ # face2 = preprocess_image_siamese(face2)
68
+
69
+
70
+ # # Get predictions
71
+ # with torch.no_grad():
72
+ # prediction = model(face1_tensor, face2_tensor)
73
+
74
+ # # Threshold decision
75
+ # if prediction.item() > 0.5:
76
+ # st.write("Matched")
77
+ # else:
78
+ # st.write("Not Matched")
79
+ # st.write(f"Confidence: {prediction.item():.4f}")
80
+
81
+ if model_type == "HOG-SVM":
82
+ with open('svm_model.pkl', 'rb') as f:
83
+ svm = pickle.load(f)
84
+ with open('pca_model.pkl', 'rb') as f:
85
+ pca = pickle.load(f)
86
+
87
+ face1 = preprocess_image_svm(face1)
88
+ face2 = preprocess_image_svm(face2)
89
+
90
+ hog1 = extract_hog_features(face1)
91
+ hog2 = extract_hog_features(face2)
92
+
93
+ hog1_pca = pca.transform([hog1])
94
+ hog2_pca = pca.transform([hog2])
95
+
96
+ pred1 = svm.predict(hog1_pca)
97
+ pred2 = svm.predict(hog2_pca)
98
+
99
+ if pred1 == 1 and pred2 == 1:
100
+ st.write("Matched")
101
+ else:
102
+ st.write("Not Matched")
103
+ else:
104
+ st.write("Face not detected in one or both images")
105
+
106
+ def main():
107
+ st.title("Face Verification App")
108
+
109
+ model_type = st.selectbox("Select Model", ["Siamese", "HOG-SVM"])
110
+
111
+ uploaded_img1 = st.file_uploader("Upload Image 1", type=["jpg", "png"])
112
+ uploaded_img2 = st.file_uploader("Upload Image 2", type=["jpg", "png"])
113
+
114
+ if uploaded_img1 and uploaded_img2:
115
+ if st.button("Verify Faces"):
116
+ verify(uploaded_img1, uploaded_img2, model_type)
117
+
118
+ if __name__ == "__main__":
119
+ main()