Δημιουργία συστήματος αναγνώρισης προσώπου με βάση το Golang και το OpenCV

Δημιουργία συστήματος αναγνώρισης προσώπου με βάση το Golang και το OpenCV
Το OpenCV είναι μια βιβλιοθήκη σχεδιασμένη για έργα υπολογιστικής όρασης. Είναι ήδη περίπου 20 ετών. Το χρησιμοποίησα στο κολέγιο και εξακολουθώ να το χρησιμοποιώ για τα έργα μου σε C++ και Python επειδή έχει καλή υποστήριξη για αυτές τις γλώσσες.

Αλλά όταν άρχισα να μαθαίνω και να χρησιμοποιώ το Go, με ενδιέφερε αν το OpenCV θα μπορούσε να χρησιμοποιηθεί για να δουλέψω με αυτήν τη γλώσσα. Εκείνη την εποχή, υπήρχαν ήδη παραδείγματα και σεμινάρια για την ενσωμάτωση, αλλά μου φάνηκε ότι ήταν πολύ περίπλοκα. Λίγο αργότερα, συνάντησα ένα περιτύλιγμα που δημιουργήθηκε από την ομάδα του The Hybrid Group. Σε αυτό το άρθρο, θα σας δείξω πώς να ξεκινήσετε με το GoCV αναπτύσσοντας ένα απλό σύστημα αναγνώρισης προσώπου με το Haar Cascades.

Το Skillbox προτείνει: Πρακτικό μάθημα "Προγραμματιστής Python από την αρχή".

Υπενθύμιση: για όλους τους αναγνώστες του "Habr" - έκπτωση 10 ρούβλια κατά την εγγραφή σε οποιοδήποτε μάθημα Skillbox χρησιμοποιώντας τον κωδικό προσφοράς "Habr".

Τι θα χρειαστείτε:

  • Πηγαίνω;
  • OpenCV (σύνδεσμοι εγκατάστασης παρακάτω).
  • web ή κανονική βιντεοκάμερα.

Εγκατάσταση

1 Παράδειγμα

Στο πρώτο παράδειγμα, θα προσπαθήσουμε να δημιουργήσουμε μια εφαρμογή που ανοίγει ένα παράθυρο που δείχνει μια ροή βίντεο κάμερας.

Πρώτα πρέπει να εισαγάγετε τις βιβλιοθήκες που απαιτούνται για εργασία.

εισαγωγή (
"κούτσουρο"
“gocv.io/x/gocv”
)

Μετά από αυτό, πρέπει να δημιουργήσετε ένα αντικείμενο VideoCapture χρησιμοποιώντας τη λειτουργία VideoCaptureDevice. Το τελευταίο καθιστά δυνατή τη λήψη μιας ροής βίντεο χρησιμοποιώντας μια κάμερα. Η συνάρτηση χρησιμοποιεί έναν ακέραιο αριθμό ως παράμετρο (αντιπροσωπεύει το αναγνωριστικό της συσκευής).

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

Τώρα πρέπει να δημιουργήσουμε έναν n-διάστατο πίνακα. Θα αποθηκεύει εικόνες που διαβάζονται από την κάμερα.

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

Για να εμφανίσετε μια ροή βίντεο, πρέπει να δημιουργήσετε ένα παράθυρο - αυτό μπορεί να γίνει χρησιμοποιώντας τη λειτουργία NewWindow.

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

Τώρα ας περάσουμε στο πιο ενδιαφέρον κομμάτι.

Δεδομένου ότι το βίντεο είναι μια συνεχής ροή πλαισίων εικόνων, θα χρειαστεί να δημιουργήσουμε έναν άπειρο βρόχο για να διαβάζουμε ατελείωτα τη ροή βίντεο της κάμερας. Για να το κάνετε αυτό, χρειάζεστε τη μέθοδο Read του τύπου VideoCapture. Θα περιμένει έναν τύπο Mat (το matrix που δημιουργήσαμε παραπάνω), επιστρέφοντας μια boolean τιμή που υποδεικνύει εάν το πλαίσιο από το VideoCapture διαβάστηκε με επιτυχία ή όχι.

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

Τώρα πρέπει να εμφανίσετε το πλαίσιο στο παράθυρο που δημιουργήθηκε. Η παύση για μετάβαση στο επόμενο καρέ είναι 50 ms.

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

Μετά την εκκίνηση της εφαρμογής, θα ανοίξει ένα παράθυρο με ροή βίντεο από την κάμερα.

Δημιουργία συστήματος αναγνώρισης προσώπου με βάση το Golang και το 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)
}
}

2 Παράδειγμα

Σε αυτό το παράδειγμα, ας χρησιμοποιήσουμε το προηγούμενο παράδειγμα και ας δημιουργήσουμε ένα σύστημα αναγνώρισης προσώπου που βασίζεται σε Haar Cascades.

Οι καταρράκτες Haar είναι ταξινομητές καταρράκτη που εκπαιδεύονται χρησιμοποιώντας την τεχνική κυματιδίων Haar. Αναλύουν τα pixel σε μια εικόνα για να εντοπίσουν ορισμένα χαρακτηριστικά. Για να μάθετε περισσότερα για το Haar Cascades, ακολουθήστε τους παρακάτω συνδέσμους.

Πλαίσιο ανίχνευσης αντικειμένων Viola-Jones
Διαδοχικοί ταξινομητές
Χαρακτηριστικό που μοιάζει με Haar

Κατεβάστε ήδη εκπαιδευμένους καταρράκτες μπορεί να είναι εδώ. Στο τρέχον παράδειγμα, οι καταρράκτες θα χρησιμοποιηθούν για την αναγνώριση του προσώπου ενός ατόμου από μπροστά.

Για να το κάνετε αυτό, πρέπει να δημιουργήσετε έναν ταξινομητή και να τον τροφοδοτήσετε με ένα ήδη εκπαιδευμένο αρχείο (ο σύνδεσμος δίνεται παραπάνω). Έχω ήδη ανεβάσει το αρχείο pencv_haarcascade_frontalface_default.xml στον κατάλογο όπου βρίσκεται το πρόγραμμά μας.

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

Για να εντοπίσετε πρόσωπα σε μια εικόνα, πρέπει να χρησιμοποιήσετε τη μέθοδο DetectMultiScale. Αυτή η συνάρτηση παίρνει ένα καρέ (τύπου Mat) που μόλις διαβάστηκε από τη ροή βίντεο της κάμερας και επιστρέφει έναν πίνακα τύπου Rectangle. Το μέγεθος του πίνακα αντιπροσωπεύει τον αριθμό των προσώπων που μπόρεσε να εντοπίσει ο ταξινομητής στο πλαίσιο. Στη συνέχεια, για να βεβαιωθούμε ότι βλέπουμε τι βρήκε, ας επαναλάβουμε τη λίστα με τα ορθογώνια και ας εκτυπώσουμε το αντικείμενο Rectangle στην κονσόλα, δημιουργώντας ένα περίγραμμα γύρω από το ορθογώνιο που εντοπίστηκε. Αυτό μπορεί να γίνει χρησιμοποιώντας τη συνάρτηση Ορθογώνιο. Θα δεχτεί το Mat που διαβάζεται από την κάμερα, το αντικείμενο Rectangle που επιστράφηκε με τη μέθοδο DetectMultiScale, το χρώμα και το πάχος για το περίγραμμα.

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

Δημιουργία συστήματος αναγνώρισης προσώπου με βάση το Golang και το OpenCV

Δημιουργία συστήματος αναγνώρισης προσώπου με βάση το Golang και το 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)
}
}

Και... ναι, όλα πήγαν καλά! Τώρα έχουμε ένα απλό σύστημα αναγνώρισης προσώπου γραμμένο στο Go. Σύντομα σκοπεύω να συνεχίσω αυτά τα πειράματα και να δημιουργήσω νέα ωραία πράγματα συνδυάζοντας το Go και το OpenCV.

Εάν ενδιαφέρεστε, αξιολογήστε Διακομιστής ιστού gRPC, το οποίο έγραψα σε Python και OpenCV. Μεταδίδει δεδομένα τη στιγμή που ανιχνεύεται ένα πρόσωπο. Αυτή είναι η βάση για τη δημιουργία διαφορετικών πελατών σε διαφορετικές γλώσσες προγραμματισμού. Θα μπορούν να συνδέονται με τον διακομιστή και να διαβάζουν δεδομένα από αυτόν.

Σας ευχαριστούμε που διαβάσατε το άρθρο!

Το Skillbox προτείνει:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο