Konstruante vizaĝrekonan sistemon bazitan sur Golang kaj OpenCV

Konstruante vizaĝrekonan sistemon bazitan sur Golang kaj OpenCV
OpenCV estas biblioteko dizajnita por komputilvidaj projektoj. Ŝi jam havas ĉirkaŭ 20 jarojn. Mi uzis ĝin en universitato kaj ankoraŭ uzas ĝin por miaj projektoj C++ kaj Python ĉar ĝi havas bonan subtenon por tiuj lingvoj.

Sed kiam mi eklernis kaj uzis Go, mi interesiĝis ĉu OpenCV povus esti uzata por labori kun ĉi tiu lingvo. Tiutempe jam ekzistis ekzemploj kaj lerniloj pri integriĝo, sed ŝajnis al mi, ke ili estas tro komplikaj. Iom poste, mi renkontis envolvaĵon kreitan de The Hybrid Group-teamo. En ĉi tiu artikolo, mi montros al vi kiel komenci kun GoCV disvolvante simplan vizaĝrekonan sistemon kun Haar Cascades.

Skillbox rekomendas: Praktika kurso "Python-programisto de nulo".

Ni memorigas vin: por ĉiuj legantoj de "Habr" - rabato de 10 000 rubloj kiam oni enskribas en iu ajn Skillbox-kurso per la reklamkodo "Habr".

Kio postulas:

  • Iru;
  • OpenCV (installigoj malsupre);
  • retejo aŭ regula videokamerao.

fikso

ekzemple 1

En la unua ekzemplo, ni provos krei aplikaĵon, kiu malfermas fenestron montrantan fotilan videofluon.

Unue vi devas importi la bibliotekojn necesajn por laboro.

importi (
"protokolo"
"gocv.io/x/gocv"
)

Post tio, vi devas krei VideoCapture objekton uzante la VideoCaptureDevice funkcio. Ĉi-lasta ebligas kapti videofluon per fotilo. La funkcio uzas entjeron kiel parametron (ĝi reprezentas la aparaton ID).

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

Nun ni devas krei n-dimensian matricon. Ĝi stokos bildojn legitajn de la fotilo.

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

Por montri videofluon, vi devas krei fenestron - tio povas esti farita per la funkcio NewWindow.

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

Nun ni transiru al la plej interesa parto.

Ĉar video estas kontinua fluo de bildkadroj, ni devos krei senfinan buklon por senfine legi la videofluon de la fotilo. Por fari tion, vi bezonas la Read-metodon de la tipo VideoCapture. Ĝi atendos Mat-tipo (la matrico, kiun ni kreis supre), revenante bulean valoron indikante ĉu la kadro de la VideoCapture estis legita sukcese aŭ ne.

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

Nun vi devas montri la kadron en la kreita fenestro. La paŭzo por moviĝi al la sekva kadro estas 50 ms.

fenestro.IMShow(img)
fenestro.WaitKey(50)

Post lanĉo de la aplikaĵo malfermiĝos fenestro kun videofluo de la fotilo.

Konstruante vizaĝrekonan sistemon bazitan sur Golang kaj 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)
}
}

ekzemple 2

En ĉi tiu ekzemplo, ni uzu la antaŭan ekzemplon kaj konstruu vizaĝrekonan sistemon bazitan sur Haar-Kaskadoj.

Haar-kaskadoj estas kaskadklasigiloj kiuj estas trejnitaj uzante la Haar-ondetoteknikon. Ili analizas la pikselojn en bildo por detekti certajn trajtojn. Por ekscii pli pri Haar-Kaskadoj, bonvolu sekvi la subajn ligilojn.

Viola-Jones objekta detekto kadro
Kaskadaj klasigiloj
Haar-simila trajto

Elŝutu jam trejnitajn kaskadojn povas esti ĉi tie. En la nuna ekzemplo, kaskadoj estos uzitaj por identigi la vizaĝon de persono de la fronto.

Por fari tion, vi devas krei klasigilon kaj nutri ĝin per jam trejnita dosiero (la ligilo estas donita supre). Mi jam alŝutis la dosieron pencv_haarcascade_frontalface_default.xml al la dosierujo kie troviĝas nia programo.

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

Por detekti vizaĝojn en bildo, vi devas uzi la metodon DetectMultiScale. Ĉi tiu funkcio prenas kadron (tipo Mat) kiu estis ĵus legita el la videofluo de la fotilo kaj resendas tabelon de tipo Rektangulo. La tabelgrandeco reprezentas la nombron da vizaĝoj kiujn la klasigilo povis detekti en la kadro. Tiam, por certigi, ke ni vidas, kion ĝi trovis, ni ripetu la liston de rektanguloj kaj presi la Rektangulon objekton al la konzolo, kreante randon ĉirkaŭ la detektita rektangulo. Ĉi tio povas esti farita per la Rektangulo-funkcio. Ĝi akceptos la Mat legitan de la fotilo, la Rektangulan objekton, kiu estis resendita per la metodo DetectMultiScale, la koloron kaj dikecon por la limo.

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

Konstruante vizaĝrekonan sistemon bazitan sur Golang kaj OpenCV

Konstruante vizaĝrekonan sistemon bazitan sur Golang kaj 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)
}
}

Kaj... jes, ĉio funkciis! Ni nun havas simplan vizaĝrekonan sistemon skribitan en Go. Baldaŭ mi planas daŭrigi ĉi tiujn eksperimentojn kaj krei novajn mirindajn aferojn kombinante Go kaj OpenCV.

Se vi interesiĝas, bonvolu taksi gRPC retservilo, kiun mi skribis en Python kaj OpenCV. Ĝi fluas datumojn en la momento, kiam vizaĝo estas detektita. Ĉi tio estas la bazo por krei malsamajn klientojn en malsamaj programlingvoj. Ili povos konektiĝi al la servilo kaj legi datumojn de ĝi.

Dankon pro legi la artikolon!

Skillbox rekomendas:

fonto: www.habr.com

Aldoni komenton