Opbygning af et ansigtsgenkendelsessystem baseret på Golang og OpenCV

Opbygning af et ansigtsgenkendelsessystem baseret på Golang og OpenCV
OpenCV er et bibliotek designet til computervisionsprojekter. Hun er allerede omkring 20 år gammel. Jeg brugte det på college og bruger det stadig til mine C++ og Python-projekter, fordi det har god understøttelse af disse sprog.

Men da jeg begyndte at lære og bruge Go, blev jeg interesseret i, om OpenCV kunne bruges til at arbejde med dette sprog. På det tidspunkt var der allerede eksempler og vejledninger om integration, men det forekom mig, at de var for komplicerede. Lidt senere stødte jeg på en indpakning skabt af The Hybrid Group-teamet. I denne artikel vil jeg vise dig, hvordan du kommer i gang med GoCV ved at udvikle et simpelt ansigtsgenkendelsessystem med Haar Cascades.

Skillbox anbefaler: Praktisk kursus "Python-udvikler fra bunden".

Påmindelse: for alle læsere af "Habr" - en rabat på 10 rubler ved tilmelding til ethvert Skillbox-kursus ved hjælp af "Habr"-kampagnekoden.

Hvad vil blive krævet:

  • Gå;
  • OpenCV (installationslinks nedenfor);
  • web- eller almindeligt videokamera.

Installation

Eksempel 1

I det første eksempel vil vi forsøge at oprette et program, der åbner et vindue, der viser en kameravideostream.

Først skal du importere de nødvendige biblioteker til arbejdet.

import (
"log"
"gocv.io/x/gocv"
)

Herefter skal du oprette et VideoCapture-objekt ved hjælp af VideoCaptureDevice-funktionen. Sidstnævnte gør det muligt at optage en videostream ved hjælp af et kamera. Funktionen bruger et heltal som en parameter (det repræsenterer enheds-id'et).

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

Nu skal vi lave en n-dimensionel matrix. Det vil gemme billeder læst fra kameraet.

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

For at vise en videostream skal du oprette et vindue - dette kan gøres ved hjælp af NewWindow-funktionen.

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

Lad os nu gå videre til den mest interessante del.

Da video er en kontinuerlig strøm af billedrammer, bliver vi nødt til at skabe en uendelig loop for uendeligt at læse kameraets videostream. For at gøre dette skal du bruge læsemetoden af ​​typen VideoCapture. Det vil forvente en Mat-type (den matrix, vi oprettede ovenfor), som returnerer en boolesk værdi, der angiver, om rammen fra VideoCapture blev læst med succes eller ej.

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

Nu skal du vise rammen i det oprettede vindue. Pausen for at gå til næste billede er 50 ms.

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

Efter lancering af applikationen åbnes et vindue med en videostream fra kameraet.

Opbygning af et ansigtsgenkendelsessystem baseret på Golang og 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)
}
}

Eksempel 2

Lad os i dette eksempel bruge det foregående eksempel og bygge et ansigtsgenkendelsessystem baseret på Haar Cascades.

Haar-kaskader er kaskadeklassifikatorer, der trænes ved hjælp af Haar wavelet-teknikken. De analyserer pixels i et billede for at opdage visse funktioner. For at finde ud af mere om Haar Cascades, følg venligst nedenstående links.

Viola-Jones objektdetektionsramme
Cascading klassifikatorer
Haar-lignende træk

Download allerede trænede kaskader kan være her. I det aktuelle eksempel vil kaskader blive brugt til at identificere en persons ansigt forfra.

For at gøre dette skal du oprette en klassificering og fodre den med en allerede trænet fil (linket er givet ovenfor). Jeg har allerede uploadet filen pencv_haarcascade_frontalface_default.xml til den mappe, hvor vores program er placeret.

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

For at registrere ansigter på et billede skal du bruge metoden DetectMultiScale. Denne funktion tager en ramme (type Mat), der lige er blevet læst fra kameraets videostream, og returnerer et array af typen Rektangel. Matrixstørrelsen repræsenterer antallet af ansigter, som klassificereren var i stand til at detektere i rammen. Lad os derefter, for at være sikker på, at vi kan se, hvad den fandt, gentage listen over rektangler og udskrive Rectangle-objektet til konsollen og skabe en ramme omkring det detekterede rektangel. Dette kan gøres ved hjælp af rektangelfunktionen. Den accepterer den måtte, der læses af kameraet, det rektangelobjekt, der blev returneret af DetectMultiScale-metoden, farven og tykkelsen for rammen.

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

Opbygning af et ansigtsgenkendelsessystem baseret på Golang og OpenCV

Opbygning af et ansigtsgenkendelsessystem baseret på Golang og 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)
}
}

Og... ja, alt lykkedes! Vi har nu et simpelt ansigtsgenkendelsessystem skrevet i Go. Snart planlægger jeg at fortsætte disse eksperimenter og skabe nye fede ting ved at kombinere Go og OpenCV.

Hvis du er interesseret, bedes du vurdere gRPC webserver, som jeg skrev i Python og OpenCV. Det streamer data i det øjeblik et ansigt opdages. Dette er grundlaget for at skabe forskellige klienter på forskellige programmeringssprog. De vil være i stand til at oprette forbindelse til serveren og læse data fra den.

Tak fordi du læste artiklen!

Skillbox anbefaler:

Kilde: www.habr.com

Tilføj en kommentar