|
import cv2 |
|
import streamlit as st |
|
from keras_vggface.vggface import VGGFace |
|
import tensorflow as tf |
|
from tensorflow.keras.applications import ResNet50 |
|
from tensorflow.keras.preprocessing import image |
|
from tensorflow.keras.models import Model |
|
from tensorflow.keras.layers import GlobalAveragePooling2D |
|
import numpy as np |
|
import pickle |
|
|
|
pickle_file_path = 'svm_model.pkl' |
|
|
|
with open(pickle_file_path, 'rb') as file: |
|
svm_model = pickle.load(file) |
|
|
|
base_model = VGGFace(model='vgg16', include_top=False, input_shape=(224, 224, 3)) |
|
x = base_model.output |
|
x = GlobalAveragePooling2D()(x) |
|
model = Model(inputs=base_model.input, outputs=x) |
|
|
|
|
|
def preprocess_image(img): |
|
img = cv2.resize(img, (224, 224)) |
|
img = image.img_to_array(img) |
|
img = np.expand_dims(img, axis=0) |
|
img = img[0] |
|
return img |
|
|
|
def extract_features(image_array): |
|
|
|
img = np.expand_dims(image_array, axis=0) |
|
img = tf.keras.applications.resnet50.preprocess_input(img) |
|
features = model.predict(img,verbose=0) |
|
return features.flatten() |
|
|
|
|
|
def predict_bmi(img): |
|
pre_img = preprocess_image(img) |
|
features = extract_features(pre_img) |
|
features = features.reshape(1,-1) |
|
pred = svm_model.predict(features) |
|
return pred |
|
|
|
def main(): |
|
st.title("Prédiction de l'IMC à partir de l'image de la caméra") |
|
st.write("Cette application prédit l'IMC d'une personne à partir d'une image capturée à l'aide de l'appareil photo.") |
|
|
|
|
|
img_file_buffer = st.camera_input("Prendre une photo") |
|
|
|
if img_file_buffer is not None: |
|
|
|
file_bytes = np.asarray(bytearray(img_file_buffer.getvalue()), dtype=np.uint8) |
|
img = cv2.imdecode(file_bytes, 1) |
|
|
|
|
|
bmi_label = predict_bmi(img) |
|
|
|
|
|
st.write("IMC prédit ::", str(bmi_label[0] - 5)) |
|
|
|
if __name__ == '__main__': |
|
main() |
|
|