Vybudování systému rozpoznávání obličeje založeného na Golang a OpenCV

Vybudování systému rozpoznávání obličeje založeného na Golang a OpenCV
OpenCV je knihovna určená pro projekty počítačového vidění. Už je jí asi 20 let. Používal jsem ho na vysoké škole a stále používám pro své projekty v C++ a Pythonu, protože má pro tyto jazyky dobrou podporu.

Když jsem se ale začal učit a používat Go, začalo mě zajímat, zda by se OpenCV dalo použít pro práci s tímto jazykem. V té době už existovaly příklady a návody na integraci, ale zdály se mi příliš složité. O něco později jsem narazil na obal vytvořený týmem The Hybrid Group. V tomto článku vám ukážu, jak začít s GoCV vývojem jednoduchého systému pro rozpoznávání obličeje s Haar Cascades.

Skillbox doporučuje: Praktický kurz "Vývojář Pythonu od nuly".

Připomínáme: pro všechny čtenáře "Habr" - sleva 10 000 rublů při zápisu do jakéhokoli kurzu Skillbox pomocí propagačního kódu "Habr".

Co se bude požadovat:

  • Jít;
  • OpenCV (odkazy na instalaci níže);
  • webovou nebo běžnou videokamerou.

Instalace

Příklad 1

V prvním příkladu se pokusíme vytvořit aplikaci, která otevře okno zobrazující stream videa z kamery.

Nejprve je potřeba naimportovat knihovny potřebné pro práci.

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

Poté musíte pomocí funkce VideoCaptureDevice vytvořit objekt VideoCapture. Ten umožňuje zachytit video stream pomocí kamery. Funkce používá jako parametr celé číslo (představuje ID zařízení).

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

Nyní potřebujeme vytvořit n-rozměrnou matici. Bude ukládat snímky načtené z fotoaparátu.

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

Chcete-li zobrazit video stream, musíte vytvořit okno - to lze provést pomocí funkce NewWindow.

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

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

Protože video je nepřetržitý proud obrazových snímků, budeme muset vytvořit nekonečnou smyčku, abychom mohli nekonečně číst video stream z kamery. K tomu potřebujete metodu Read typu VideoCapture. Očekává typ Mat (matici, kterou jsme vytvořili výše), vracející booleovskou hodnotu indikující, zda byl snímek z VideoCapture přečten úspěšně 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 rámeček ve vytvořeném okně. Pauza pro přechod na další snímek je 50 ms.

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

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

Vybudování systému rozpoznávání obličeje 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)
}
}

Příklad 2

V tomto příkladu použijeme předchozí příklad a postavme systém rozpoznávání obličejů založený na Haar Cascades.

Haarovy kaskády jsou kaskádové klasifikátory, které jsou trénovány pomocí techniky Haarových vlnek. Analyzují pixely v obraze, aby detekovaly určité funkce. Chcete-li se dozvědět více o Haar Cascades, klikněte na níže uvedené odkazy.

Rámec detekce objektů Viola-Jones
Kaskádové klasifikátory
Vlastnost podobná vlasu

Stáhněte si již natrénované kaskády může být tady. V aktuálním příkladu budou kaskády použity k identifikaci obličeje osoby zepředu.

Chcete-li to provést, musíte vytvořit klasifikátor a vložit do něj již trénovaný soubor (odkaz je uveden výše). Již jsem nahrál soubor pencv_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()

Chcete-li detekovat tváře na snímku, musíte použít metodu DetectMultiScale. Tato funkce vezme snímek (typ Mat), který byl právě přečten z video streamu kamery, a vrátí pole typu Rectangle. Velikost pole představuje počet tváří, které byl klasifikátor schopen detekovat v rámci. Poté, abychom se ujistili, že vidíme, co našel, projdeme seznam obdélníků a vytiskneme objekt Rectangle do konzoly, čímž vytvoříme ohraničení kolem detekovaného obdélníku. To lze provést pomocí funkce Obdélník. Přijme Mat čtenou kamerou, objekt Rectangle, který byl vrácen metodou DetectMultiScale, barvu a tloušťku okraje.

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

Vybudování systému rozpoznávání obličeje založeného na Golang a OpenCV

Vybudování systému rozpoznávání obličeje 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... ano, všechno klaplo! Nyní máme jednoduchý systém rozpoznávání obličeje napsaný v Go. Brzy plánuji pokračovat v těchto experimentech a vytvářet nové skvělé věci kombinací Go a OpenCV.

V případě zájmu ohodnoťte webový server gRPC, který jsem napsal v Pythonu a OpenCV. Přenáší data v okamžiku, kdy je detekován obličej. To je základ pro vytváření různých klientů v různých programovacích jazycích. Budou se moci připojit k serveru a číst z něj data.

Děkuji za přečtení článku!

Skillbox doporučuje:

Zdroj: www.habr.com

Přidat komentář