Գոլանգի և OpenCV-ի հիման վրա դեմքի ճանաչման համակարգի կառուցում
OpenCV-ն գրադարան է, որը մշակվել է համակարգչային տեսողական նախագծերի համար: Նա արդեն մոտ 20 տարեկան է։ Ես օգտագործել եմ այն քոլեջում և դեռ օգտագործում եմ այն իմ C++ և Python նախագծերի համար, քանի որ այն լավ աջակցություն ունի այդ լեզուների համար:
Բայց երբ սկսեցի սովորել և օգտագործել Go-ն, մտածեցի՝ արդյոք OpenCV-ն կարող է օգտագործվել այս լեզվով աշխատելու համար: Այն ժամանակ արդեն կային ինտեգրման վերաբերյալ օրինակներ և ձեռնարկներ, բայց ինձ թվում էր, որ դրանք չափազանց բարդ են։ Քիչ անց հանդիպեցի The Hybrid Group-ի կողմից ստեղծված փաթաթանին: Այս հոդվածում ես ձեզ ցույց կտամ, թե ինչպես սկսել GoCV-ի հետ՝ Haar Cascades-ի միջոցով դեմքի ճանաչման պարզ համակարգ մշակելով:
Առաջին օրինակում մենք կփորձենք ստեղծել ծրագիր, որը պատուհան է բացում տեսախցիկի տեսահոսքով:
Նախ անհրաժեշտ է ներմուծել գրադարանները, որոնք անհրաժեշտ են աշխատելու համար:
ներմուծում (
«մատյան»
«gocv.io/x/gocv»
)
Դրանից հետո դուք պետք է ստեղծեք VideoCapture օբյեկտ՝ օգտագործելով VideoCaptureDevice ֆունկցիան։ Վերջինս հնարավորություն է տալիս տեսախցիկի միջոցով տեսահոսք նկարել։ Ֆունկցիան ընդունում է ամբողջ թիվ որպես պարամետր (այն ներկայացնում է սարքի ID-ն):
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()
Այժմ մենք պետք է ստեղծենք n-չափ մատրիցա: Այն կպահի տեսախցիկից կարդացված պատկերները:
img := gocv.NewMat()
defer img.Close()
Տեսահոսքը ցուցադրելու համար անհրաժեշտ է ստեղծել պատուհան՝ դա կարելի է անել՝ օգտագործելով NewWindow ֆունկցիան:
Քանի որ տեսանյութը պատկերի շրջանակների շարունակական հոսք է, մենք պետք է ստեղծենք անսահման օղակ՝ տեսախցիկի տեսահոսքն անվերջ կարդալու համար: Սա պահանջում է VideoCapture տեսակի Read մեթոդը: Այն ակնկալում է Mat տիպ (մատրիցը, որը մենք ստեղծել ենք վերևում), վերադարձնելով բուլյան, որը ցույց է տալիս, թե արդյոք VideoCapture-ի շրջանակը հաջողությամբ կարդացվել է, թե ոչ:
for {
if ok := webcam.Read(&img); !ok || img.Empty( {
log.Println(“Unable to read from the webcam”) continue
}
.
.
.
}
Այժմ մենք պետք է ցուցադրենք շրջանակը ստեղծված պատուհանում: Դադար՝ հաջորդ կադրին անցնելու համար՝ 50 ms:
window.IMShow(img)
window.WaitKey (50)
Հավելվածը գործարկելուց հետո տեսախցիկից տեսահոսքով պատուհան կբացվի:
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)
}
}
Օրինակ 2
Այս օրինակում եկեք օգտագործենք նախորդ օրինակը և կառուցենք դեմքի ճանաչման համակարգ՝ հիմնված Haar Cascades-ի վրա:
Haar կասկադները կասկադային դասակարգիչներ են, որոնք պատրաստված են Haar wavelet տեխնիկայի հիման վրա: Նրանք վերլուծում են պատկերի պիքսելները՝ կոնկրետ հատկանիշներ փնտրելու համար: Haar Cascades-ի մասին ավելին իմանալու համար խնդրում ենք հետևել ստորև նշված հղումներին:
Ներբեռնեք արդեն պատրաստված կասկադներ կարող է լինել այստեղ. Ներկայիս օրինակում կասկադները կօգտագործվեն առջևում գտնվող անձի դեմքը նույնականացնելու համար:
Դա անելու համար դուք պետք է ստեղծեք դասակարգիչ և այն կերակրեք արդեն պատրաստված ֆայլով (հղումը տրված է վերևում): Ես արդեն վերբեռնել եմ pencv_haarcascade_frontalface_default.xml ֆայլը այն գրացուցակում, որտեղ գտնվում է մեր ծրագիրը:
Պատկերում դեմքեր հայտնաբերելու համար հարկավոր է օգտագործել մեթոդը DetectMultiScale. Այս ֆունկցիան վերցնում է կադր (mat տիպի), որը հենց նոր կարդացվել է տեսախցիկի տեսահոսքից և վերադարձնում է ուղղանկյուն տիպի զանգված: Զանգվածի չափը ներկայացնում է դեմքերի թիվը, որոնք դասակարգիչը կարողացել է հայտնաբերել կադրում: Այնուհետև, համոզվելու համար, որ մենք տեսնում ենք, թե ինչ է այն գտել, եկեք կրկնենք ուղղանկյունների ցանկը և տպենք Rectangle օբյեկտը վահանակում՝ ստեղծելով եզրագիծ գտնված ուղղանկյան շուրջը: Դա կարելի է անել՝ օգտագործելով Rectangle ֆունկցիան: Այն կպահանջի խցիկի կողմից կարդացվող Mat-ը, DetectMultiScale մեթոդով վերադարձված Rectangle օբյեկտը և եզրագծի գույնն ու հաստությունը:
for _, r := range rects {
fmt.Println(“detected”, r)
gocv.Rectangle(&img, r, color, 2)
}
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)
}
}
Եվ ... այո, ամեն ինչ ստացվեց: Այժմ մենք ունենք դեմքի ճանաչման պարզ համակարգ, որը գրված է Go-ում: Մոտ ապագայում ես նախատեսում եմ շարունակել այս փորձերը և ստեղծել նոր հետաքրքիր բաներ՝ համատեղելով Go-ն և OpenCV-ն։
Եթե դուք հետաքրքրված եք, խնդրում ենք գնահատել gRPC վեբ սերվեր, որը ես գրել եմ Python-ում և OpenCV-ում։ Այն հեռարձակում է տվյալները հենց որ դեմք հայտնաբերվի: Սա հիմք է տարբեր ծրագրավորման լեզուներով տարբեր հաճախորդներ ստեղծելու համար: Նրանք կկարողանան միանալ սերվերին և կարդալ տվյալները դրանից։