ساخت یک سیستم تشخیص چهره بر اساس Golang و OpenCV

ساخت یک سیستم تشخیص چهره بر اساس Golang و OpenCV
OpenCV یک کتابخانه طراحی شده برای پروژه های بینایی کامپیوتری است. او در حال حاضر حدود 20 سال دارد. من از آن در کالج استفاده کردم و هنوز هم برای پروژه های ++C و پایتون از آن استفاده می کنم زیرا پشتیبانی خوبی از آن زبان ها دارد.

اما زمانی که شروع به یادگیری و استفاده از Go کردم، به این موضوع علاقه مند شدم که آیا می توان از OpenCV برای کار با این زبان استفاده کرد یا خیر. در آن زمان قبلاً نمونه ها و آموزش هایی در مورد ادغام وجود داشت، اما به نظرم خیلی پیچیده بود. کمی بعد با لفافی برخوردم که توسط تیم The Hybrid Group ساخته شده بود. در این مقاله، من به شما نشان خواهم داد که چگونه با توسعه یک سیستم تشخیص چهره ساده با Haar Cascades، با GoCV شروع کنید.

Skillbox توصیه می کند: دوره عملی "توسعه دهنده پایتون از ابتدا".

یادآوری می کنیم: برای همه خوانندگان "Habr" - تخفیف 10 روبل هنگام ثبت نام در هر دوره Skillbox با استفاده از کد تبلیغاتی "Habr".

چه چیزی لازم است:

  • برو ؛
  • OpenCV (لینک های نصب کننده زیر)؛
  • وب یا دوربین فیلمبرداری معمولی

نصب

به عنوان مثال 1

در مثال اول، ما سعی خواهیم کرد برنامه‌ای ایجاد کنیم که پنجره‌ای را باز کند که جریان ویدیویی دوربین را نشان می‌دهد.

ابتدا باید کتابخانه های مورد نیاز برای کار را وارد کنید.

وارد كردن (
"ورود"
“gocv.io/x/gocv”
)

پس از این، باید با استفاده از تابع VideoCaptureDevice یک شی VideoCapture ایجاد کنید. دومی امکان گرفتن یک جریان ویدیویی با استفاده از دوربین را فراهم می کند. این تابع از یک عدد صحیح به عنوان پارامتر استفاده می کند (این نشان دهنده شناسه دستگاه است).

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

حالا بیایید به جالب ترین قسمت برویم.

از آنجایی که ویدیو یک جریان پیوسته از فریم‌های تصویر است، برای خواندن بی‌پایان جریان ویدیویی دوربین باید یک حلقه بی‌نهایت ایجاد کنیم. برای این کار به متد Read از نوع VideoCapture نیاز دارید. انتظار می رود یک نوع Mat (ماتریسی که در بالا ایجاد کردیم)، یک مقدار بولی را برگرداند که نشان می دهد آیا فریم از VideoCapture با موفقیت خوانده شده است یا خیر.

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

حال باید قاب را در پنجره ایجاد شده نمایش دهید. مکث برای رفتن به فریم بعدی 50 میلی ثانیه است.

window.IMShow(img)
window.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 بسازیم.

آبشار های هار طبقه بندی کننده های آبشاری هستند که با استفاده از تکنیک موجک هار آموزش داده می شوند. آنها پیکسل های یک تصویر را برای تشخیص ویژگی های خاص تجزیه و تحلیل می کنند. برای کسب اطلاعات بیشتر در مورد آبشار هار، لطفاً پیوندهای زیر را دنبال کنید.

چارچوب تشخیص شی Viola-Jones
طبقه بندی های آبشاری
ویژگی هار مانند

آبشارهای آموزش دیده را بارگیری کنید می تواند اینجا باشد. در مثال فعلی، آبشارها برای شناسایی چهره افراد از جلو استفاده خواهند شد.

برای انجام این کار، باید یک طبقه‌بندی کننده ایجاد کنید و آن را با یک فایل آموزش دیده تغذیه کنید (لینک در بالا داده شده است). من قبلاً فایل pencv_haarcascade_frontalface_default.xml را در دایرکتوری که برنامه ما در آن قرار دارد آپلود کرده ام.

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

برای تشخیص چهره در یک تصویر، باید از این روش استفاده کنید DetectMultiScale. این تابع یک فریم (نوع Mat) را می گیرد که به تازگی از جریان ویدئوی دوربین خوانده شده است و آرایه ای از نوع Rectangle را برمی گرداند. اندازه آرایه نشان‌دهنده تعداد چهره‌هایی است که طبقه‌بندی‌کننده توانسته است در قاب تشخیص دهد. سپس، برای اطمینان از دیدن آنچه که پیدا کرده است، بیایید لیست مستطیل ها را تکرار کنیم و شی Rectangle را در کنسول چاپ کنیم، و یک حاشیه در اطراف مستطیل شناسایی شده ایجاد کنیم. این کار را می توان با استفاده از تابع Rectangle انجام داد. متد خوانده شده توسط دوربین، شی Rectangle که با روش 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که در پایتون و OpenCV نوشتم. در لحظه شناسایی چهره، داده ها را به جریان می اندازد. این مبنای ایجاد کلاینت های مختلف در زبان های برنامه نویسی مختلف است. آنها قادر خواهند بود به سرور متصل شوند و داده ها را از آن بخوانند.

با تشکر از شما برای خواندن مقاله!

Skillbox توصیه می کند:

منبع: www.habr.com

اضافه کردن نظر