dvieri's picture
Update app.py
af18329 verified
raw
history blame
2.51 kB
import cv2
import streamlit as st
import tempfile
import torch
from torchvision import transforms
from mtcnn import MTCNN
from skimage.feature import hog
import joblib
import numpy as np
# Preprocessing for Siamese Model
def preprocess_image_siamese(img):
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor()
])
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
return transform(img)
# Preprocessing for SVM model (converting to grayscale)
def preprocess_image_svm(img):
img = cv2.resize(img, (224, 224))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
return img
# Extract HOG Features
def extract_hog_features(img):
hog_features = hog(img, orientations=9, pixels_per_cell=(16, 16), cells_per_block=(4, 4))
return hog_features
# Detect faces using MTCNN
def get_face(img):
detector = MTCNN()
faces = detector.detect_faces(img)
if faces:
x1, y1, w, h = faces[0]['box']
x1, y1 = abs(x1), abs(y1)
x2, y2 = x1 + w, y1 + h
return img[y1:y2, x1:x2]
return None
# Function to verify face (either HOG-SVM or Siamese model)
def verify(image, model, person):
with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as temp_image:
temp_image.write(image.read())
temp_image_path = temp_image.name
image = cv2.imread(temp_image_path)
face = get_face(image)
if face is not None:
if model_type == "HOG-SVM":
with open(f'./svm_{lower(person)}.pkl', 'rb') as f:
svm = joblib.load(f)
with open(f'./pca_{lower(person)}.pkl', 'rb') as f:
pca = joblib.load(f)
face = preprocess_image_svm(face)
hog = extract_hog_features(face)
hog_pca = pca.transform([hog])
pred = svm.predict(hog_pca)
if pred == 1:
st.write("Match")
else:
st.write("Not Match")
else:
st.write("Face not detected in one or both images")
# Main function to handle Streamlit interaction
def main():
st.title("Real-time Face Verification App")
model = st.selectbox("Select Model", ["Siamese", "HOG-SVM"])
person = st.selectbox("Select Person", ["Theo"])
enable = st.checkbox("Enable camera")
captured_image = st.camera_input("Take a picture", disabled=not enable)
if captured_image:
verify(captured_image, model, person)
if __name__ == "__main__":
main()