Які будуецца сістэму распазнання асоб на аснове Golang і OpenCV

Які будуецца сістэму распазнання асоб на аснове Golang і OpenCV
OpenCV - бібліятэка, распрацаваная для праектаў па кампутарным зроку. Ёй ужо каля 20 год. Я выкарыстаў яе яшчэ ў каледжы і да гэтага часу ўжываю для сваіх праектаў на C++ і Python, паколькі яна мае нядрэнную падтрымку гэтых моў.

Але калі я пачаў вывучаць і выкарыстоўваць Go, мне стала цікава, ці можна прымяніць OpenCV для працы з гэтай мовай. У той час ужо існавалі прыклады і тутарыялы па інтэграцыі, але мне падалося, што яны занадта складаныя. Крыху пазней мне ў рукі трапіўся раппер, створаны камандай The Hybrid Group. У гэтым артыкуле я пакажу, як пачаць з GoCV, распрацаваўшы простую сістэму распазнання асоб з каскадамі Хаара (Haar Cascades).

Skillbox рэкамендуе: Практычны курс "Python-распрацоўшчык з нуля".

Нагадваем: для ўсіх чытачоў "Хабра" - зніжка 10 000 рублёў пры запісе на любы курс Skillbox па промакодзе "Хабр".

Што спатрэбіцца:

  • Ідзі;
  • OpenCV (спасылкі на ўсталёўшчык ніжэй);
  • вэб-ці звычайная відэакамера.

Ўстаноўка

Прыклад 1

У першым прыкладзе мы паспрабуем стварыць прыкладанне, якое адкрывае акно з дэманстрацыяй відэаструменю камеры.

Спачатку трэба імпартаваць бібліятэкі, патрэбныя для працы.

імпарт (
"log"
"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()

Цяпер пяройдзем да самай цікавай часткі.

Паколькі відэа ўяўляе сабой бесперапынны паток кадраў-малюнкаў, нам трэба будзе стварыць бясконцы цыкл для бясконцага счытвання відэаструменю камеры. Для гэтага патрэбен метад Read тыпу VideoCapture. Ён будзе чакаць тып Mat (матрыца, якую мы стварылі вышэй), вяртаючы лагічнае значэнне, якое паказвае, ці быў кадр з 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 Cascades, можна прайсці па спасылках ніжэй.

Viola-Jones object detection framework
Cascading classifiers
Haar-like feature

Спампаваць ужо навучаныя каскады можна тут. У бягучым прыкладзе каскады будуць выкарыстоўвацца для ідэнтыфікацыі асобы чалавека ў фас.

Для таго каб зрабіць гэта, трэба стварыць класіфікатар і скарміць яму ўжо навучаны файл (вышэй дадзена спасылка). Я ўжо загрузіў файл 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. Яна будзе прымаць Mat, лічаны камерай, аб'ект 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 web server, які я напісаў на Python і OpenCV Ён стрымае дадзеныя ў момант выяўлення асобы. Гэта аснова для стварэння розных кліентаў на розных мовах праграмавання. Яны змогуць падлучацца да сервера і счытваць з яго дадзеныя.

Дзякуй, што прачыталі артыкул!

Skillbox рэкамендуе:

Крыніца: habr.com

Дадаць каментар