Spaces:
Running
Running
import cv2 | |
import streamlit as st | |
import tempfile | |
import torch | |
from torchvision import transforms | |
from mtcnn import MTCNN | |
from skimage.feature import hog | |
import pickle | |
import torch.nn as nn | |
from torchvision.models import resnet50 | |
def preprocess_image_siamese(img): | |
transform = transforms.Compose([ | |
transforms.Resize((224, 224)), | |
transforms.ToTensor() | |
]) | |
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
return transform(img) | |
def preprocess_image_svm(img): | |
img= cv2.resize(img, (224, 224)) | |
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
return img | |
def extract_hog_features(img): | |
hog_features = hog(img, orientations=9, | |
pixels_per_cell=(8, 8), | |
cells_per_block=(2, 2)) | |
return hog_features | |
def get_face(img): | |
detector = MTCNN() | |
faces = detector.detect_faces(img) | |
x1,y1,w,h = faces[0]['box'] | |
x1, y1 = abs(x1), abs(y1) | |
x2 = abs(x1+w) | |
y2 = abs(y1+h) | |
store_face = img[y1:y2,x1:x2] | |
return store_face | |
def verify(img1, img2, model_type): | |
with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as temp_img1: | |
temp_img1.write(img1.read()) | |
temp_img1_path = temp_img1.name | |
with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as temp_img2: | |
temp_img2.write(img2.read()) | |
temp_img2_path = temp_img2.name | |
img1p = cv2.imread(temp_img1_path) | |
img2p = cv2.imread(temp_img2_path) | |
face1 = get_face(img1p) | |
face2 = get_face(img2p) | |
if face1.size > 0 and face2.size > 0: | |
st.image([face1, face2], caption=["Image 1", "Image 2"], width=200) | |
# if model_type == "Siamese": | |
# face1 = preprocess_image_siamese(face1) | |
# face2 = preprocess_image_siamese(face2) | |
# # Get predictions | |
# with torch.no_grad(): | |
# prediction = model(face1_tensor, face2_tensor) | |
# # Threshold decision | |
# if prediction.item() > 0.5: | |
# st.write("Matched") | |
# else: | |
# st.write("Not Matched") | |
# st.write(f"Confidence: {prediction.item():.4f}") | |
if model_type == "HOG-SVM": | |
with open('svm.pkl', 'rb') as f: | |
svm = pickle.load(f) | |
with open('pca.pkl', 'rb') as f: | |
pca = pickle.load(f) | |
face1 = preprocess_image_svm(face1) | |
face2 = preprocess_image_svm(face2) | |
hog1 = extract_hog_features(face1) | |
hog2 = extract_hog_features(face2) | |
hog1_pca = pca.transform([hog1]) | |
hog2_pca = pca.transform([hog2]) | |
pred1 = svm.predict(hog1_pca) | |
pred2 = svm.predict(hog2_pca) | |
if pred1 == 1 and pred2 == 1: | |
st.write("Matched") | |
else: | |
st.write("Not Matched") | |
else: | |
st.write("Face not detected in one or both images") | |
def main(): | |
st.title("Face Verification App") | |
model_type = st.selectbox("Select Model", ["Siamese", "HOG-SVM"]) | |
uploaded_img1 = st.file_uploader("Upload Image 1", type=["jpg", "png"]) | |
uploaded_img2 = st.file_uploader("Upload Image 2", type=["jpg", "png"]) | |
if uploaded_img1 and uploaded_img2: | |
if st.button("Verify Faces"): | |
verify(uploaded_img1, uploaded_img2, model_type) | |
if __name__ == "__main__": | |
main() |