Membangun sistem pengenalan wajah berbasis Golang dan OpenCV

Membangun sistem pengenalan wajah berbasis Golang dan OpenCV
OpenCV adalah perpustakaan yang dirancang untuk proyek visi komputer. Dia sudah berusia sekitar 20 tahun. Saya menggunakannya di perguruan tinggi dan masih menggunakannya untuk proyek C++ dan Python saya karena memiliki dukungan yang baik untuk bahasa-bahasa tersebut.

Namun ketika saya mulai belajar dan menggunakan Go, saya menjadi tertarik apakah OpenCV dapat digunakan untuk bekerja dengan bahasa ini. Saat itu sudah ada contoh dan tutorial integrasi, namun menurut saya terlalu rumit. Beberapa saat kemudian, saya menemukan pembungkus yang dibuat oleh tim The Hybrid Group. Pada artikel ini, saya akan menunjukkan cara memulai GoCV dengan mengembangkan sistem pengenalan wajah sederhana dengan Haar Cascades.

Skillbox merekomendasikan: Tentu saja praktis "Pengembang Python dari awal".

Kami mengingatkan: untuk semua pembaca "Habr" - diskon 10 rubel saat mendaftar di kursus Skillbox apa pun menggunakan kode promosi "Habr".

Apa yang dibutuhkan:

  • Pergi;
  • OpenCV (tautan penginstal di bawah);
  • web atau kamera video biasa.

Instalasi

misalnya 1

Pada contoh pertama, kita akan mencoba membuat aplikasi yang membuka jendela yang menampilkan aliran video kamera.

Pertama, Anda perlu mengimpor perpustakaan yang diperlukan untuk bekerja.

impor (
"catatan"
“gocv.io/x/gocv”
)

Setelah ini, Anda perlu membuat objek VideoCapture menggunakan fungsi VideoCaptureDevice. Yang terakhir memungkinkan untuk menangkap aliran video menggunakan kamera. Fungsi ini menggunakan bilangan bulat sebagai parameter (mewakili ID perangkat).

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

Sekarang kita perlu membuat matriks berdimensi n. Ini akan menyimpan gambar yang dibaca dari kamera.

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

Untuk menampilkan aliran video, Anda perlu membuat jendela - ini dapat dilakukan menggunakan fungsi NewWindow.

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

Sekarang mari kita beralih ke bagian yang paling menarik.

Karena video adalah aliran bingkai gambar yang berkelanjutan, kita perlu membuat loop tak terbatas untuk membaca aliran video kamera tanpa henti. Untuk melakukan ini, Anda memerlukan metode Baca jenis VideoCapture. Ini akan mengharapkan tipe Mat (matriks yang kita buat di atas), mengembalikan nilai boolean yang menunjukkan apakah frame dari VideoCapture berhasil dibaca atau tidak.

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

Sekarang Anda perlu menampilkan bingkai di jendela yang dibuat. Jeda untuk berpindah ke frame berikutnya adalah 50 ms.

jendela.IMShow(img)
jendela.WaitKey(50)

Setelah meluncurkan aplikasi, sebuah jendela dengan aliran video dari kamera akan terbuka.

Membangun sistem pengenalan wajah berbasis 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)
}
}

misalnya 2

Dalam contoh ini, mari kita gunakan contoh sebelumnya dan membangun sistem pengenalan wajah berdasarkan Haar Cascades.

Kaskade Haar adalah pengklasifikasi kaskade yang dilatih menggunakan teknik wavelet Haar. Mereka menganalisis piksel dalam suatu gambar untuk mendeteksi fitur tertentu. Untuk mengetahui lebih lanjut tentang Haar Cascades, silakan ikuti tautan di bawah ini.

Kerangka kerja deteksi objek Viola-Jones
Pengklasifikasi bertingkat
Fitur seperti Haar

Unduh kaskade yang sudah dilatih bisa disini. Dalam contoh saat ini, kaskade akan digunakan untuk mengidentifikasi wajah seseorang dari depan.

Untuk melakukan ini, Anda perlu membuat pengklasifikasi dan memberinya file yang sudah dilatih (tautan diberikan di atas). Saya sudah mengunggah file pencv_haarcascade_frontalface_default.xml ke direktori tempat program kita berada.

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

Untuk mendeteksi wajah dalam suatu gambar, Anda perlu menggunakan metode ini Deteksi MultiSkala. Fungsi ini mengambil bingkai (tipe Mat) yang baru saja dibaca dari aliran video kamera dan mengembalikan array bertipe Rectangle. Ukuran array mewakili jumlah wajah yang dapat dideteksi oleh pengklasifikasi dalam bingkai. Kemudian, untuk memastikan kita melihat apa yang ditemukan, mari kita ulangi daftar persegi panjang dan cetak objek Rectangle ke konsol, buatlah batas di sekeliling persegi panjang yang terdeteksi. Hal ini dapat dilakukan dengan menggunakan fungsi Rectangle. Ini akan menerima Mat yang dibaca oleh kamera, objek Rectangle yang dikembalikan dengan metode DetectMultiScale, warna dan ketebalan perbatasan.

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

Membangun sistem pengenalan wajah berbasis Golang dan OpenCV

Membangun sistem pengenalan wajah berbasis 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 berhasil! Kami sekarang memiliki sistem pengenalan wajah sederhana yang ditulis dalam Go. Saya berencana untuk segera melanjutkan eksperimen ini dan menciptakan hal-hal baru yang keren dengan menggabungkan Go dan OpenCV.

Jika Anda tertarik, silakan beri peringkat server web gRPC, yang saya tulis dengan Python dan OpenCV. Ini mengalirkan data saat wajah terdeteksi. Ini adalah dasar untuk membuat klien berbeda dalam bahasa pemrograman berbeda. Mereka akan dapat terhubung ke server dan membaca data darinya.

Terima kasih telah membaca artikelnya!

Skillbox merekomendasikan:

Sumber: www.habr.com

Tambah komentar