Bumuo ng isang face recognition system batay sa Golang at OpenCV

Bumuo ng isang face recognition system batay sa Golang at OpenCV
Ang OpenCV ay isang library na binuo para sa mga proyekto ng computer vision. Mga 20 taong gulang na siya. Ginamit ko ito sa kolehiyo at ginagamit pa rin ito para sa aking mga proyekto sa C++ at Python dahil mayroon itong magandang suporta para sa mga wikang iyon.

Ngunit noong nagsimula akong mag-aral at gumamit ng Go, naisip ko kung magagamit ang OpenCV para magtrabaho sa wikang ito. Sa oras na iyon mayroon nang mga halimbawa at mga tutorial sa pagsasama, ngunit tila sa akin na sila ay masyadong kumplikado. Maya-maya pa, nakita ko ang isang wrapper na ginawa ng The Hybrid Group. Sa artikulong ito, ipapakita ko sa iyo kung paano magsimula sa GoCV sa pamamagitan ng pagbuo ng isang simpleng face recognition system gamit ang Haar Cascades.

Inirerekomenda ng Skillbox ang: Praktikal na kurso "Python developer mula sa simula".

Pinapaalala namin sa iyo: para sa lahat ng mga mambabasa ng "Habr" - isang diskwento na 10 rubles kapag nag-enroll sa anumang kurso sa Skillbox gamit ang code na pang-promosyon ng "Habr".

Ano ang kinakailangan:

  • Pumunta ka;
  • OpenCV (mga link sa installer sa ibaba);
  • web o regular na camcorder.

Instalasyon

halimbawa 1

Sa unang halimbawa, susubukan naming lumikha ng isang application na nagbubukas ng isang window na may stream ng video ng camera.

Una kailangan mong i-import ang mga aklatan na kailangan mong magtrabaho.

angkat (
"log"
“gocv.io/x/gocv”
)

Pagkatapos nito, kailangan mong lumikha ng object ng VideoCapture gamit ang function na VideoCaptureDevice. Ginagawang posible ng huli na kumuha ng video stream gamit ang isang camera. Ang function ay tumatagal ng isang integer bilang isang parameter (ito ay kumakatawan sa device ID).

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

Ngayon kailangan nating lumikha ng isang n-dimensional na matrix. Ito ay mag-imbak ng mga imahe na nabasa mula sa camera.

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

Upang ipakita ang video stream, kailangan mong lumikha ng isang window - ito ay maaaring gawin gamit ang NewWindow function.

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

Ngayon ay lumipat tayo sa pinaka-kagiliw-giliw na bahagi.

Dahil ang video ay isang tuluy-tuloy na stream ng mga frame ng larawan, kakailanganin naming lumikha ng isang walang katapusang loop upang walang katapusang basahin ang video stream ng camera. Nangangailangan ito ng paraan ng Pagbasa ng uri ng VideoCapture. Aasahan nito ang isang uri ng Mat (ang matrix na ginawa namin sa itaas), na nagbabalik ng boolean na nagsasaad kung matagumpay na nabasa o hindi ang isang frame mula sa VideoCapture.

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

Ngayon kailangan nating ipakita ang frame sa nilikha na window. I-pause para lumipat sa susunod na frame - 50 ms.

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

Pagkatapos ilunsad ang application, magbubukas ang isang window na may video stream mula sa camera.

Bumuo ng isang face recognition system batay sa Golang at 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)
}
}

halimbawa 2

Sa halimbawang ito, gamitin natin ang nakaraang halimbawa at bumuo ng sistema ng pagkilala sa mukha batay sa Haar Cascades.

Ang Haar cascades ay mga cascaded classifier na sinanay batay sa Haar wavelet technique. Sinusuri nila ang mga pixel sa isang imahe upang maghanap ng mga partikular na feature. Upang matuto nang higit pa tungkol sa Haar Cascades, mangyaring sundin ang mga link sa ibaba.

Viola-Jones object detection framework
Mga cascading classifier
Haar-like na feature

Mag-download ng mga sinanay na cascades pwede dito. Sa kasalukuyang halimbawa, ang mga cascades ay gagamitin upang makilala ang mukha ng isang tao sa harap.

Upang magawa ito, kailangan mong lumikha ng isang classifier at pakainin ito ng isang sinanay na file (ang link ay ibinigay sa itaas). Na-upload ko na ang pencv_haarcascade_frontalface_default.xml file sa direktoryo kung saan matatagpuan ang aming programa.

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

Upang makita ang mga mukha sa isang imahe, kailangan mong gamitin ang pamamaraan DetectMultiScale. Ang function na ito ay tumatagal ng isang frame (ng uri ng Mat) na kababasa lang mula sa video stream ng camera at nagbabalik ng hanay ng uri ng Rectangle. Ang laki ng array ay kumakatawan sa bilang ng mga mukha na na-detect ng classifier sa frame. Pagkatapos, upang matiyak na nakikita natin kung ano ang nahanap nito, ulitin natin ang listahan ng mga parihaba at i-print ang Rectangle object sa console, na lumilikha ng hangganan sa paligid ng natagpuang parihaba. Magagawa ito gamit ang Rectangle function. Dadalhin nito ang Mat na binasa ng camera, ang Rectangle object na ibinalik ng DetectMultiScale method, at ang kulay at kapal para sa hangganan.

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

Bumuo ng isang face recognition system batay sa Golang at OpenCV

Bumuo ng isang face recognition system batay sa Golang at 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)
}
}

At ... oo, naging maayos ang lahat! Mayroon na kaming simpleng sistema ng pagkilala sa mukha na nakasulat sa Go. Sa malapit na hinaharap, plano kong ipagpatuloy ang mga eksperimentong ito at lumikha ng mga bagong cool na bagay sa pamamagitan ng pagsasama ng Go at OpenCV.

Kung interesado ka, mangyaring i-rate web server ng gRPC, na isinulat ko sa Python at OpenCV. Nag-stream ito ng data sa sandaling may nakitang mukha. Ito ang batayan para sa paglikha ng iba't ibang mga kliyente sa iba't ibang mga programming language. Magagawa nilang kumonekta sa server at magbasa ng data mula dito.

Salamat sa pagbabasa ng artikulo!

Inirerekomenda ng Skillbox ang:

Pinagmulan: www.habr.com

Magdagdag ng komento