Construyendo un sistema de reconocimiento facial basado en Golang y OpenCV


OpenCV es una biblioteca diseñada 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 en C ++ y Python, porque tiene un buen soporte para estos lenguajes.

Pero cuando comencé a aprender y usar Go, me preguntaba si OpenCV podría usarse para trabajar con este lenguaje. En ese momento, ya había ejemplos y tutoriales sobre integración, pero me pareció que eran demasiado complicados. Poco después me encontré con un contenedor creado por el equipo de 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: el programa práctico Python Developer desde cero .

Le recordamos: para todos los lectores de "Habr": un descuento de 10.000 rublos al registrarse en cualquier curso de Skillbox con el código de promoción "Habr".

Lo que se requiere:
  • Ir;
  • OpenCV (enlaces del instalador a continuación);
  • Videocámara web o convencional.

Instalación


Ejemplo 1


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

Primero debe importar las bibliotecas que necesita para trabajar.

importar (
"Iniciar sesión"
"Gocv.io/x/gocv"
)

Después de eso, debe crear un objeto VideoCapture utilizando la función VideoCaptureDevice. Este último permite capturar la transmisión de video usando la cámara. La función utiliza un número entero como parámetro (representa la ID del dispositivo).

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

Ahora necesita crear una matriz n-dimensional. Almacenará imágenes leídas de la cámara.

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

Para mostrar la secuencia 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 video es un flujo continuo de cuadros de imagen, necesitaremos crear un bucle sin fin para leer el flujo de video de la cámara sin cesar. Para hacer esto, necesita el método de lectura de tipo VideoCapture. Esperará el tipo Mat (la matriz que creamos anteriormente), devolviendo un valor booleano que indica si el fotograma de VideoCapture se leyó con éxito o no.

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

Ahora necesita mostrar el marco en la ventana creada. Pausa para ir al siguiente cuadro: 50 ms.

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

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



 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 (Haar cascades).

Las cascadas de Haar son clasificadores en cascada que se entrenan según la técnica de wavelet de Haar. Analizan los píxeles en la imagen para detectar ciertos signos. 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 al cabello

Puede descargar cascadas ya entrenadas aquí . En el ejemplo actual, las cascadas se utilizarán para identificar cara a cara a una persona.

Para hacer esto, debe crear un clasificador y alimentarlo con un archivo ya entrenado (se proporciona el enlace de arriba). Ya he subido el archivo pencv_haarcascade_frontalface_default.xml al directorio donde se encuentra nuestro programa.

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

Para detectar caras en la imagen, debe usar el método DetectMultiScale . Esta función toma un cuadro (tipo Mat) que se acaba de leer 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 el número de caras que el clasificador pudo detectar en el marco. Luego, para asegurarnos de que vemos lo que encontró, repasemos la lista de rectángulos y visualicemos el objeto Rectángulo en la consola, creando un borde alrededor del rectángulo detectado. Esto se puede hacer usando la función Rectángulo. Tomará el tapete leído por la cámara, el objeto Rectángulo que fue devuelto por el método DetectMultiScale, el color y el grosor del borde.

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





 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í, ¡funcionó! Ahora tenemos un sistema de reconocimiento facial simple escrito en Go. En un futuro próximo planeo continuar estos experimentos y crear cosas nuevas y geniales, combinando Go y OpenCV.

Si está interesado, consulte el servidor web gRPC , que escribí en Python y OpenCV. Transmite datos en el momento de la detección de rostros. Esta es la base para crear diferentes clientes en diferentes lenguajes de programación. Podrán conectarse al servidor y leer datos de él.

¡Gracias por leer el artículo!

Skillbox recomienda:

Source: https://habr.com/ru/post/462159/


All Articles