تشخیص چهره با استفاده از الگوریتم Haar Cascade
امروز تصمیم دارم در مورد تشخیص چهره و چشم ها با استفاده از الگوریتم Haar Cascade صحبت کنم و کدی برای این منظور با استفاده از زبان پایتون بنویسم.
تشخیص اجسام با استفاده از الگوریتم Haar Cascade، یک روش بسیار موثر است که اولین بار توسط Paul Viola و Michael Jones در سال ۲۰۰۱ مطرح شد. این الگوریتم بر پایه یادگیری ماشین بوده و بدین صورت عمل می کند که با استفاده از تصاویری که چهره در آنها وجود دارد (تصاویر مثبت) و تصاویری که چهره در آنها وجود ندارد (تصاویر منفی) تابعی را آموزش می دهد تا بتواند مولفه هایی مانند وجود فاصله بین چشم ها را پیدا کند.
این الگوریتم منحصر به تشخیص چهره نیست؛ و بیشتر یک آموزش دهنده است و می توان با آموزش دادن تابع دلخواه خودتان هر شی مانند ماشین، میز، مداد و … را شناسایی کنید. OpenCV مجموعه ای از توابع از پیش آموزش دیده را برای تشخیص چهره، چشمان، لبخند و … در خود دارد که می توان به سادگی از آنها استفاده کرد. زیاد وارد جزئیات در مورد این الگوریتم نمی شم و به نوشتن برنامه ای برای تشخیص چهره و چشمان می پردازم.
1 2 3 4 5 6 |
# Import necessary packages import cv2 # Load the required XML classifiers face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_cascade=cv2.CascadeClassifier('haarcascade_eye.xml') |
ابتدا پکیج cv2 را برای OpenCV وارد می کنیم. سپس توابع از پیش آموزش دیده را برای شناسایی صورت و چشم ها بارگذاری می کنیم. این توابع در مسیر opencv/data/haarcascades قرار دارند.
1 2 3 4 5 6 7 |
# Make ready camera or webcam camera=cv2.VideoCapture(0) while True: # grab the current frame success, frame = camera.read() gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) |
در قسمت بعدی چون می خواهیم عمل تشخیص چهره را به صورت Real-time انجام دهیم، از دوربین استفاده می کنیم. برای این منظور دوربین را فراخوانی می کنیم و کد را درون یک حلقه می نویسیم.
توجه داشته باشید که برای استفاده از اگوریتم haar cascade، حتماً باید تصویر به صورت سیاه و سفید باشد. به همین دلیل هر فریم را پس از دریافت از دوربین از حالت رنگی به سیاه و سفید تبدیل می کنیم.
1 2 3 4 5 |
# Now we find the faces in the video. if faces are found, # it returns the positions of detected faces as Rect(x,t,w,h) faces=face_cascade.detectMultiScale(gray,1.3,5) for (x,y,w,h) in faces: frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) |
در مرحله بعدی، با استفاده از دستور MultiScale، تابع تشخیص چهره را به تصویر سیاه و سفید خود اعمال می کنیم. اعدادی که در این دستور آمده اند، محدوده اندازه را تعیید می کنند. این تابع یک خروجی با مختصات محل صورت می دهد. سپس با استفاده از خروجی این تابع با یک مستطیل آبی رنگ محدوده صورت را نشان می دهیم.
1 2 3 4 5 6 7 |
# Once we get these locations, we can create a ROI for the face # and apply eye detection on this ROI roi_gray=gray[y:y+h,x:x+w] roi_color=frame[y:y+h,x:x+w] eyes=eye_cascade.detectMultiScale(roi_gray,1.1,5) for (ex,ey,ew,eh) in eyes: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) |
حال نوبت به شناسایی چشم ها می رسد. برای این منظور نیز مانند مرحله قبلی از دستور MultiScale استفاده خواهیم کرد ولی قبل از آن باید محدوده صورت را جدا کنیم.
مجدداً با استفاده از یک مستطیل با رنگ سبز چشم ها را بر روی تصویر نشان می دهیم.
1 2 3 4 5 6 7 8 9 |
# Show the results on video cv2.imshow("Face Detecting",frame) # if the 'q' key is pressed, stop the loop if cv2.waitKey(1) & 0xFF == ord("q"): break camera.release() cv2.destroyAllWindows() |
و در مرحله آخر با فشردن کلید q از برنامه خارج می شویم. شکل زیر نتیجه این کد را نشان می دهد.
همانطور که در کدهای بالا ملاحظه کردید، استفاده از این توابع از پیش آموزش دیده شده باعث کاهش حجم کدنویسی شده است. در پایان می توانید کد را به همراه توابع تشخیص از لینک زیر دانلد کنید.