From 79e2f982dcf7f8db9dd9555f840713b905efc8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B0=D1=80=D1=88=D0=B8=D0=BD=D0=B0=20=D0=95=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=BD=D0=B0=20=D0=A1=D0=B5=D1=80?= =?UTF-8?q?=D0=B3=D0=B5=D0=B5=D0=B2=D0=BD=D0=B0?= <esparshina@miem.hse.ru> Date: Sat, 1 Feb 2025 20:14:51 +0000 Subject: [PATCH] Upload New File --- HW 4/Task2/app.py | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 HW 4/Task2/app.py diff --git a/HW 4/Task2/app.py b/HW 4/Task2/app.py new file mode 100644 index 0000000..95dfc6a --- /dev/null +++ b/HW 4/Task2/app.py @@ -0,0 +1,78 @@ +import streamlit as st +import numpy as np +import faiss +import cv2 +import os +import pandas as pd +from deepface import DeepFace +from natsort import natsorted + +metadata_path = '/content/drive/MyDrive/hse_faces_miem/staff_photo.csv' +images_dir = '/content/drive/MyDrive/hse_faces_miem' + +st.write("Загрузка метаданных...") +staff_metadata = pd.read_csv(metadata_path) +st.write("Метаданные загружены.") + +def extract_face_embedding(image_path): + try: + image = cv2.imread(image_path) + if image is None: + raise Exception(f"РќРµ удалось загрузить изображение: {image_path}") + face_embedding = DeepFace.represent(img_path=image_path, model_name='Facenet', enforce_detection=False) + return np.array(face_embedding) + except Exception as e: + st.error(f"Ошибка РїСЂРё обработке изображения {image_path}: {e}") + return None + +st.write("Рзвлечение эмбеддингов РёР· изображений...") +face_embeddings = [] +person_names = [] + +for file_name in natsorted(os.listdir(images_dir)): + if file_name.lower().endswith('.jpeg'): + path_to_img = os.path.join(images_dir, file_name) + embedding = extract_face_embedding(path_to_img) + if embedding is not None: + face_embeddings.append(embedding) + person_names.append(file_name) + +face_embeddings = [emb[0]['embedding'] for emb in face_embeddings if emb is not None] +face_embeddings = np.array(face_embeddings) + +if len(face_embeddings) == 0: + st.error("РќРµ удалось загрузить эмбеддинги РёР· исходных данных.") +else: + embed_dim = face_embeddings.shape[1] + index = faiss.IndexFlatL2(embed_dim) + index.add(face_embeddings) + st.write("Рмбеддинги успешно загружены Рё индексированы.") + +st.title('Приложение для распознавания лиц') + +uploaded_file = st.file_uploader("Загрузите СЃРІРѕС‘ изображение", type=["jpg", "jpeg", "png"]) + +if uploaded_file is not None: + image_save_path = "uploaded_img.jpg" + with open(image_save_path, "wb") as f: + f.write(uploaded_file.getbuffer()) + + st.image(image_save_path, caption='Ваше изображение', use_column_width=True) + st.write("Рзвлечение эмбеддинга РёР· загруженного изображения...") + + query_emb = extract_face_embedding(image_save_path) + if query_emb is not None: + query_emb = query_emb[0]['embedding'] + distances, indices = index.search(np.array([query_emb]), 1) + best_match_distance = distances[0][0] + best_match_name = person_names[indices[0][0]] + matched_person = staff_metadata.name[staff_metadata.filename.eq(best_match_name)].values[0] + + st.write(f"Наиболее похожий человек: {matched_person}") + st.write(f"Расстояние: {best_match_distance:.4f}") + + # Показываем изображение наиболее похожего человека + matched_image_path = os.path.join(images_dir, best_match_name) + st.image(matched_image_path, caption=f'Наиболее похожий человек: {matched_person}', use_column_width=True) + else: + st.error("РќРµ удалось получить эмбеддинг для изображения, проверьте его корректность.") \ No newline at end of file -- GitLab