Construír un sistema de recoñecemento facial baseado en Golang e OpenCV

Construír un sistema de recoñecemento facial baseado en Golang e OpenCV
OpenCV é unha biblioteca deseñada para proxectos de visión por ordenador. Xa ten uns 20 anos. Useino na facultade e sigo usándoo para os meus proxectos C++ e Python porque ten un bo soporte para eses idiomas.

Pero cando comecei a aprender e usar Go, interesoume se OpenCV podía usarse para traballar con este idioma. Daquela xa había exemplos e titoriais sobre integración, pero parecíame que eran demasiado complicados. Un pouco máis tarde, atopeime cun envoltorio creado polo equipo de The Hybrid Group. Neste artigo, mostrarei como comezar con GoCV desenvolvendo un sistema de recoñecemento facial sinxelo con Haar Cascades.

Skillbox recomenda: Curso práctico "Desenvolvedor Python desde cero".

Recordámolo: para todos os lectores de "Habr" - un desconto de 10 rublos ao inscribirse en calquera curso de Skillbox usando o código promocional "Habr".

O que se require:

  • Vaia;
  • OpenCV (ligazóns de instalación abaixo);
  • web ou cámara de vídeo normal.

Instalación

Exemplo 1

No primeiro exemplo, tentaremos crear unha aplicación que abra unha xanela que mostra un fluxo de vídeo da cámara.

Primeiro cómpre importar as bibliotecas necesarias para traballar.

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

Despois diso, cómpre crear un obxecto VideoCapture usando a función VideoCaptureDevice. Este último permite capturar un fluxo de vídeo mediante unha cámara. A función usa un número enteiro como parámetro (representa o ID do dispositivo).

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

Agora necesitamos crear unha matriz n-dimensional. Almacenará as imaxes lidas desde a cámara.

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

Para mostrar un fluxo de vídeo, cómpre crear unha xanela; isto pódese facer usando a función NewWindow.

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

Agora pasemos á parte máis interesante.

Dado que o vídeo é un fluxo continuo de cadros de imaxe, necesitaremos crear un bucle infinito para ler sen fin o fluxo de vídeo da cámara. Para iso, necesitas o método Read do tipo VideoCapture. Esperará un tipo Mat (a matriz que creamos anteriormente), devolvendo un valor booleano que indica se o cadro do VideoCapture foi lido con éxito ou non.

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

Agora cómpre mostrar o marco na xanela creada. A pausa para pasar ao seguinte fotograma é de 50 ms.

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

Despois de iniciar a aplicación, abrirase unha xanela cun fluxo de vídeo da cámara.

Construír un sistema de recoñecemento facial baseado en 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)
}
}

Exemplo 2

Neste exemplo, usemos o exemplo anterior e creemos un sistema de recoñecemento facial baseado en Haar Cascades.

As cascadas de Haar son clasificadores en cascada que se adestran mediante a técnica de wavelet de Haar. Analizan os píxeles dunha imaxe para detectar determinadas características. Para obter máis información sobre Haar Cascades, siga as seguintes ligazóns.

Marco de detección de obxectos Viola-Jones
Clasificadores en cascada
Característica similar a Haar

Descarga cascadas xa adestradas pode estar aquí. No exemplo actual, utilizaranse cascadas para identificar o rostro dunha persoa desde a fronte.

Para facelo, cómpre crear un clasificador e alimentarlle cun ficheiro xa adestrado (a ligazón aparece arriba). Xa carguei o ficheiro pencv_haarcascade_frontalface_default.xml ao directorio onde se atopa o noso programa.

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

Para detectar caras nunha imaxe, cómpre utilizar o método DetectMultiScale. Esta función toma un cadro (tipo Mat) que se acaba de ler do fluxo de vídeo da cámara e devolve unha matriz de tipo Rectangle. O tamaño da matriz representa o número de caras que o clasificador puido detectar no marco. Entón, para asegurarnos de que vemos o que atopou, imos iterando pola lista de rectángulos e imprimamos o obxecto Rectangle na consola, creando un bordo arredor do rectángulo detectado. Isto pódese facer usando a función Rectángulo. Aceptará o Mat lido pola cámara, o obxecto Rectangle que foi devolto polo método DetectMultiScale, a cor e o grosor do bordo.

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

Construír un sistema de recoñecemento facial baseado en Golang e OpenCV

Construír un sistema de recoñecemento facial baseado en 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... si, todo funcionou! Agora temos un sinxelo sistema de recoñecemento facial escrito en Go. Pronto penso continuar con estes experimentos e crear novas cousas interesantes combinando Go e OpenCV.

Se estás interesado, valora servidor web gRPC, que escribín en Python e OpenCV. Transmite datos no momento en que se detecta unha cara. Esta é a base para crear diferentes clientes en diferentes linguaxes de programación. Poderán conectarse ao servidor e ler datos del.

Grazas por ler o artigo!

Skillbox recomenda:

Fonte: www.habr.com

Engadir un comentario