Xây dựng hệ thống nhận dạng khuôn mặt dựa trên Golang và OpenCV

Xây dựng hệ thống nhận dạng khuôn mặt dựa trên Golang và OpenCV
OpenCV là một thư viện được phát triển cho các dự án thị giác máy tính. Cô ấy đã khoảng 20 tuổi rồi. Tôi đã sử dụng nó ở trường đại học và vẫn sử dụng nó cho các dự án C++ và Python của mình vì nó hỗ trợ tốt cho các ngôn ngữ đó.

Nhưng khi tôi bắt đầu học và sử dụng Go, tôi đã tự hỏi liệu OpenCV có thể được sử dụng để làm việc với ngôn ngữ này hay không. Vào thời điểm đó đã có các ví dụ và hướng dẫn về tích hợp, nhưng tôi thấy chúng quá phức tạp. Một lát sau, tôi bắt gặp một trình bao bọc do The Hybrid Group tạo ra. Trong bài viết này, tôi sẽ chỉ cho bạn cách bắt đầu với GoCV bằng cách phát triển một hệ thống nhận dạng khuôn mặt đơn giản với Haar Cascades.

Hộp kỹ năng khuyến nghị: khóa học thực hành "Nhà phát triển Python từ đầu".

Chúng tôi nhắc nhở: cho tất cả độc giả của "Habr" - giảm giá 10 rúp khi đăng ký bất kỳ khóa học Skillbox nào bằng mã khuyến mại "Habr".

Những gì được yêu cầu:

  • Đi;
  • OpenCV (liên kết đến trình cài đặt bên dưới);
  • web hoặc máy quay phim thông thường.

Cài đặt

Ví dụ 1

Trong ví dụ đầu tiên, chúng tôi sẽ cố gắng tạo một ứng dụng mở cửa sổ bằng luồng video camera.

Trước tiên, bạn cần nhập các thư viện bạn cần để làm việc.

nhập khẩu (
"nhật ký"
“gocv.io/x/gocv”
)

Sau đó, bạn cần tạo đối tượng VideoCapture bằng chức năng VideoCaptureDevice. Cái sau giúp bạn có thể quay một luồng video bằng máy ảnh. Hàm lấy một số nguyên làm tham số (nó đại diện cho ID thiết bị).

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

Bây giờ chúng ta cần tạo một ma trận n chiều. Nó sẽ lưu trữ các hình ảnh được đọc từ máy ảnh.

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

Để hiển thị luồng video, bạn cần tạo một cửa sổ - điều này có thể được thực hiện bằng chức năng NewWindow.

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

Bây giờ chúng ta hãy chuyển sang phần thú vị nhất.

Vì video là một luồng khung hình ảnh liên tục, nên chúng tôi sẽ cần tạo một vòng lặp vô hạn để đọc vô tận luồng video của máy ảnh. Điều này yêu cầu phương thức Đọc của loại VideoCapture. Nó sẽ mong đợi một loại Mat (ma trận mà chúng ta đã tạo ở trên), trả về một giá trị boolean cho biết khung hình từ VideoCapture đã được đọc thành công hay chưa.

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

Bây giờ chúng ta cần hiển thị khung trong cửa sổ đã tạo. Tạm dừng để chuyển sang khung tiếp theo - 50 ms.

cửa sổ.IMShow(img)
cửa sổ.WaitKey(50)

Sau khi khởi chạy ứng dụng, một cửa sổ có luồng video từ máy ảnh sẽ mở ra.

Xây dựng hệ thống nhận dạng khuôn mặt dựa trên Golang và 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)
}
}

Ví dụ 2

Trong ví dụ này, hãy sử dụng ví dụ trước và xây dựng hệ thống nhận dạng khuôn mặt dựa trên Haar Cascades.

Haar cascades là bộ phân loại theo tầng được đào tạo dựa trên kỹ thuật Haar wavelet. Họ phân tích các pixel trong một hình ảnh để tìm kiếm các tính năng cụ thể. Để tìm hiểu thêm về Haar Cascades, vui lòng theo các liên kết bên dưới.

Khung phát hiện đối tượng Viola-Jones
phân loại theo tầng
tính năng giống haar

Tải xuống các tầng đã được đào tạo đây. Trong ví dụ hiện tại, thác sẽ được sử dụng để xác định khuôn mặt của một người ở phía trước.

Để làm điều này, bạn cần tạo một bộ phân loại và cung cấp cho nó một tệp đã được đào tạo (liên kết được cung cấp ở trên). Tôi đã tải tệp pencv_haarcascade_frontalface_default.xml lên thư mục chứa chương trình của chúng ta.

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

Để phát hiện khuôn mặt trong ảnh, bạn cần sử dụng phương pháp Phát HiệnĐa Quy Mô. Hàm này lấy một khung (kiểu Mat) vừa được đọc từ luồng video của máy ảnh và trả về một mảng kiểu Hình chữ nhật. Kích thước của mảng biểu thị số lượng khuôn mặt mà bộ phân loại có thể phát hiện trong khung. Sau đó, để chắc chắn rằng chúng ta thấy những gì nó tìm thấy, hãy duyệt qua danh sách các hình chữ nhật và in đối tượng Hình chữ nhật ra bàn điều khiển, tạo một đường viền xung quanh hình chữ nhật đã tìm thấy. Điều này có thể được thực hiện bằng cách sử dụng chức năng Hình chữ nhật. Nó sẽ lấy Mat được máy ảnh đọc, đối tượng Hình chữ nhật được trả về bằng phương thức DetectMultiScale, màu sắc và độ dày cho đường viền.

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

Xây dựng hệ thống nhận dạng khuôn mặt dựa trên Golang và OpenCV

Xây dựng hệ thống nhận dạng khuôn mặt dựa trên Golang và 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)
}
}

Và ... vâng, mọi thứ đã ổn thỏa! Bây giờ chúng tôi có một hệ thống nhận dạng khuôn mặt đơn giản được viết bằng Go. Trong tương lai gần, tôi dự định sẽ tiếp tục những thử nghiệm này và tạo ra những thứ hay ho mới bằng cách kết hợp Go và OpenCV.

Nếu bạn quan tâm, vui lòng đánh giá máy chủ web gRPC, mà tôi đã viết bằng Python và OpenCV. Nó truyền dữ liệu ngay khi khuôn mặt được phát hiện. Đây là cơ sở để tạo các client khác nhau bằng các ngôn ngữ lập trình khác nhau. Họ sẽ có thể kết nối với máy chủ và đọc dữ liệu từ đó.

Cảm ơn đã đọc bài viết!

Hộp kỹ năng khuyến nghị:

Nguồn: www.habr.com

Mua dịch vụ lưu trữ đáng tin cậy cho các trang web có bảo vệ DDoS, máy chủ VPS VDS 🔥 Mua dịch vụ hosting website đáng tin cậy với bảo vệ DDoS, máy chủ VPS VDS | ProHoster