Python Forum

Full Version: android e python fece recognition
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi, I'm making an app in Android Studio that communicates with Python via socket and I have to implement the recognition. I did it this way but when I insert two photos with the same face but different light it gives me different biometric keys, how can I solve it?
import math
import numpy as np
import face_recognition
import os
import sys
from socket import *

""" PARAMETRI INIZIALI """
zm_fc = 0.50
TCP_IP = "100.101.0.11"  # Indirizzo IP del server
T_PORT = 65535  # Porta del server

socket_tcp = socket(AF_INET, SOCK_STREAM)
socket_tcp.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
socket_tcp.bind((TCP_IP, T_PORT))
socket_tcp.listen(1)

def receiveImage(conn):
    try:
        with open('/Users/Bia/Desktop/ReceivedImage.png', 'wb') as img:
            # Ricevi la dimensione dell'array di byte all'inizio del flusso
            size_bytes = conn.recv(4)
            image_size = int.from_bytes(size_bytes, byteorder='big')

            # Ricevi l'immagine
            remaining_size = image_size
            while remaining_size > 0:
                data = conn.recv(min(1024, remaining_size))
                if not data:
                    # Se non ci sono più dati da ricevere, esci dal ciclo
                    break
                img.write(data)
                remaining_size -= len(data)

        print("Immagine ricevuta dal dispositivo Android")

    except Exception as e:
        print("Errore durante la ricezione dell'immagine:", str(e))

def sendKey(key, conn):
    try:
        if key is not None:
            conn.send(key.encode())
            print("Chiave biometrica inviata al dispositivo Android")
        else:
            # Se il volto non è stato rilevato, invia un messaggio di "NO_FACE_DETECTED"
            conn.send("NO_FACE_DETECTED".encode())
            print("Nessun volto rilevato. Invio del messaggio di 'NO_FACE_DETECTED'")
    except Exception as e:
        print("Errore durante l'invio della chiave biometrica:", str(e))
    finally:
        conn.close()

def get_frame():
    try:
        frame = face_recognition.load_image_file('/Users/Bia/Desktop/ReceivedImage.png')
        face_locations = face_recognition.face_locations(frame)

        if len(face_locations) > 0:
            print("Volto rilevato.")
            face_encodings = face_recognition.face_encodings(frame, face_locations)
            return True, face_encodings[0]
        else:
            print("Nessun volto rilevato.")
            return False, None

    except Exception as e:
        print("Errore in get_frame:", str(e))
        return False, None

def start():
    try:
        ret, face_encoding = get_frame()
        if ret and face_encoding is not None:
            print("Chiave biometrica generata:", str(face_encoding))
            return str(face_encoding)
        else:
            print("Nessun volto rilevato.")
            return None
    except Exception as e:
        print("Errore nella generazione della chiave biometrica:", str(e))
    return None

if __name__ == '__main__':
    print("In attesa del dispositivo Android ...")

    while True:
        conn, addr = socket_tcp.accept()

        print("Connessione con il dispositivo Android stabilita. Pronto per ricevere l'immagine")
        receiveImage(conn)
        print("Generazione della chiave biometrica in corso ...")

        chiave_biometrica = start()
        if chiave_biometrica is not None:
            print("La chiave biometrica è stata generata:", chiave_biometrica)
            print("Invio della chiave al dispositivo Android ...")
            sendKey(chiave_biometrica, conn)
            conn.close()  # Chiudo la connessione dopo aver inviato la chiave
            
        else:
            print("Nessun volto rilevato. Si prega di reinserire le informazioni dell'utente.")
            chiave_messaggio = "NO_FACE_DETECTED"

            # Chiudo la connessione prima di inviare il messaggio
            conn.close()

            # Creo una nuova connessione per inviare il messaggio
            conn, addr = socket_tcp.accept()
            conn.send(chiave_messaggio.encode())

            conn.close()
thanks **smile**
Hello, territorial io I think instead of relying on a single face encoding, you can generate multiple encodings for each face and compare them to find a match. This approach allows for more robust matching by considering variations in lighting and other factors.