Golang va OpenCV asosida yuzni aniqlash tizimini yaratish

Golang va OpenCV asosida yuzni aniqlash tizimini yaratish
OpenCV - bu kompyuterni ko'rish loyihalari uchun ishlab chiqilgan kutubxona. U allaqachon 20 yoshda. Men uni kollejda ishlatganman va hali ham C++ va Python loyihalarim uchun foydalanaman, chunki u ushbu tillarni yaxshi qo'llab-quvvatlaydi.

Lekin men Go o'rganishni va undan foydalanishni boshlaganimda, OpenCV bu til bilan ishlash uchun ishlatilishi mumkinmi, deb o'yladim. O'sha paytda integratsiyaga oid misollar va qo'llanmalar allaqachon mavjud edi, lekin menga ular juda murakkab tuyuldi. Biroz vaqt o'tgach, men The Hybrid Group tomonidan yaratilgan o'ramga duch keldim. Ushbu maqolada men sizga Haar Cascades yordamida yuzni tanishning oddiy tizimini ishlab chiqish orqali GoCV-ni qanday boshlashni ko'rsataman.

Skillbox tavsiya qiladi: Amaliy kurs "Python dasturchisi noldan".

Sizga eslatib o'tamiz: "Habr" ning barcha o'quvchilari uchun - "Habr" promo-kodidan foydalangan holda har qanday Skillbox kursiga yozilishda 10 000 rubl chegirma.

Nima talab qilinadi:

  • Borish;
  • OpenCV (quyida o'rnatuvchiga havolalar);
  • veb yoki oddiy videokamera.

sozlama

misol 1

Birinchi misolda biz kamera video oqimi bilan oyna ochadigan dastur yaratishga harakat qilamiz.

Avval siz ishlashingiz kerak bo'lgan kutubxonalarni import qilishingiz kerak.

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

Shundan so'ng, VideoCaptureDevice funksiyasidan foydalanib, VideoCapture ob'ektini yaratishingiz kerak. Ikkinchisi kamera yordamida video oqimini suratga olish imkonini beradi. Funktsiya parametr sifatida butun sonni oladi (u qurilma identifikatorini bildiradi).

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

Endi biz n o'lchovli matritsa yaratishimiz kerak. U kameradan o'qilgan tasvirlarni saqlaydi.

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

Video oqimini ko'rsatish uchun siz oyna yaratishingiz kerak - bu NewWindow funksiyasi yordamida amalga oshirilishi mumkin.

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

Endi eng qiziqarli qismga o'tamiz.

Video tasvir ramkalarining uzluksiz oqimi bo'lgani uchun biz kameraning video oqimini cheksiz o'qish uchun cheksiz tsikl yaratishimiz kerak bo'ladi. Bu VideoCapture turidagi Read usulini talab qiladi. VideoCapture-dan kadr muvaffaqiyatli o'qilgan yoki o'qilmaganligini ko'rsatadigan mantiqiy qiymatni qaytaradigan Mat turini (yuqorida biz yaratgan matritsa) kutadi.

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

Endi biz yaratilgan oynada ramkani ko'rsatishimiz kerak. Keyingi kadrga o'tish uchun pauza qiling - 50 ms.

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

Ilovani ishga tushirgandan so'ng, kameradan video oqimi bo'lgan oyna ochiladi.

Golang va OpenCV asosida yuzni aniqlash tizimini yaratish

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

misol 2

Ushbu misolda oldingi misoldan foydalanamiz va Haar Cascades asosida yuzni aniqlash tizimini quramiz.

Haar kaskadlari - bu Haar to'lqinlari texnikasi asosida o'qitilgan kaskadli tasniflagichlar. Muayyan xususiyatlarni izlash uchun ular tasvirdagi piksellarni tahlil qiladilar. Haar Cascades haqida ko'proq ma'lumot olish uchun quyidagi havolalarga o'ting.

Viola-Jones ob'ektni aniqlash tizimi
Kaskadli klassifikatorlar
Haarga o'xshash xususiyat

Allaqachon o'qitilgan kaskadlarni yuklab oling bu erda mumkin. Joriy misolda kaskadlar odamning yuzini identifikatsiyalash uchun ishlatiladi.

Buni amalga oshirish uchun siz tasniflagich yaratishingiz va unga allaqachon o'qitilgan faylni berishingiz kerak (havola yuqorida keltirilgan). Men allaqachon pencv_haarcascade_frontalface_default.xml faylini dasturimiz joylashgan katalogga yuklaganman.

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

Rasmdagi yuzlarni aniqlash uchun siz usuldan foydalanishingiz kerak DetectMultiScale. Bu funksiya kameraning video oqimidan hozirgina o‘qilgan kadrni (Mat tipidagi) oladi va Rectangle tipidagi massivni qaytaradi. Massivning o'lchami klassifikator ramkada aniqlay olgan yuzlar sonini ifodalaydi. Keyin, topilgan narsaga ishonch hosil qilish uchun keling, to'rtburchaklar ro'yxatini takrorlaymiz va topilgan to'rtburchak atrofida chegara yaratib, konsolga Rectangle ob'ektini chop etamiz. Buni Rectangle funksiyasi yordamida amalga oshirish mumkin. Bu kamera tomonidan o'qiladigan Matni, DetectMultiScale usuli bilan qaytarilgan Rectangle ob'ektini va chegaraning rangi va qalinligini oladi.

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

Golang va OpenCV asosida yuzni aniqlash tizimini yaratish

Golang va OpenCV asosida yuzni aniqlash tizimini yaratish

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

Va ... ha, hammasi yaxshi bo'ldi! Endi bizda Go-da yozilgan yuzni tanishning oddiy tizimi mavjud. Yaqin kelajakda men ushbu tajribalarni davom ettirishni va Go va OpenCV-ni birlashtirib, yangi ajoyib narsalarni yaratishni rejalashtirmoqdaman.

Agar qiziqsangiz, baho bering gRPC veb-server, men Python va OpenCV da yozganman. U yuz aniqlanishi bilanoq ma'lumotlarni uzatadi. Bu turli dasturlash tillarida turli xil mijozlarni yaratish uchun asosdir. Ular serverga ulanishi va undan ma'lumotlarni o'qishi mumkin bo'ladi.

Maqolani o'qiganingiz uchun tashakkur!

Skillbox tavsiya qiladi:

Manba: www.habr.com

a Izoh qo'shish