Сохтани системаи шинохти чеҳра дар асоси Golang ва OpenCV

Сохтани системаи шинохти чеҳра дар асоси Golang ва OpenCV
OpenCV китобхонаест, ки барои лоиҳаҳои биниши компютер пешбинӣ шудааст. Вай аллакай тақрибан 20-сола аст. Ман онро дар коллеҷ истифода кардам ва то ҳол онро барои лоиҳаҳои C++ ва Python истифода мебарам, зеро он барои ин забонҳо дастгирии хуб дорад.

Аммо вақте ки ман омӯхтан ва истифодаи Go-ро оғоз кардам, ман ба он шавқ пайдо кардам, ки оё OpenCV барои кор бо ин забон истифода мешавад. Он вақтҳо аллакай мисолҳо ва дастурҳои дарсӣ оид ба ҳамгироӣ вуҷуд доштанд, аммо ба назарам онҳо хеле печида буданд. Каме дертар, ман бо парпеччае дучор омадам, ки аз ҷониби дастаи Hybrid Group сохта шудааст. Дар ин мақола, ман ба шумо нишон медиҳам, ки чӣ гуна бо GoCV тавассути таҳияи системаи оддии шинохти чеҳра бо Haar Cascades оғоз кунед.

Skillbox тавсия медиҳад: Курси амалӣ "Таҳиягари Python аз сифр".

Мо ба шумо хотиррасон мекунем: барои ҳамаи хонандагони "Habr" - тахфифи 10 000 рубл ҳангоми номнавис шудан ба курсҳои Skillbox бо истифода аз рамзи таблиғотии "Habr".

Чӣ бояд кард:

  • Бирав;
  • OpenCV (пайвандҳои насбкунанда дар зер);
  • веб ё камераи видеоии муқаррарӣ.

параметр

Масалан 1

Дар мисоли аввал, мо кӯшиш мекунем, ки замимаеро эҷод кунем, ки равзанаи ҷараёни видеои камераро мекушояд.

Аввал шумо бояд китобхонаҳои барои кор заруриро ворид кунед.

воридот (
"лог"
"gocv.io/x/gocv"
)

Пас аз ин, шумо бояд бо истифода аз функсияи VideoCaptureDevice объекти VideoCapture эҷод кунед. Охирин имкон медиҳад, ки ҷараёни видеоро бо истифода аз камера сабт кунед. Функсия адади бутунро ҳамчун параметр истифода мебарад (он 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()

Акнун биёед ба қисми ҷолибтарин мегузарем.

Азбаски видео ҷараёни пайвастаи чаҳорчӯбаҳои тасвирӣ аст, мо бояд як ҳалқаи беохир эҷод кунем, то ҷараёни видеои камераро беохир хонем. Барои ин ба шумо усули Read-и навъи VideoCapture лозим аст. Он намуди Матро интизор мешавад (матрисае, ки мо дар боло офаридаем), арзиши логикиро бармегардонад, ки оё чаҳорчӯба аз VideoCapture бомуваффақият хонда шудааст ё не.

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

Акнун шумо бояд чаҳорчӯбаро дар равзанаи сохташуда нишон диҳед. Танаффус барои гузаштан ба чаҳорчӯбаи навбатӣ 50 мс аст.

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

Пас аз оғози барнома, тиреза бо ҷараёни видео аз камера кушода мешавад.

Сохтани системаи шинохти чеҳра дар асоси Golang ва 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 Cascades, лутфан истиноди зерро пайгирӣ кунед.

Чаҳорчӯбаи ошкоркунии объекти Viola-Jones
Классификаторҳои каскадӣ
Хусусияти ба 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-ро дар консол чоп кунем ва дар атрофи росткунҷаи ошкоршуда сарҳад эҷод кунем. Инро бо истифода аз функсияи Rectangle иҷро кардан мумкин аст. Он Матеро, ки аз ҷониби камера хонда шудааст, объекти Rectangle, ки бо усули DetectMultiScale баргардонида шудааст, ранг ва ғафсӣ барои сарҳад қабул мекунад.

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

Сохтани системаи шинохти чеҳра дар асоси Golang ва OpenCV

Сохтани системаи шинохти чеҳра дар асоси Golang ва 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 тавсия медиҳад:

Манбаъ: will.com

Илова Эзоҳ