Po ndërtojmë një sistem njohjeje të fytyrës duke përdorur Golang dhe OpenCV

Po ndërtojmë një sistem njohjeje të fytyrës duke përdorur Golang dhe OpenCV
OpenCV — njĂ« bibliotekĂ« e zhvilluar pĂ«r projekte nĂ« vizionin kompjuterik. Ajo Ă«shtĂ« rreth 20 vjeçare. E kam pĂ«rdorur qĂ« nĂ« kolegj dhe vazhdoj ta aplikoj nĂ« projektet e mia nĂ« C++ dhe Python, pasi ka mbĂ«shtetje tĂ« mirĂ« pĂ«r kĂ«to gjuhĂ«.

Por kur fillova tĂ« studioja dhe tĂ« pĂ«rdorja Go, m’u bĂ« interesant tĂ« di nĂ«se mund tĂ« aplikoj OpenCV me kĂ«tĂ« gjuhĂ«. NĂ« atĂ« kohĂ« ishin tĂ« pranishĂ«m shembuj dhe tutoriale pĂ«r integrimin, por mĂ« dukeshin shumĂ« tĂ« komplikuara. Pak mĂ« vonĂ« mĂ« ra nĂ« dorĂ« njĂ« wrapper i krijuar nga ekipi The Hybrid Group. NĂ« kĂ«tĂ« artikull do tĂ« tregoj se si tĂ« filloni me GoCV, duke zhvilluar njĂ« sistem tĂ« thjeshtĂ« pĂ«r njohjen e fytyrave me kaskadat Haar (Haar Cascades).

Skillbox rekomandon: Kurs praktik "Zhvillues Python nga zero".

KujtojmĂ«: pĂ«r tĂ« gjithĂ« lexuesit e «Habra» — zbritje prej 10,000 rublesh pĂ«r regjistrimin nĂ« çdo kurs Skillbox me kodin promovues «Habr».

ÇfarĂ« do tĂ« kĂ«rkohet:

  • Go;
  • OpenCV (linkat pĂ«r instaluesin mĂ« poshtĂ«);
  • njĂ« kamerĂ« web ose normale.

Instalimi

Shembulli 1

Në shembullin e parë do të përpiqemi të krijojmë një aplikacion që hap një dritare me një demonstrim të videokanalit nga kamera.

Së pari duhet të importojmë bibliotekat e nevojshme për funksionim.

import (
“log”
“gocv.io/x/gocv”
)

Më pas, duhet të krijojmë një objekt VideoCapture duke përdorur funksionin VideoCaptureDevice. Ky i fundit lejon kapjen e videokanalit përmes kamerës. Në funksion përdoret një numër i plotë si parametër (ai paraqet ID-në e pajisjes).

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

Tani duhet të krijojmë një matricë n-dimensionale. Ajo do të ruajë imazhet e lexuara nga kamera.

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

PĂ«r tĂ« shfaqur videokanalin, duhet tĂ« krijojmĂ« njĂ« dritare — kjo mund tĂ« bĂ«het me funksionin NewWindow.

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

Tani kalojmë në pjesën më interesante.

Duke qenĂ« se video Ă«shtĂ« njĂ« rrjedhĂ« e vazhdueshme e ĐșĐ°ĐŽŃ€ĐŸĐČ, do tĂ« na duhet tĂ« krijojmĂ« njĂ« cikĂ«l tĂ« pafund pĂ«r tĂ« lexuar vazhdimisht videokanalin e kamerĂ«s. PĂ«r kĂ«tĂ« Ă«shtĂ« i nevojshĂ«m metoda Read e tipit VideoCapture. Ajo do tĂ« presĂ« njĂ« tip Mat (matrica qĂ« krijuam mĂ« sipĂ«r), duke kthyer njĂ« vlerĂ« logjike qĂ« tregon nĂ«se ĐșаЮр nga VideoCapture u lexua me sukses ose jo.

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

Tani duhet tĂ« shfaqim ĐșаЮр nĂ« dritaren e krijuar. Ndalesa pĂ«r kalimin nĂ« ĐșаЮр tjetĂ«r — 50 ms.

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

Pas nisjes së aplikacionit, do të hapet një dritare me videokanalin nga kamera.

Po ndërtojmë një sistem njohjeje të fytyrës duke përdorur Golang dhe OpenCV

paketa kryesore
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func kryesore() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("gabim në hapjen e pajisjes: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("window_webcam")
defer window.Close()
 
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Nuk mund të lexojmë nga webcam")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Shembulli 2

Në këtë shembull, le të përdorim shembullin e mëparshëm dhe të ndërtojmë një sistem për njohjen e fytyrave bazuar në Haar Cascades.

Haar Cascades janë klasifikues kaskadë, të cilët trajnohen në bazë të teknikës Haar wavelets. Ato analizojnë pikselët në imazh për të zbuluar karakteristika të caktuara. Për të mësuar më shumë rreth Haar Cascades, mund të ndiqni lidhjet e mëposhtme.

Korniza e zbulimit të objekteve Viola-Jones
Klasifikues kaskadë
Karakteristika Haar-like

Shkarkoni klasifikuesit e stërvitur tashmë mund të shkarkohet këtu. Në shembullin aktual, klasifikuesit do të përdoren për identifikimin e fytyrës së një personi nga balli.

Për ta bërë këtë, duhet të krijoni një klasifikues dhe t'i ushqeni atij një skedar të stërvitur (linku i mësipërm jepet). Unë tashmë kam ngarkuar skedarin opencv_haarcascade_frontalface_default.xml në direktoriumin ku ndodhet programi ynë.

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

Për të zbuluar fytyrat në imazh, duhet të përdorni metodën DetectMultiScale. Kjo funksion merr një kadër (tip Mat), i cili sapo është lexuar nga video-streami i kamerës dhe kthen një array të tipit Rectangle. Madhësia e array-t tregon numrin e fytyrave që klasifikuesi ka arritur të zbulojë në kadër. Pastaj, për t'u siguruar se ne shohim atë që ai ka gjetur, le të kalojmë përmes listës së drejtkëndëshëve dhe të nxjerrim objektin Rectangle në konsolë, duke krijuar një kufi përreth drejtkëndëshit të zbuluar. Kjo mund të bëhet me anë të funksionit Rectangle. Ai do të pranojë Mat, të lexuar nga kamera, objektin Rectangle, i cili u kthye nga metoda DetectMultiScale, ngjyrën dhe trashësinë për kufirin.

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

Po ndërtojmë një sistem njohjeje të fytyrës duke përdorur Golang dhe OpenCV

Po ndërtojmë një sistem njohjeje të fytyrës duke përdorur Golang dhe OpenCV

pako kryesor
 
import (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("gabim në hapjen e kamerës: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("dritarja e kamerës")
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("Nuk arritëm të lexojmë nga pajisja")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("e identifikuar", r)
gocv.Rectangle(&img, r, color, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Po
 ia dolëm! Tani kemi një sistem të thjeshtë për njohjen e fytyrave, të shkruar në Go. Së shpejti planifikoj të vazhdoj këto eksperimente dhe të krijoj gjëra të reja interesante duke kombinuar Go dhe OpenCV.

Nëse jeni të interesuar, ju lutem vlerësoni server gRPC web, i cili e kam shkruar në Python dhe OpenCV. Ai transmeton të dhëna në momentin e zbulesës së fytyrës. Kjo është baza për krijimin e klientëve të ndryshëm në gjuhë të ndryshme programimi. Ata do të mund të lidhen me serverin dhe të nxjerrin të dhëna nga ai.

Faleminderit që e lexuat artikullin!

Skillbox rekomandon:

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster