تشخیص چهره با پایتون، در کمتر از 25 خط کد
- بهدست: Admingfars
- دستهبندی: عمومی خبری
در این مقاله، ما به یک راه شگفتآور ساده برای شروع تشخیص چهره با استفاده از پایتون و کتابخانه منبع باز OpenCV نگاه خواهیم کرد .
قبل از پرسیدن هر گونه سوال در بخش نظرات:
- مقاله را نادیده نگیرید و فقط سعی کنید کد را اجرا کنید. شما باید درک کنید که کد چه کاری انجام می دهد، نه تنها برای اجرای صحیح آن، بلکه برای عیب یابی آن.
- حتما از OpenCV v2 استفاده کنید.
- یک وب کم کارآمد داشته باشید تا این اسکریپت بتواند به درستی کار کند.
- نظرات و سؤالات دیگر را مرور کنید، زیرا احتمالاً سؤالات شما قبلاً پاسخ داده شده است.
متشکرم.
OpenCV
OpenCV محبوب ترین کتابخانه برای بینایی کامپیوتر است. در ابتدا به زبان C/C++ نوشته شده بود، اکنون اتصالاتی را برای پایتون فراهم می کند.
OpenCV از الگوریتمهای یادگیری ماشین برای جستجوی چهرهها در تصویر استفاده میکند. از آنجایی که چهره ها بسیار پیچیده هستند، یک آزمایش ساده وجود ندارد که به شما بگوید آیا چهره ای پیدا کرده است یا نه. در عوض، هزاران الگو و ویژگی کوچک وجود دارد که باید مطابقت داشته باشند. الگوریتمها وظیفه شناسایی چهره را به هزاران کار کوچکتر و کوچکتر تقسیم میکنند که حل هر یک از آنها آسان است. به این وظایف طبقه بندی کننده نیز گفته می شود .
برای چیزی مانند یک چهره، ممکن است 6000 یا بیشتر طبقه بندی کننده داشته باشید، که همه آنها باید برای شناسایی یک چهره مطابقت داشته باشند (البته در محدوده خطا). اما مشکل اینجاست: برای تشخیص چهره، الگوریتم از سمت چپ بالای یک تصویر شروع میشود و در بلوکهای کوچک داده به پایین حرکت میکند، به هر بلوک نگاه میکند و دائماً میپرسد: «آیا این یک چهره است؟ … آیا این یک چهره است؟ … آیا این یک چهره است؟ از آنجایی که 6000 تست یا بیشتر در هر بلوک وجود دارد، ممکن است میلیون ها محاسبات برای انجام دادن داشته باشید، که کامپیوتر شما را متوقف می کند.
برای دور زدن این موضوع، OpenCV از آبشارها استفاده می کند . آبشار چیست؟ بهترین پاسخ را می توان در فرهنگ لغت یافت : “یک آبشار یا مجموعه ای از آبشارها”.
مانند مجموعه ای از آبشارها، آبشار OpenCV مشکل تشخیص چهره را به چند مرحله تقسیم می کند. برای هر بلوک، یک آزمایش بسیار خشن و سریع انجام می دهد. اگر قبول شد، آزمایش کمی دقیق تری انجام می دهد و غیره. این الگوریتم ممکن است 30 تا 50 مورد از این مراحل یا آبشارها را داشته باشد و تنها در صورت گذراندن همه مراحل، چهره را تشخیص می دهد.
مزیت این است که اکثر تصویر در چند مرحله اول منفی می شود، به این معنی که الگوریتم زمان را برای آزمایش تمام 6000 ویژگی روی آن تلف نمی کند. به جای ساعت ها وقت گذاشتن، تشخیص چهره اکنون می تواند در زمان واقعی انجام شود
آبشارها در عمل
اگرچه ممکن است این نظریه پیچیده به نظر برسد، اما در عمل بسیار آسان است. خود آبشارها فقط دستهای از فایلهای XML هستند که حاوی دادههای OpenCV هستند که برای شناسایی اشیا استفاده میشوند. کد خود را با آبشاری که میخواهید مقداردهی اولیه میکنید و سپس آن کار را برای شما انجام میدهد.
از آنجایی که تشخیص چهره یک مورد رایج است، OpenCV با تعدادی آبشار داخلی برای تشخیص همه چیز، از صورت گرفته تا چشم ها، دست ها و پاها ارائه می شود. حتی آبشارهایی برای چیزهای غیر انسانی وجود دارد. به عنوان مثال، اگر شما یک مغازه موز دارید و می خواهید افرادی را که موز می دزدند ردیابی کنید، این مرد یکی را برای آن ساخته است!
نصب OpenCV
ابتدا باید فایل راه اندازی صحیح سیستم عامل خود را پیدا کنید .
من متوجه شدم که نصب OpenCV سخت ترین قسمت کار است. اگر خطاهای عجیب غیرقابل توضیحی دریافت می کنید، ممکن است به دلیل برخوردهای کتابخانه، تفاوت های 32/64 بیتی و غیره باشد. به نظرم سادهترین کار این است که فقط از یک ماشین مجازی لینوکس استفاده کنم و OpenCV را از ابتدا نصب کنم.
پس از اتمام نصب، می توانید با راه اندازی یک جلسه پایتون و تایپ کردن، تست کنید که آیا کار می کند یا خیر:
>>> import cv2 >>>
اگر هیچ خطایی دریافت نکردید، می توانید به قسمت بعدی بروید.
درک کد
بیایید کد واقعی را که می توانید از مخزن بارگیری کنید، تجزیه کنیم . اسکریپت face_detect.py ، عکس abba.png و haarcascade_frontalface_default.xml را بگیرید .
# Get user supplied values imagePath = sys.argv[1] cascPath = sys.argv[2]
ابتدا نام تصویر و آبشار را به عنوان آرگومان های خط فرمان ارسال می کنید. ما از تصویر ABBA و همچنین آبشار پیشفرض برای تشخیص چهره ارائه شده توسط OpenCV استفاده خواهیم کرد.
# Create the haar cascade faceCascade = cv2.CascadeClassifier(cascPath)
اکنون آبشار را ایجاد می کنیم و آن را با آبشار چهره خود مقداردهی اولیه می کنیم. این آبشار چهره را در حافظه بارگیری می کند تا برای استفاده آماده شود. به یاد داشته باشید، آبشار فقط یک فایل XML است که حاوی داده هایی برای تشخیص چهره است.
# Read the image image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
در اینجا ما تصویر را می خوانیم و آن را به مقیاس خاکستری تبدیل می کنیم. بسیاری از عملیات در OpenCV در مقیاس خاکستری انجام می شود.
# Detect faces in the image faces = faceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags = cv2.cv.CV_HAAR_SCALE_IMAGE )
این تابع چهره واقعی را تشخیص میدهد و بخش کلیدی کد ما است، بنابراین اجازه دهید به گزینهها بپردازیم:
- تابع یک تابع کلی است که اشیا را تشخیص می دهد
detectMultiScale
. از آنجایی که ما آن را روی آبشار چهره می نامیم، این همان چیزی است که تشخیص می دهد.- اولین گزینه تصویر خاکستری است.
- دومی است
scaleFactor
. از آنجایی که برخی از چهرهها ممکن است به دوربین نزدیکتر باشند، بزرگتر از چهرههای پشت به نظر میرسند. ضریب مقیاس این را جبران می کند.- الگوریتم تشخیص از یک پنجره متحرک برای تشخیص اشیا استفاده می کند.
minNeighbors
تعیین می کند که قبل از اینکه چهره پیدا شده را اعلام کند، در نزدیکی شیء فعلی شناسایی شده است.minSize
در همین حال، اندازه هر پنجره را می دهد.توجه: من برای این فیلدها مقادیری را که معمولاً استفاده می شود گرفتم. در زندگی واقعی، شما با مقادیر مختلف برای اندازه پنجره، ضریب مقیاس و غیره آزمایش می کنید تا زمانی که یکی را پیدا کنید که بهترین کار را برای شما دارد.
تابع لیستی از مستطیل ها را برمی گرداند که معتقد است در آن صورت پیدا کرده است. در مرحله بعد، جایی را که فکر میکند چیزی پیدا کرده است بررسی میکنیم.
print "Found {0} faces!".format(len(faces)) # Draw a rectangle around the faces for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
این تابع 4 مقدار را برمیگرداند:
x
وy
مکان مستطیل، و عرض و ارتفاع مستطیل (w
,h
).ما از این مقادیر برای رسم مستطیل با استفاده از تابع داخلی استفاده می کنیم
rectangle()
.cv2.imshow("Faces found", image) cv2.waitKey(0)
در پایان تصویر را نمایش می دهیم و منتظر می مانیم تا کاربر کلیدی را فشار دهد.
بررسی نتایج
بیایید در برابر عکس ABBA تست کنیم:
$ python face_detect.py abba.png haarcascade_frontalface_default.xml
این کار کرد. عکس دیگر چطور:
که … یک چهره نیست. بیایید دوباره تلاش کنیم. من پارامترها را تغییر دادم و متوجه شدم که با تنظیم روی
scaleFactor
1.2 از شر چهره اشتباه خلاص شدم.چی شد؟
خب، اولین عکس نسبتا نزدیک با دوربینی با کیفیت بالا گرفته شده است. به نظر می رسد دومی از دور و احتمالاً با تلفن همراه گرفته شده است. به همین دلیل است که
scaleFactor
باید اصلاح شود. همانطور که گفتم، شما باید الگوریتم را به صورت موردی تنظیم کنید تا از مثبت کاذب جلوگیری کنید.البته هشدار داده شود که از آنجایی که این مبتنی بر یادگیری ماشینی است، نتایج هرگز 100٪ دقیق نخواهد بود. در بیشتر موارد به اندازه کافی نتایج خوبی دریافت خواهید کرد، اما گاهی اوقات الگوریتم اشیاء نادرست را به عنوان چهره شناسایی می کند.
کد نهایی را می توانید در اینجا پیدا کنید .
گسترش به وب کم
اگر بخواهید از وب کم استفاده کنید چه؟ OpenCV هر فریم را از وب کم می گیرد و سپس می توانید با پردازش هر فریم چهره ها را شناسایی کنید. شما به یک کامپیوتر قدرتمند نیاز دارید، اما به نظر می رسد لپ تاپ پنج ساله من به خوبی از عهده این کار بر می آید، تا زمانی که من زیاد در اطراف برقص نباشم.
بدون دیدگاه