Ehitatakse näotuvastussüsteemi Golangi ja OpenCV põhjal

Ehitatakse näotuvastussüsteemi Golangi ja OpenCV põhjal
OpenCV — teekond, mis on arendatud arvutinägemise projektide jaoks. Sellel on juba umbes 20 aastat ajalugu. Kasutasin seda juba ülikoolis ja kasutan seda endiselt oma C++ ja Python projektides, kuna sellel on nende keelte suhtes hea tugi.

Kuid kui hakkasin õppima ja kasutama Go'd, tekkis mul huvi, kas OpenCV-d on võimalik kasutada ka selle keele jaoks. Sel ajal olid juba olemas näidised ja õpetused integreerimise kohta, kuid need tundusid mulle liiga keerulised. Hiljem sattusin ma kätte The Hybrid Group'i loodud wrapper'i. Selles artiklis näitan, kuidas alustada GoCV-ga, arendades lihtsa näo tuvastamise süsteemi Haari kaskaadide abil.

Skillbox soovitab: Praktiline kursus „Python-arendaja algusest peale“.

Tuletame meelde: kõigile «Habra» lugejatele — 10 000 rubla soodustus, kui registreerite end Skillboxi mis tahes kursusele promokoodi «Habr» abil.

Mida on vaja:

  • Go;
  • OpenCV (installijuhised all);
  • veebikaamera või tavaline kaamera.

Installeerimine

Näide 1

Esimeses näites proovime luua rakenduse, mis avab akna, kus on näidatud kaamera video voog.

Esimene samm on importida vajalikud raamatukogud.

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

Seejärel tuleb luua VideoCapture objekti, kasutades VideoCaptureDevice funktsiooni. Viimane võimaldab salvestada videovoogu kaamera abil. Funktsioonis kasutatakse täisarvu parameetrina (see esindab seadme ID-d).

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

Nüüd tuleb luua n-mõõtmeline maatriks. See salvestab kaamerast loetud pildid.

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

Videovoogude kuvamiseks tuleb luua aken - seda saab teha NewWindow funktsiooni abil.

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

Nüüd liikume kõige huvitavama osa juurde.

Kuna video on pidev voog kaadritest-piltidest, peame looma lõpmatu tsükli kaamera videovoogude pidevaks lugemiseks. Selleks on vajalik VideoCapture tüüpi Read meetod. See ootab Mat tüüpi (maatriks, mille me eelnevalt lõime), tagastades loogilise väärtuse, mis näitab, kas kaader VideoCapture-st loeti edukalt või mitte.

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

Nüüd tuleb raami kuvamiseks avada aken. Ülemineku paus järgmisele raamile on 50 ms.

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

Pärast rakenduse käivitamist avatakse aken, kus on videovool kaamerast.

Ehitatakse näotuvastussüsteemi Golangi ja OpenCV põhjal

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)
}
}

Näide 2

Selles näites kasutame eelmise näite põhjal näo tuvastamise süsteemi, kasutades Haari kaskaade.

Haar'i kaskaadid on kaskaadklassifikaatorid, mis õpitakse Haari vektorite meetodi põhjal. Need analüüsivad piltide pikslit, et tuvastada teatud jooni. Lisainformatsiooni saamiseks Haari kaskaadide kohta külastage allolevaid linke.

Viola-Jones objekti tuvastamise raamistik
Kaskaadklassifikaatorid
Haar-sarnane omadus

Laadi alla juba koolitatud kaskaadid leiate siit. Käesolevas näites kasutatakse kaskaade inimese näo tuvastamiseks frontaalvaates.

Selleks, et seda teha, peate looma klassifitseerija ja toitma sellele juba koolitatud faili (eelnevalt on antud link). Olen juba üles laadinud faili pencv_haarcascade_frontalface_default.xml kausta, kus asub meie programm.

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

Kasutamiseks nägude tuvastamiseks pildil peate kasutama meetodit DetectMultiScale. See funktsioon võtab sisendiks kaadri (tüüp Mat), mis on just loetud kaamera videoserverist, ja tagastab Rectangle tüüpi massiivi. Massiivi suurus näitab, kui palju nägusid klassifitseerija suutis kaadris tuvastada. Seejärel, et veenduda, et näeme seda, mida ta leidis, läbime ristkülikute nimekirja ja väljastame objekti Rectangle konsooli, luues piirjoone tuvastatud ristküliku ümber. Seda saab teha funktsiooni Rectangle abil. See võtab sisse Mat'i, mis on kaameraga loetud, Rectangle objekti, mis tagastati meetodiga DetectMultiScale, värvi ja piiri paksuse.

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

Ehitatakse näotuvastussüsteemi Golangi ja OpenCV põhjal

Ehitatakse näotuvastussüsteemi Golangi ja OpenCV põhjal

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)
}
}

Ja… see on tõenäoliselt õnnestunud! Nüüd on meil lihtne näotuvastus süsteem, mis on kirjutatud Go keeles. Peagi plaanin jätkata neid eksperimente ja luua uusi lahedaid asju, kombineerides Go ja OpenCV.

Kui see teid huvitab, siis hindake gRPC veebi server, mille ma kirjutasin Pythonis ja OpenCV-s. See edastab andmeid näo avastamise hetkel. See on alus erinevate klientide loomiseks erinevates programmeerimiskeeltes. Need saavad serveriga ühenduda ja sealt andmeid lugeda.

Aitäh, et lugesite artiklit!

Skillbox soovitab:

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster