چندین ماه پیش، به برنامهنویسی در حوزه بینایی ماشین و پردازش تصویر علاقمند شدم که خب احتمالا اکثر شما دوستانم در جریانش باشید. یکی از دلایلی که سمت چنین چیزی رفتم، حقیقتا سریال Person of Interest بود (که از صدا و سیمای ایران با نام «مظنون» پخش شده) و در اون «ماشین» میتونست آدمها رو تشخیص بده.
در دوران قرنطینه هم، تماشای فیلمهای دنیای سینمایی مارول و علاقمندی شخصی من به شخصیت تونی استارک باعث شد که بیش از پیش به این حوزه علاقمند شم چون که استارک هم با تکنولوژی مشابهی میتونست تهدیدات و ... رو شناسایی کنه (البته از زیباییهای جارویس و فرایدی که بگذریم).
خلاصه اینجا، به خودم آمدم و دیدم که خیلی از مفاهیم و پایههای پردازش تصویر و حتی بینایی ماشین رو یاد گرفتم و با خودم گفتم، چرا یک چیز کاربردی ازش نسازم؟ و این طوری شد که ایدههای فراوانی به ذهنم رسیدند. در ادامه، کم کم با ایدهها آشنا خواهیم شد.
در دنیای آنلاین، یکی از اهداف اینه که همه به حد خوبی از برابری برسند. این برابری، در برخورداری از حقوق یکسان در استفاده از سرویسهای آنلاین (که خب متاسفانه تحریم، فیلتر و ... چیزایین که مانعش میشن) شروع میشه و تا «امکان استفاده با هر شرایط جسمی و ذهنی» ادامه پیدا میکنند.
محققین کاربردپذیری، یکی از کارهاشون اینه که بیان بسنجن که یک سرویس، تا چه حد میتونه برای شخصی که معلولیت، کمتوانی یا ناتوانی خاصی داره مورد استفاده قرار بگیره.
بگذارید کمی مثال رو بهتر بزنم. مثلا وقتی شما بخواهید در شبکه اجتماعی توییتر، یک ایموجی به اسمتون اضافه کنید به هشداری برمیخورید که میگه «صفحهخوانها نمیتونن ایموجیها رو درست تشخیص بدند و یا ممکنه برای افرادی که از صفحهخوان استفاده میکنند مشکل ایجاد کنند در فهم اسم شما».
حالا موضوع اینجاست که مثلا ? رو یک صفحهخوان به صورت Heart eyes میخونه (البته از اسم مطمئن نیستم) و مثلا Muhammadreza ? Haghiri رو به شکل Muhammadreza Heart Eyes Haghiri میخونه و دوستی که به هردلیلی، مثل نابینایی، کوررنگی، کمبینایی و ... مجبور به استفاده از صفحهخوانه نمیتونه درست بفهمه که اسم من چیه.
مورد دیگر هم اینه که در توییتر و لینکدین، شما میتونید alternate text برای عکسها قرار بدید. این موضوع چی میگه؟ این موضوع میگه «بیا عکس رو توصیف کن که صفحهخوان بیاد و این رو برای شخص بخونه. در بسیاری از عکسهای تزیینی ممکنه این امر مهم نباشه، ولی اگر قراره این عکس، ربطی به متن موضوع داشته باشه بهتره که این قسمت هم پر بشه.
خلاصه تلاش ما اینه که نرمافزارها بیش از پیش، برای «همه» قابل استفاده بشن و تحقیقات کاربردپذیری هم بخش بزرگی از این امر هستند.
خب فکر کنم حالا لازمه که به پروژه خودم برسیم :) پروژه زبان اشاره که به افرادی که نیازمند مترجم همزمان زبان اشاره بودند کمک میکرد که بتونن حروف اشاره رو به دیگران نشان بدن و نیازی به کمک شخص ثالثی نباشه.
سلب ادعا: این پروژه صرفا آزمایش و تفریح بود و تا حد زیادی از چیزایی که در این پروژه میبینید، کاربرد دنیای واقعیشون پایینتر از چیزیه که حتی فکرش هم کنید. چنانچه میتونید به من کمک کنید که برای زبان اشاره پویا هم سیستم مشابهی درست کنم، ممنون میشم در بخش نظرات اعلام کنید.
به طور کلی، هرپروژه علوم داده و هوش مصنوعی، چنین پروسهای رو طی میکنه تا به نتیجه برسه:
خب بیاییم این پروسه رو اینجا ببینیم با هم. از طرح مسالهمون شروع کنیم و سپس برسیم به اصل موضوع که میشد همون قضیه مدلی که حروف اشاره رو تشخیص بده.
مساله ما اینجا اینه که «چطور میتونیم به کمک یک نرمافزار، به صورت همزمان زبان اشاره رو ترجمه کنیم؟». خب، قراره به این نیاز خاص پاسخ بدیم. یکی از پروسههای خیلی مرسوم و البته الزامی هر تحقیق علمیای، طرح سوالاته.
سوالات ما به این شکل میشن که:
و خب این سوالات رو من به این صورت تونستم براشون پاسخ پیدا کنم:
پس نتیجه این شد که:
یک نرم افزار تشخیص حروف اشاره (یا همون زبان اشاره ایستا) ساخته شه که از روی حرکات دست بتونه حرف الفبا رو نشان بده و به اشخاص در درک بهتر زبان اشاره کمک کنه.
حالا وقتشه بریم سروقت مرحله دوم :)
جمعآوری داده در پروژههای هوش به شدت مهمه. در حدی که حتی پیشتر در این مطلب از وبلاگ شخصیم مفصلا در موردش نوشته بودم. اما خب اینجا قرار بود که دادهها مرتبط با دست باشن. چیزی که دوست داشتم بدونم اینه که آیا حتما باید داده تصویری باشه؟
جواب خیر بود :) لایبرری خاصی به اسم mediapipe وجود داره که به شما کمک میکنه تا مختصات ۲۱ نقطه از دستتون رو پیدا کنید به این شکل:
و این مختصات هم همونطوری که حدس زدید، به شکل مختصات عددی بودند و چی از این بهتر؟ هرقدر دیتا سادهتر، ترین کردن یک مدل هم سادهتر میشه.
اما هنوز یک مشکل بزرگ دیگر وجود داشت. این که چطور میتونم حروف اشاره فارسی رو یاد بگیرم؟ خب اینجا دوستی به کمکم آمد. خانم آرزو زمانی که قبلتر خودشون هم پروژهای به این شکل انجام داده بودن، این راهنما رو برای من فرستادن:
مرحله بعدی این بود که یه حجم خوبی از دیتای دست رو هم بگیرم. پس چه کار کردم؟ یک اسکریپت ساده پایتون نوشتم و با استفاده از کتابخونه OpenCV و همچنین وبکم لپتاپم، دیتا رو در یک CSV خاص ذخیره کردم.
بعد از اون، با استفاده از متدهای یادگیری ماشین کلاسیک (و نه عمیق) و کتابخونه scikit learn شروع به آموزش یک مدل کردم و خب نتیجه رو میتونید در اولین تصویر این مقاله ببینید :)
پس از نوشتن کدهای لازم، کدی نوشتم که مدل آموزشدیده رو لود کنه، سپس عکسها رو با mediapipe پردازش کنه، مختصات دست رو بگیره و اون رو به مدل بده. در نهایت، مدل هم باید پیشبینی میکرد که این کدوم یکی از حروف اشاره فارسیه.
شما رو نمیدونم ولی من جدی جدی، طرفدار هرچیزی هستم که نیاز به نصب نداشته باشه و در وب هم قابل استفاده باشه. پس چی بهتر از این که یک وب اپ نوشته شه که امکان آزمایش این مدل رو به همه بده؟ به همین خاطر یه وب اپ کوچولوی پایتونی نوشتم و در این آدرس هاستش کردم.
الان شما هم میتونید تشریف ببرید و ازش استفاده کنید و به من فیدبک بدید.
سورس کد پروژه فارسی هنوز منتشر نشده، ولی اگر خیلی مشتاق هستید که ببینید چه پروسهای در کل طی شده، میتونید در گیتهاب من، سورس کد پروژه مشابه برای حروف انگلیسی رو ببینید:
در کل، پروژههای کاربردپذیری برای من جالبن. این که چطور میشه یک نرمافزار بسیار بسیار ساده رو طوری تغییر داد که همون سادگی رو برای همه حفظ کنه، پروسه سخت و در عین حال لذتبخشیه. پروژه بالا، یکی از پروژههای شاید بگم اولیهای بود که در این زمینه انجام دادم و حقیقتا از این که چنین پروژهای در کارنامهم دارم، کاملا راضیم.
در ادامه، میخوام ازتون دعوت کنم که اگر علاقمند به حوزههایی مثل هوش مصنوعی، الکترونیک دیجیتال، اینترنت چیزها و ... هستید، لطفا به وبلاگ شخصی من هم سر بزنید. خوشحال میشم که اونجا هم بخونیدم و البته، برام نظر بذارید.
در نهایت، اگر این مطلب طولانی براتون مفید بود، میتونید یک قهوه هم مهمونم کنید: