Veido atpažinimo sistemos kūrimas remiantis Golang ir OpenCV

Veido atpažinimo sistemos kūrimas remiantis Golang ir OpenCV
OpenCV yra biblioteka, skirta kompiuterinės vizijos projektams. Jai jau apie 20 metų. Naudojau jį koledže ir vis dar naudoju savo C++ ir Python projektuose, nes jis gerai palaiko šias kalbas.

Bet kai pradėjau mokytis ir naudoti Go, susidomėjau, ar OpenCV galima naudoti dirbant su šia kalba. Tuo metu jau buvo pavyzdžių ir pamokų apie integraciją, bet man atrodė, kad jos buvo per sudėtingos. Kiek vėliau aptikau The Hybrid Group komandos sukurtą vyniotinį. Šiame straipsnyje parodysiu, kaip pradėti naudotis GoCV kuriant paprastą veido atpažinimo sistemą su Haar Cascades.

„Skillbox“ rekomenduoja: Praktinis kursas „Python kūrėjas nuo nulio“.

Primename: visiems „Habr“ skaitytojams – 10 000 rublių nuolaida užsiregistravus į bet kurį „Skillbox“ kursą naudojant „Habr“ reklamos kodą.

Ką reikės:

  • Eik;
  • OpenCV (diegiklio nuorodos žemiau);
  • internetinė arba įprasta vaizdo kamera.

Montavimas

Pavyzdys 1

Pirmajame pavyzdyje pabandysime sukurti programą, kuri atidarys langą, kuriame rodomas kameros vaizdo srautas.

Pirmiausia reikia importuoti darbui reikalingas bibliotekas.

importuoti (
"rąstas"
„gocv.io/x/gocv“
)

Po to turite sukurti „VideoCapture“ objektą naudodami „VideoCaptureDevice“ funkciją. Pastarasis leidžia užfiksuoti vaizdo srautą naudojant kamerą. Funkcija kaip parametrą naudoja sveikąjį skaičių (jis reiškia įrenginio ID).

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

Dabar turime sukurti n matmenų matricą. Jis išsaugos iš fotoaparato nuskaitytus vaizdus.

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

Norėdami rodyti vaizdo įrašų srautą, turite sukurti langą – tai galima padaryti naudojant NewWindow funkciją.

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

Dabar pereikime prie įdomiausios dalies.

Kadangi vaizdo įrašas yra nenutrūkstamas vaizdo kadrų srautas, turėsime sukurti begalinį ciklą, kad galėtume be galo skaityti fotoaparato vaizdo srautą. Norėdami tai padaryti, jums reikia „VideoCapture“ tipo skaitymo metodo. Tikėsis Mat tipo (matricos, kurią sukūrėme aukščiau), grąžinant loginę reikšmę, nurodant, ar kadras iš „VideoCapture“ buvo nuskaitytas sėkmingai, ar ne.

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

Dabar sukurtame lange turite parodyti rėmelį. Perėjimo prie kito kadro pauzė yra 50 ms.

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

Paleidus programą, atsidarys langas su vaizdo srautu iš fotoaparato.

Veido atpažinimo sistemos kūrimas remiantis Golang ir 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)
}
}

Pavyzdys 2

Šiame pavyzdyje naudokime ankstesnį pavyzdį ir sukurkime veido atpažinimo sistemą, pagrįstą „Haar Cascades“.

Haar kaskados yra kaskadiniai klasifikatoriai, mokomi naudojant Haar bangelių techniką. Jie analizuoja vaizdo pikselius, kad nustatytų tam tikras funkcijas. Norėdami sužinoti daugiau apie Haar Cascades, spustelėkite toliau pateiktas nuorodas.

Viola-Jones objektų aptikimo sistema
Kaskadiniai klasifikatoriai
Haarą primenanti savybė

Atsisiųskite jau apmokytas kaskadas gali būti čia. Dabartiniame pavyzdyje kaskados bus naudojamos asmens veidui atpažinti iš priekio.

Norėdami tai padaryti, turite sukurti klasifikatorių ir pateikti jam jau paruoštą failą (nuoroda pateikta aukščiau). Jau įkėliau failą pencv_haarcascade_frontalface_default.xml į katalogą, kuriame yra mūsų programa.

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

Norėdami vaizde aptikti veidus, turite naudoti šį metodą DetectMultiScale. Ši funkcija paima kadrą (tipas Mat), kuris buvo ką tik nuskaitytas iš fotoaparato vaizdo srauto, ir grąžina stačiakampio tipo masyvą. Masyvo dydis parodo veidų, kuriuos klasifikatorius galėjo aptikti kadre, skaičių. Tada norėdami įsitikinti, kad matome, ką jis rado, pakartokime stačiakampių sąrašą ir atspausdinkite objektą Stačiakampis konsolėje, sukurdami kraštinę aplink aptiktą stačiakampį. Tai galima padaryti naudojant Stačiakampio funkciją. Jis priims fotoaparato nuskaitytą kilimėlį, stačiakampio objektą, kuris buvo grąžintas DetectMultiScale metodu, kraštinės spalvą ir storį.

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

Veido atpažinimo sistemos kūrimas remiantis Golang ir OpenCV

Veido atpažinimo sistemos kūrimas remiantis Golang ir 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)
}
}

Ir... taip, viskas pavyko! Dabar turime paprastą veido atpažinimo sistemą, parašytą Go. Netrukus ketinu tęsti šiuos eksperimentus ir kurti naujus įdomius dalykus derindama Go ir OpenCV.

Jei susidomėjote, įvertinkite gRPC žiniatinklio serveris, kurį parašiau Python ir OpenCV. Ji perduoda duomenis srautu, kai tik aptinkamas veidas. Tai yra pagrindas kurti skirtingus klientus skirtingomis programavimo kalbomis. Jie galės prisijungti prie serverio ir skaityti duomenis iš jo.

Dėkojame, kad perskaitėte straipsnį!

„Skillbox“ rekomenduoja:

Šaltinis: www.habr.com

Добавить комментарий