การสร้างระบบจดจำใบหน้าโดยใช้ Golang และ OpenCV

การสร้างระบบจดจำใบหน้าโดยใช้ Golang และ OpenCV
OpenCV เป็นไลบรารีที่พัฒนาขึ้นสำหรับโครงการคอมพิวเตอร์วิทัศน์ เธออายุประมาณ 20 ปีแล้ว ฉันใช้มันในวิทยาลัยและยังคงใช้สำหรับโปรเจ็กต์ C++ และ Python ของฉันเพราะมันรองรับภาษาเหล่านั้นได้ดี

แต่เมื่อฉันเริ่มเรียนรู้และใช้ Go ฉันสงสัยว่า OpenCV สามารถใช้ทำงานกับภาษานี้ได้หรือไม่ ในเวลานั้นมีตัวอย่างและบทช่วยสอนเกี่ยวกับการบูรณาการอยู่แล้ว แต่สำหรับฉันแล้วดูเหมือนว่าสิ่งเหล่านั้นจะซับซ้อนเกินไป หลังจากนั้นไม่นาน ฉันก็เจอกระดาษห่อที่สร้างโดย The Hybrid Group ในบทความนี้ ฉันจะแสดงวิธีเริ่มต้นใช้งาน GoCV โดยการพัฒนาระบบจดจำใบหน้าอย่างง่ายด้วย Haar Cascades

Skillbox แนะนำ: หลักสูตรภาคปฏิบัติ "นักพัฒนา Python ตั้งแต่เริ่มต้น".

เราเตือนคุณ: สำหรับผู้อ่าน "Habr" ทุกคน - ส่วนลด 10 rubles เมื่อลงทะเบียนในหลักสูตร Skillbox ใด ๆ โดยใช้รหัสส่งเสริมการขาย "Habr"

สิ่งที่ต้องการ:

  • ไป;
  • OpenCV (ลิงก์ไปยังตัวติดตั้งด้านล่าง);
  • เว็บหรือกล้องวิดีโอทั่วไป

การติดตั้ง

1 ตัวอย่าง

ในตัวอย่างแรก เราจะพยายามสร้างแอปพลิเคชันที่เปิดหน้าต่างพร้อมสตรีมวิดีโอจากกล้อง

ขั้นแรกคุณต้องนำเข้าไลบรารีที่คุณต้องการใช้งาน

นำเข้า (
"บันทึก"
“gocv.io/x/gocv”
)

หลังจากนั้นคุณจะต้องสร้างออบเจ็กต์ VideoCapture โดยใช้ฟังก์ชัน VideoCaptureDevice อย่างหลังทำให้สามารถจับภาพวิดีโอสตรีมโดยใช้กล้องได้ ฟังก์ชันรับจำนวนเต็มเป็นพารามิเตอร์ (ซึ่งแสดงถึงรหัสอุปกรณ์)

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

ตอนนี้เราต้องสร้างเมทริกซ์ n มิติ มันจะเก็บภาพที่อ่านจากกล้อง

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

หากต้องการแสดงสตรีมวิดีโอ คุณต้องสร้างหน้าต่าง ซึ่งสามารถทำได้โดยใช้ฟังก์ชัน NewWindow

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

ตอนนี้เรามาดูส่วนที่น่าสนใจที่สุดกันดีกว่า

เนื่องจากวิดีโอเป็นการสตรีมเฟรมภาพอย่างต่อเนื่อง เราจะต้องสร้างวงวนไม่สิ้นสุดเพื่ออ่านสตรีมวิดีโอของกล้องอย่างไม่สิ้นสุด ซึ่งต้องใช้วิธีอ่านประเภท VideoCapture โดยคาดว่าจะเป็นประเภท Mat (เมทริกซ์ที่เราสร้างไว้ด้านบน) โดยส่งคืนบูลีนเพื่อระบุว่าเฟรมจาก VideoCapture อ่านได้สำเร็จหรือไม่

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

ตอนนี้เราต้องแสดงเฟรมในหน้าต่างที่สร้างขึ้น หยุดชั่วคราวเพื่อเลื่อนไปยังเฟรมถัดไป - 50 ms

หน้าต่าง IMShow (img)
หน้าต่าง WaitKey (50)

หลังจากเปิดแอปพลิเคชัน หน้าต่างที่มีสตรีมวิดีโอจากกล้องจะเปิดขึ้น

การสร้างระบบจดจำใบหน้าโดยใช้ Golang และ 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 ตัวอย่าง

ในตัวอย่างนี้ ลองใช้ตัวอย่างก่อนหน้านี้และสร้างระบบจดจำใบหน้าโดยใช้ Haar Cascades

Haar cascades เป็นตัวแยกประเภทแบบเรียงซ้อนที่ได้รับการฝึกฝนโดยใช้เทคนิค Haar wavelet พวกเขาวิเคราะห์พิกเซลในรูปภาพเพื่อค้นหาคุณสมบัติเฉพาะ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Haar Cascades โปรดไปที่ลิงก์ด้านล่าง

กรอบการตรวจจับวัตถุ Viola-Jones
ตัวแยกประเภทแบบเรียงซ้อน
ลักษณะเหมือน Haar

ดาวน์โหลดน้ำตกที่ผ่านการฝึกอบรมแล้ว ได้ที่นี่. ในตัวอย่างปัจจุบัน การเรียงซ้อนจะถูกนำมาใช้เพื่อระบุใบหน้าของบุคคลที่อยู่ข้างหน้า

ในการดำเนินการนี้ คุณจะต้องสร้างตัวแยกประเภทและป้อนไฟล์ที่ได้รับการฝึกอบรมแล้ว (ลิงก์ที่ให้ไว้ด้านบน) ฉันได้อัปโหลดไฟล์ pencv_haarcascade_frontalface_default.xml ไปยังไดเร็กทอรีที่โปรแกรมของเราตั้งอยู่แล้ว

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

หากต้องการตรวจจับใบหน้าในภาพ คุณต้องใช้วิธีนี้ ตรวจจับ MultiScale. ฟังก์ชันนี้รับเฟรม (ประเภท Mat) ที่เพิ่งอ่านจากสตรีมวิดีโอของกล้องและส่งกลับอาร์เรย์ประเภทสี่เหลี่ยมผืนผ้า ขนาดของอาร์เรย์แสดงถึงจำนวนใบหน้าที่ตัวแยกประเภทสามารถตรวจจับได้ในเฟรม จากนั้น เพื่อให้แน่ใจว่าเราเห็นสิ่งที่พบ เรามาวนซ้ำรายการสี่เหลี่ยมและพิมพ์วัตถุสี่เหลี่ยมผืนผ้าไปที่คอนโซล สร้างเส้นขอบรอบๆ สี่เหลี่ยมที่พบ ซึ่งสามารถทำได้โดยใช้ฟังก์ชันสี่เหลี่ยมผืนผ้า โดยจะใช้ Mat อ่านโดยกล้อง วัตถุสี่เหลี่ยมผืนผ้าที่ส่งคืนโดยวิธี DetectMultiScale และสีและความหนาของเส้นขอบ

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

การสร้างระบบจดจำใบหน้าโดยใช้ Golang และ OpenCV

การสร้างระบบจดจำใบหน้าโดยใช้ Golang และ 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)
}
}

และ ... ใช่ทุกอย่างได้ผล! ขณะนี้เรามีระบบจดจำใบหน้าแบบง่ายๆ ที่เขียนด้วยภาษา Go ในอนาคตอันใกล้นี้ ฉันวางแผนที่จะทำการทดลองเหล่านี้ต่อไปและสร้างสิ่งใหม่ๆ ที่ยอดเยี่ยมโดยการรวม Go และ OpenCV

หากคุณสนใจกรุณาให้คะแนน เว็บเซิร์ฟเวอร์ gRPCซึ่งฉันเขียนใน Python และ OpenCV โดยจะสตรีมข้อมูลทันทีที่ตรวจพบใบหน้า นี่เป็นพื้นฐานสำหรับการสร้างไคลเอนต์ที่แตกต่างกันในภาษาการเขียนโปรแกรมที่แตกต่างกัน พวกเขาจะสามารถเชื่อมต่อกับเซิร์ฟเวอร์และอ่านข้อมูลจากเซิร์ฟเวอร์ได้

ขอบคุณสำหรับการอ่านบทความ!

Skillbox แนะนำ:

ที่มา: will.com

เพิ่มความคิดเห็น