Construyendo un sistema de reconocimiento facial basado en Golang y OpenCV

Construyendo un sistema de reconocimiento facial basado en Golang y OpenCV
OpenCV es una biblioteca desarrollada para proyectos de visión por computadora. Ella ya tiene unos 20 años. Lo usé en la universidad y todavía lo uso para mis proyectos de C++ y Python porque tiene buen soporte para esos lenguajes.

Pero cuando comencé a aprender y usar Go, me pregunté si OpenCV podría usarse para trabajar con este lenguaje. En ese momento ya existían ejemplos y tutoriales sobre integración, pero me pareció que eran demasiado complicados. Un poco más tarde, me encontré con un envoltorio creado por The Hybrid Group. En este artículo, le mostraré cómo comenzar con GoCV desarrollando un sistema simple de reconocimiento facial con Haar Cascades.

Skillbox recomienda: Curso práctico "Desarrollador Python desde cero".

Recordamos: para todos los lectores de "Habr": un descuento de 10 rublos al inscribirse en cualquier curso de Skillbox utilizando el código promocional "Habr".

Lo que se requerirá:

  • Ir;
  • OpenCV (enlaces al instalador a continuación);
  • videocámara web o normal.

Instalación

ejemplo 1

En el primer ejemplo, intentaremos crear una aplicación que abra una ventana con la transmisión de video de la cámara.

Primero necesitas importar las bibliotecas que necesitas para trabajar.

importar
"Iniciar sesión"
“gocv.io/x/gocv”
)

Después de eso, necesitas crear un objeto VideoCapture usando la función VideoCaptureDevice. Este último permite capturar una transmisión de vídeo utilizando una cámara. La función toma un número entero como parámetro (representa el ID del dispositivo).

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

Ahora necesitamos crear una matriz de n dimensiones. Almacenará las imágenes leídas de la cámara.

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

Para mostrar la transmisión de video, debe crear una ventana; esto se puede hacer usando la función NewWindow.

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

Ahora pasemos a la parte más interesante.

Dado que el vídeo es un flujo continuo de fotogramas de imágenes, necesitaremos crear un bucle infinito para leer sin cesar el flujo de vídeo de la cámara. Esto requiere el método Read del tipo VideoCapture. Esperará un tipo Mat (la matriz que creamos anteriormente), que devolverá un valor booleano que indica si un fotograma de VideoCapture se leyó correctamente o no.

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

Ahora necesitamos mostrar el marco en la ventana creada. Haga una pausa para pasar al siguiente fotograma: 50 ms.

ventana.IMShow(img)
ventana.WaitKey(50)

Después de iniciar la aplicación, se abrirá una ventana con una transmisión de video de la cámara.

Construyendo un sistema de reconocimiento facial basado en Golang y 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)
}
}

ejemplo 2

En este ejemplo, usemos el ejemplo anterior y construyamos un sistema de reconocimiento facial basado en Haar Cascades.

Las cascadas de Haar son clasificadores en cascada que se entrenan en función de la técnica wavelet de Haar. Analizan los píxeles de una imagen para buscar características específicas. Para obtener más información sobre Haar Cascades, siga los enlaces a continuación.

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

Descargar cascadas ya entrenadas. aquí. En el ejemplo actual, se utilizarán cascadas para identificar el rostro de una persona al frente.

Para hacer esto, necesita crear un clasificador y alimentarlo con un archivo ya entrenado (el enlace se encuentra arriba). Ya cargué el archivo pencv_haarcascade_frontalface_default.xml en el directorio donde se encuentra nuestro programa.

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

Para detectar rostros en una imagen, debe utilizar el método DetectarMultiEscala. Esta función toma un fotograma (de tipo Mat) que acaba de leerse de la transmisión de video de la cámara y devuelve una matriz de tipo Rectángulo. El tamaño de la matriz representa la cantidad de caras que el clasificador pudo detectar en el marco. Luego, para asegurarnos de que vemos lo que encontró, repitamos la lista de rectángulos e imprimamos el objeto Rectángulo en la consola, creando un borde alrededor del rectángulo encontrado. Esto se puede hacer usando la función Rectángulo. Tomará el Mat leído por la cámara, el objeto Rectángulo devuelto por el método DetectMultiScale y el color y grosor del borde.

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

Construyendo un sistema de reconocimiento facial basado en Golang y OpenCV

Construyendo un sistema de reconocimiento facial basado en Golang y 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)
}
}

Y... sí, ¡todo salió bien! Ahora tenemos un sistema sencillo de reconocimiento facial escrito en Go. En un futuro próximo, planeo continuar con estos experimentos y crear cosas nuevas e interesantes combinando Go y OpenCV.

Si estás interesado por favor califica servidor web gRPC, que escribí en Python y OpenCV. Transmite datos tan pronto como se detecta una cara. Esta es la base para crear diferentes clientes en diferentes lenguajes de programación. Podrán conectarse al servidor y leer datos del mismo.

¡Gracias por leer el articulo!

Skillbox recomienda:

Fuente: habr.com

Añadir un comentario