BI Blog,  Machine Learning,  R,  slider

Real Time Face Detection con OpenCV e R

Il riconoscimento facciale (face detection) è una tecnica di intelligenza artificiale utilizzata per verificare l’identità di una persona a partire da una o più immagini che la ritraggono. Come potrete immaginare, i campi di applicazione sono immensi: dalla sicurezza (riconoscimento della persona che si trova di fronte al sensore) alla catalogazione delle immagini (molti strumenti, come Google Foto e Facebook, permettono di riconoscere le persone nelle foto). Alcune compagnie aeree utilizzano il riconoscimento facciale per l’imbarco dei passeggeri e quasi tutti i modelli di cellulari utilizzano il riconoscimento facciale per lo sblocco del dispositivo.

Nel nostro esercizio vedremo come identificare (in maniera generica) un volto in un’immagine o in un video: vi sorprenderà come sia possibile ottenere questi risultati tramite pochissime righe di codice in R e sfruttando la famosa libreria OpenCV.

Cos’è OpenCV

OpenCV è una libreria Open Source di Machine Learning e Computer Vision, contenente diverse migliaia di algoritmi, che hanno ottime prestazioni in termini di accuratezza e velocità. Scritto in C++, possiede interfacce per i principali linguaggi utilizzati per il machine learning, compreso R, dove il package opencv (https://cran.r-project.org/web/packages/opencv/) si occupa proprio di fare da collegamento con la libreria.

Face Detection con R

Tra i vari algoritmi, esamineremo quelli di riconoscimento del volto (face detection) ed elaborazione in tempo reale delle immagini provenienti dalla webcam. Il riconoscimento dei volti è parte della visione artificiale (o computer vision), il cui scopo è riconoscere o rilevare volti umani in una qualsiasi immagine digitale ed appartiene al più ampio settore dell’Object Detection, dove si cerca più in generale di individuare e classificare specifici oggetti (animali, automobili, esseri umani, ecc).

Iniziamo con l’installazione del package:

> install.packages("opencv")
> library(opencv)

Proviamo ora ad effettuare un riconoscimento abbastanza facile: quello del nostro volto! È necessario, ovviamente, che siate in possesso di una webcam qualsiasi sul vostro pc. La funzione ocv_picture() preleva dalla webcam un’immagine, che salveremo nella variabile test1. Con la funzione ocv_write() salviamo l’immagine nel file test1.png. Sistematevi di fronte alla webcam ed eseguite il codice:

> # Face detection da webcam
> test1 <- ocv_picture()
> ocv_write(test1, 'test1.png')

A questo punto utilizziamo la funzione ocv_face() che prenderà in input l’immagine appena prelevata e proverà ad effettuare il riconoscimento del volto:

> test1_faces <- ocv_face(test1)
> ocv_write(test1_faces, 'test1_faces.png')

Potrete osservare che nel file test1_faces.png il vostro viso sarà circondato da un cerchio. Riconoscere un viso nella foto di un viso, in effetti, non è così complicato. Proviamo ad aumentare la difficoltà e scarichiamo una qualsiasi foto con tanti volti da internet:

Chiamiamola test2.jpg e posizioniamola nella cartella di lavoro di R. Eseguiamo:

> # Face detection da immagine
> test2 <- ocv_read('test2.jpg')
> test2_faces <- ocv_face(test2)
> ocv_write(test2_faces, 'test2_faces.jpg')

“C:\\..\\test2_faces.jpg”

> test2_faces

<pointer: 0x0000021a6f3fc270>
attr(,”class”)
1 “opencv-image”

Il risultato sarà:

Real Time Face Detection

Potrete notare che quasi tutti i volti sono stati correttamente identificati. L’identificazione può avvenire anche live, analizzando in tempo reale il flusso proveniente dalla webcam:

> # Live face detection
> ocv_video(ocv_face)

Oppure possiamo applicare filtri live:

> # Applica filtri
> ocv_video(ocv_edges)
> ocv_video(ocv_knn)
> ocv_video(ocv_facemask)
> ocv_video(ocv_mog2)
> ocv_video(ocv_stylize)
> ocv_video(ocv_sketch)

Elaborazione delle immagini

Proviamo ad applicare vari filtri ad un’immagine:

> # Filtri su immagini
> test3 <- ocv_read('test3.jpg')


> ocv_sketch(test3, color = T)


> ocv_blur(test3, ksize = 15)


> ocv_markers(test3)


> ocv_stylize(test3)

Per ottenere, invece, le coordinate della maschera:

> # coordinate della maschera
> facemask <- ocv_facemask(test3)
> attr(facemask, 'faces')
radius   x   y
1     82 418 200

Ti interessa il Machine Learning?

Tutto quello che devi conoscere (e molto di più) puoi trovarlo nel mio libro Data Science e Machine Learning, disponibile sia in versione cartacea che digitale. Puoi acquistarlo da qui:

 Acquista il libro su Amazon

Acquista l’ebook su Kindle

Acquista l’ebook su Kobo

Acquista l’ebook su Play Libri

 

Leave a Reply