Het bouwen van een gezichtsherkenningssysteem op basis van Golang en OpenCV

Het bouwen van een gezichtsherkenningssysteem op basis van Golang en OpenCV
OpenCV is een bibliotheek ontworpen voor computer vision-projecten. Ze is al ongeveer 20 jaar oud. Ik gebruikte het op de universiteit en gebruik het nog steeds voor mijn C++- en Python-projecten omdat het goede ondersteuning biedt voor die talen.

Maar toen ik Go begon te leren en te gebruiken, raakte ik geĆÆnteresseerd in de vraag of OpenCV gebruikt kon worden om met deze taal te werken. Destijds waren er al voorbeelden en tutorials over integratie, maar het leek mij dat ze te ingewikkeld waren. Even later kwam ik een verpakking tegen die was gemaakt door het team van The Hybrid Group. In dit artikel laat ik je zien hoe je aan de slag kunt gaan met GoCV door een eenvoudig gezichtsherkenningssysteem te ontwikkelen met Haar Cascades.

Skillbox beveelt aan: Praktische cursus "Python-ontwikkelaar vanaf nul".

Herinnering: voor alle lezers van "Habr" - een korting van 10 roebel bij inschrijving voor een Skillbox-cursus met behulp van de promotiecode "Habr".

Wat is vereist:

  • Gaan;
  • OpenCV (links naar installatieprogramma hieronder);
  • web- of gewone videocamera.

installatie

voorbeeld 1

In het eerste voorbeeld proberen we een applicatie te maken die een venster opent met een cameravideostream.

Eerst moet u de bibliotheken importeren die nodig zijn voor uw werk.

importeren (
"loggen"
ā€œgocv.io/x/gocvā€
)

Hierna moet u een VideoCapture-object maken met behulp van de VideoCaptureDevice-functie. Dit laatste maakt het mogelijk om met een camera een videostream vast te leggen. De functie gebruikt een geheel getal als parameter (deze vertegenwoordigt de apparaat-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. Het slaat afbeeldingen op die van de camera zijn gelezen.

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

Om een ​​videostream weer te geven, moet u een venster maken. Dit kunt u doen met behulp van de NewWindow-functie.

window := gocv.NewWindow(ā€œwebcamwindowā€)
defer window.Close()

Laten we nu verder gaan met het meest interessante deel.

Omdat video een continue stroom van beeldframes is, zullen we een oneindige lus moeten creƫren om de videostream van de camera eindeloos te kunnen lezen. Hiervoor heeft u de Read-methode van het type VideoCapture nodig. Het verwacht een Mat-type (de matrix die we hierboven hebben gemaakt), die een Booleaanse waarde retourneert die aangeeft of het frame van 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 moet u het frame in het gemaakte venster weergeven. De pauze voor het overgaan naar het volgende frame bedraagt ​​50 ms.

venster.IMShow(img)
venster.WaitKey(50)

Na het starten van de applicatie wordt een venster geopend met een videostream van de camera.

Het bouwen van een gezichtsherkenningssysteem op basis van Golang en 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)
}
}

voorbeeld 2

Laten we in dit voorbeeld het vorige voorbeeld gebruiken en een gezichtsherkenningssysteem bouwen op basis van Haar Cascades.

Haarcascades zijn cascadeclassificatoren die zijn getraind met behulp van de Haar wavelet-techniek. Ze analyseren de pixels in een afbeelding om bepaalde kenmerken te detecteren. Voor meer informatie over Haar Cascades kunt u de onderstaande links volgen.

Viola-Jones raamwerk voor objectdetectie
Trapsgewijze classificaties
Haarachtige eigenschap

Download reeds getrainde cascades kan hier zijn. In het huidige voorbeeld worden cascades gebruikt om het gezicht van een persoon vanaf de voorkant te identificeren.

Om dit te doen, moet u een classificator maken en deze aan een reeds getraind bestand toevoegen (de link vindt u hierboven). Ik heb het bestand pencv_haarcascade_frontalface_default.xml al geüpload naar de map 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 u de methode gebruiken Detecteer MultiScale. Deze functie neemt een frame (type Mat) dat zojuist uit de videostream van de camera is gelezen en retourneert een array van het type Rechthoek. De arraygrootte vertegenwoordigt het aantal gezichten dat de classificator in het frame heeft kunnen detecteren. Om er zeker van te zijn dat we zien wat het heeft gevonden, gaan we vervolgens door de lijst met rechthoeken en printen we een Rectangle-object naar de console, waarbij we een rand rond de gedetecteerde rechthoek creƫren. Dit kan gedaan worden met behulp van de rechthoekfunctie. Het accepteert de mat die door de camera is gelezen, het rechthoekobject dat is geretourneerd door de DetectMultiScale-methode, de kleur en dikte van de rand.

for _, r := range rects {
fmt.Println(ā€œdetectedā€, r)
gocv.Rectangle(&img, r, color, 2)
}

Het bouwen van een gezichtsherkenningssysteem op basis van Golang en OpenCV

Het bouwen van een gezichtsherkenningssysteem op basis van 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)
}
}

En... ja, alles is gelukt! We hebben nu een eenvoudig gezichtsherkenningssysteem geschreven in Go. Binnenkort ben ik van plan deze experimenten voort te zetten en nieuwe coole dingen te creƫren door Go en OpenCV te combineren.

Als u geĆÆnteresseerd bent, kunt u een beoordeling geven gRPC-webserver, die ik schreef in Python en OpenCV. Het streamt gegevens zodra een gezicht wordt gedetecteerd. Dit is de basis voor het maken van verschillende clients in verschillende programmeertalen. Ze kunnen verbinding maken met de server en er gegevens van lezen.

Bedankt voor het lezen van het artikel!

Skillbox beveelt aan:

Bron: www.habr.com

Koop betrouwbare hosting voor sites met DDoS-bescherming, VPS VDS-servers šŸ”„ Koop betrouwbare websitehosting met DDoS-bescherming, VPS- en VDS-servers | ProHoster