تشخیص جنسیت و سن افراد با کتابخانه OpenCV
در این مطلب با کمک پایتون و کتابخانه OpenCV به دنبال ارائه روشی برای تشخیص جنسیت و سن افراد هستیم.برای یافتن راه حل ابتدا یک سری پیشنیازهای زیر را شرح میدهیم.
بینایی ماشین چیست؟
بینایی کامپیوتر رشتهای است که کامپیوترها را قادر میسازد تا تصاویر و فیلمهای دیجیتال را مانند یک انسان ببینند و شناسایی کنند. چالشهایی که با آن مواجه است عمدتاً ناشی از درک محدود بینایی بیولوژیکی است. این حوزه شامل به دست آوردن، پردازش، تجزیه و تحلیل و درک تصاویر دیجیتال برای استخراج داده هایی با ابعاد بالا از دنیای واقعی به منظور تولید اطلاعات نمادین یا عددی است. که این اطلاعات سپس می تواند برای تصمیم گیری استفاده شود. این فرآیند اغلب شامل اقداماتی مانند تشخیص شی، ردیابی ویدئو، تخمین حرکت و بازیابی تصویر است.
کتابخانه OpenCV
OpenCV مخفف عبارت Open Source Computer Vision است. به طور شهودی با نام، یک کتابخانه منبع باز کامپیوتر و یادگیری ماشین است. این کتابخانه قادر به پردازش تصویر و ویدئو در زمان واقعی است و در عین حال از قابلیت های تحلیلی نیز برخوردار است. از چارچوب های یادگیری عمیق TensorFlow، Caffe و PyTorch پشتیبانی می کند.
شبکه CNN
شبکه عصبی کانولوشن یک شبکه عصبی عمیق است که به طور گسترده برای اهداف تشخیص و پردازش تصویر و NLP استفاده می شود. همچنین به عنوان ConvNet شناخته می شود، یک CNN دارای لایه های ورودی و خروجی و چندین لایه پنهان است که بسیاری از آنها کانولوشن هستند. به نوعی، CNN ها پرسپترون های چندلایه منظم هستند.
اهداف:
حال میخواهیم یک آشکارساز جنسیت و سن را ایجاد کنیم که بتواند جنسیت و سن فرد ( با کمک چهره) را در یک تصویر با استفاده از یادگیری عمیق در مجموعه داده Adience حدس بزند.
در این پروژه پایتون، ما از یادگیری عمیق برای شناسایی دقیق جنسیت و سن یک فرد از روی یک تصویر واحد استفاده خواهیم کرد. ما از مدل های آموزش دیده توسط تال هاسنر و گیل لوی استفاده خواهیم کرد. جنسیت پیشبینیشده ممکن است یکی از دو دسته «مذکر» و «مونث» باشد. و سن پیشبینیشده ممکن است یکی از محدودههای زیر باشد: (0 – 2)، (4 – 6)، (8 – 12)، (15 – 20) ، (25 – 32)، (38 – 43)، (48 – 53)، (60 – 100) (8 گره در لایه سافت مکس نهایی).
تذکر:به دلیل عواملی مانند آرایش، نور، موانع و حالات چهره، حدس زدن سن دقیق از روی یک تصویر بسیار دشوار است. و بنابراین، ما به جای اینکه آن را به مسئله رگرسیونی تبدیل کنیم، آن را به عنوان یک مسئله طبقه بندی تبدیل میکنیم.
معماری CNN
شبکه عصبی کانولوشن برای این پروژه دارای 3 لایه کانولوشن به صورت زیر است:
- لایه کانولوشنال ؛ 96 گره، اندازه هسته 7
- کانولوشن دوم؛ 256 گره، اندازه هسته 5
- لایه کانولوشنال سوم؛ 384 گره، اندازه هسته 3
همچنین معماری شبکه دارای 2 لایه کاملاً متصل هر کدام با 512 گره و یک لایه خروجی نهایی از نوع softmax میباشد.
برای رسیدن به هدف نهایی شبکه باید قادر به تشخیصهای زیر باشد:
- تشخیص چهره
- طبقه بندی تصاویر به مذکر/مونث
- طبقهبندی به یکی از 8 محدوده سنی
- نتایج را روی تصویر قرار داده و نمایش دهد
دیتاست:
برای این پروژه، از مجموعه داده Adience استفاده خواهیم کرد. مجموعه داده را میتوانید در اینجا پیدا کنید. این مجموعه داده به عنوان معیاری برای عکسهای صورت عمل میکند و شرایط مختلف تصویربرداری در دنیای واقعی مانند نویز، نور، ژست و ظاهر را در بر میگیرد. تصاویر از آلبوم های فلیکر جمع آوری شده و تحت مجوز Creative Commons (CC) توزیع شده اند. در مجموع دارای 26580 عکس از 2284 سوژه در هشت محدوده سنی (همانطور که در بالا ذکر شد) و حجم آن حدود 1 گیگابایت است. مدل هایی که ما استفاده خواهیم کرد بر روی این مجموعه داده آموزش دیده اند.
پیش نیازها
برای اجرای این پروژه باید OpenCV (cv2) را نصب کنید. شما می توانید این کار را با دستور زیر انجام دهید.
pip install opencv-python
مراحل پروژه تشخیص جنسیت و سن
1. این فایل فشرده را دانلود کنید. آن را از حالت فشرده خارج کنید و محتویات آن را در دایرکتوری که gad نامیده می شود قرار دهید.
محتویات این فایل عبارتند از:
برای تشخیص چهره، ما یک فایل pb. داریم – این فایل تعریف گراف و وزن های آموزش دیده مدل را نگه می دارد. ما می توانیم از این برای اجرای مدل آموزش دیده استفاده کنیم. در حالی که فایل pb. protobuf وزنها را در قالب باینری نگه می دارد، و فایل با پسوند pbtxt. آن را در قالب متن نگه می دارد. اینها فایل های تنسورفلو هستند. برای سن و جنسیت، فایلهای prototxt پیکربندی شبکه را توصیف میکنند و فایل caffemodel. حالتهای داخلی پارامترهای لایهها را تعریف میکند.
2. ما از کتابخانه argparse برای ایجاد یک تجزیه کننده آرگومان استفاده می کنیم تا بتوانیم آرگومان تصویر را از خط فرمان دریافت کنیم. ما آن را تجزیه آرگومان می کنیم که مسیر تصویر را برای طبقه بندی جنسیت و سن نگه می دارد.
3. برای صورت، سن و جنسیت، بافر و مدل پروتکل را مقداردهی اولیه کنید.
4. مقادیر میانگین را برای مدل و لیست های محدوده سنی و جنسیت را برای طبقه بندی اولیه تنظیم کنید.
5. اکنون از متد readNet برای بارگذاری شبکه ها استفاده کنید. پارامتر اول وزن های آموزش دیده را نگه می دارد و پارامتر دوم پیکربندی شبکه را حمل میکند.
6. در صورتی که بخواهید در جریان یک وب کم طبقه بندی کنید، اجازه دهید ویدئو را ضبط کنیم. padding را روی 20 تنظیم کنید.
7. اکنون تا زمانی که هر کلیدی فشار داده شود، استریم را می خوانیم و محتوا را به نام hasFrame و frame ذخیره می کنیم. اگر یک ویدیو نیست، باید منتظر بماند، و بنابراین ما WaitKey را از cv2 فراخوانی می کنیم، سپس breakمی کنیم.
8. بیایید با پارامترهای faceNet و frame تابع highlightFace را فراخوانی کنیم و آنچه را که برمیگرداند، در نامهای resultImg و faceBoxes ذخیره میکنیم. و اگر faceBox مقدار صفر را دریافت کند، به این معنی است که هیچ چهره ای برای شناسایی وجود ندارد.
در اینجا، شبکه faceNet است که یک مدل برای آشکارسازی چهره است.
یک کپی ار فریم سطح میسازیم و عرض و ارتفاع زا بدست میآوریم.
یک تکه از سطح ایجاد میکنیم.
ورودی را تنظیم کرده و فاز forward شبکه را میسازیم.
در حال حاضر faceBoxes یک فهرست خالی است. برای هر مقدار در ۰ تا ۱۲۷، ضریب اطمینان(بین ۰ و ۱)را تعریف میکنیم. هر کجا که این ضریب را بیشتر از حد آستانه(مقدار آستانه را 0.7 در نظر گرفتیم) پیدا کنیم، آن را x2، x1،y1،y2 میگیریم .و آنها را به faceBoxes الحاق میکنیم.
سپس، ما مستطیل هایی را روی تصویر برای هر یک از این لیست از مختصات قرار می دهیم. و دو چیز را برمی گردانیم: سطح و لیست faceBoxها.
9. اما اگر واقعاً FaceBoxهایی وجود داشته باشد، برای هر یک از آنها، صورت را تعریف می کنیم. یک تکه 4 بعدی از تصویر ایجاد می کنیم. در انجام این کار، آن را مقیاس می کنیم، اندازه آن را تغییر می دهیم و مقادیر میانگین را برمیگردانیم.
10. ورودی را تغذیه می کنیم و به شبکه را یک پاس رو به جلو میبریم. تا اطمینان دو کلاس را بدست آوریم. هر کدام بالاتر باشد، جنسیت فرد در تصویر است.
11. سپس، ما همین کار را برای سن انجام می دهیم.
12. متن های جنسیت و سن را به تصویر به دست آمده اضافه می کنیم و با imshow نمایش می دهیم.
بررسی نتایج:
بیایید اکنون این طبقهبندی کننده جنسیت و سن را روی برخی از تصاویر خود امتحان کنیم.
اسکریپت خود را با گزینه image اجرا میکنیم و تصویری را برای طبقهبندی مشخص میکنیم:
نمونه اول
نمونه دوم
دیدگاهتان را بنویسید