import streamlit as st import os import numpy as np import pandas as pd from glob import glob import pickle from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, mean_absolute_error from scipy.stats import pearsonr import matplotlib.pyplot as plt import seaborn as sns import torch import torchvision.transforms as transforms from PIL import Image from facenet_pytorch import MTCNN, InceptionResnetV1 import warnings warnings.filterwarnings("ignore") device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') with st.spinner('Loading the models...'): # If required, create a face detection pipeline using MTCNN: mtcnn = MTCNN( image_size=160, margin=40, min_face_size=20, thresholds=[0.6, 0.7, 0.7], factor=0.709, post_process=True, device=device ) mtcnn2 = MTCNN( image_size=160, margin=40, min_face_size=20, thresholds=[0.6, 0.7, 0.7], factor=0.709, post_process=False, device=device ) # Create an inception resnet (in eval mode): resnet = InceptionResnetV1(pretrained='casia-webface').eval().to(device) # Define the transformation to preprocess the images preprocess = transforms.Compose([ transforms.Resize((160, 160)), transforms.ToTensor(), transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) ]) def extract_features(img): img = img.convert('RGB') face = mtcnn(img) if face is None: face = preprocess(img) img = torch.stack([face]).to(device) with torch.no_grad(): features = resnet(img) return features[0].cpu().numpy() with open("models/model.p", "rb") as f: lr = pickle.load(f) st.markdown("

Know Your BMI

", unsafe_allow_html=True) st.caption("
Click a photo and the underlying Machine Learning model will predict your BMI
", unsafe_allow_html=True) # img_file_buffer = st.camera_input("Click a photo and the underlying Machine Learning model will predict your BMI", label_visibility="hidden") img_file_buffer = st.file_uploader("Upload an image", type=["jpg", "jpeg", "png"]) if img_file_buffer is None: img_file_buffer = st.camera_input("Or click a photo", label_visibility="hidden") if img_file_buffer is not None: # To read image file buffer as a PIL Image: img = Image.open(img_file_buffer) if img.mode == 'RGBA': img = img.convert('RGB') detected_face = mtcnn2(img) if detected_face is None: st.write("No Face Detected") else: detected_face = Image.fromarray(detected_face.numpy().transpose(1, 2, 0).astype(np.uint8)) st.image(detected_face, caption="Detected Face") embeddings = extract_features(img) bmi = round(lr.predict([embeddings])[0], 2) st.write(f"Your BMI is {bmi}")