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

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig webhotell med DDoS-beskyttelse, VPS VDS-servere | ProHoster