تشخیص بلادرنگ زنده بودن چهره با Python ، Keras و OpenCV

سیستم های تشخیص چهره موجود در اینترنت و مقالات پژوهشی از حملات عکس (نشان دادن عکس چهره بجای چهره ی واقعی فرد) در امان نیستند. این روش ها در تشخیص و شناسایی چهره ها در تصاویر، فیلم ها و جریان ‌های ویدئویی از وبکم و دوربین ها بسیار خوب عمل می کنند. با این حال، آن ها نمی توانند بین چهره های زنده واقعی و چهره های موجود در عکس ، تمایز قائل شوند. این ناتوانی در تشخیص چهره ها به این دلیل است که این الگوریتم ها روی فریم های ۲ بعدی کار می کنند.

حال بیایید تصور کنیم که می خواهیم یک درب بازکن با تشخیص چهره را پیاده سازی کنیم. این سیستم برای تمایز بین چهره های تعریف شده و چهره های ناشناخته به خوبی کار خواهد کرد تا فقط افراد مجاز به آن دسترسی داشته باشند. با این وجود، ورود یک فرد با نیت بد، فقط با نشان دادن عکس شخص مجاز، امکان پذیر خواهد بود. اینجاست که تشخیص دهنده های سه بعدی، مثل FaceID اپل ، وارد بازی می شوند. اما اگر تشخیص دهنده های سه بعدی نداشته باشیم چه؟

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

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

  1. شناسایی چهره ها در هر فریم تولید شده توسط وبکم
  2. تشخیص چشم ها، برای هر چهره شناسایی شده
  3. تشخیص باز یا بسته بودن چشم ها، برای هر چشم شناسایی شده
  4. اگر در یک لحظه، تشخیص داده شد که چشم ها باز هستند، و سپس بسته و سپس باز می شوند، نتیجه می گیریم که فرد پلک می زند و برنامه نام آن شخص را نمایش می دهد ( در مورد درب بازکن تشخیص چهره ، به شخص اجازه ورود می دهیم ).

برای تشخیص و شناسایی چهره ها،  باید کتابخانه face_recognition  را نصب کنید که راهکار های یادگیری عمیق بسیار مفیدی را برای تشخیص و شناسایی چهره ها در تصویر ارائه می دهد. بویژه، ۳ تابعFace_locations  ، Face_encodings و compare_faces بسیار کاربردی هستند. روش Face_locations می تواند چهره ها را با استفاده از دو روش تشخیص دهد : هیستوگرام گرادیان های جهت دار ( HoG ) و شبکه عصبی کانولوشنی ( CNN ) . به دلیل محدودیت های زمانی ، در این آموزش روش HoG انتخاب شده است. تابع face_encodings یک شبکه عصبی کانولوشنی از قبل آموزش دیده است و می تواند یک تصویر را به یک بردار از ۱۲۸ ویژگی تبدیل ( کدنگاری ) کند. این بردار تجمیع شده باید اطلاعات کافی را برای تمایز بین دو شخص مختلف ارائه دهد. در نهایت، compare_faces  فاصله بین دو بردار تعبیه را محاسبه می کند. این کار به الگوریتم این امکان را می دهد که چهره استخراج شده از یک فریم وبکم را تشخیص داده و بردار تعبیه آن را با تمام چهره های کدنگاری شده در مجموعه داده ما مقایسه کند. نزدیکترین بردارها باید مربوط به همان شخص باشد.

۱- کدنگاری مجموعه داده تعریف شده چهره

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

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

۲- تشخیص زنده بودن چهره

به عنوان یک یادآوری، هدف تشخیص یک الگوی چشم باز-بسته-باز در یک لحظه است. ما یک شبکه عصبی کانولوشنی را آموزش دادیم تا کلاسه بندی کند که آیا چشم بسته است یا باز. مدل انتخاب شده LeNet-5 است که در مجموعه داده های Closed Eyes In The Wild (CEW) آموزش داده شده و از حدود ۴۸۰۰ تصویر چشم در اندازه ۲۴×۲۴ تشکیل شده است.

هنگام ارزیابی این مدل، به دقت ۹۴ % رسیدیم.

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

۳- تشخیص چهره افراد زنده

تقریباً همه المان های تنظیم الگوریتم تشخیص چهره واقعی خود را در اختیار داریم. ما فقط به یک روش برای تشخیص بلادرنگ چهره ها و چشم ها نیاز داریم. برای انجام این کار ها از کلاسه بند از قبل آموزش دیده Haar-cascade openCV استفاده کردیم. برای اطلاعات بیشتر در مورد تشخیص چهره و چشم با استفاده از Haar-cascade ، توصیه می کنیم این مقاله عالی را از OpenCV بخوانید.

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

  • model : کلاسه بند چشم باز / بسته ما
  • video_capture  : یک جریان ویدئویی
  • face_detector  : یک کلاسه بند چهره Haas-cascade . ما از xml استفاده کردیم
  • open_eyes_detector : یک کلاسه بند چشم باز  Haas-cascade. ما از xml استفاده کردیم
  • left_eye_detector : یک کلاسه بند چشم چپ Haar-cascade. ما از haarcascade_lefteye_2 splits.xml استفاده کردیم که می تواند چشم باز یا بسته را تشخیص دهد.
  • right_eye_detector : یک کلاسه بند چشم راست Haar-cascade. ما از xml استفاده کردیم که می تواند چشم های باز یا بسته را تشخیص دهد.
  • data : مستنداتی از کدنگاری های تعریف شده و اسامی تعریف شده
  • eyes_detected : مستنداتی حاوی سابقه وضعیت چشم برای هر نام.

در خطوط ۴-۲ یک فریم را از جریان وبکم می گیریم و برای سرعت بخشیدن به محاسبات، اندازه آن را تغییر می دهیم. در خط ۱۰ چهره ها را از فریم تشخیص می دهیم ، سپس در خط ۲۱ ، آن ها را در یک بردار -d128 کد می کنیم. در خط ۳۸-۲۳ این بردار را با کدنگاری چهره های تعریف شده مقایسه می کنیم و با شمارش تعداد موارد منطبق، نام شخص را تعیین می کنیم. موردی که بیشترین تعداد منطبق و همخوان را داشته باشد انتخاب می شود. با شروع خط ۴۵ سعی می کنیم از درون کادر های چهره ، چشم ها را تشخیص دهیم.

ابتدا سعی می کنیم چشم های باز را با open_eye_detector تشخیص دهیم. اگر تشخیص دهنده موفق شود، در خط ۵۴، ‘۱’ به سابقه وضعیت چشم اضافه می شود، به این معنی که چشم ها باز هستند، زیرا open_eye_detector نمی تواند چشم بسته را تشخیص دهد.

درغیر این صورت، اگر کلاسه بند اول موفق نشد، (شاید به دلیل بسته بودن چشم ها یا به دلیل اینکه چشم ها را تشخیص نمی دهد) از تشخیص دهنده های left_eye  و right_eye  استفاده می شود. چهره به نیمه چپ و راست جدا از هم تقسیم می شود تا با تشخیص دهنده های مربوطه، کلاسه بندی شود. با شروع خط ۹۲، قسمت چشم استخراج می شود و مدل آموزش دیده پیش بینی می کند که آیا چشم ها بسته هستند یا نه.

اگر یک چشم بسته تشخیص داده شود، آنگاه پیش بینی می شود هر دو چشم بسته باشد و یک ‘۰’ به سابقه وضعیت چشم اضافه می شود. درغیراینصورت، نتیجه گیری می شود که چشم ها باز هستند. درنهایت در خط ۱۱۰ از تابع isBlinking ()  برای تشخیص پلک زدن استفاده می شود و اگر فرد پلک بزند، نامش نمایش داده می شود. کد کامل را می توانید طریق github دریافت کنید.

بیشتر بخوانید :

درباره‌ی امیر اقتدائی

همچنین ببینید

دستاورد های هوش مصنوعی 2020

۵ دستاورد برتر هوش مصنوعی در سال ۲۰۲۰

هوش مصنوعی در سال ۲۰۲۰ پیشرفت چشمگیری داشته است، جهان موفقیت های بسیاری در حوزه …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *