Golangiin ja OpenCV:hen perustuvan kasvojentunnistusjärjestelmän rakentaminen

Golangiin ja OpenCV:hen perustuvan kasvojentunnistusjärjestelmän rakentaminen
OpenCV on tietokonenäköprojekteihin suunniteltu kirjasto. Hän on jo noin 20-vuotias. Käytin sitä yliopistossa ja käytän sitä edelleen C++- ja Python-projekteissani, koska sillä on hyvä tuki näille kielille.

Mutta kun aloin oppia ja käyttää Goa, kiinnostuin siitä, voidaanko OpenCV:tä käyttää tämän kielen kanssa työskentelemiseen. Tuolloin oli jo esimerkkejä ja opetusohjelmia integraatiosta, mutta minusta ne tuntuivat liian monimutkaisilta. Hieman myöhemmin törmäsin The Hybrid Group -tiimin luomaan kääreeseen. Tässä artikkelissa näytän sinulle, kuinka pääset alkuun GoCV:n kanssa kehittämällä yksinkertaisen kasvojentunnistusjärjestelmän Haar Cascadesin avulla.

Skillbox suosittelee: Käytännön kurssi "Python-kehittäjä tyhjästä".

Muistutamme sinua: kaikille "Habrin" lukijoille - 10 000 ruplan alennus ilmoittautuessaan mille tahansa Skillbox-kurssille "Habr" -tarjouskoodilla.

Mitä tarvitaan:

  • Mennä;
  • OpenCV (asennuslinkit alla);
  • web- tai tavallinen videokamera.

Asennus

Esimerkki 1

Ensimmäisessä esimerkissä yritämme luoda sovelluksen, joka avaa ikkunan, jossa näkyy kameran videovirta.

Ensin sinun on tuotava työhön tarvittavat kirjastot.

tuonti (
"Hirsi"
"gocv.io/x/gocv"
)

Tämän jälkeen sinun on luotava VideoCapture-objekti VideoCaptureDevice-toiminnolla. Jälkimmäinen mahdollistaa videovirran kaappaamisen kameralla. Funktio käyttää kokonaislukua parametrina (se edustaa laitetunnusta).

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

Nyt meidän on luotava n-ulotteinen matriisi. Se tallentaa kamerasta luetut kuvat.

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

Videovirran näyttämiseksi sinun on luotava ikkuna - tämä voidaan tehdä käyttämällä NewWindow-toimintoa.

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

Siirrytään nyt mielenkiintoisimpaan osaan.

Koska video on jatkuva kuvakehysten virta, meidän on luotava ääretön silmukka, jotta voimme lukea kameran videovirtaa loputtomasti. Tätä varten tarvitset VideoCapture-tyyppisen Read-menetelmän. Se odottaa Mat-tyyppiä (yllä luomamme matriisi), joka palauttaa loogisen arvon, joka osoittaa, luettiinko kehys VideoCapturesta onnistuneesti vai ei.

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

Nyt sinun on näytettävä kehys luodussa ikkunassa. Seuraavaan kehykseen siirtymisen tauko on 50 ms.

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

Sovelluksen käynnistämisen jälkeen avautuu ikkuna, jossa on videovirta kamerasta.

Golangiin ja OpenCV:hen perustuvan kasvojentunnistusjärjestelmän rakentaminen

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

Esimerkki 2

Tässä esimerkissä käytetään edellistä esimerkkiä ja rakennetaan Haar Cascadesiin perustuva kasvojentunnistusjärjestelmä.

Haar-kaskadit ovat kaskadiluokittajia, jotka on koulutettu käyttämällä Haar-aaltotekniikkaa. He analysoivat kuvan pikseleitä havaitakseen tiettyjä ominaisuuksia. Saat lisätietoja Haar Cascadesista seuraamalla alla olevia linkkejä.

Viola-Jones objektintunnistuskehys
CSS luokittelijat
Haar-tyyppinen ominaisuus

Lataa jo koulutetut kaskadit täällä. Nykyisessä esimerkissä kaskadeja käytetään tunnistamaan henkilön kasvot edestäpäin.

Tätä varten sinun on luotava luokitin ja syötettävä sille jo koulutettu tiedosto (linkki on yllä). Olen jo ladannut tiedoston pencv_haarcascade_frontalface_default.xml hakemistoon, jossa ohjelmamme sijaitsee.

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

Kasvojen tunnistamiseksi kuvassa sinun on käytettävä menetelmää DetectMultiScale. Tämä toiminto ottaa kehyksen (tyyppi Mat), joka on juuri luettu kameran videovirrasta, ja palauttaa taulukon, jonka tyyppi on Suorakulmio. Taulukon koko edustaa niiden kasvojen määrää, jotka luokitin pystyi havaitsemaan kehyksestä. Varmista sitten, että näemme, mitä se löysi, toistamalla suorakulmioluetteloa ja tulostamalla Suorakulmio-objekti konsoliin luoden reunuksen havaitun suorakulmion ympärille. Tämä voidaan tehdä käyttämällä Suorakulmio-toimintoa. Se hyväksyy kameran lukeman maton, DetectMultiScale-menetelmällä palautetun suorakulmio-objektin, reunuksen värin ja paksuuden.

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

Golangiin ja OpenCV:hen perustuvan kasvojentunnistusjärjestelmän rakentaminen

Golangiin ja OpenCV:hen perustuvan kasvojentunnistusjärjestelmän rakentaminen

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... kyllä, kaikki sujui! Meillä on nyt yksinkertainen Go:lla kirjoitettu kasvojentunnistusjärjestelmä. Pian aion jatkaa näitä kokeiluja ja luoda uusia hienoja asioita yhdistämällä Go ja OpenCV.

Jos olet kiinnostunut, ole hyvä ja arvioi gRPC-verkkopalvelin, jonka kirjoitin Pythonissa ja OpenCV:ssä. Se suoratoistaa dataa heti, kun kasvot havaitaan. Tämä on perusta erilaisten asiakkaiden luomiselle eri ohjelmointikielillä. He voivat muodostaa yhteyden palvelimeen ja lukea tietoja siitä.

Kiitos artikkelin lukemisesta!

Skillbox suosittelee:

Lähde: will.com

Lisää kommentti