Membina sistem pengecaman muka berdasarkan Golang dan OpenCV

Membina sistem pengecaman muka berdasarkan Golang dan OpenCV
OpenCV ialah perpustakaan yang dibangunkan untuk projek penglihatan komputer. Dia sudah berusia lebih kurang 20 tahun. Saya menggunakannya di kolej dan masih menggunakannya untuk projek C++ dan Python saya kerana ia mempunyai sokongan yang baik untuk bahasa tersebut.

Tetapi apabila saya mula belajar dan menggunakan Go, saya tertanya-tanya sama ada OpenCV boleh digunakan untuk bekerja dengan bahasa ini. Pada masa itu, contoh dan tutorial mengenai integrasi sudah wujud, tetapi saya nampaknya ia terlalu rumit. Tidak lama kemudian, saya terjumpa pembungkus yang dicipta oleh The Hybrid Group. Dalam artikel ini, saya akan menunjukkan kepada anda cara untuk memulakan GoCV dengan membangunkan sistem pengecaman muka yang mudah dengan Haar Cascades.

Skillbox mengesyorkan: Kursus praktikal "Pembangun Python dari awal".

Kami mengingatkan: untuk semua pembaca "Habr" - diskaun sebanyak 10 rubel apabila mendaftar dalam mana-mana kursus Skillbox menggunakan kod promosi "Habr".

Apa yang diperlukan:

  • Pergi;
  • OpenCV (pautan ke pemasang di bawah);
  • web atau camcorder biasa.

Pemasangan

1 Contoh

Dalam contoh pertama, kami akan cuba mencipta aplikasi yang membuka tetingkap dengan aliran video kamera.

Mula-mula anda perlu mengimport perpustakaan yang anda perlukan untuk bekerja.

import(
"log"
β€œgocv.io/x/gocv”
)

Selepas itu, anda perlu mencipta objek VideoCapture menggunakan fungsi VideoCaptureDevice. Yang terakhir memungkinkan untuk menangkap aliran video menggunakan kamera. Fungsi ini mengambil integer sebagai parameter (ia mewakili ID peranti).

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

Sekarang kita perlu mencipta matriks n-dimensi. Ia akan menyimpan imej yang dibaca daripada kamera.

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

Untuk memaparkan aliran video, anda perlu mencipta tetingkap - ini boleh dilakukan menggunakan fungsi NewWindow.

window := gocv.NewWindow(β€œwebcamwindow”)
defer window.Close()

Sekarang mari kita beralih ke bahagian yang paling menarik.

Memandangkan video ialah strim bingkai imej yang berterusan, kami perlu mencipta gelung tak terhingga untuk membaca strim video kamera tanpa henti. Ini memerlukan kaedah Baca jenis VideoCapture. Ia akan menjangkakan jenis Mat (matriks yang kami buat di atas), mengembalikan boolean yang menunjukkan sama ada bingkai daripada VideoCapture berjaya dibaca atau tidak.

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

Sekarang kita perlu memaparkan bingkai dalam tetingkap yang dibuat. Jeda untuk beralih ke bingkai seterusnya - 50 ms.

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

Selepas melancarkan aplikasi, tetingkap dengan aliran video dari kamera akan dibuka.

Membina sistem pengecaman muka berdasarkan Golang dan 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 Contoh

Dalam contoh ini, mari kita gunakan contoh sebelumnya dan bina sistem pengecaman muka berdasarkan Haar Cascades.

Lata Haar ialah pengelas bertingkat yang dilatih berdasarkan teknik wavelet Haar. Mereka menganalisis piksel dalam imej untuk mencari ciri khusus. Untuk mengetahui lebih lanjut tentang Haar Cascades, sila ikuti pautan di bawah.

Rangka kerja pengesanan objek Viola-Jones
Pengelas berlatarkan
Ciri seperti Haar

Muat turun lata yang telah dilatih boleh berada di sini. Dalam contoh semasa, lata akan digunakan untuk mengenal pasti wajah seseorang di hadapan.

Untuk melakukan ini, anda perlu mencipta pengelas dan memberinya fail yang telah dilatih (pautan diberikan di atas). Saya telah pun memuat naik fail pencv_haarcascade_frontalface_default.xml ke direktori tempat program kami berada.

harrcascade := β€œopencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

Untuk mengesan wajah dalam imej, anda perlu menggunakan kaedah tersebut DetectMultiScale. Fungsi ini mengambil bingkai (jenis Mat) yang baru dibaca daripada strim video kamera dan mengembalikan tatasusunan jenis Rectangle. Saiz tatasusunan mewakili bilangan muka yang dapat dikesan oleh pengelas dalam bingkai. Kemudian, untuk memastikan kita melihat apa yang ditemuinya, mari kita ulangi senarai segi empat tepat dan cetak objek Rectangle ke konsol, mewujudkan sempadan di sekeliling segi empat tepat yang ditemui. Ini boleh dilakukan menggunakan fungsi Rectangle. Ia akan mengambil Mat dibaca oleh kamera, objek Rectangle yang dikembalikan oleh kaedah DetectMultiScale, dan warna dan ketebalan untuk sempadan.

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

Membina sistem pengecaman muka berdasarkan Golang dan OpenCV

Membina sistem pengecaman muka berdasarkan Golang dan 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)
}
}

Dan ... ya, semuanya berjaya! Kami kini mempunyai sistem pengecaman muka ringkas yang ditulis dalam Go. Dalam masa terdekat, saya merancang untuk meneruskan eksperimen ini dan mencipta perkara baharu yang menarik dengan menggabungkan Go dan OpenCV.

Jika anda berminat, sila nilaikan pelayan web gRPC, yang saya tulis dalam Python dan OpenCV. Ia menstrim data sebaik sahaja wajah dikesan. Ini adalah asas untuk mencipta pelanggan yang berbeza dalam bahasa pengaturcaraan yang berbeza. Mereka akan dapat menyambung ke pelayan dan membaca data daripadanya.

Terima kasih kerana membaca artikel!

Skillbox mengesyorkan:

Sumber: www.habr.com

Tambah komen