Golang və OpenCV əsasında üz tanıma sisteminin qurulması

Golang və OpenCV əsasında üz tanıma sisteminin qurulması
OpenCV kompüter görmə layihələri üçün nəzərdə tutulmuş kitabxanadır. Onun artıq 20 yaşı var. Mən onu kollecdə istifadə etdim və hələ də C++ və Python layihələrim üçün istifadə edirəm, çünki bu dillər üçün yaxşı dəstək var.

Amma mən Go öyrənməyə və istifadə etməyə başlayanda, OpenCV-nin bu dillə işləmək üçün istifadə oluna biləcəyi ilə maraqlandım. O vaxt inteqrasiya ilə bağlı artıq nümunələr və dərsliklər var idi, amma mənə elə gəldi ki, onlar çox mürəkkəbdir. Bir az sonra The Hybrid Group komandasının yaratdığı sarğı ilə rastlaşdım. Bu yazıda mən sizə Haar Cascades ilə sadə üz tanıma sistemini inkişaf etdirərək GoCV ilə necə başlayacağınızı göstərəcəyəm.

Skillbox tövsiyə edir: Praktik kurs "Sıfırdan Python tərtibçisi".

Xatırladırıq: "Habr" ın bütün oxucuları üçün - "Habr" promosyon kodundan istifadə edərək hər hansı bir Skillbox kursuna yazılarkən 10 000 rubl endirim.

Nə tələb olunacaq:

  • Get;
  • OpenCV (aşağıdakı quraşdırma linkləri);
  • veb və ya adi video kamera.

Quraşdırma

Məsələn 1

Birinci misalda biz kameranın video axını göstərən pəncərəni açan proqram yaratmağa çalışacağıq.

Əvvəlcə iş üçün lazım olan kitabxanaları idxal etməlisiniz.

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

Bundan sonra, VideoCaptureDevice funksiyasından istifadə edərək VideoCapture obyekti yaratmalısınız. Sonuncu, kameradan istifadə edərək video axını çəkməyə imkan verir. Funksiya parametr kimi tam ədəddən istifadə edir (cihaz identifikatorunu təmsil edir).

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

İndi n ölçülü matris yaratmalıyıq. O, kameradan oxunan şəkilləri saxlayacaq.

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

Video axınını göstərmək üçün bir pəncərə yaratmalısınız - bu, NewWindow funksiyasından istifadə etməklə edilə bilər.

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

İndi keçək ən maraqlı hissəyə.

Video şəkil çərçivələrinin davamlı axını olduğundan, kameranın video axınını sonsuz oxumaq üçün sonsuz bir döngə yaratmalıyıq. Bunun üçün sizə VideoCapture tipli Read metodu lazımdır. O, VideoCapture-dan olan çərçivənin uğurla oxunub-oxunmadığını göstərən bir boolean dəyəri qaytaran Mat tipini (yuxarıda yaratdığımız matris) gözləyəcək.

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

İndi yaradılmış pəncərədə çərçivəni göstərməlisiniz. Növbəti kadra keçmək üçün fasilə 50 ms-dir.

pəncərə.IMShow(img)
pəncərə.Gözləmə açarı(50)

Tətbiqi işə saldıqdan sonra kameradan video axını olan bir pəncərə açılacaq.

Golang və OpenCV əsasında üz tanıma sisteminin qurulması

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)
}
}

Məsələn 2

Bu nümunədə, əvvəlki nümunədən istifadə edək və Haar Cascades əsasında üz tanıma sistemi quraq.

Haar şəlalələri, Haar dalğası texnikasından istifadə edərək öyrədilmiş kaskad təsnifatçılarıdır. Müəyyən xüsusiyyətləri aşkar etmək üçün təsvirdəki pikselləri təhlil edirlər. Haar Cascades haqqında daha çox məlumat əldə etmək üçün aşağıdakı linkləri izləyin.

Viola-Jones obyekt aşkarlama çərçivəsi
Kaskad təsnifatçılar
Haar kimi xüsusiyyət

Artıq təlim keçmiş kaskadları yükləyin burada ola bilər. Mövcud nümunədə, bir insanın üzünü öndən müəyyən etmək üçün kaskadlardan istifadə ediləcək.

Bunu etmək üçün bir təsnifat yaratmalı və onu artıq öyrədilmiş faylla təmin etməlisiniz (link yuxarıda verilmişdir). Mən artıq pencv_haarcascade_frontalface_default.xml faylını proqramımızın yerləşdiyi qovluğa yükləmişəm.

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

Şəkildəki üzləri aşkar etmək üçün metoddan istifadə etməlisiniz DetectMultiScale. Bu funksiya kameranın video axınından yenicə oxunmuş çərçivəni (Mat tipli) götürür və Rectangle tipli massivi qaytarır. Massivin ölçüsü təsnifatçının çərçivədə aşkar edə bildiyi üzlərin sayını əks etdirir. Sonra onun tapdıqlarını gördüyümüzə əmin olmaq üçün gəlin düzbucaqlılar siyahısını təkrarlayaq və aşkar edilmiş düzbucaqlı ətrafında haşiyə yaradaraq konsola Rectangle obyektini çap edək. Bu, Düzbucaqlı funksiyasından istifadə etməklə edilə bilər. O, kameranın oxuduğu Matı, DetectMultiScale metodu ilə qaytarılan Rectangle obyektini, sərhəd üçün rəng və qalınlığı qəbul edəcək.

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

Golang və OpenCV əsasında üz tanıma sisteminin qurulması

Golang və OpenCV əsasında üz tanıma sisteminin qurulması

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)
}
}

Və... bəli, hər şey alındı! İndi Go-da yazılmış sadə üz tanıma sistemimiz var. Tezliklə bu təcrübələri davam etdirməyi və Go və OpenCV-ni birləşdirərək yeni gözəl şeylər yaratmağı planlaşdırıram.

Əgər maraqlanırsınızsa, qiymət verin gRPC veb serveriPython və OpenCV-də yazdığım. O, üz aşkarlanan an məlumatları ötürür. Bu, müxtəlif proqramlaşdırma dillərində müxtəlif müştərilər yaratmaq üçün əsasdır. Onlar serverə qoşula və ondan məlumatları oxuya biləcəklər.

Məqaləni oxuduğunuz üçün təşəkkür edirik!

Skillbox tövsiyə edir:

Mənbə: www.habr.com

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