Vytváříme systém rozpoznávání obličejů založený na Golang a OpenCV

Vytváříme systém rozpoznávání obličejů založený na Golang a OpenCV
OpenCV — knihovna vyvinutá pro projekty v oblasti počítačového vidění. Je stará již více než 20 let. Používal jsem ji ještě na vysoké škole a dodnes ji aplikuji ve svých projektech v C++ a Pythonu, protože má slušnou podporu pro tyto jazyky.

A když jsem začal studovat a používat Go, zajímalo mě, zda je možné použít OpenCV pro práci s tímto jazykem. V té době už existovaly příklady a tutoriály na integraci, ale zdály se mi příliš složité. O něco později jsem objevil wrapper vytvořený týmem The Hybrid Group. V tomto článku ukážu, jak začít s GoCV a vyvinout jednoduchý systém rozpoznávání obličejů pomocí Haar cascades.

Skillbox doporučuje: Praktický kurz „Python developer z nuly“.

Připomínáme: pro všechny čtenáře "Habra" – sleva 10 000 korun při registraci na jakýkoli kurz Skillbox s promokódem "Habr".

Co bude potřeba:

  • Go;
  • OpenCV (odkazy na instalátor níže);
  • webová nebo běžná kamera.

Instalace

Příklad 1

V prvním příkladu se pokusíme vytvořit aplikaci, která otevře okno s demonstrací videostreamu z kamery.

Nejprve je nutné importovat knihovny potřebné pro práci.

import (
"log"
"gocv.io/x/gocv"
)

Poté je potřeba vytvořit objekt VideoCapture pomocí funkce VideoCaptureDevice. Ta umožňuje zachytit videostream pomocí kamery. Ve funkci se používá celé číslo jako parametr (reprezentuje ID zařízení).

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

Nyní je potřeba vytvořit n-rozměrnou matici. Ta bude uchovávat obrázky načtené z kamery.

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

Pro zobrazení videostreamu je potřeba vytvořit okno — to lze udělat pomocí funkce NewWindow.

window := gocv.NewWindow("webcamwindow")
defer window.Close()

Nyní přejdeme k té nejzajímavější části.

Protože video představuje nepřetržitý tok snímků-obrázků, budeme potřebovat vytvořit nekonečnou smyčku pro nekonečné čtení videostreamu z kamery. K tomu je potřeba metoda Read typu VideoCapture. Ta bude očekávat typ Mat (matrice, kterou jsme vytvořili výše), a vrátí logickou hodnotu, která naznačuje, zda byl snímek z VideoCapture úspěšně načten nebo ne.

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

Nyní je potřeba zobrazit snímek v vytvořeném okně. Pauza pro přechod k dalšímu snímku — 50 ms.

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

Po spuštění aplikace se otevře okno s videostreamem z kamery.

Vytváříme systém rozpoznávání obličejů založený 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)
}
}

Příklad 2

V tomto příkladu využijeme předchozí příklad a vytvoříme systém pro rozpoznávání obličejů na základě Haarových kaskád.

Haarovy kaskády jsou kaskádové klasifikátory, které se trénují na základě Haarovy vlnkové techniky. Analyzují pixely v obraze, aby odhalily určité rysy. Chcete-li se dozvědět více o Haarových kaskádách, můžete navštívit odkazy níže.

Rámec detekce objektů Viola-Jones
Kaskádové klasifikátory
Haarovské rysy

Stáhnout již natrénované kaskády zde. V aktuálním příkladu budou kaskády použity k identifikaci obličeje člověka zepředu.

Abychom to udělali, musíme vytvořit klasifikátor a poskytnout mu již natrénovaný soubor (viz odkaz výše). Již jsem nahrál soubor opencv_haarcascade_frontalface_default.xml do adresáře, kde se nachází náš program.

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

Pro detekci obličejů v obraze je potřeba použít metodu DetectMultiScale. Tato funkce přijímá snímek (typ Mat), který byl právě přečten z videostreamu kamery, a vrací pole typu Rectangle. Velikost pole představuje počet obličejů, které klasifikátor dokázal detekovat ve snímku. Poté, abychom se ujistili, že vidíme to, co našel, projdeme seznamem obdélníků a vypíšeme objekt Rectangle na konzoli, čímž vytvoříme obvod kolem nalezeného obdélníku. To lze provést pomocí funkce Rectangle. Ta vezme Mat, který byla přečten z kamery, objekt Rectangle, který byl vrácen metodou DetectMultiScale, barvu a tloušťku pro obvod.

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

Vytváříme systém rozpoznávání obličejů založený na Golang a OpenCV

Vytváříme systém rozpoznávání obličejů založený 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… ano, všechno se podařilo! Teď máme jednoduchý systém rozpoznávání obličejů napsaný v Go. Brzy plánuji pokračovat v těchto experimentech a vytvořit nové skvělé věci kombinující Go a OpenCV.

Pokud máte zájem, ohodnoťte to gRPC webový server, který jsem napsal v Pythonu a OpenCV. Streamuje data v okamžiku detekce obličeje. To je základ pro vytváření různých klientů v různých programovacích jazycích. Ty se budou moci připojit k serveru a číst z něj data.

Děkuji, že jste si přečetli článek!

Skillbox doporučuje:

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster