Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Face Detection in Python in 10 linee di codice

Il riconoscimento facciale non è mai stato così semplice! Realizzeremo infatti un semplice script Python che lo implementa in sole 10 linee di codice.
Il riconoscimento facciale non è mai stato così semplice! Realizzeremo infatti un semplice script Python che lo implementa in sole 10 linee di codice.
Link copiato negli appunti

Implementare un algoritmo di riconoscimento facciale potrebbe ancora sembrare qualcosa di complicato. In questo articolo, scopriremo invece quanto sia semplice mettere a punto uno script in grado di riconoscere un volto in modo efficiente e robusto. Per farlo, sfrutteremo la semplicità e la potenza di Python, uno dei linguaggi di programmazione più utilizzati negli ambiti di data science, machine learning ed intelligenza artificiale.

Più precisamente, il nostro script utilizzerà le potenzialità della libreria OpenCV, che implementa già uno degli algoritmi di classificazione più usati in questo contesto, noto come Haar-Cascade. Questo algoritmo (che non approfondiamo in questa sede) ci permetterà di sfruttare un classificatore già pronto e disponibile sul repository di OpenCV, cosa che ci eviterà l'onere di dover addestrare un algoritmo con un training set tutto da definire.

Ma partiamo subito con il nostro tutorial. Per i nostri scopi, faremo riferimento all'ultima versione stabile di Python, vale a dire la 3.8.

Installazione di OpenCV

Prima di iniziare, dobbiamo assicurarci di avere installato il modulo di Python che permette di usare la libreria OpenCV su questo linguaggio di programmazione. Per farlo, possiamo sfruttare pip:

pip install opencv-python

Fatto ciò, dovremo scaricare il file XML contenente i dati del classificatore pre-addestrato. Possiamo trovare questo file direttamente sul già citato repository di OpenCV, o alternativamente scaricandolo da questo link.

Dopo questi semplici passaggi, siamo pronti per analizzare il codice.

Face Detection da immagini statiche

Per poter implementare il nostro script, la prima cosa da fare è importare OpenCV (rappresentato dal modulo cv2) e caricare il file contenente i dati del classificatore:

import cv2
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

A questo punto, abbiamo bisogno di un'immagine da usare come banco di prova. Per i nostri test abbiamo scelto la seguente:

Figura 1. Immagine di test (click per ingrandire)Immagine di test

Creiamo quindi un oggetto rappresentante la nostra immagine, sfruttando ancora una volta le funzionalità offerte dal modulo cv2:

img = cv2.imread('img.jpg')

A questo punto, è bene precisare che il classificare che stiamo utilizzando lavora esclusivamente su immagini in scala di grigi. Per ovviare a questo problema, ci basterà convertire la nostra immagine in questa rappresentazione. Ancora una volta, sfruttiamo le funzionalità di OpenCV:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Infine, non resta che sfruttare il classificatore che avevamo salvato in face_cascade, applicandolo all'immagine img:

faces = face_cascade.detectMultiScale(gray, 1.1, 4)

Come si vede, il metodo detectMultiScale richiede tre parametri:

  • il primo parametro deve essere l'immagine in scala di grigi
  • il secondo parametro è un fattore di scala, richiesto dal classificatore Haar-Cascade per realizzare una serie di versioni ridotte dell'immagine originaria, a formare una sorta di piramide, come quella mostrata nella figura seguente:
    Figura 2. Esempio di rappresentazione piramidale dell'immagine (click per ingrandire)Esempio di rappresentazione piramidale dell'immagine

    Questa rappresentazione è cruciale per il classificatore, in quanto su di essa si basa il processo di estrazione delle caratteristiche maggiormente salienti dell'immagine, poi usate per il riconoscimento vero e proprio

  • il terzo ed ultimo parametro rappresenta il numero di regioni vicine che deve essere considerato dall'algoritmo per ognuna delle aree candidate ad essere riconosciute come volti. Valori più alti permettono, generalmente, un minor numero di volti riconosciuti, ma una migliore qualità del riconoscimento

Per potere apprezzare la qualità di questo algoritmo, dovremo però visualizzare il risultato del riconoscimento. La lista faces, infatti, contiene le coordinate di ognuno dei volti identificati dal nostro algoritmo, e possiamo sfruttare queste informazioni per disegnare un rettangolo attorno ad ognuno dei volti identificati. Il codice che implementa ciò è molto semplice:

for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.imshow('img', img)
cv2.waitKey()

Il risultato sarà il seguente:

Figura 3. Risultato dell'algoritmo di face detection implementato (click per ingrandire)Risultato dell'algoritmo di face detection implementato

Considerazioni finali

Contando il numero di linee di codice, ci possiamo subito rendere conto di quanto sia stato semplice implementare questo algoritmo. Ci sono ancora molti altri miglioramenti possibili: potremmo, ad esempio, provare ad applicare il riconoscimento facciale ad un video, magari catturato dalla nostra webcam o da una videocamera di sicurezza. Poiché lo scopo di questo articolo era però quello di dimostrare la semplicità di implementazione del riconoscimento facciale in Python, lasciamo le rimanenti sperimentazioni al lettore, come utile esercizio per mettere in pratica questo ed altri tutorial disponibili su HTML.it

Il codice completo visto in questo articolo è disponibile a face_detection_code.

Ti consigliamo anche