Að byggja upp andlitsgreiningarkerfi byggt á Golang og OpenCV

Að byggja upp andlitsgreiningarkerfi byggt á Golang og OpenCV
OpenCV er bókasafn hannað fyrir tölvusjónarverkefni. Hún er nú þegar um 20 ára gömul. Ég notaði það í háskóla og nota það enn fyrir C++ og Python verkefnin mín vegna þess að það hefur góðan stuðning fyrir þessi tungumál.

En þegar ég byrjaði að læra og nota Go fékk ég áhuga á því hvort hægt væri að nota OpenCV til að vinna með þetta tungumál. Á þeim tíma voru þegar til dæmi og kennsluefni um samþættingu, en mér fannst þau vera of flókin. Nokkru síðar rakst ég á umbúðir sem voru búnar til af Hybrid Group teyminu. Í þessari grein mun ég sýna þér hvernig á að byrja með GoCV með því að þróa einfalt andlitsgreiningarkerfi með Haar Cascades.

Skillbox mælir með: Verklegt námskeið „Python verktaki frá grunni“.

Við minnum á: fyrir alla Habr lesendur - 10 rúblur afsláttur þegar þú skráir þig á hvaða Skillbox námskeið sem er með því að nota Habr kynningarkóðann.

Hvað verður krafist:

  • Farðu;
  • OpenCV (uppsetningartenglar hér að neðan);
  • vef eða venjulega myndbandsupptökuvél.

Uppsetning

Dæmi 1

Í fyrsta dæminu munum við reyna að búa til forrit sem opnar glugga sem sýnir myndavélarvídeóstraum.

Fyrst þarftu að flytja inn þau bókasöfn sem þarf til vinnu.

flytja inn (
"log"
„gocv.io/x/gocv“
)

Eftir þetta þarftu að búa til VideoCapture hlut með því að nota VideoCaptureDevice aðgerðina. Hið síðarnefnda gerir það mögulegt að taka myndstraum með myndavél. Aðgerðin notar heiltölu sem færibreytu (það táknar auðkenni tækisins).

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

Nú þurfum við að búa til n-víddar fylki. Það mun geyma myndir sem lesnar eru úr myndavélinni.

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

Til að birta myndbandsstraum þarftu að búa til glugga - það er hægt að gera með því að nota NewWindow aðgerðina.

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

Nú skulum við halda áfram að áhugaverðasta hlutanum.

Þar sem myndband er samfelldur straumur myndramma þurfum við að búa til óendanlega lykkju til að lesa endalaust myndbandsstraum myndavélarinnar. Til að gera þetta þarftu Read aðferðina af gerðinni VideoCapture. Það mun búast við Mat gerð (fylki sem við bjuggum til hér að ofan), sem skilar boolean gildi sem gefur til kynna hvort ramminn úr VideoCapture hafi verið lesinn með góðum árangri eða ekki.

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

Nú þarftu að birta rammann í glugganum sem búið er til. Hlé til að fara yfir í næsta ramma er 50 ms.

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

Eftir að forritið hefur verið ræst opnast gluggi með myndbandsstraumi frá myndavélinni.

Að byggja upp andlitsgreiningarkerfi byggt á Golang og 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)
}
}

Dæmi 2

Í þessu dæmi skulum við nota fyrra dæmið og byggja upp andlitsgreiningarkerfi byggt á Haar Cascades.

Haar fossar eru fossaflokkarar sem eru þjálfaðir með Haar wavelet tækni. Þeir greina punkta í mynd til að greina ákveðna eiginleika. Til að fá frekari upplýsingar um Haar Cascades skaltu fylgja krækjunum hér að neðan.

Viola-Jones hlutgreiningarrammi
Cascading flokkarar
Haar-eins og eiginleiki

Hlaða niður þegar þjálfuðum kaskaðum getur verið hér. Í núverandi dæmi verða fossar notaðir til að bera kennsl á andlit einstaklings að framan.

Til þess að gera þetta þarftu að búa til flokkara og gefa honum þegar þjálfaða skrá (tengillinn er að ofan). Ég hef þegar hlaðið upp pencv_haarcascade_frontalface_default.xml skránni í möppuna þar sem forritið okkar er staðsett.

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

Til að greina andlit á mynd þarftu að nota aðferðina DetectMultiScale. Þessi aðgerð tekur ramma (gerð Mat) sem var rétt lesinn úr myndstraumi myndavélarinnar og skilar fylki af gerðinni Rétthyrningi. Stærð fylkisins táknar fjölda andlita sem flokkarinn gat greint í rammanum. Síðan, til að vera viss um að við sjáum hvað það fann, skulum við fara í gegnum listann yfir rétthyrninga og prenta Rectangle hlut á stjórnborðið og búa til ramma utan um rétthyrninginn sem fannst. Þetta er hægt að gera með því að nota Rectangle aðgerðina. Það mun samþykkja mottuna sem myndavélin les, rétthyrningahlutinn sem var skilað með DetectMultiScale aðferðinni, litinn og þykkt rammans.

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

Að byggja upp andlitsgreiningarkerfi byggt á Golang og OpenCV

Að byggja upp andlitsgreiningarkerfi byggt á Golang og 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)
}
}

Og... já, allt gekk upp! Nú erum við með einfalt andlitsgreiningarkerfi skrifað í Go. Bráðum ætla ég að halda þessum tilraunum áfram og búa til nýja flotta hluti með því að sameina Go og OpenCV.

Ef þú hefur áhuga, vinsamlegast gefðu einkunn gRPC vefþjónn, sem ég skrifaði í Python og OpenCV. Það streymir gögnum um leið og andlit greinist. Þetta er grunnurinn að því að búa til mismunandi viðskiptavini á mismunandi forritunarmálum. Þeir munu geta tengst þjóninum og lesið gögn af honum.

Þakka þér fyrir að lesa greinina!

Skillbox mælir með:

Heimild: www.habr.com

Bæta við athugasemd