diff --git a/README.md b/README.md new file mode 100644 index 0000000..a62c97d --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# Biometrický prístupový systém + +## Inštalácia + +1. Naklonovať repozitár +``` +$ git clone git@git.kemt.fei.tuke.sk:vj586da/recognition_system.git +``` +2. Spustiť inštalačný skript +``` +$ cd recognition_system/src +$ sudo ./setup.sh +``` + +### Čo robí inštalačný skript? +1. Inštalačný skrip aktualizuje operačný systém. +2. Následne skontroluje či sa nachádza Python verzia 3.10. Ak sa nenachádza, skompiluje ju zo zdrojového kódu priloženého +v repozitári. V oficiálnych repozitároch napr. Debian Linuxu sa už Python3.10 +nenachádza. +3. Vytvorí Python virtual environment, ktorý je potrebný pre inštaláciu Python +balíčkov, keďže je zakázaná globálna systémova inštalácia na nových systémoch +založených na Debian/Ubuntu. +4. Po aktivácii Python env sa nainštalujú potrebné balíčky z requirements.txt +5. Skopírujú sa SystemD service súbory z priečinka ./service a pomocou sed príkazu +sa nahradí aktívný používateľ - pripravia sa súbory. +6. Vytvorí sa symbolický link na dané service do /etc/systemd/system +7. Spraví sa SystemD daemon reload. +8. Povolia sa service, aby sa spúštali pri spustení systému. +9. Nainštaluje sa MariaDB server používaný pre logovanie overených používateľov. +10. Vytvorí sa používateľ *face_logger* s heslom *secret* +11. Pridajú sa mu potrebné práva +12. Zo súboru *schema.sql* sa importuje štruktúra databázy + + +## Náhľad používateľského rozhrania +### Prihlásenie +![Prihlásenie](screenshots/add_face.png "Prihlásenie") + +## Logy +![Logy](screenshots/logs.png "Logy") + +## Pridanie tváre +![Pridanie tváre](screenshots/add_face.png "Pridanie tváre") + +## Zoznam tvárí +![Zoznam tvárí](screenshots/people_list.png "Zoznam tvárí") + diff --git a/screenshots/add_face.png b/screenshots/add_face.png new file mode 100644 index 0000000..2ee7a9a Binary files /dev/null and b/screenshots/add_face.png differ diff --git a/screenshots/login.png b/screenshots/login.png new file mode 100644 index 0000000..216da4d Binary files /dev/null and b/screenshots/login.png differ diff --git a/screenshots/logs.png b/screenshots/logs.png new file mode 100644 index 0000000..da6bd5d Binary files /dev/null and b/screenshots/logs.png differ diff --git a/screenshots/people_list.png b/screenshots/people_list.png new file mode 100644 index 0000000..b506e65 Binary files /dev/null and b/screenshots/people_list.png differ diff --git a/src/config.py b/src/config.py index 00d018c..4fd5c17 100644 --- a/src/config.py +++ b/src/config.py @@ -12,6 +12,6 @@ SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) ENCODINGS_PATH = os.path.join(SCRIPT_DIR, "encodings.pickle") LANDMARKS_PATH = os.path.join(SCRIPT_DIR, "shape_predictor_68_face_landmarks.dat") -THRESHOLD = 0.3 +THRESHOLD = 0.4 COOLDOWN = 15 CV_SCALER = 4 diff --git a/src/face_recognition_module.py b/src/face_recognition_module.py index 1ad2231..1e4e93a 100644 --- a/src/face_recognition_module.py +++ b/src/face_recognition_module.py @@ -68,9 +68,11 @@ def process_frame(frame, known_face_encodings, known_face_names): face_distances = face_recognition.face_distance(known_face_encodings, face_encoding) if len(face_distances) > 0: best_match_index = np.argmin(face_distances) - name = known_face_names[best_match_index] if matches[best_match_index] else "Unknown" - else: - name = "Unknown" + best_distance = face_distances[best_match_index] + if best_distance < THRESHOLD: + name = known_face_names[best_match_index] + else: + name = "Unknown" else: name = "Unknown" face_names.append(name) diff --git a/src/remove_face.py b/src/remove_face.py index 92d87e5..a70d115 100644 --- a/src/remove_face.py +++ b/src/remove_face.py @@ -1,5 +1,6 @@ import argparse import pickle +import subprocess import os import shutil from cryptography.fernet import Fernet @@ -47,7 +48,7 @@ def delete_person(person_name, pickle_path="encodings.pickle", dataset_folder="d with open(pickle_path, "wb") as f: f.write(encrypted_data) print(f"Deleted {count_deleted} entr{'y' if count_deleted == 1 else 'ies'} for person '{person_name}' from {pickle_path}.") - + subprocess.run(["sudo", "systemctl", "restart", "face_rec"], check=True) if __name__ == "__main__": parser = argparse.ArgumentParser(