Construir un sistema de reconeixement facial basat en Golang i OpenCV

Construir un sistema de reconeixement facial basat en Golang i OpenCV
OpenCV és una biblioteca desenvolupada per a projectes de visió per ordinador. Ja té uns 20 anys. El vaig utilitzar a la universitat i encara el vaig utilitzar per als meus projectes C++ i Python perquè té un bon suport per a aquests idiomes.

Però quan vaig començar a aprendre i utilitzar Go, em vaig preguntar si OpenCV es podria utilitzar per treballar amb aquest llenguatge. En aquell moment ja hi havia exemples i tutorials sobre integració, però em va semblar que eren massa complicats. Una mica més tard, em vaig trobar amb un embolcall creat per The Hybrid Group. En aquest article, us mostraré com començar amb GoCV desenvolupant un sistema senzill de reconeixement facial amb Haar Cascades.

Skillbox recomana: Curs pràctic "Desenvolupador Python des de zero".

Recordem: per a tots els lectors de "Habr": un descompte de 10 rubles en inscriure's a qualsevol curs de Skillbox amb el codi promocional "Habr".

El que es requereix:

  • Vaja;
  • OpenCV (enllaços a l'instal·lador a continuació);
  • càmera de vídeo web o normal.

Instal · lació

Exemple 1

En el primer exemple, intentarem crear una aplicació que obri una finestra amb un flux de vídeo de la càmera.

Primer heu d'importar les biblioteques que necessiteu per treballar.

importar (
"registre"
“gocv.io/x/gocv”
)

Després d'això, heu de crear un objecte VideoCapture mitjançant la funció VideoCaptureDevice. Aquest últim permet capturar un flux de vídeo mitjançant una càmera. La funció pren un nombre enter com a paràmetre (representa l'ID del dispositiu).

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

Ara hem de crear una matriu n-dimensional. Emmagatzemarà les imatges llegides des de la càmera.

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

Per mostrar el flux de vídeo, heu de crear una finestra; això es pot fer mitjançant la funció NewWindow.

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

Ara passem a la part més interessant.

Com que el vídeo és un flux continu de fotogrames d'imatge, haurem de crear un bucle infinit per llegir sense parar el flux de vídeo de la càmera. Això requereix el mètode Read del tipus VideoCapture. Esperarà un tipus Mat (la matriu que hem creat anteriorment), que retornarà un booleà que indica si un fotograma de VideoCapture s'ha llegit correctament o no.

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

Ara hem de mostrar el marc a la finestra creada. Pausa per passar al següent fotograma - 50 ms.

finestra.IMShow(img)
window.WaitKey(50)

Després d'iniciar l'aplicació, s'obrirà una finestra amb un flux de vídeo de la càmera.

Construir un sistema de reconeixement facial basat en Golang i 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)
}
}

Exemple 2

En aquest exemple, utilitzem l'exemple anterior i creem un sistema de reconeixement facial basat en Haar Cascades.

Les cascades Haar són classificadors en cascada que s'entrenen basant-se en la tècnica wavelet Haar. Analitzen els píxels d'una imatge per buscar característiques específiques. Per obtenir més informació sobre Haar Cascades, seguiu els enllaços següents.

Marc de detecció d'objectes Viola-Jones
Classificadors en cascada
Característica semblant a Haar

Descarrega cascades ja entrenades pot ser aquí. En l'exemple actual, s'utilitzaran cascades per identificar la cara d'una persona davant.

Per fer-ho, heu de crear un classificador i alimentar-lo amb un fitxer ja entrenat (l'enllaç es troba més amunt). Ja he penjat el fitxer pencv_haarcascade_frontalface_default.xml al directori on es troba el nostre programa.

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

Per detectar cares en una imatge, cal utilitzar el mètode DetectMultiScale. Aquesta funció pren un fotograma (de tipus Mat) que s'acaba de llegir del flux de vídeo de la càmera i retorna una matriu de tipus Rectangle. La mida de la matriu representa el nombre de cares que el classificador ha pogut detectar en el marc. Aleshores, per assegurar-nos que veiem què ha trobat, anem a iterar per la llista de rectangles i imprimir l'objecte Rectangle a la consola, creant una vora al voltant del rectangle trobat. Això es pot fer mitjançant la funció Rectangle. Prendrà el Mat llegit per la càmera, l'objecte Rectangle retornat pel mètode DetectMultiScale i el color i el gruix de la vora.

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

Construir un sistema de reconeixement facial basat en Golang i OpenCV

Construir un sistema de reconeixement facial basat en Golang i 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)
}
}

I... sí, tot va sortir! Ara tenim un sistema senzill de reconeixement facial escrit a Go. En un futur proper, penso continuar amb aquests experiments i crear noves coses interessants combinant Go i OpenCV.

Si esteu interessats, puntueu si us plau servidor web gRPC, que vaig escriure en Python i OpenCV. Transmet dades tan bon punt es detecta una cara. Aquesta és la base per crear diferents clients en diferents llenguatges de programació. Podran connectar-se al servidor i llegir-ne dades.

Gràcies per llegir l'article!

Skillbox recomana:

Font: www.habr.com

Afegeix comentari