Een gezichtsherkenningssysteem bouwen met Golang en OpenCV

Een gezichtsherkenningssysteem bouwen met Golang en OpenCV
OpenCV is een bibliotheek die is ontwikkeld voor projecten op het gebied van computer vision. Het bestaat al ongeveer 20 jaar. Ik heb het gebruikt tijdens mijn studie en pas het nog steeds toe in mijn projecten in C++ en Python, omdat het een goede ondersteuning voor deze talen biedt.

Maar toen ik begon met het leren en gebruiken van Go, vroeg ik me af of ik OpenCV kon toepassen met deze taal. Op dat moment waren er al voorbeelden en tutorials over integratie, maar ik vond ze te complex. Een tijdje later kwam ik een wrapper tegen, gemaakt door het team van The Hybrid Group. In dit artikel laat ik zien hoe je aan de slag kunt met GoCV door een eenvoudig gezichtsherkenningssysteem te ontwikkelen met Haar Cascades.

Skillbox raadt aan: Praktische cursus «Python-ontwikkelaar vanaf nul».

Ter herinnering: voor alle lezers van «Habr» — een korting van 10.000 roebel bij inschrijving voor elke cursus van Skillbox met de promocode «Habr».

Wat je nodig hebt:

  • Go;
  • OpenCV (links naar de installer hieronder);
  • een webcam of gewone videocamera.

Installatie

Voorbeeld 1

In het eerste voorbeeld proberen we een applicatie te maken die een venster opent met de demonstratie van de videostream van de camera.

Eerst moeten we de vereiste bibliotheken importeren.

import (
“log”
“gocv.io/x/gocv”
)

Vervolgens moeten we een VideoCapture-object maken met behulp van de functie VideoCaptureDevice. Deze laatste maakt het mogelijk om de videostream van de camera vast te leggen. De functie gebruikt een geheel getal als parameter (dit vertegenwoordigt het apparaats-ID).

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

Nu moeten we een n-dimensionale matrix creëren. Deze zal de beelden opslaan die van de camera zijn gelezen.

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

Om de videostream weer te geven, moeten we een venster creĂ«ren — dit kan met de functie NewWindow.

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

Laten we nu doorgaan naar het meest interessante deel.

Omdat video bestaat uit een ononderbroken stroom van beeldframes, moeten we een oneindige lus maken voor het oneindig lezen van de videostream van de camera. Hiervoor is een methode Read van het type VideoCapture nodig. Deze zal wachten op een type Mat (de matrix die we hierboven hebben gemaakt) en een logisch waarde retourneren die aangeeft of het frame uit VideoCapture succesvol is gelezen of niet.

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

Nu moeten we het frame in het gemaakte venster weergeven. De pauze om naar het volgende frame te gaan — 50 ms.

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

Na het starten van de applicatie opent er een venster met de videostream van de camera.

Een gezichtsherkenningssysteem bouwen met Golang en OpenCV

pakket hoofd
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func hoofd() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("fout bij het openen van apparaat: %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("Kan niet lezen van de webcam")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Voorbeeld 2

In dit voorbeeld gaan we gebruikmaken van het vorige voorbeeld en een systeem voor gezichtsherkenning bouwen op basis van Haar Cascades.

Haar Cascades zijn cascade classifiers die zijn getraind op basis van de Haar wavelet techniek. Ze analyseren pixels in een afbeelding om bepaalde kenmerken te detecteren. Voor meer informatie over Haar Cascades kun je de onderstaande links volgen.

Viola-Jones objectdetectiekader
Cascading classifiers
Haar-achtige kenmerken

Download al getrainde cascades hier. In het huidige voorbeeld zullen de cascades worden gebruikt om het gezicht van een persoon van voren te identificeren.

Om dit te doen, moet je een classifier maken en deze voeden met het eerder getrainde bestand (de link is hierboven gegeven). Ik heb al het bestand opencv_haarcascade_frontalface_default.xml in de map geplaatst waar ons programma zich bevindt.

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

Om gezichten in een afbeelding te detecteren, moet je de methode DetectMultiScale. Deze functie neemt een frame (type Mat), dat net is gelezen van de videostream van de camera, en retourneert een array van het type Rectangle. De grootte van de array geeft het aantal gezichten aan dat de classifier in het frame heeft kunnen detecteren. Vervolgens, om er zeker van te zijn dat we zien wat hij heeft gevonden, laten we door de lijst van rechthoeken lopen en het Rectangle-object naar de console afdrukken, terwijl we een rand rondom het gedetecteerde rechthoek maken. Dit kan gedaan worden met de functie Rectangle. Het zal Mat, dat door de camera is gelezen, een Rectangle-object, dat door de DetectMultiScale-methode is geretourneerd, kleur en dikte voor de rand accepteren.

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

Een gezichtsherkenningssysteem bouwen met Golang en OpenCV

Een gezichtsherkenningssysteem bouwen met Golang en 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)
}
}

Ja... het is gelukt! We hebben nu een eenvoudig gezichtsherkenningssysteem in Go. Binnenkort ben ik van plan om deze experimenten voort te zetten en nieuwe coole dingen te maken door Go en OpenCV te combineren.

Als je geĂŻnteresseerd bent, laat dan een beoordeling achter gRPC webserver, die ik heb geschreven in Python en OpenCV. Het streamt gegevens op het moment dat een gezicht wordt gedetecteerd. Dit is de basis voor het maken van verschillende clients in verschillende programmeertalen. Zij kunnen verbinding maken met de server en gegevens van hem lezen.

Bedankt voor het lezen van het artikel!

Skillbox raadt aan:

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers đŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster