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