Construirea unui sistem de recunoaștere a feței bazat pe Golang și OpenCV

Construirea unui sistem de recunoaștere a feței bazat pe Golang și OpenCV
OpenCV este o bibliotecă dezvoltată pentru proiecte de viziune computerizată. Are deja vreo 20 de ani. L-am folosit la facultate și încă îl folosesc pentru proiectele mele C++ și Python, deoarece are un suport bun pentru acele limbi.

Dar când am început să învăț și să folosesc Go, m-am întrebat dacă OpenCV ar putea fi folosit pentru a lucra cu acest limbaj. Pe atunci existau deja exemple și tutoriale despre integrare, dar mi se părea că sunt prea complicate. Puțin mai târziu, am dat peste un wrapper creat de The Hybrid Group. În acest articol, vă voi arăta cum să începeți cu GoCV prin dezvoltarea unui sistem simplu de recunoaștere a feței cu Haar Cascades.

Skillbox recomandă: Curs practic „Dezvoltator Python de la zero”.

Amintim: pentru toți cititorii „Habr” - o reducere de 10 de ruble la înscrierea la orice curs Skillbox folosind codul promoțional „Habr”.

Ce este necesar:

  • Merge;
  • OpenCV (linkuri către programul de instalare de mai jos);
  • cameră video web sau obișnuită.

Instalare

Exemplul 1

În primul exemplu, vom încerca să creăm o aplicație care deschide o fereastră cu un flux video al camerei.

Mai întâi trebuie să importați bibliotecile de care aveți nevoie pentru a lucra.

import(
"Buturuga"
„gocv.io/x/gocv”
)

După aceea, trebuie să creați un obiect VideoCapture folosind funcția VideoCaptureDevice. Acesta din urmă face posibilă capturarea unui flux video folosind o cameră. Funcția ia un număr întreg ca parametru (reprezintă ID-ul dispozitivului).

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

Acum trebuie să creăm o matrice n-dimensională. Acesta va stoca imaginile citite de pe cameră.

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

Pentru a afișa fluxul video, trebuie să creați o fereastră - acest lucru se poate face folosind funcția NewWindow.

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

Acum să trecem la partea cea mai interesantă.

Deoarece videoclipul este un flux continuu de cadre de imagine, va trebui să creăm o buclă infinită pentru a citi la nesfârșit fluxul video al camerei. Aceasta necesită metoda Read de tip VideoCapture. Se va aștepta un tip Mat (matricea creată mai sus), returnând un boolean care indică dacă un cadru din VideoCapture a fost citit cu succes sau nu.

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

Acum trebuie să afișăm cadrul în fereastra creată. Pauză pentru a trece la următorul cadru - 50 ms.

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

După lansarea aplicației, se va deschide o fereastră cu un flux video de la cameră.

Construirea unui sistem de recunoaștere a feței bazat pe Golang și 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)
}
}

Exemplul 2

În acest exemplu, să folosim exemplul anterior și să construim un sistem de recunoaștere a feței bazat pe Haar Cascades.

Cascadele Haar sunt clasificatoare în cascadă care sunt antrenate pe baza tehnicii wavelet Haar. Ei analizează pixelii dintr-o imagine pentru a căuta caracteristici specifice. Pentru a afla mai multe despre Haar Cascades, vă rugăm să urmați linkurile de mai jos.

Cadrul de detectare a obiectelor Viola-Jones
Clasificatoare în cascadă
Caracteristică asemănătoare Haar

Descărcați cascade deja antrenate poate fi aici. În exemplul actual, cascadele vor fi folosite pentru a identifica fața unei persoane din față.

Pentru a face acest lucru, trebuie să creați un clasificator și să îl alimentați cu un fișier deja antrenat (linkul este dat mai sus). Am încărcat deja fișierul pencv_haarcascade_frontalface_default.xml în directorul în care se află programul nostru.

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

Pentru a detecta fețele dintr-o imagine, trebuie să utilizați metoda DetectMultiScale. Această funcție preia un cadru (de tip Mat) care tocmai a fost citit din fluxul video al camerei și returnează o matrice de tip Rectangle. Dimensiunea matricei reprezintă numărul de fețe pe care clasificatorul a fost capabil să le detecteze în cadru. Apoi, pentru a ne asigura că vedem ce a găsit, haideți să repetăm ​​lista de dreptunghiuri și să tipărim obiectul Rectangle pe consolă, creând un chenar în jurul dreptunghiului găsit. Acest lucru se poate face folosind funcția dreptunghi. Va lua Mat citit de cameră, obiectul Rectangle returnat prin metoda DetectMultiScale și culoarea și grosimea chenarului.

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

Construirea unui sistem de recunoaștere a feței bazat pe Golang și OpenCV

Construirea unui sistem de recunoaștere a feței bazat pe Golang și 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)
}
}

Și... da, totul a mers! Acum avem un sistem simplu de recunoaștere a feței scris în Go. În viitorul apropiat, intenționez să continui aceste experimente și să creez noi lucruri interesante combinând Go și OpenCV.

Dacă sunteți interesat, vă rugăm să evaluați server web gRPC, pe care l-am scris în Python și OpenCV. Transmite date de îndată ce o față este detectată. Aceasta este baza pentru crearea diferiților clienți în diferite limbaje de programare. Ei se vor putea conecta la server și vor citi datele de pe acesta.

Mulțumesc că ai citit articolul!

Skillbox recomandă:

Sursa: www.habr.com

Adauga un comentariu