تشخیص چهره بسیار ساده تر از چیزی است که فکر می کنید و این کتابخانه مفید پایتون آن را ثابت می کند.
آیا تا به حال فکر کرده اید که اسنپ چت چگونه فیلترهای مختلف را به طور دقیق روی صورت شما اعمال می کند؟ آیا گوشی هوشمند شما هنگام باز کردن قفل با استفاده از ویژگی های صورت شما جادویی می کند؟ نه، شما فقط در حال تماشای تشخیص چهره هستید.
تشخیص چهره یک فناوری هوش مصنوعی است که می تواند چهره انسان را در یک تصویر یا فیلم دیجیتال شناسایی کند. کشف کنید که چگونه می توانید یک برنامه تشخیص چهره در کمتر از 25 خط کد با الگوریتم افسانه ای Haar Cascade بسازید.
آبشار هار چیست؟
Haar Cascade یک الگوریتم تشخیص اشیا است که توسط پل ویولا و مایکل جونز برای تشخیص چهره در تصاویر یا ویدیوها معرفی شده است. یک تابع آبشار با استفاده از بسیاری از تصاویر مثبت و منفی آموزش داده می شود که بعداً می تواند برای شناسایی هر شی یا چهره در رسانه های دیگر استفاده شود. این فایل های آموزش دیده در مخزن OpenCV GitHub موجود هستند.
با استفاده از رویکرد پنجره کشویی، یک پنجره با اندازه ثابت روی یک تصویر از چپ به راست، از بالا به پایین تکرار میشود. در هر مرحله، پنجره متوقف میشود و طبقهبندی میکند که آیا ناحیه دارای یک چهره است یا خیر.
OpenCV، یک ابزار بینایی کامپیوتری، با یک مدل Haar Cascade از پیش آموزش دیده برای طبقه بندی ویژگی ها کار می کند. هر فاز پنج ویژگی را بررسی می کند: دو ویژگی لبه، دو ویژگی خط و یک ویژگی چهار مستطیلی.
با مشاهده، ناحیه چشم تیره تر از ناحیه گونه به نظر می رسد در حالی که ناحیه بینی روشن تر از ناحیه چشم به نظر می رسد. شما می توانید این ویژگی ها را به شکل زیر تجسم کنید.
با استفاده از این ویژگی ها و محاسبه پیکسل ها، الگوریتم بیش از 100000 نقطه داده را شناسایی می کند. سپس می توانید از الگوریتم Adaboost برای بهبود دقت و کنار گذاشتن ویژگی های نامربوط استفاده کنید. در بسیاری از تکرارها، این رویکرد میزان خطا را به حداقل می رساند و وزن ویژگی را تا رسیدن به دقت قابل قبولی افزایش می دهد.
با این حال، اگر یک مورد آزمایشی خاص با شکست مواجه شود، تکنیک پنجره کشویی متوقف می شود و از نظر محاسباتی گران است. برای حل این موضوع، می توانید مفهوم آبشار طبقه بندی کننده ها را اعمال کنید. این رویکرد به جای اعمال تمام ویژگی ها در یک پنجره واحد، آنها را گروه بندی و به صورت مرحله ای اعمال می کند.
اگر پنجره در مرحله اول شکست بخورد، فرآیند آن را دور می اندازد، در غیر این صورت ادامه می یابد. این منجر به کاهش شدید تعداد عملیات برای انجام می شود و استفاده از آن را برای برنامه های بلادرنگ قابل استفاده می کند.
گردش کار تشخیص چهره
این الگوریتم را برای ایجاد برنامه تشخیص چهره خود دنبال کنید:
- الگوریتم صورت جلوی آبشار Haar را بارگیری کنید.
- دوربین را راه اندازی کنید.
- فریم ها را از دوربین بخوانید.
- تبدیل تصاویر رنگی به خاکستری
- مختصات صورت را دریافت کنید.
- یک مستطیل بکشید و پیام مناسب را قرار دهید.
- نمایش خروجی
OpenCV چیست؟
OpenCV یک کتابخانه بینایی کامپیوتری و یادگیری ماشین منبع باز است. دارای بیش از 2500 الگوریتم بهینه شده برای کاربردهای مختلف. اینها شامل تشخیص چهره/اشیاء، تشخیص، طبقه بندی و بسیاری موارد دیگر است.
حفظ حریم خصوصی داده های چهره شما یک نگرانی جداگانه است. صدها شرکت مطرح مانند گوگل، آی بی ام و یاهو از OpenCV در برنامه های خود استفاده می کنند. برخی از افرادی که قصد دارند داده های خود را خصوصی نگه دارند، نشان داده اند که راه هایی برای جلوگیری از تشخیص چهره وجود دارد.
برای نصب OpenCV در پایتون از دستور زیر استفاده کنید:
pip install opencv-python
چگونه با استفاده از پایتون یک برنامه تشخیص چهره بسازیم
برای ساخت ردیاب چهره مراحل زیر را دنبال کنید:
این کد نمونه به همراه فایل الگوریتم Haar Cascade در a موجود است
مخزن GitHub
و استفاده از آن تحت مجوز MIT برای شما رایگان است.
- فایل XML پیشفرض Haar Cascade Frontal Face را دانلود کنید و آن را در همان مکان برنامه پایتون خود قرار دهید.
- کتابخانه OpenCV را وارد کنید.# وارد کردن کتابخانه های مورد نیاز cv2 را وارد کنید
- فایل الگوریتم Haar Cascade Frontal Face را برای ارجاع آسان ذخیره کنید.# بارگیری فایل الگوریتم مورد haar در alg variablealg = “haarcascade_frontalface_default.xml”
- از کلاس CascadeClassifier برای بارگذاری یک فایل XML در OpenCV استفاده کنید.# ارسال الگوریتم به OpenCVhaar_cascade = cv2.CascadeClassifier(alg)
- از دوربین فیلمبرداری کنید. برای استفاده از دوربین اصلی خود عدد 0 را به تابع VideoCapture() منتقل کنید. اگر یک دوربین خارجی متصل کرده اید، می توانید از اعداد متوالی 1، 2 و غیره برای استفاده از آن استفاده کنید.# گرفتن فید ویدیو از دوربین دوربین = cv2.VideoCapture(0)
# importing the required libraries
import cv2
# loading the haar case algorithm file into alg variable
alg = "haarcascade_frontalface_default.xml"
# passing the algorithm to OpenCV
haar_cascade = cv2.CascadeClassifier(alg)
# capturing the video feed from the camera
cam = cv2.VideoCapture(0)
- یک حلقه بی نهایت برای خواندن فریم به فریم ورودی دوربین تنظیم کنید. تابع read() دو پارامتر را برمی گرداند. مقدار اول از نوع boolean است که نشان می دهد آیا عملیات موفقیت آمیز است یا خیر. پارامتر دوم شامل فریم واقعی است که قرار است با آن کار کنید. این قاب را در متغیر img ذخیره کنید.whileTrue: _, img = cam.read()
- متن پیشفرض را طوری تنظیم کنید که چهره شناسایی نشده باشد. وقتی شناسایی شد، مقدار این متغیر را به روز کنید. text = “چهره شناسایی نشد”
- ورودی دریافتی از دنیای واقعی رنگارنگ و در قالب BGR است. BGR مخفف آبی، سبز و قرمز است. این باعث ایجاد پردازش های زیادی برای برنامه های بینایی کامپیوتر می شود. برای کاهش این میزان، از قالب خاکستری استفاده کنید. # تبدیل هر فریم از BGR به Grayscale grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) قالب و فرمت کد تبدیل، COLOR_BGR2GRAY را به cvtColor() منتقل کنید تا هر فریم ویدیو از رنگی به مقیاس خاکستری تغییر یابد.
- برای تشخیص چهره ها از detectMultiScale() استفاده کنید. این روش سه پارامتر را به عنوان ورودی می گیرد. اول تصویر منبع، grayImg است. پارامتر دوم scaleFactor است. این مشخص می کند که چقدر باید اندازه تصویر را در هر مقیاس تصویر کاهش دهید. از مقدار پیش فرض 1.3 به عنوان ضریب مقیاس استفاده کنید. هر چه ضریب مقیاس بالاتر باشد، مراحل کمتر و سریعتر اجرا می شود. با این حال، احتمال مفقود شدن چهره نیز بیشتر است. سومین پارامتر minNeighbors است. این مشخص می کند که هر مستطیل نامزد باید چند همسایه داشته باشد تا آن را حفظ کند. هر چه مقدار بالاتر باشد، احتمال مثبت کاذب کمتر است، اما همچنین به معنای از دست دادن ردهای نامشخص چهره است. # تشخیص چهره با استفاده از Haar Cascade face = haar_cascade.detectMultiScale(grayImg, 1.3, 4)
- وقتی یک چهره را تشخیص می دهید، چهار مختصات به دست می آورید. x نشان دهنده مختصات x، y نشان دهنده مختصات y، w نشان دهنده عرض و h نشان دهنده ارتفاع است. متن را به Face Detected به روز کنید و با استفاده از این مختصات یک مستطیل بکشید. رنگ مستطیل سبز (BGR) با ضخامت دو پیکسل است. # یک مستطیل در اطراف صورت بکشید و متن را به Face Detected برای (x, y, w, h) در صورت بهروزرسانی کنید: text = “Face Detected” cv2.rectangle(img, (x, y), (x + w, y + h)، (0، 255، 0)، 2)
- به صورت اختیاری متن را روی کنسول خروجی چاپ کنید. متن را روی صفحه با استفاده از قاب گرفته شده به عنوان منبع، متنی که در متن بالا به دست آمده است، سبک فونت FONT_HERSHEY_SIMPLEX، ضریب مقیاس فونت 1، رنگ آبی، ضخامت دو پیکسل و نوع خط AA نمایش دهید. # نمایش متن روی تصویر print(text) image = cv2.putText(img, text, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
- پنجره ای را با عنوان Face Detection و تصویر نمایش دهید. از روش Waitkey() برای نمایش پنجره به مدت 10 میلی ثانیه استفاده کنید و فشار دادن کلید را بررسی کنید. اگر کاربر کلید Esc (مقدار ASCII 27) را فشار داد، از حلقه خارج شوید. # پنجره خروجی را نمایش دهید و کلید فرار را فشار دهید تا از cv2.imshow خارج شوید (“تشخیص چهره”، تصویر) کلید = cv2.waitKey(10) اگر کلید == 27: شکسته شود
- در نهایت، شی دوربین را از برنامه پایتون رها کنید و تمام windows.cam.release()cv2.destroyAllWindows() را ببندید.
whileTrue:
_, img = cam.read()
text = "Face not detected"
# convert each frame from BGR to Grayscale
grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# detect faces using Haar Cascade
face = haar_cascade.detectMultiScale(grayImg, 1.3, 4)
# draw a rectangle around the face and update the text to Face Detected
for (x, y, w, h) in face:
text = "Face Detected"
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
# display the text on the image
print(text)
image = cv2.putText(img, text, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
# display the output window and press escape key to exit
cv2.imshow("Face Detection", image)
key = cv2.waitKey(10)
if key == 27:
break
cam.release()
cv2.destroyAllWindows()
تشخیص چهره با استفاده از پایتون در عمل
هنگامی که یک چهره در معرض دید است، باید خروجی را مانند این ببینید:
وقتی هیچ چهره ای وجود نداشته باشد، پیامی مانند این را خواهید دید:
محدودیتهای تشخیص چهره با استفاده از الگوریتم آبشار هار
در حالی که این الگوریتم سبک وزن است، با اندازه مدل کوچک و سریع کار می کند، چند محدودیت وجود دارد:
- در یک ویدیوی بلادرنگ، چهره باید در خط دید دوربین باشد. اگر صورت خیلی دور یا نزدیک یا خیلی کج باشد، الگوریتم نمی تواند ویژگی ها را انتخاب کند.
- این یک الگوریتم چهره جلویی است، بنابراین نمی توانید نماهای جانبی را تشخیص دهید.
- نتایج مثبت کاذب بالا اغلب مناطق را به عنوان چهره تشخیص می دهد حتی اگر چهره ای وجود نداشته باشد.
- نیاز به داشتن شرایط نور مطلوب دارد. نور زیاد یا کم، دقت الگوریتم را مختل می کند.
بسیاری از کاربردهای تشخیص چهره
تشخیص چهره در دنیای امروز کاربردهای گسترده ای دارد. می توانید از آن برای تشخیص چهره در گوشی های هوشمند، خانه ها، وسایل نقلیه و پست های بازرسی مهاجرت استفاده کنید. تشخیص چهره در حال حاضر در نظارت دوربین مدار بسته، فیلترهای رسانه های اجتماعی و ردیابی خودکار چهره در فیلمبرداری رایج است.
این تازه شروع این فناوری شگفت انگیز است. با پیشرفتها، ممکن است بتوانیم کودکان گمشده را شناسایی کنیم، مجرمان را دستگیر کنیم و از جرائمی مانند سرقت هویت جلوگیری کنیم.