Construire un système de reconnaissance faciale basé sur Golang et OpenCV

Construire un système de reconnaissance faciale basé sur Golang et OpenCV
OpenCV est une bibliothèque conçue pour les projets de vision par ordinateur. Elle a déjà environ 20 ans. Je l'ai utilisé à l'université et je l'utilise toujours pour mes projets C++ et Python car il prend bien en charge ces langages.

Mais lorsque j'ai commencé à apprendre et à utiliser Go, je me suis demandé si OpenCV pouvait être utilisé pour travailler avec ce langage. A cette époque, il existait déjà des exemples et des tutoriels sur l'intégration, mais il me semblait qu'ils étaient trop compliqués. Un peu plus tard, je suis tombé sur un wrapper créé par l'équipe de The Hybrid Group. Dans cet article, je vais vous montrer comment démarrer avec GoCV en développant un système simple de reconnaissance faciale avec Haar Cascades.

Skillbox vous recommande : Cours pratique "Développeur Python à partir de zéro".

Nous rappelons: pour tous les lecteurs de "Habr" - une remise de 10 000 roubles lors de l'inscription à n'importe quel cours Skillbox en utilisant le code promotionnel "Habr".

Ce qui sera requis:

  • Aller;
  • OpenCV (liens d'installation ci-dessous);
  • Web ou caméra vidéo ordinaire.

Installation

Exemple 1

Dans le premier exemple, nous allons essayer de créer une application qui ouvre une fenêtre affichant le flux vidéo d'une caméra.

Vous devez d'abord importer les bibliothèques nécessaires au travail.

importer (
"Journal"
"gocv.io/x/gocv"
)

Après cela, vous devez créer un objet VideoCapture à l'aide de la fonction VideoCaptureDevice. Ce dernier permet de capturer un flux vidéo à l'aide d'une caméra. La fonction utilise un entier comme paramètre (il représente l'ID de l'appareil).

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

Nous devons maintenant créer une matrice à n dimensions. Il stockera les images lues par la caméra.

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

Pour afficher un flux vidéo, vous devez créer une fenêtre - cela peut être fait à l'aide de la fonction NewWindow.

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

Passons maintenant à la partie la plus intéressante.

Puisque la vidéo est un flux continu d’images, nous devrons créer une boucle infinie pour lire sans fin le flux vidéo de la caméra. Pour ce faire, vous avez besoin de la méthode Read de type VideoCapture. Il attendra un type Mat (la matrice que nous avons créée ci-dessus), renvoyant une valeur booléenne indiquant si l'image de VideoCapture a été lue avec succès ou non.

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

Vous devez maintenant afficher le cadre dans la fenêtre créée. La pause pour passer à l'image suivante est de 50 ms.

fenêtre.IMShow(img)
fenêtre.WaitKey(50)

Après avoir lancé l'application, une fenêtre avec un flux vidéo de la caméra s'ouvrira.

Construire un système de reconnaissance faciale basé sur Golang et 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

Dans cet exemple, utilisons l'exemple précédent et construisons un système de reconnaissance faciale basé sur Haar Cascades.

Les cascades Haar sont des classificateurs en cascade formés à l'aide de la technique des ondelettes Haar. Ils analysent les pixels d'une image pour détecter certaines caractéristiques. Pour en savoir plus sur Haar Cascades, veuillez suivre les liens ci-dessous.

Cadre de détection d'objets Viola-Jones
Classificateurs en cascade
Fonction de type Haar

Téléchargez des cascades déjà formées ici. Dans l'exemple actuel, des cascades seront utilisées pour identifier le visage d'une personne de face.

Pour ce faire, vous devez créer un classificateur et lui fournir un fichier déjà formé (le lien est donné ci-dessus). J'ai déjà téléchargé le fichier pencv_haarcascade_frontalface_default.xml dans le répertoire où se trouve notre programme.

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

Pour détecter des visages dans une image, vous devez utiliser la méthode DétecterMultiScale. Cette fonction prend une image (type Mat) qui vient d'être lue dans le flux vidéo de la caméra et renvoie un tableau de type Rectangle. La taille du tableau représente le nombre de visages que le classificateur a pu détecter dans la trame. Ensuite, pour être sûr de voir ce qu'il a trouvé, parcourons la liste des rectangles et imprimons l'objet Rectangle sur la console, créant une bordure autour du rectangle détecté. Cela peut être fait en utilisant la fonction Rectangle. Il acceptera le Mat lu par la caméra, l'objet Rectangle renvoyé par la méthode DetectMultiScale, la couleur et l'épaisseur de la bordure.

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

Construire un système de reconnaissance faciale basé sur Golang et OpenCV

Construire un système de reconnaissance faciale basé sur Golang et 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)
}
}

Et... oui, tout s'est bien passé ! Nous disposons désormais d’un système simple de reconnaissance faciale écrit en Go. Bientôt, je prévois de poursuivre ces expériences et de créer de nouvelles choses sympas en combinant Go et OpenCV.

Si vous êtes intéressé, veuillez noter serveur Web gRPC, que j'ai écrit en Python et OpenCV. Il diffuse des données dès qu'un visage est détecté. C'est la base pour créer différents clients dans différents langages de programmation. Ils pourront se connecter au serveur et y lire des données.

Merci d'avoir lu l'article!

Skillbox vous recommande :

Source: habr.com

Ajouter un commentaire