Ti sei mai chiesto come Snapchat applichi accuratamente vari filtri sul tuo viso? Il tuo smartphone sta facendo magie quando si sblocca usando i tratti del tuo viso? No, stai solo guardando Face Detection in azione.

Face Detection è una tecnologia di Intelligenza Artificiale in grado di identificare i volti umani in un'immagine o in un video digitale. Scopri come creare un programma di rilevamento dei volti in tempo reale in meno di 25 righe di codice con il leggendario algoritmo Haar Cascade.

Cos'è la cascata di Haar?

Haar Cascade è un algoritmo di rilevamento degli oggetti introdotto da Paul Viola e Michael Jones per rilevare i volti nelle immagini o nei video. Viene addestrata una funzione a cascata utilizzando molte immagini positive e negative che possono essere successivamente utilizzate per identificare qualsiasi oggetto o volto in altri media. Questi file addestrati sono disponibili nel formato Repository OpenCV GitHub.

Utilizzando un approccio a finestra scorrevole, una finestra di dimensioni fisse itera su un'immagine da sinistra a destra, dall'alto verso il basso. Ad ogni fase, la finestra si ferma e classifica se l'area contiene o meno una faccia.

instagram viewer

OpenCV, uno strumento di visione artificiale, funziona con un modello Haar Cascade pre-addestrato per classificare le caratteristiche. Ciascuna fase controlla cinque feature: due feature di spigolo, due feature di linea e una feature di quattro rettangoli.

All'osservazione, la zona degli occhi appare più scura della zona delle guance mentre la zona del naso appare più luminosa della zona degli occhi. Puoi visualizzare queste funzionalità nel modo seguente.

Utilizzando queste funzionalità e il calcolo dei pixel, l'algoritmo identifica più di 100.000 punti dati. È quindi possibile utilizzare un algoritmo Adaboost per migliorare la precisione ed eliminare le funzionalità irrilevanti. Nel corso di molte iterazioni, questo approccio riduce al minimo il tasso di errore e aumenta il peso della caratteristica fino a raggiungere una precisione accettabile.

Tuttavia, la tecnica della finestra scorrevole si interrompe se un particolare test case fallisce ed è computazionalmente costosa. Per risolvere questo problema, puoi applicare il concetto di Cascade of Classifiers. Invece di applicare tutte le funzionalità in un'unica finestra, questo approccio le raggruppa e le applica in più fasi.

Se la finestra fallisce la prima fase, il processo la scarta, altrimenti continua. Ciò porta a una drastica diminuzione del numero di operazioni da eseguire e ne rende fattibile l'utilizzo per applicazioni in tempo reale.

Flusso di lavoro del rilevamento dei volti

Segui questo algoritmo per creare il tuo programma di rilevamento del volto:

  1. Carica l'algoritmo Haar Cascade Frontal Face.
  2. Inizializza la fotocamera.
  3. Leggi i fotogrammi dalla fotocamera.
  4. Converti immagini a colori in scala di grigi.
  5. Ottieni le coordinate del viso.
  6. Disegna un rettangolo e inserisci il messaggio appropriato.
  7. Visualizza l'output.

Che cos'è Open CV?

OpenCV è una libreria open source di computer vision e machine learning. Ha oltre 2.500 algoritmi ottimizzati per varie applicazioni. Questi includono il rilevamento di volti/oggetti, il riconoscimento, la classificazione e molti altri.

Privacy dei tuoi dati facciali è una preoccupazione separata. Centinaia di importanti aziende come Google, IBM e Yahoo utilizzano OpenCV nelle loro applicazioni. Alcune persone che mirano a mantenere i propri dati privati ​​​​hanno dimostrato ci sono modi per evitare il riconoscimento facciale.

Per installare OpenCV in Python, usa il comando:

pippo installare opencv-python

Come costruire un programma di rilevamento dei volti usando Python

Segui questi passaggi per costruire il rilevatore di volti:

Questo codice di esempio, insieme al file dell'algoritmo Haar Cascade, è disponibile in formato a Deposito GitHub ed è gratuito per l'uso sotto la licenza MIT.

  1. Scarica il Haar Cascade Faccia frontale XML predefinito file e posizionalo nella stessa posizione del tuo programma Python.
  2. Importa la libreria OpenCV.
    # importazione delle librerie richieste
    importare cv2
  3. Archiviare il file dell'algoritmo Haar Cascade Frontal Face per un facile riferimento.
    # caricamento del file dell'algoritmo haar case nella variabile alg
    alg = "haarcascade_frontalface_default.xml"
  4. Utilizzare la classe CascadeClassifier per caricare un file XML in OpenCV.
    # passando l'algoritmo a OpenCV
    haar_cascade = cv2.CascadeClassifier (alg)
  5. Cattura il video dalla fotocamera. Passa 0 al Acquisizione video() funzione per utilizzare la fotocamera principale. Se hai collegato una fotocamera esterna, puoi utilizzare i numeri successivi 1, 2 e così via per utilizzarla.
    # acquisizione del feed video dalla videocamera
    cam = cv2.VideoCapture (0)
  6. Imposta un ciclo infinito per leggere l'input della telecamera fotogramma per fotogramma. IL Leggere() la funzione restituisce due parametri. Il primo valore è di tipo booleano che indica se l'operazione è andata a buon fine o meno. Il secondo parametro contiene il frame effettivo con cui lavorerai. Memorizza questo frame nel file imm variabile.
    MentreVERO:
    _, img = cam.read()
  7. Imposta il testo predefinito da visualizzare come Volto non rilevato. Quando viene rilevato, aggiorna il valore di questa variabile.
     testo = "Volto non rilevato"
  8. L'input ricevuto dal mondo reale è colorato, nel formato BGR. BGR sta per blu, verde e rosso. Questo crea molta elaborazione per le applicazioni di visione artificiale. Per ridurlo, usa un formato in scala di grigi.
    # converte ogni fotogramma da BGR a scala di grigi
    grayImg = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)
    Passa il frame e il formato del codice di conversione, COLORE_BGR2GRIGIO, A cvtColor() per cambiare ogni fotogramma del video da colore a scala di grigi.
  9. Utilizzo rilevaMultiscala() per rilevare i volti. Questo metodo accetta tre parametri come input. La prima è l'immagine sorgente, grigioImg. Il secondo parametro è scaleFactor. Questo specifica quanto devi ridurre la dimensione dell'immagine ad ogni scala dell'immagine. Utilizzare il valore predefinito 1.3 come fattore di scala. Maggiore è il fattore di scala, minore è il numero di passaggi e più rapida è l'esecuzione. Tuttavia, c'è anche una maggiore probabilità di volti mancanti. Il terzo parametro è minNeighbors. Questo specifica quanti vicini ogni rettangolo candidato dovrebbe avere per conservarlo. Più alto è il valore, minore è la possibilità di un falso positivo, ma significa anche perdere tracce del viso poco chiare.
    # rileva i volti utilizzando Haar Cascade 
    faccia = haar_cascade.detectMultiScale (grayImg, 1.3, 4)
  10. Quando rilevi un volto, ottieni quattro coordinate. x rappresenta la coordinata x, y rappresenta la coordinata y, w rappresenta la larghezza e h rappresenta l'altezza. Aggiorna il testo a Volto rilevato e disegna un rettangolo usando queste coordinate. Il colore del rettangolo è il formato verde (BGR) con uno spessore di due pixel.
    # disegna un rettangolo attorno al viso e aggiorna il testo in Face Detected
    per (x, y, w, h) in faccia:
    testo = "Volto rilevato"
    cv2.rettangolo(imm, (X, si), (X + w, si + H), (0, 255, 0), 2)
  11. Facoltativamente, stampa il testo sulla console di output. Visualizzare il testo sullo schermo utilizzando il fotogramma acquisito come sorgente, il testo come ottenuto nel testo sopra, font stile di FONT_HERSHEY_SIMPLEX, fattore di scala del carattere di 1, colore blu, spessore di due pixel e tipo di linea di AA.
    # visualizza il testo sull'immagine
    stampa(testo)
    immagine = cv2.putText (img, testo, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
  12. Visualizza la finestra con il titolo Riconoscimento facciale e l'immagine. Usa il tasto attesa() metodo per visualizzare la finestra per 10 millisecondi e verificare la pressione di un tasto. Se un utente preme il Esc chiave (valore ASCII 27), uscire dal ciclo.
    # visualizza la finestra di output e premi il tasto Esc per uscire
    cv2.imshow("Riconoscimento facciale", Immagine)
    chiave = cv2.waitKey (10)

    se chiave == 27:
    rottura

  13. Infine, rilascia l'oggetto fotocamera dal programma python e chiudi tutte le finestre.
    Camera.pubblicazione()
    cv2.destroyAllWindows()

Rilevamento dei volti utilizzando Python in azione

Quando una faccia è in vista, dovresti vedere un output come questo:

Quando non è presente alcun volto, vedrai un messaggio come questo:

Limitazioni del rilevamento dei volti mediante l'algoritmo Haar Cascade

Sebbene questo algoritmo sia leggero, con un modello di piccole dimensioni e funzioni velocemente, ci sono alcune limitazioni:

  • In un video in tempo reale, il volto deve trovarsi nel campo visivo della telecamera. Se la faccia è troppo lontana o troppo vicina o troppo inclinata l'algoritmo non riesce a rilevare le caratteristiche.
  • È un algoritmo frontale, quindi non è possibile rilevare le viste laterali.
  • Risultati falsi positivi elevati. Spesso rileva le aree come volti anche se non è presente un volto.
  • Ha bisogno di condizioni di luce ottimali. Un'illuminazione eccessiva o scarsa ostacola la precisione dell'algoritmo.

Le numerose applicazioni del rilevamento dei volti

Il rilevamento dei volti ha una vasta gamma di applicazioni nel mondo di oggi. Puoi usarlo per il riconoscimento facciale su smartphone, case, veicoli e posti di blocco dell'immigrazione. Il rilevamento facciale è già comune nella sorveglianza CCTV, nei filtri dei social media e nel tracciamento automatico dei volti nella cinematografia.

È solo l'inizio di questa meravigliosa tecnologia. Con i progressi, potremmo essere in grado di identificare i bambini scomparsi, catturare criminali e prevenire crimini come il furto di identità.