Golang ve OpenCV tabanlı bir yüz tanıma sistemi oluşturmak

Golang ve OpenCV tabanlı bir yüz tanıma sistemi oluşturmak
OpenCV, bilgisayarla görme projeleri için tasarlanmış bir kütüphanedir. O zaten yaklaşık 20 yaşında. Üniversitede kullandım ve hala C++ ve Python projelerim için kullanıyorum çünkü bu diller için iyi bir desteğe sahip.

Ancak Go'yu öğrenmeye ve kullanmaya başladığımda OpenCV'nin bu dille çalışmak için kullanılıp kullanılamayacağıyla ilgilenmeye başladım. O zamanlar entegrasyonla ilgili örnekler ve eğitimler zaten vardı, ancak bana bunlar çok karmaşık geldi. Biraz sonra The Hybrid Group ekibinin yarattığı bir ambalajla karşılaştım. Bu yazıda Haar Cascades ile basit bir yüz tanıma sistemi geliştirerek GoCV'ye nasıl başlayacağınızı göstereceğim.

Skillbox şunları önerir: pratik kurs "Sıfırdan Python geliştiricisi".

Hatırlatıyoruz: tüm "Habr" okuyucuları için - "Habr" promosyon kodunu kullanarak herhangi bir Skillbox kursuna kayıt olurken 10 ruble indirim.

Ne gerekli olacak:

  • Gitmek;
  • OpenCV (yükleyici bağlantıları aşağıdadır);
  • web veya normal video kamera.

Montaj

Örnek 1

İlk örnekte kamera video akışını gösteren bir pencere açan bir uygulama oluşturmaya çalışacağız.

Öncelikle iş için gerekli kütüphaneleri içe aktarmanız gerekir.

içe aktar (
"kayıt"
“gocv.io/x/gocv”
)

Bundan sonra VideoCaptureDevice işlevini kullanarak bir VideoCapture nesnesi oluşturmanız gerekir. İkincisi, bir kamera kullanarak video akışını yakalamayı mümkün kılar. İşlev, parametre olarak bir tam sayı kullanır (cihaz kimliğini temsil eder).

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

Şimdi n boyutlu bir matris oluşturmamız gerekiyor. Kameradan okunan görüntüleri saklar.

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

Bir video akışını görüntülemek için bir pencere oluşturmanız gerekir; bu, NewWindow işlevi kullanılarak yapılabilir.

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

Şimdi en ilginç kısma geçelim.

Video, sürekli bir görüntü karesi akışı olduğundan, kameranın video akışını sonsuz bir şekilde okumak için sonsuz bir döngü oluşturmamız gerekecektir. Bunu yapmak için VideoCapture türünün Read yöntemine ihtiyacınız vardır. VideoCapture'dan gelen karenin başarıyla okunup okunmadığını belirten bir boolean değeri döndüren bir Mat türü (yukarıda oluşturduğumuz matris) bekleyecektir.

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

Artık çerçeveyi oluşturulan pencerede görüntülemeniz gerekiyor. Bir sonraki kareye geçmek için gereken duraklama 50 ms'dir.

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

Uygulamayı başlattıktan sonra kameradan video akışı içeren bir pencere açılacaktır.

Golang ve OpenCV tabanlı bir yüz tanıma sistemi oluşturmak

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

Örnek 2

Bu örnekte önceki örneği kullanalım ve Haar Cascades'i temel alan bir yüz tanıma sistemi oluşturalım.

Haar basamakları, Haar dalgacık tekniği kullanılarak eğitilen basamaklı sınıflandırıcılardır. Belirli özellikleri tespit etmek için görüntüdeki pikselleri analiz ederler. Haar Cascades hakkında daha fazla bilgi edinmek için lütfen aşağıdaki bağlantıları takip edin.

Viola-Jones nesne algılama çerçevesi
Basamaklı sınıflandırıcılar
Haar benzeri özellik

Zaten eğitilmiş basamakları indirin burada olabilir. Mevcut örnekte, bir kişinin yüzünü önden tanımlamak için basamaklar kullanılacaktır.

Bunu yapmak için bir sınıflandırıcı oluşturmanız ve onu önceden eğitilmiş bir dosyayla beslemeniz gerekir (bağlantı yukarıda verilmiştir). Pencv_haarcascade_frontalface_default.xml dosyasını zaten programımızın bulunduğu dizine yükledim.

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

Bir görüntüdeki yüzleri tespit etmek için yöntemi kullanmanız gerekir. MultiScale'i Algıla. Bu işlev, kameranın video akışından yeni okunan bir kareyi (Mat türü) alır ve Dikdörtgen türünde bir dizi döndürür. Dizi boyutu, sınıflandırıcının çerçevede algılayabildiği yüz sayısını temsil eder. Ardından, ne bulduğunu gördüğümüzden emin olmak için dikdörtgenler listesini yineleyelim ve Rectangle nesnesini konsola yazdırarak algılanan dikdörtgenin etrafında bir kenarlık oluşturalım. Bu, Dikdörtgen işlevi kullanılarak yapılabilir. Kamera tarafından okunan Mat'ı, DetectMultiScale yöntemiyle döndürülen Rectangle nesnesini, kenarlığın rengini ve kalınlığını kabul edecektir.

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

Golang ve OpenCV tabanlı bir yüz tanıma sistemi oluşturmak

Golang ve OpenCV tabanlı bir yüz tanıma sistemi oluşturmak

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

Ve... evet, her şey yolunda gitti! Artık Go'da yazılmış basit bir yüz tanıma sistemimiz var. Yakında bu deneylere devam etmeyi ve Go ile OpenCV'yi birleştirerek yeni harika şeyler yaratmayı planlıyorum.

İlgileniyorsanız lütfen değerlendirin gRPC web sunucusuPython ve OpenCV'de yazdım. Bir yüz algılandığı anda veri akışı sağlar. Bu, farklı programlama dillerinde farklı istemciler oluşturmanın temelidir. Sunucuya bağlanabilecek ve ondan veri okuyabilecekler.

Makaleyi okuduğunuz için teşekkür ederiz!

Skillbox şunları önerir:

Kaynak: habr.com

Yorum ekle