Aufbau eines Gesichtserkennungssystems basierend auf Golang und OpenCV

Aufbau eines Gesichtserkennungssystems basierend auf Golang und OpenCV
OpenCV ist eine Bibliothek, die für Computer-Vision-Projekte entwickelt wurde. Sie ist bereits etwa 20 Jahre alt. Ich habe es im College verwendet und verwende es immer noch für meine C++- und Python-Projekte, weil es diese Sprachen gut unterstützt.

Aber als ich anfing, Go zu lernen und zu verwenden, begann ich mich dafür zu interessieren, ob OpenCV für die Arbeit mit dieser Sprache verwendet werden könnte. Damals gab es bereits Beispiele und Tutorials zur Integration, die mir aber zu kompliziert erschienen. Wenig später stieß ich auf einen Wrapper, der vom Team der Hybrid Group erstellt wurde. In diesem Artikel zeige ich Ihnen, wie Sie mit GoCV beginnen, indem ich mit Haar Cascades ein einfaches Gesichtserkennungssystem entwickle.

Skillbox empfiehlt: Praktischer Kurs „Python-Entwickler von Grund auf“.

Erinnerung: für alle Leser von „Habr“ – ein Rabatt von 10 Rubel bei der Anmeldung zu einem beliebigen Skillbox-Kurs mit dem Aktionscode „Habr“.

Was wird benötigt:

  • Gehen;
  • OpenCV (Links zum Installationsprogramm unten);
  • Web- oder normale Videokamera.

Einstellung

Beispiel 1

Im ersten Beispiel werden wir versuchen, eine Anwendung zu erstellen, die ein Fenster öffnet, in dem ein Kameravideostream angezeigt wird.

Zuerst müssen Sie die für die Arbeit benötigten Bibliotheken importieren.

importieren (
"Protokoll"
„gocv.io/x/gocv“
)

Anschließend müssen Sie mithilfe der VideoCaptureDevice-Funktion ein VideoCapture-Objekt erstellen. Letzteres ermöglicht die Aufnahme eines Videostreams mit einer Kamera. Die Funktion verwendet eine Ganzzahl als Parameter (sie stellt die Geräte-ID dar).

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

Jetzt müssen wir eine n-dimensionale Matrix erstellen. Es speichert die von der Kamera gelesenen Bilder.

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

Um einen Videostream anzuzeigen, müssen Sie ein Fenster erstellen – dies kann mit der NewWindow-Funktion erfolgen.

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

Kommen wir nun zum interessantesten Teil.

Da es sich bei einem Video um einen kontinuierlichen Strom von Einzelbildern handelt, müssen wir eine Endlosschleife erstellen, um den Videostrom der Kamera endlos zu lesen. Dazu benötigen Sie die Read-Methode vom Typ VideoCapture. Es wird ein Mat-Typ erwartet (die Matrix, die wir oben erstellt haben), der einen booleschen Wert zurückgibt, der angibt, ob der Frame aus dem VideoCapture erfolgreich gelesen wurde oder nicht.

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

Jetzt müssen Sie den Rahmen im erstellten Fenster anzeigen. Die Pause zum Übergang zum nächsten Frame beträgt 50 ms.

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

Nach dem Start der Anwendung öffnet sich ein Fenster mit einem Videostream von der Kamera.

Aufbau eines Gesichtserkennungssystems basierend auf Golang und 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)
}
}

Beispiel 2

In diesem Beispiel verwenden wir das vorherige Beispiel und erstellen ein Gesichtserkennungssystem basierend auf Haar Cascades.

Haar-Kaskaden sind Kaskadenklassifikatoren, die mithilfe der Haar-Wavelet-Technik trainiert werden. Sie analysieren die Pixel in einem Bild, um bestimmte Merkmale zu erkennen. Um mehr über Haar Cascades zu erfahren, folgen Sie bitte den untenstehenden Links.

Objekterkennungs-Framework von Viola-Jones
Kaskadierende Klassifikatoren
Haarähnliches Merkmal

Laden Sie bereits trainierte Kaskaden herunter hier. Im aktuellen Beispiel werden Kaskaden verwendet, um das Gesicht einer Person von vorne zu identifizieren.

Dazu müssen Sie einen Klassifikator erstellen und ihn mit einer bereits trainierten Datei füttern (der Link ist oben angegeben). Ich habe die Datei pencv_haarcascade_frontalface_default.xml bereits in das Verzeichnis hochgeladen, in dem sich unser Programm befindet.

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

Um Gesichter in einem Bild zu erkennen, müssen Sie die Methode verwenden DetectMultiScale. Diese Funktion nimmt einen Frame (Typ Mat), der gerade aus dem Videostream der Kamera gelesen wurde, und gibt ein Array vom Typ Rechteck zurück. Die Array-Größe stellt die Anzahl der Gesichter dar, die der Klassifikator im Rahmen erkennen konnte. Um sicherzustellen, dass wir sehen, was gefunden wurde, durchlaufen wir dann die Liste der Rechtecke und geben das Rechteckobjekt auf der Konsole aus, wodurch ein Rahmen um das erkannte Rechteck erstellt wird. Dies kann mit der Rechteckfunktion erfolgen. Es akzeptiert die von der Kamera gelesene Matte, das von der DetectMultiScale-Methode zurückgegebene Rechteckobjekt sowie die Farbe und Dicke des Rahmens.

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

Aufbau eines Gesichtserkennungssystems basierend auf Golang und OpenCV

Aufbau eines Gesichtserkennungssystems basierend auf Golang und 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)
}
}

Und... ja, alles hat geklappt! Wir haben jetzt ein einfaches Gesichtserkennungssystem, das in Go geschrieben ist. Bald habe ich vor, diese Experimente fortzusetzen und durch die Kombination von Go und OpenCV neue coole Dinge zu schaffen.

Bei Interesse bitte bewerten gRPC-Webserver, das ich in Python und OpenCV geschrieben habe. Es überträgt Daten, sobald ein Gesicht erkannt wird. Dies ist die Grundlage für die Erstellung unterschiedlicher Clients in unterschiedlichen Programmiersprachen. Sie können sich mit dem Server verbinden und Daten von ihm lesen.

Vielen Dank, dass Sie den Artikel gelesen haben!

Skillbox empfiehlt:

Source: habr.com

Kommentar hinzufügen