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 en C ++ et Python, car il supporte bien ces langages.

Mais quand 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 y avait 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 de reconnaissance faciale simple avec Haar Cascades.

Skillbox recommande: Le cours pratique de Python Developer from scratch .

Nous vous rappelons: pour tous les lecteurs de «Habr» - une remise de 10 000 roubles lors de l'inscription à un cours Skillbox en utilisant le code promo «Habr».

Ce qui est requis:
  • Allez;
  • OpenCV (liens d'installation ci-dessous);
  • Web ou camĂ©scope conventionnel.

L'installation


Exemple 1


Dans le premier exemple, nous allons essayer de crĂ©er une application qui ouvre une fenĂȘtre avec une dĂ©monstration du flux vidĂ©o de la camĂ©ra.

Vous devez d'abord importer les bibliothĂšques dont vous avez besoin pour travailler.

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 le flux vidéo à l'aide de la caméra. La fonction utilise un entier comme paramÚtre (il représente l'ID du périphérique).

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

Vous devez maintenant créer une matrice à n dimensions. Il stockera les images lues sur l'appareil photo.

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

Pour afficher le flux vidĂ©o, vous devez crĂ©er une fenĂȘtre - cela peut ĂȘtre fait en utilisant la fonction NewWindow.

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

Passons maintenant à la partie la plus intéressante.

Étant donnĂ© que la vidĂ©o est un flux continu d'images, nous devrons crĂ©er une boucle sans fin pour lire le flux vidĂ©o de la camĂ©ra Ă  l'infini. Pour ce faire, vous avez besoin de la mĂ©thode Read de type VideoCapture. Il attendra le 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. Pause pour passer Ă  l'image suivante - 50 ms.

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

AprĂšs avoir dĂ©marrĂ© l'application, une fenĂȘtre avec un flux vidĂ©o de la camĂ©ra s'ouvrira.



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

Les cascades de Haar sont des classificateurs en cascade qui sont formés sur la base de la technique des ondelettes de Haar. Ils analysent les pixels de l'image pour détecter certains signes. Pour en savoir plus sur Haar Cascades, suivez les liens ci-dessous.

Cadre de détection d'objets Viola-jones
Classificateurs en cascade
Fonction de type haar

Vous pouvez télécharger des cascades déjà formées ici . Dans l'exemple actuel, les cascades seront utilisées pour identifier le visage d'une personne face à face.

Pour ce faire, vous devez crĂ©er un classificateur et lui fournir un fichier dĂ©jĂ  formĂ© (le lien ci-dessus est donnĂ©). 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 l'image, vous devez utiliser la mĂ©thode DetectMultiScale . 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 faces que le classificateur a pu dĂ©tecter dans le cadre. Ensuite, pour nous assurer de voir ce qu'il a trouvĂ©, parcourons la liste des rectangles et affichons 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 faudra le tapis lu par la camĂ©ra, l'objet Rectangle retournĂ© 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) } 





 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, ça a marché! Nous avons maintenant un systÚme de reconnaissance faciale simple écrit en Go. Dans un avenir proche, je prévois de poursuivre ces expériences et de créer de nouvelles choses sympas, combinant Go et OpenCV.

Si vous ĂȘtes intĂ©ressĂ©, consultez le serveur Web gRPC , que j'ai Ă©crit en Python et OpenCV. Il diffuse des donnĂ©es au moment de la dĂ©tection de visage. 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 recommande:

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


All Articles