Bygga ett ansiktsigenkänningssystem baserat på Golang och OpenCV

Bygga ett ansiktsigenkänningssystem baserat på Golang och OpenCV
OpenCV är ett bibliotek utvecklat för datorseendeprojekt. Hon är redan cirka 20 år gammal. Jag använde det på college och använder det fortfarande för mina C++- och Python-projekt eftersom det har bra stöd för dessa språk.

Men när jag började lära mig och använda Go undrade jag om OpenCV kunde användas för att arbeta med detta språk. På den tiden fanns det redan exempel och handledningar om integration, men jag tyckte att de var för komplicerade. Lite senare kom jag över ett omslag skapat av The Hybrid Group. I den här artikeln kommer jag att visa dig hur du kommer igång med GoCV genom att utveckla ett enkelt ansiktsigenkänningssystem med Haar Cascades.

Skillbox rekommenderar: Praktisk kurs "Python-utvecklare från grunden".

Påminnelse: för alla läsare av "Habr" - en rabatt på 10 000 rubel när du anmäler dig till någon Skillbox-kurs med hjälp av "Habr"-kampanjkoden.

Vad kommer att krävas:

  • Gå;
  • OpenCV (länkar till installationsprogrammet nedan);
  • webb eller vanlig videokamera.

Installation

exempel 1

I det första exemplet kommer vi att försöka skapa ett program som öppnar ett fönster med en kameravideoström.

Först måste du importera de bibliotek du behöver för att arbeta.

importera (
"logga"
"gocv.io/x/gocv"
)

Efter det måste du skapa ett VideoCapture-objekt med funktionen VideoCaptureDevice. Det senare gör det möjligt att fånga en videoström med hjälp av en kamera. Funktionen tar ett heltal som en parameter (det representerar enhets-ID).

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

Nu måste vi skapa en n-dimensionell matris. Den lagrar bilderna som läses från kameran.

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

För att visa videoströmmen måste du skapa ett fönster - detta kan göras med hjälp av NewWindow-funktionen.

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

Låt oss nu gå vidare till den mest intressanta delen.

Eftersom videon är en kontinuerlig ström av bildramar, kommer vi att behöva skapa en oändlig loop för att oändligt läsa kamerans videoström. Detta kräver läsmetoden av typen VideoCapture. Den förväntar sig en Mat-typ (matrisen vi skapade ovan), som returnerar en boolean som indikerar om en bildruta från VideoCapture lästes framgångsrikt eller inte.

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

Nu måste vi visa ramen i det skapade fönstret. Pausa för att gå till nästa bildruta - 50 ms.

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

Efter att ha startat programmet öppnas ett fönster med en videoström från kameran.

Bygga ett ansiktsigenkänningssystem baserat på Golang och 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)
}
}

exempel 2

I det här exemplet, låt oss använda det föregående exemplet och bygga ett ansiktsigenkänningssystem baserat på Haar Cascades.

Haar-kaskader är kaskadklassificerare som tränas baserat på Haar wavelet-tekniken. De analyserar pixlarna i en bild för att leta efter specifika funktioner. För att lära dig mer om Haar Cascades, följ länkarna nedan.

Viola-Jones objektdetektionsramverk
Kaskadklassificerare
Haarliknande funktion

Ladda ner redan tränade kaskader kan vara här. I det aktuella exemplet kommer kaskader att användas för att identifiera en persons ansikte framför.

För att göra detta måste du skapa en klassificerare och mata den med en redan tränad fil (länken ges ovan). Jag har redan laddat upp filen pencv_haarcascade_frontalface_default.xml till katalogen där vårt program finns.

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

För att upptäcka ansikten i en bild måste du använda metoden DetectMultiScale. Denna funktion tar en bildruta (av typen Mat) som just har lästs från kamerans videoström och returnerar en array av typen Rektangel. Storleken på arrayen representerar antalet ansikten som klassificeraren kunde detektera i ramen. Sedan, för att vara säker på att vi ser vad den hittade, låt oss iterera genom listan med rektanglar och skriva ut Rectangle-objektet till konsolen och skapa en ram runt den hittade rektangeln. Detta kan göras med hjälp av rektangelfunktionen. Det tar mattan som läses av kameran, Rectangle-objektet som returneras med DetectMultiScale-metoden och färgen och tjockleken för kanten.

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

Bygga ett ansiktsigenkänningssystem baserat på Golang och OpenCV

Bygga ett ansiktsigenkänningssystem baserat på Golang och 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)
}
}

Och ... ja, allt löste sig! Vi har nu ett enkelt ansiktsigenkänningssystem skrivet i Go. Inom en snar framtid planerar jag att fortsätta dessa experiment och skapa nya coola saker genom att kombinera Go och OpenCV.

Om du är intresserad, vänligen betygsätt gRPC webbserver, som jag skrev i Python och OpenCV. Den strömmar data så snart ett ansikte upptäcks. Detta är grunden för att skapa olika klienter i olika programmeringsspråk. De kommer att kunna ansluta till servern och läsa data från den.

Tack för att du läser artikeln!

Skillbox rekommenderar:

Källa: will.com

Lägg en kommentar