Vi bygger et ansigtgenkendelsessystem baseret på Golang og OpenCV

Vi bygger et ansigtgenkendelsessystem baseret på Golang og OpenCV
OpenCV — et bibliotek udviklet til projekter inden for computer vision. Det har været omkring i næsten 20 år. Jeg brugte det allerede i college og bruger det stadig til mine projekter i C++ og Python, da det har en god støtte til disse sprog.

Men da jeg begyndte at studere og bruge Go, blev jeg nysgerrig efter, om det var muligt at anvende OpenCV med dette sprog. Der eksisterede allerede eksempler og vejledninger til integration, men de virkede for komplekse. Lidt senere stødte jeg på et wrapper, skabt af The Hybrid Group. I denne artikel viser jeg, hvordan man kommer i gang med GoCV ved at udvikle et simpelt ansigtsgenkendelsessystem ved hjælp af Haar Cascades.

Skillbox anbefaler: Praktisk kursus «Python-udvikler fra bunden».

Vi minder om: til alle læsere af 'Habr' — rabat på 10.000 rubler ved tilmelding til et hvilket som helst Skillbox-kursus med rabatkoden 'Habr'.

Hvad der er nødvendigt:

  • Go;
  • OpenCV (links til installationsprogrammet nedenfor);
  • en web- eller almindelig videokamera.

Installation

Eksempel 1

I det første eksempel vil vi prøve at oprette en applikation, der åbner et vindue med en demonstration af videostrømmen fra kameraet.

Først skal de biblioteker importeres, der er nødvendige for at arbejde.

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

Derefter skal der oprettes et VideoCapture-objekt ved at bruge funktionen VideoCaptureDevice. Denne giver mulighed for at fange videostrømmen ved hjælp af kameraet. Funktionen bruger et helt tal som parameter (som repræsenterer enhedens ID).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“fejl ved åbning af webkamera: %v”, err)
}
defer webcam.Close()

Nu skal der oprettes en n-dimensionel matrix. Den vil gemme billeder, der er læst fra kameraet.

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

For at vise videostrømmen skal der oprettes et vindue — dette kan gøres ved hjælp af funktionen NewWindow.

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 frames-billeder, skal der oprettes et uendeligt loop til kontinuerligt at læse videostrømmen fra kameraet. Til dette er der brug for metoden Read af typen VideoCapture. Den vil forvente en type Mat (den matrix, vi oprettede ovenfor), der returnerer en boolesk værdi, der angiver, om et frame fra VideoCapture blev læst korrekt eller ej.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty() {
        log.Println(“Kunne ikke læse fra webkameraet”)    continue
     }
.
.
.
}

Nu skal frame vises i det oprettede vindue. Der skal være en pause for at gå til det næste frame — 50 ms.

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

Når applikationen startes, åbnes et vindue med videostrømmen fra kameraet.

Vi bygger et ansigtgenkendelsessystem baseret på Golang og OpenCV

pakke main

import (
"log"

"gocv.io/x/gocv"
)

func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("fejl ved åbning af enhed: %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 ikke læse fra webcam")
continue
}

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

Eksempel 2

I dette eksempel lad os tage det tidligere eksempel og opbygge et ansigtsgenkendelsessystem baseret på Haar Cascades.

Haar Cascades er cascade klasseifikatorer, der trænes ved hjælp af Haar wavelets teknik. De analyserer pixel i et billede for at opdage bestemte træk. For at lære mere om Haar Cascades kan du følge linkene nedenfor.

Viola-Jones objektgenkendelsesramme
Kaskadeklassefikatorer
Haar-lignende funktion

Download allerede trænede cascades her. I det aktuelle eksempel vil cascades blive brugt til at identificere en persons ansigt frontalt.

For at gøre dette skal du oprette en klassifikator og fodre den med en allerede trænet fil (linken er givet ovenfor). Jeg har allerede downloadet filen opencv_haarcascade_frontalface_default.xml til den mappe, hvor vores program ligger.

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

For at opdage ansigtet i billedet skal du bruge metoden DetectMultiScale. Denne funktion tager en ramme (type Mat), der netop er blevet læst fra videostrømmen fra kameraet, og returnerer et array af typen Rectangle. Størrelsen af arrayet repræsenterer antallet af ansigt, som klassifikatoren kunne opdage i rammen. Derefter, for at sikre, at vi ser det, den fandt, lad os gå gennem listen over rektangler og udskrive objektet Rectangle til konsollen ved at oprette en grænse omkring det opdagede rektangel. Dette kan gøres ved hjælp af funktionen Rectangle. Den vil tage Mat, der er læst fra kameraet, et Rectangle-objekt, der blev returneret af metoden DetectMultiScale, farven og tykkelsen til grænsen.

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

Vi bygger et ansigtgenkendelsessystem baseret på Golang og OpenCV

Vi bygger et ansigtgenkendelsessystem baseret på Golang og OpenCV

pakke main
 
import (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("fejl ved åbning af webcam: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamvindue")
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("Kan ikke læse fra enheden")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("opdaget", r)
gocv.Rectangle(&img, r, color, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Ja, det lykkedes! Nu har vi et simpelt ansigtsgenkendelsessystem skrevet i Go. Snart planlægger jeg at fortsætte disse eksperimenter og skabe nye spændende ting ved at kombinere Go og OpenCV.

Hvis du er interesseret, så vurder venligst gRPC web server, som jeg skrev i Python og OpenCV. Den streamer data i det øjeblik, ansigtet opdages. Dette er grundlaget for at oprette forskellige kunder på forskellige programmeringssprog. De kan tilslutte sig serveren og læse data herfra.

Tak for at du læste artiklen!

Skillbox anbefaler:

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster