آموزش تشخیص چهره با OPENCV در پایتون

مدتیه که بحث تشخیص چهره و شناسایی چهره( این دوتا باهم فرق دارن) ذهنمو مشغول کرده و ازش خوشم اومده در طول مطالعه ها و تحقیقاتم گفتم بد نیست که چیزایی که یاد میگیرم و پیدا میکنم اینجام بذارم 😃

تو این مطلب میخوایم به شکل باحال و ساده ای شروع به تشخیص چهره با پایتون و OpenCV کنیم

قبل از اینکه آموزش رو مطالعه کنید :

۱- متن هارو رد نکنید و سریع برید سراغ کد ها 😒شما باید بدونید کد ها دقیقاً چیکار میکنن ، نه فقط برای اجرای درست اونا بلکه برای ایراد یابی و رفع اونها

۲- دقت کنید که از آخرین نسخه OpenCV استفاده میکنید الان که این متنو مینویسم ، نسخه ۳

۳- یه وب کم که کار میکنه برای اجرای این اسکریپت داشته باشید(آموزش بعدی )

۴- حتماً سوالاتون رو بپرسید ، و در یادگیری مشترک سهیم بشین

باتشکر

OpenCv

OpenCv محبوب ترین و پراستفاده ترین کتابخانه برای بینایی کامپیوتری هست. با زبان های C++/C نوشته شده و الانم یه نسخه برای پایتون داره.

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

الگوریتم ها مراحل و فرایند تشخیص چهره رو به هزاران کار کوچیک و کوچیکتر تقسیم میکنن که اینجوری خیلی راحت تر حل میشن (جابجایی ۲۰۰ کیلو وزنه تکه تکه راحت تره یا یکجا؟)

این وظایف و فرآیند هارو طبقه بندی(رده بندی) صدا میزنیم ( classifiers) ، البته به نظرم این ترجمه درست نیست ، اگه ترجمه درست تری ازش میدونید بگید.

برای یه چیزی شبیه چهره شما باید ۶۰۰۰! طبقه بندی داشته باشید که همه اونها باید در تشخیص یک چهره پیدا بشن ( البته همراه با خطاهایی محدودی هست).

ولی یه مشکل اینجا داریم !😐 : برای تشخیص چهره الگوریتم از سمت چپ و بالای تصویر شروع به کار میکنه و روبه پایین دراطراف بلوک های کوچیکی از داده ها حرکت میکنه ، به هر بلوک نگاه میکنه و هربار از خودش میپرسه” این یه چهره هست ؟؟… این یه چهره هست ؟؟… این یه چهره هست ؟؟ ” از اونجایی که توی هر بلوک طبق چیزی که بالا تر گفتیم باید ۶۰۰۰ تست روی بلوک انجام بشه ممکنه شما میلیون ها محاسبه انجام بدید که این میلیون ها محاسبه احتمالاً سیستمتون رو به فنا میده !

برای حل این مشکل OpenCV از آبشارها (cascades) استفاده میکنه . ولی آبشار چیه ؟ منم نمیدونم 😂😂ولی تو فرهنگ لغت میشه ” یک آبشار یا مجموعه ای از آبشارها”

مثل یک سری از آبشارها، آبشار OpenCV مشکل تشخیص چهره رو به چندین مرحله میشکنه ( تقسیم میکنه).

برای هر بلوک، یک آزمایش بسیار دقیق(به قول بچه ها سفت) و سریع انجام میشه . اگر قبول بشه ، بعدش یه آزمایش دقیق تر انجام میشه ، و غیره…

الگوریتم ممکنه ۳۰ تا ۵۰ تا از این مراحل و آبشار ها داشته بشه و تشخیص چهره ما فقط زمانی انجام میشه که این مراحل و آبشار ها با موفقیت انجام بشن .

مزیت این روش اینه که توی یه تصویر اکثر بلوک ها رد میشن ( چون با اون تست هایی سفتی و سریعی که ما میگیریم منطبق نیستن)، واین به این معناست که الگوریتم کلی وقت برای آزمایش ۶۰۰۰! و یژگی مورد نظر نمیزاره و این میتونه بجای گرفتن ساعتها وقت در فرایند تشخیص چهره اونو به کاری لحظه ای ( real time) تبدیل کنه

آبشار ها در عمل

ممکنه که از لحاظ تئوری سخت باشن ولی در عمل ساده هستن ! خود آبشار ها دسته ای از فایل های XMl هستن که حاوی داده های OpenCv مورد استفاده برای شناسایی اشیاء هستن .

ما کد هامون رو با استفاده از آبشار هایی که میخوایم راه اندازی میکنیم و اونم کاری که ما ازش خواستیم انجام میده .

ازاونجایی که تشخیص چهره یه کار معمول هست ، OpenCv همراه خودش آبشار های ساخته شده ای برای تشخیص دست ها ، پاها ، چشم ها و… رو داره .

حتی آبشار هایی برای چیز های غیر انسانی مثل ماشین ، حیوان و… وجود داره . مثلاً اگه میخواید از این فناوری توی موز فروشی برای تشخیص دزدی موز استفاده کنید ، این کتابخونه میتونه هم موز ، هم آقا دزده رو تشخیص بده و دهنش رو سرویس کنه.( شمام مثل من فکرتون رفت تو کاربرد های این علم ؟😃)

نصب OpenCv

خب اول که حتما ً آخرین نسخه پایتون رو همراه خودش pip رو داره نصب کردید!( نگو نمیدونم پایتون و pip چیه 😐)

نصب opencv در ویندوز

ساده ترین و تمیزترین روش نصب ماژول opencv بر روی ویندوز استفاده از pip هست
در صورتی که استفاده از دستور pip را نمی دانید، یه سرچ کنید !

البته چند راه برای نصبش وجود داره که ما از طریق pip میریم جلو.

روش اول استفاده از pip

در این روش کافیه که دستور زیر رو تو cmd ویندوز وارد کنید . اما نکته ای که مهم است، در نظر داشتن اینه که باید برای استفاده از opencv حتما ماژول numpy هم نصب باشه.

اینجوری :

 

با کد بالا ماژول numpy نصب میشه .

کد زیر هم برای نصب opencv :

 


برای اطمینان از اینکه آیا opencv نصب شده یا نه میتونید در cmd تایپ کنید pythonتا مفسر اون در CLI نمایش داده بشه. بعدش با اضافه کردن ماژول با استفاده از import opencv در صورت نگرفتن هشدار و یا خطا میتونید مطمئن بشین که نصب شده و اگه که می خواهید ورژن نسخه نصب شده رو ببینید از دستور print(cv2.__version__) استفاده کنید.

درک کد ها 

 

خب بریم سراغ کد های واقعی و درگیری با اونها هرکدوم از کدها و فایل ها رو میتونید از این مخزن دانلود کنید 

اول از همه باید کتابخونه های مورد نیاز رو ایمپورت کنیم:

و بعدش 

اول از همه ما باید تصویر و آیشار مورد نطر رو به OpenCV معرفی کنیم ، ما از تصویر ABBA و آبشار haarcascade_frontalface_default  ارائه شده توسط OpenCv  استفاده میکنیم. دو تا خط بالا اسم تصویر و آبشار رو از طریق خط فرمان میگیره .

حالا یک آبشار را ایجاد می کنیم و اونو با آبشاری که تو خط فرمان بهش معرفی میکنیم مقدار دهی میکنیم. این کار آبشار چهره رو در حافظه ذخیره میکنه . بنابراین آماده استفاده است. یادون باشه ، آبشار تنها یک فایل XML هست که حاوی اطلاعات برای تشخیص چهره است. 

در  کد بالا ما تصویر را میخونیم  و به سیاه و سفید تبدیل می کنیم. بسیاری از عملیات ها در OpenCV درحالت سیاه سفید انجام میشه .

این تابع چهره واقعی رو تشخص میده بنابر این بخش اصلی برنامه ماست پس به موارد زیر دقت کنید :

  1. detectMultiScale تابع اصلی هست که اشیاء رو تشخیص میده .
  2. مورد اول تصویر سیاه و سفید شده است (gray)
  3. دومین مورد فاکتور مقیاس هست(scaleFactor) ، از اونجایی که بعضی چهره  به دوربین نزدیک هستن ممکنه از چهره های عقبی  بزرگتر دیده بشن ، فاکتور مقیاس برای رفع این مشکل هست .
  4. الگوریتم تشخیص از یک پنجره متحرک برای تشخیص اشیا استفاده میکنه. minNeighbors تعریف میکنه  که چندتا  از اشیاء در نزدیکی فعلی تشخیص داده بشه قبل از اینکه چهره پیدا بشه . minSize،نیز ، اندازه هر پنجره را مشخص میکنه

نکته : 

تابع بالا لیستی از مستطیل هارو که به نظر میرسه چهره باشه برمیگردونه ، بعدش یه حلقه از این مستطیل ها ایجاد خواهیم کرد 

 

این تابع ۴ مقدار برمیگردونه : موقعیت x و y مستطیل و عرض و ارتفاع مستطیل (w، h).

ما از این مقادیر برای رسم یک مستطیل با استفاده از تابع  آماده مستطیل در پایتون  استفاده می کنیم.

در آخر هم تصویر رو نمایش میدیم ، و منتظر میمونیم که کاربر کلید خروج رو بزنه.

اجرای برنامه 

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

و میبینید که ۴ تا چهره رو تشخیص داد.

انشاالله تو آموزش بعدی میریم که تصویر وب کم رو بجای عکس به ورودی بدیم پس باماباش با خودتم باش.

 

محمد قبادی

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

مطالب مرتبط
نظرات ( ۶ )
  1. امیرحسین آقاجانی
    اردیبهشت ۲۲, ۱۳۹۸ at ۱۱:۵۳ ق.ظ
    پاسخ

    سلام، چطوری میشه کاری کرد که بشه درب ساختمون رو با این تشخیص دادن برای افراز مجاز باز کرد ؟

    • محمد قبادی
      محمد قبادی
      اردیبهشت ۲۳, ۱۳۹۸ at ۱:۱۸ ق.ظ
      پاسخ

      سلام ، خیلی خلاصه عرض میکنم :
      ۱- طراحی یک دیتاست از افرادی که قرار است مجاز باشند ( به روش های گوناگون میتوان این دیتاست رو جمع آورری کرد)
      ۲- آموزش شبکه عصبی توسط این دیتاست و دخیره چهره های دلخواه و مجاز در پایگاه داده
      ۳- نوشتن برنامه پایگاه داده برای مقایسه چهره تشخص داده شده با چهره ذخیره شده
      ۴- دستورات لازم برای عملیات های مختلف

  2. امیرحسین آقاجانی
    اردیبهشت ۲۳, ۱۳۹۸ at ۳:۴۲ ب.ظ
    پاسخ

    شما انجام میدین؟ چقدر هزینه داره ؟ (بدون در نظر گرفتن هزینه تجهیزات فیزیکیش)

    • محمد قبادی
      محمد قبادی
      خرداد ۱۰, ۱۳۹۸ at ۱:۵۶ ب.ظ
      پاسخ

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

  3. soheil
    خرداد ۲, ۱۳۹۸ at ۲:۱۵ ب.ظ
    پاسخ

    آموزش عالیی بود . زبان آموزشت بی نظیره.
    چرا کد ((print “Found {0} faces!”.format(len(faces
    رو برای من خطا میگیره ؟ اصلا این کد چی میگه؟

    • محمد قبادی
      محمد قبادی
      خرداد ۱۰, ۱۳۹۸ at ۱:۵۸ ب.ظ
      پاسخ

      این کد نشون میده چندتا چهره تو تصویر پیدا شد. چه خطایی بهتون میده؟

ارسال یک نظر