Budujemy system rozpoznawania twarzy oparty na Golang i OpenCV

Budujemy system rozpoznawania twarzy oparty na Golang i OpenCV
OpenCV — biblioteka opracowana dla projektów związanych z komputerowym widzeniem. Istnieje już od około 20 lat. Używałem jej jeszcze w college'u i do tej pory stosuję w swoich projektach w C++ i Pythonie, ponieważ ma dobrą obsługę tych języków.

Jednak kiedy zacząłem uczyć się i używać Go, zainteresowało mnie, czy można zastosować OpenCV do pracy z tym językiem. Wtedy istniały już przykłady i samouczki dotyczące integracji, ale wydawały mi się zbyt skomplikowane. Niedługo potem natknąłem się na wrappera stworzonego przez zespół The Hybrid Group. W tym artykule pokażę, jak zacząć z GoCV, tworząc prosty system rozpoznawania twarzy przy użyciu kaskad Haar.

Skillbox poleca: Praktyczny kurs „Python-developer od podstaw”.

Przypominamy: dla wszystkich czytelników „Habra” — zniżka 10 000 rubli przy zapisie na dowolny kurs Skillbox z kodem promocyjnym „Habra”.

Co będzie potrzebne:

  • Go;
  • OpenCV (linki do instalatora poniżej);
  • kamera internetowa lub zwykła kamera wideo.

Instalacja

Przykład 1

W pierwszym przykładzie spróbujemy stworzyć aplikację, która otwiera okno z demonstracją strumienia wideo z kamery.

Najpierw musimy zaimportować biblioteki potrzebne do pracy.

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

Następnie należy stworzyć obiekt VideoCapture przy użyciu funkcji VideoCaptureDevice. Ta ostatnia pozwala na przechwytywanie strumienia wideo z kamery. W funkcji używa się liczby całkowitej jako parametru (reprezentuje ona ID urządzenia).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“błąd podczas otwierania kamery internetowej: %v”, err)
}
defer webcam.Close()

Teraz należy stworzyć n-wymiarową macierz. Będzie ona przechowywać obrazy odczytane z kamery.

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

Aby wyświetlić strumień wideo, należy stworzyć okno — można to zrobić przy pomocy funkcji NewWindow.

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

Teraz przejdźmy do najciekawszej części.

Ponieważ wideo to ciągły strumień klatek-obrazu, musimy stworzyć nieskończoną pętlę do ciągłego odczytu strumienia wideo z kamery. Do tego potrzebna jest metoda Read typu VideoCapture. Będzie ona oczekiwała typu Mat (macierz, którą stworzyliśmy wyżej), zwracając wartość logiczną, która wskazuje, czy klatka z VideoCapture została pomyślnie odczytana czy nie.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty() {
        log.Println(“Nie można odczytać z kamery internetowej”)    continue
     }
.
.
.
}

Teraz trzeba wyświetlić ramkę w utworzonym oknie. Przerwa na przejście do następnej ramki - 50 ms.

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

Po uruchomieniu aplikacji otworzy się okno z strumieniem wideo z kamery.

Budujemy system rozpoznawania twarzy oparty na Golang i OpenCV

package main
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("błąd otwierania urządzenia: %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("Nie można odczytać z kamerki")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Przykład 2

W tym przykładzie skorzystajmy z poprzedniego przykładu i zbudujmy system rozpoznawania twarzy oparty na Haar Cascades (kaskady Haara).

Kaskady Haara to kaskadowe klasyfikatory, które są trenowane w oparciu o technikę falkową Haara. Analizują piksele w obrazie, aby wykryć określone cechy. Aby dowiedzieć się więcej o Haar Cascades, można przejść do linków poniżej.

Zestaw detekcji obiektów Viola-Jones
Kaskadowe klasyfikatory
Cechy podobne do Haara

Pobierz już wytrenowane kaskady można tutaj. W bieżącym przykładzie kaskady będą używane do identyfikacji twarzy człowieka z przodu.

Aby to zrobić, należy stworzyć klasyfikator i dostarczyć mu już wytrenowany plik (link podany powyżej). Już załadowałem plik opencv_haarcascade_frontalface_default.xml do katalogu, w którym znajduje się nasz program.

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

Aby wykrywać twarze na obrazie, należy skorzystać z metody DetectMultiScale. Funkcja ta przyjmuje klatkę (typ Mat), która została właśnie odczytana ze strumienia wideo kamery, i zwraca tablicę typu Rectangle. Rozmiar tablicy reprezentuje liczbę twarzy, które klasyfikator był w stanie wykryć w klatce. Następnie, aby upewnić się, że widzimy to, co znalazł, przejdźmy przez listę prostokątów i wyświetlmy obiekt Rectangle w konsoli, tworząc ramkę wokół wykrytego prostokąta. Można to zrobić za pomocą funkcji Rectangle. Przyjmuje ona Mat, odczytany z kamery, obiekt Rectangle, który został zwrócony przez metodę DetectMultiScale, kolor i grubość ramki.

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

Budujemy system rozpoznawania twarzy oparty na Golang i OpenCV

Budujemy system rozpoznawania twarzy oparty na Golang i OpenCV

pakiet główny
 
import (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
funkcja main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("błąd przy otwieraniu kamery internetowej: %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("Nie można odczytać z urządzenia")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("wykryto", r)
gocv.Rectangle(&img, r, color, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Tak, udało się! Mamy teraz prosty system rozpoznawania twarzy, napisany w Go. Wkrótce planuję kontynuować te eksperymenty i stworzyć nowe ciekawe rzeczy, łącząc Go i OpenCV.

Jeśli jesteś zainteresowany, oceniaj serwer gRPC web, który napisałem w Pythonie i OpenCV. Transmituje dane w momencie wykrycia twarzy. To podstawa do tworzenia różnych klientów w różnych językach programowania. Będą mogli łączyć się z serwerem i odczytywać z niego dane.

Dziękuję za przeczytanie artykułu!

Skillbox poleca:

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster