Bygge et ansiktsgjenkjenningssystem basert på Golang og OpenCV

Bygge et ansiktsgjenkjenningssystem basert på Golang og OpenCV
OpenCV er et bibliotek designet for datasynsprosjekter. Hun er allerede rundt 20 år gammel. Jeg brukte den på college og bruker den fortsatt til C++- og Python-prosjektene mine fordi den har god støtte for disse språkene.

Men da jeg begynte å lære og bruke Go, ble jeg interessert i om OpenCV kunne brukes til å jobbe med dette språket. På den tiden fantes det allerede eksempler og veiledninger om integrering, men det virket for meg som om de var for kompliserte. Litt senere kom jeg over en innpakning laget av The Hybrid Group-teamet. I denne artikkelen skal jeg vise deg hvordan du kommer i gang med GoCV ved å utvikle et enkelt ansiktsgjenkjenningssystem med Haar Cascades.

Skillbox anbefaler: Praktisk kurs "Python-utvikler fra bunnen av".

Vi minner om: for alle lesere av "Habr" - en rabatt på 10 000 rubler når du melder deg på et hvilket som helst Skillbox-kurs ved å bruke kampanjekoden "Habr".

Hva vil være nødvendig:

  • Gå;
  • OpenCV (installasjonslenker nedenfor);
  • web eller vanlig videokamera.

Installasjon

Eksempel 1

I det første eksemplet vil vi prøve å lage en applikasjon som åpner et vindu som viser en kameravideostrøm.

Først må du importere bibliotekene som trengs for arbeid.

importere (
"Logg"
«gocv.io/x/gocv»
)

Etter dette må du lage et VideoCapture-objekt ved hjelp av VideoCaptureDevice-funksjonen. Sistnevnte gjør det mulig å fange en videostrøm ved hjelp av et kamera. Funksjonen bruker et heltall som en parameter (den representerer enhets-IDen).

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

Nå må vi lage en n-dimensjonal matrise. Den vil lagre bilder lest fra kameraet.

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

For å vise en videostrøm, må du opprette et vindu - dette kan gjøres ved å bruke NewWindow-funksjonen.

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

La oss nå gå videre til den mest interessante delen.

Siden video er en kontinuerlig strøm av bilderammer, må vi lage en uendelig sløyfe for uendelig å lese kameraets videostrøm. For å gjøre dette trenger du lesemetoden av typen VideoCapture. Den vil forvente en Mat-type (matrisen vi opprettet ovenfor), som returnerer en boolsk verdi som indikerer om rammen fra VideoCapture ble lest vellykket eller ikke.

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

Nå må du vise rammen i det opprettede vinduet. Pausen for å gå til neste bilde er 50 ms.

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

Etter å ha startet programmet, åpnes et vindu med en videostrøm fra kameraet.

Bygge et ansiktsgjenkjenningssystem basert 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

I dette eksemplet, la oss bruke det forrige eksemplet og bygge et ansiktsgjenkjenningssystem basert på Haar Cascades.

Haar-kaskader er kaskadeklassifiserere som er trent ved hjelp av Haar wavelet-teknikken. De analyserer pikslene i et bilde for å oppdage visse funksjoner. For å finne ut mer om Haar Cascades, følg lenkene nedenfor.

Viola-Jones objektdeteksjonsrammeverk
Kaskadeklassifiserere
Haar-lignende funksjon

Last ned allerede trente kaskader kan være her. I det gjeldende eksemplet vil kaskader brukes til å identifisere en persons ansikt forfra.

For å gjøre dette, må du lage en klassifisering og mate den med en allerede opplært fil (lenken er gitt ovenfor). Jeg har allerede lastet opp filen pencv_haarcascade_frontalface_default.xml til katalogen der programmet vårt ligger.

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

For å oppdage ansikter i et bilde, må du bruke metoden DetectMultiScale. Denne funksjonen tar en ramme (type Mat) som nettopp ble lest fra kameraets videostrøm og returnerer en rekke av typen Rektangel. Matrisestørrelsen representerer antall ansikter som klassifisereren var i stand til å oppdage i rammen. Deretter, for å være sikker på at vi ser hva den fant, la oss iterere gjennom listen over rektangler og skrive ut Rectangle-objektet til konsollen, og lage en kant rundt det oppdagede rektangelet. Dette kan gjøres ved å bruke rektangelfunksjonen. Den vil godta matten som er lest av kameraet, rektangelobjektet som ble returnert av DetectMultiScale-metoden, fargen og tykkelsen for kantlinjen.

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

Bygge et ansiktsgjenkjenningssystem basert på Golang og OpenCV

Bygge et ansiktsgjenkjenningssystem basert 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 ordnet seg! Vi har nå et enkelt ansiktsgjenkjenningssystem skrevet i Go. Snart planlegger jeg å fortsette disse eksperimentene og lage nye kule ting ved å kombinere Go og OpenCV.

Hvis du er interessert, vennligst vurder gRPC webserver, som jeg skrev i Python og OpenCV. Den strømmer data i det øyeblikket et ansikt oppdages. Dette er grunnlaget for å lage forskjellige klienter på forskjellige programmeringsspråk. De vil kunne koble til serveren og lese data fra den.

Takk for at du leste artikkelen!

Skillbox anbefaler:

Kilde: www.habr.com

Legg til en kommentar