Budovanie systému rozpoznávania tvárí založeného na Golang a OpenCV

Budovanie systému rozpoznávania tvárí založeného na Golang a OpenCV
OpenCV je knižnica určená pre projekty počítačového videnia. Má už asi 20 rokov. Používal som ho na vysokej škole a stále ho používam pre svoje projekty C++ a Python, pretože má dobrú podporu pre tieto jazyky.

Ale keď som sa začal učiť a používať Go, začalo ma zaujímať, či by sa OpenCV dalo použiť na prácu s týmto jazykom. V tom čase už existovali príklady a návody na integráciu, ale zdalo sa mi, že sú príliš komplikované. O niečo neskôr som narazil na obal vytvorený tímom The Hybrid Group. V tomto článku vám ukážem, ako začať s GoCV vyvinutím jednoduchého systému na rozpoznávanie tváre s Haar Cascades.

Skillbox odporúča: Praktický kurz "Vývojár Pythonu od nuly".

Pripomíname vám: pre všetkých čitateľov „Habr“ - zľava 10 000 rubľov pri registrácii do akéhokoľvek kurzu Skillbox pomocou propagačného kódu „Habr“.

Čo sa vyžaduje:

  • Choď;
  • OpenCV (odkazy na inštaláciu nižšie);
  • webovú alebo bežnú videokameru.

Inštalácia

Príklad 1

V prvom príklade sa pokúsime vytvoriť aplikáciu, ktorá otvorí okno zobrazujúce stream videa z kamery.

Najprv musíte importovať knižnice potrebné pre prácu.

importovať (
"log"
"gocv.io/x/gocv"
)

Potom musíte vytvoriť objekt VideoCapture pomocou funkcie VideoCaptureDevice. Ten umožňuje zachytiť video stream pomocou kamery. Funkcia používa ako parameter celé číslo (predstavuje ID zariadenia).

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

Teraz musíme vytvoriť n-rozmernú maticu. Uloží obrázky načítané z fotoaparátu.

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

Ak chcete zobraziť stream videa, musíte vytvoriť okno - to je možné vykonať pomocou funkcie NewWindow.

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

Teraz prejdime k najzaujímavejšej časti.

Keďže video je nepretržitý tok snímok, budeme musieť vytvoriť nekonečnú slučku, aby sme mohli donekonečna čítať tok videa z kamery. Na to potrebujete metódu Read typu VideoCapture. Očakáva typ Mat (maticu, ktorú sme vytvorili vyššie), vracajúcu booleovskú hodnotu označujúcu, či bola snímka z VideoCapture načítaná úspešne alebo nie.

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

Teraz musíte zobraziť rám vo vytvorenom okne. Pauza na prechod na ďalšiu snímku je 50 ms.

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

Po spustení aplikácie sa otvorí okno s videostreamom z kamery.

Budovanie systému rozpoznávania tvárí založeného na Golang a 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)
}
}

Príklad 2

V tomto príklade použijeme predchádzajúci príklad a zostavme systém rozpoznávania tvárí založený na Haar Cascades.

Haarove kaskády sú kaskádové klasifikátory, ktoré sú trénované pomocou Haarovej vlnkovej techniky. Analyzujú pixely v obraze, aby zistili určité funkcie. Ak sa chcete dozvedieť viac o kaskádach Haar, kliknite na nižšie uvedené odkazy.

Rámec detekcie objektov Viola-Jones
Kaskádové klasifikátory
Funkcia podobná vlasom

Stiahnite si už natrénované kaskády môže byť tu. V aktuálnom príklade sa na identifikáciu tváre osoby spredu použijú kaskády.

Aby ste to mohli urobiť, musíte vytvoriť klasifikátor a odovzdať mu už natrénovaný súbor (odkaz je uvedený vyššie). Súbor pencv_haarcascade_frontalface_default.xml som už nahral do adresára, kde sa nachádza náš program.

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

Ak chcete rozpoznať tváre na obrázku, musíte použiť metódu DetectMultiScale. Táto funkcia vezme snímku (typ Mat), ktorá bola práve načítaná z video streamu kamery, a vráti pole typu Rectangle. Veľkosť poľa predstavuje počet tvárí, ktoré bol klasifikátor schopný rozpoznať v rámci. Potom, aby sme sa uistili, že vidíme, čo našiel, prejdeme zoznamom obdĺžnikov a vytlačíme objekt Rectangle do konzoly, čím vytvoríme orámovanie okolo rozpoznaného obdĺžnika. Môžete to urobiť pomocou funkcie Obdĺžnik. Bude akceptovať podložku načítanú kamerou, objekt Rectangle, ktorý vrátila metóda DetectMultiScale, farbu a hrúbku okraja.

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

Budovanie systému rozpoznávania tvárí založeného na Golang a OpenCV

Budovanie systému rozpoznávania tvárí založeného na Golang a 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)
}
}

A... áno, všetko vyšlo! Teraz máme jednoduchý systém rozpoznávania tváre napísaný v Go. Čoskoro plánujem pokračovať v týchto experimentoch a vytvárať nové skvelé veci kombináciou Go a OpenCV.

Ak máte záujem, ohodnoťte webový server gRPC, ktorý som napísal v Pythone a OpenCV. Streamuje údaje v momente, keď je rozpoznaná tvár. Toto je základ pre vytváranie rôznych klientov v rôznych programovacích jazykoch. Budú sa môcť pripojiť k serveru a čítať z neho údaje.

Ďakujem za prečítanie článku!

Skillbox odporúča:

Zdroj: hab.com

Pridať komentár