Գոլանգի և OpenCV-ի հիման վրա դեմքի ճանաչման համակարգի կառուցում

Գոլանգի և OpenCV-ի հիման վրա դեմքի ճանաչման համակարգի կառուցում
OpenCV-ն գրադարան է, որը մշակվել է համակարգչային տեսողական նախագծերի համար: Նա արդեն մոտ 20 տարեկան է։ Ես օգտագործել եմ այն ​​քոլեջում և դեռ օգտագործում եմ այն ​​իմ C++ և Python նախագծերի համար, քանի որ այն լավ աջակցություն ունի այդ լեզուների համար:

Բայց երբ սկսեցի սովորել և օգտագործել Go-ն, մտածեցի՝ արդյոք OpenCV-ն կարող է օգտագործվել այս լեզվով աշխատելու համար: Այն ժամանակ արդեն կային ինտեգրման վերաբերյալ օրինակներ և ձեռնարկներ, բայց ինձ թվում էր, որ դրանք չափազանց բարդ են։ Քիչ անց հանդիպեցի The Hybrid Group-ի կողմից ստեղծված փաթաթանին: Այս հոդվածում ես ձեզ ցույց կտամ, թե ինչպես սկսել GoCV-ի հետ՝ Haar Cascades-ի միջոցով դեմքի ճանաչման պարզ համակարգ մշակելով:

Skillbox-ը խորհուրդ է տալիս. Գործնական դասընթաց «Python-ի մշակողը զրոյից».

Հիշեցում. «Habr»-ի բոլոր ընթերցողների համար՝ 10 ռուբլի զեղչ «Habr» գովազդային կոդով Skillbox-ի ցանկացած դասընթացին գրանցվելիս:

Ինչ է պահանջվում.

  • Գնա;
  • OpenCV (ներքևում գտնվող տեղադրողի հղումները);
  • վեբ կամ սովորական տեսախցիկ:

Տեղակայում

Օրինակ 1

Առաջին օրինակում մենք կփորձենք ստեղծել ծրագիր, որը պատուհան է բացում տեսախցիկի տեսահոսքով:

Նախ անհրաժեշտ է ներմուծել գրադարանները, որոնք անհրաժեշտ են աշխատելու համար:

ներմուծում (
«մատյան»
«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 ֆունկցիան:

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

Հիմա անցնենք ամենահետաքրքիր հատվածին։

Քանի որ տեսանյութը պատկերի շրջանակների շարունակական հոսք է, մենք պետք է ստեղծենք անսահման օղակ՝ տեսախցիկի տեսահոսքն անվերջ կարդալու համար: Սա պահանջում է 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)

Հավելվածը գործարկելուց հետո տեսախցիկից տեսահոսքով պատուհան կբացվի:

Գոլանգի և 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)
}
}

Օրինակ 2

Այս օրինակում եկեք օգտագործենք նախորդ օրինակը և կառուցենք դեմքի ճանաչման համակարգ՝ հիմնված Haar Cascades-ի վրա:

Haar կասկադները կասկադային դասակարգիչներ են, որոնք պատրաստված են Haar wavelet տեխնիկայի հիման վրա: Նրանք վերլուծում են պատկերի պիքսելները՝ կոնկրետ հատկանիշներ փնտրելու համար: Haar Cascades-ի մասին ավելին իմանալու համար խնդրում ենք հետևել ստորև նշված հղումներին:

Վիոլա-Ջոնսի օբյեկտների հայտնաբերման շրջանակ
Կասկադային դասակարգիչներ
Haar-ի նման հատկություն

Ներբեռնեք արդեն պատրաստված կասկադներ կարող է լինել այստեղ. Ներկայիս օրինակում կասկադները կօգտագործվեն առջևում գտնվող անձի դեմքը նույնականացնելու համար:

Դա անելու համար դուք պետք է ստեղծեք դասակարգիչ և այն կերակրեք արդեն պատրաստված ֆայլով (հղումը տրված է վերևում): Ես արդեն վերբեռնել եմ pencv_haarcascade_frontalface_default.xml ֆայլը այն գրացուցակում, որտեղ գտնվում է մեր ծրագիրը:

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

Պատկերում դեմքեր հայտնաբերելու համար հարկավոր է օգտագործել մեթոդը DetectMultiScale. Այս ֆունկցիան վերցնում է կադր (mat տիպի), որը հենց նոր կարդացվել է տեսախցիկի տեսահոսքից և վերադարձնում է ուղղանկյուն տիպի զանգված: Զանգվածի չափը ներկայացնում է դեմքերի թիվը, որոնք դասակարգիչը կարողացել է հայտնաբերել կադրում: Այնուհետև, համոզվելու համար, որ մենք տեսնում ենք, թե ինչ է այն գտել, եկեք կրկնենք ուղղանկյունների ցանկը և տպենք Rectangle օբյեկտը վահանակում՝ ստեղծելով եզրագիծ գտնված ուղղանկյան շուրջը: Դա կարելի է անել՝ օգտագործելով Rectangle ֆունկցիան: Այն կպահանջի խցիկի կողմից կարդացվող Mat-ը, DetectMultiScale մեթոդով վերադարձված Rectangle օբյեկտը և եզրագծի գույնն ու հաստությունը:

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

Գոլանգի և OpenCV-ի հիման վրա դեմքի ճանաչման համակարգի կառուցում

Գոլանգի և 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)
}
}

Եվ ... այո, ամեն ինչ ստացվեց: Այժմ մենք ունենք դեմքի ճանաչման պարզ համակարգ, որը գրված է Go-ում: Մոտ ապագայում ես նախատեսում եմ շարունակել այս փորձերը և ստեղծել նոր հետաքրքիր բաներ՝ համատեղելով Go-ն և OpenCV-ն։

Եթե ​​դուք հետաքրքրված եք, խնդրում ենք գնահատել gRPC վեբ սերվեր, որը ես գրել եմ Python-ում և OpenCV-ում։ Այն հեռարձակում է տվյալները հենց որ դեմք հայտնաբերվի: Սա հիմք է տարբեր ծրագրավորման լեզուներով տարբեր հաճախորդներ ստեղծելու համար: Նրանք կկարողանան միանալ սերվերին և կարդալ տվյալները դրանից։

Շնորհակալություն հոդվածը կարդալու համար:

Skillbox-ը խորհուրդ է տալիս.

Source: www.habr.com

Добавить комментарий