Haar Cascades در OpenCV
مقدمه
در این ماژول نمونه ای از تشخیص چهره برای تشریح تشخیص ابعاد را خواهیم گرفت. مفاهیم مشابه نیز برای تشخیص کلی شی مورد استفاده قرار می گیرند. بیایید چند سالی تا سال 2001 برگردیم، زمانی که تشخیص چهره بیشتر از موضوع تحقیق بود و بسیاری از روش ها پیشنهاد شده بود که به خوبی کار نمی کرد. پل ویولا و مایکل جونز مقاله ای با عنوان خود ارائه دادند که نه تنها به طور چشمگیری تشخیص چهره را ایفا می داشت، بلکه در زمان واقعی و بر خط نیز انجام می گرفت. این یکی از مهمترین مقالات در Computer Vision است. ارزش این مقاله این است که آنها در مورد رویکرد خود بحث می کنند زیرا برخی از ایده های جدید را از طریق این مقاله پیشنهاد می کنند. در بخش های زیر، ما نحوه استفاده از آشکارسازهای چهره و لبخند مبتنی بر HAAR را در OpenCV یاد خواهیم گرفت. سپس ما تئوری تشخیص چهره را به طور خلاصه پوشش خواهیم داد.
Haar Cascades در OpenCV
در این بخش، یک نسخه ی نمایشی از اجرای تشخیص چهره با استفاده از HAAR Cascade در OpenCV خواهیم دید. همچنین یک نسخه آزمایشی تشخیص لبخند را مشاهده خواهید کرد و نحوه استفاده از هر دو cascade (یا آبشار) برای تشخیص چهره و لبخند در تصویر. مدل آموزش یافته برای تشخیص چهره و شناسایی لبخند در قطعه کد ها وجود دارد کهدر ادامه قابل دریافت است. آشکارساز صورت توسط پروفسور دکتر Rainer Leinhart و تشخیص لبخند توسط Deniz Suarez ایجاد شده اند. مدل ها در فایل های xml نگهداری می شوند. در OpenCV دیگر آشکارسازهای شبیه HAAR Cascade وجود دارد که توسط محققان مختلف آموزش داده شده و از طریق OpenCV مانند آشکارساز چشم، آشکارساز چهره خاص، آشکارساز چهره گربه، آشکارساز عابر پیاده به اشتراک گذاشته شده است. تابع اصلی مورد استفاده در قطعه کد نمونه از نوع تشخیص مقیاس پذیر است. cv2.CascadeClassifier.detectMultiScale(image[, scaleFactor[, minNeighbors)
که در حقیقت هر کدام از پارامتر ها به شرح زیر اند: جایی که،
- image : تصویر سیاه و سفید ورودی است.
- Objects: منطقه مستطیلی است که محصور شده است
- scaleFactor : پارامتر تعیین میزان اندازه تصویر در هر مقیاس تصویر است. این برای ایجاد هرم مقیاس استفاده می شود.
- minNeighbors : یک پارامتر مشخص می کند که چند همسایه هر کدام مستطیل نامزد باید داشته باشند تا بتوانند آن را حفظ کنند. شماره بالاتر می دهد مثبت کاذب کمتر.
در این آموزش، ما در مورد تاثیر پارامترها بحث می کنیم. اثر scaleFactor بیشتر به سرعت بستگی دارد. مقدار را کاهش دهید، سرعت آن کمتر خواهد شد. در این نسخه آزمایشی، ما بررسی پارامتر minNeighbors را بررسی می کنیم. همانطور که مقدار این متغیر افزایش می یابد، مثبت کاذب کاهش می یابد. قبل از اجرای قطعه کد داده شده شما می بایست فایل xml زیر را در دایرکتوری حاوی کد خود قرار دهید تا بتواند بر اساس HAAR داده شده تصاویر چهره را شناسایی نماید.
لینک دانلود HAAR Cascade های آماده : https://github.com/opencv/opencv/tree/master/data/haarcascades
قطعه کد نمونه برای اجرای تشخیص چهره
import cv2
import sys
import numpy as np
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faceNeighborsMax = 10
neighborStep = 1
frame = cv2.imread("alibigdeli.jpg")
frameGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Perform multi scale detection of faces
for neigh in range(1, faceNeighborsMax, neighborStep):
faces = faceCascade.detectMultiScale(frameGray, 1.2, neigh)
frameClone = np.copy(frame)
# Display the image
for (x, y, w, h) in faces:
cv2.rectangle(frameClone, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.putText(frameClone, "# Neighbors = {}".format(neigh), (10, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 4)
cv2.imshow('Face Detection Demo', frameClone)
if cv2.waitKey(500) & 0xFF == 27:
cv2.destroyAllWindows()
sys.exit()
خروجی قطعه کد بالا:
نمونه قطعه کد زیر خروجی برابر با تشخیص صورت را خواهد داشت.
#importing libraries
import numpy as np
import cv2
#initializing the classifier of face
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#reading the image
img = cv2.imread('alibigdeli.jpeg')
#changing the image color to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#multi scale detecting face
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
#making the boundry box of face in image
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
#showing image
cv2.imshow('img',img)
#waiting for a key to exit
cv2.waitKey(0)
cv2.destroyAllWindows()
خروجی قطعه کد بالا: