Costruire un sistema di riconoscimento facciale basato su Golang e OpenCV

Costruire un sistema di riconoscimento facciale basato su Golang e OpenCV
OpenCV è una libreria progettata per progetti di visione artificiale. Ha già circa 20 anni. L'ho usato al college e lo uso ancora per i miei progetti C++ e Python perché ha un buon supporto per quei linguaggi.

Ma quando ho iniziato a imparare e a usare Go, mi sono interessato a sapere se OpenCV potesse essere utilizzato per lavorare con questo linguaggio. All’epoca esistevano già esempi e tutorial sull’integrazione, ma mi sembrava che fossero troppo complicati. Poco dopo, mi sono imbattuto in un wrapper creato dal team di The Hybrid Group. In questo articolo ti mostrerò come iniziare con GoCV sviluppando un semplice sistema di riconoscimento facciale con Haar Cascades.

Skillbox consiglia: Corso pratico "Sviluppatore Python da zero".

Ti ricordiamo: per tutti i lettori di "Habr" - uno sconto di 10 rubli al momento dell'iscrizione a qualsiasi corso Skillbox utilizzando il codice promozionale "Habr".

Cosa sarà richiesto:

  • Andare;
  • OpenCV (link di installazione di seguito);
  • web o una normale videocamera.

Installazione

esempio 1

Nel primo esempio, proveremo a creare un'applicazione che apra una finestra che mostra il flusso video della telecamera.

Per prima cosa devi importare le librerie necessarie per il lavoro.

importazione (
"tronco d'albero"
“gocv.io/x/gocv”
)

Successivamente, è necessario creare un oggetto VideoCapture utilizzando la funzione VideoCaptureDevice. Quest'ultimo consente di catturare un flusso video utilizzando una fotocamera. La funzione utilizza un numero intero come parametro (rappresenta l'ID del dispositivo).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()

Ora dobbiamo creare una matrice n-dimensionale. Memorizzerà le immagini lette dalla fotocamera.

img := gocv.NewMat()
defer img.Close()

Per visualizzare un flusso video, è necessario creare una finestra: questo può essere fatto utilizzando la funzione Nuova Finestra.

window := gocv.NewWindow(“webcamwindow”)
defer window.Close()

Passiamo ora alla parte più interessante.

Poiché il video è un flusso continuo di fotogrammi di immagine, dovremo creare un ciclo infinito per leggere all'infinito il flusso video della telecamera. Per fare ciò è necessario il metodo Read del tipo VideoCapture. Si aspetterà un tipo Mat (la matrice che abbiamo creato sopra), restituendo un valore booleano che indica se il fotogramma del VideoCapture è stato letto con successo o meno.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty( {
        log.Println(“Unable to read from the webcam”)    continue
     }
.
.
.
}

Ora devi visualizzare la cornice nella finestra creata. La pausa per passare al fotogramma successivo è di 50 ms.

window.IMMostra(img)
window.WaitKey(50)

Dopo aver avviato l'applicazione, si aprirà una finestra con un flusso video dalla telecamera.

Costruire un sistema di riconoscimento facciale basato su Golang e OpenCV

package main
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("error opening device: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the webcam")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

esempio 2

In questo esempio, utilizziamo l'esempio precedente e creiamo un sistema di riconoscimento facciale basato su Haar Cascades.

Le cascate Haar sono classificatori a cascata addestrati utilizzando la tecnica wavelet Haar. Analizzano i pixel di un'immagine per rilevare determinate caratteristiche. Per saperne di più su Haar Cascades, segui i link sottostanti.

Framework di rilevamento degli oggetti Viola-Jones
Classificatori a cascata
Caratteristica simile a Haar

Scarica cascate già addestrate qui. Nell'esempio attuale, le cascate verranno utilizzate per identificare il volto di una persona dalla parte anteriore.

Per fare ciò, è necessario creare un classificatore e alimentarlo con un file già addestrato (il collegamento è fornito sopra). Ho già caricato il file pencv_haarcascade_frontalface_default.xml nella directory in cui si trova il nostro programma.

harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

Per rilevare i volti in un'immagine, è necessario utilizzare il metodo Rileva MultiScala. Questa funzione prende un fotogramma (tipo Mat) appena letto dal flusso video della telecamera e restituisce un array di tipo Rectangle. La dimensione dell'array rappresenta il numero di volti che il classificatore è stato in grado di rilevare nella cornice. Quindi, per essere sicuri di vedere cosa ha trovato, iteriamo attraverso l'elenco dei rettangoli e stampiamo l'oggetto Rectangle sulla console, creando un bordo attorno al rettangolo rilevato. Questo può essere fatto utilizzando la funzione Rettangolo. Accetterà il Mat letto dalla fotocamera, l'oggetto Rectangle restituito dal metodo DetectMultiScale, il colore e lo spessore del bordo.

for _, r := range rects {
fmt.Println(“detected”, r)
gocv.Rectangle(&img, r, color, 2)
}

Costruire un sistema di riconoscimento facciale basato su Golang e OpenCV

Costruire un sistema di riconoscimento facciale basato su Golang e OpenCV

package main
 
import (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("error opening web cam: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
harrcascade := "opencv_haarcascade_frontalface_default.xml"
classifier := gocv.NewCascadeClassifier()
classifier.Load(harrcascade)
defer classifier.Close()
 
color := color.RGBA{0, 255, 0, 0}
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the device")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

E... sì, tutto ha funzionato! Ora abbiamo un semplice sistema di riconoscimento facciale scritto in Go. Presto ho intenzione di continuare questi esperimenti e creare nuove cose interessanti combinando Go e OpenCV.

Se sei interessato, valuta server Web gRPC, che ho scritto in Python e OpenCV. Trasmette i dati nel momento in cui viene rilevato un volto. Questa è la base per creare diversi client in diversi linguaggi di programmazione. Saranno in grado di connettersi al server e leggere i dati da esso.

Grazie per aver letto l'articolo!

Skillbox consiglia:

Fonte: habr.com

Aggiungi un commento