محمدرضا حقیری | Muhammadreza Haghiri
محمدرضا حقیری | Muhammadreza Haghiri
خواندن ۸ دقیقه·۳ سال پیش

زبان اشاره و هوش مصنوعی - رساله‌ای در باب کاربردپذیری

چندین ماه پیش، به برنامه‌نویسی در حوزه بینایی ماشین و پردازش تصویر علاقمند شدم که خب احتمالا اکثر شما دوستانم در جریانش باشید. یکی از دلایلی که سمت چنین چیزی رفتم، حقیقتا سریال Person of Interest بود (که از صدا و سیمای ایران با نام «مظنون» پخش شده) و در اون «ماشین» می‌تونست آدم‌ها رو تشخیص بده.

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

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

ایده‌های اولیه

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


اول از همه: چرا کاربردپذیری مهمه؟

در دنیای آنلاین، یکی از اهداف اینه که همه به حد خوبی از برابری برسند. این برابری، در برخورداری از حقوق یکسان در استفاده از سرویس‌های آنلاین (که خب متاسفانه تحریم، فیلتر و ... چیزایین که مانعش میشن) شروع میشه و تا «امکان استفاده با هر شرایط جسمی و ذهنی» ادامه پیدا می‌کنند.

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

بگذارید کمی مثال رو بهتر بزنم. مثلا وقتی شما بخواهید در شبکه اجتماعی توییتر، یک ایموجی به اسمتون اضافه کنید به هشداری برمی‌خورید که میگه «صفحه‌خوان‌ها نمی‌تونن ایموجی‌ها رو درست تشخیص بدند و یا ممکنه برای افرادی که از صفحه‌خوان استفاده می‌کنند مشکل ایجاد کنند در فهم اسم شما».

حالا موضوع اینجاست که مثلا ? رو یک صفحه‌خوان به صورت Heart eyes میخونه (البته از اسم مطمئن نیستم) و مثلا Muhammadreza ? Haghiri رو به شکل Muhammadreza Heart Eyes Haghiri میخونه و دوستی که به هردلیلی، مثل نابینایی، کوررنگی، کم‌بینایی و ... مجبور به استفاده از صفحه‌خوانه نمی‌تونه درست بفهمه که اسم من چیه.

مورد دیگر هم اینه که در توییتر و لینکدین، شما می‌تونید alternate text برای عکس‌ها قرار بدید. این موضوع چی میگه؟ این موضوع میگه «بیا عکس رو توصیف کن که صفحه‌خوان بیاد و این رو برای شخص بخونه. در بسیاری از عکس‌های تزیینی ممکنه این امر مهم نباشه، ولی اگر قراره این عکس، ربطی به متن موضوع داشته باشه بهتره که این قسمت هم پر بشه.

خلاصه تلاش ما اینه که نرم‌افزارها بیش از پیش، برای «همه» قابل استفاده بشن و تحقیقات کاربردپذیری هم بخش بزرگی از این امر هستند.


پروسه پروژه زبان اشاره

خب فکر کنم حالا لازمه که به پروژه خودم برسیم :) پروژه زبان اشاره که به افرادی که نیازمند مترجم همزمان زبان اشاره بودند کمک می‌کرد که بتونن حروف اشاره رو به دیگران نشان بدن و نیازی به کمک شخص ثالثی نباشه.

سلب ادعا: این پروژه صرفا آزمایش و تفریح بود و تا حد زیادی از چیزایی که در این پروژه می‌بینید، کاربرد دنیای واقعیشون پایین‌تر از چیزیه که حتی فکرش هم کنید. چنانچه می‌تونید به من کمک کنید که برای زبان اشاره پویا هم سیستم مشابهی درست کنم، ممنون میشم در بخش نظرات اعلام کنید.

به طور کلی، هرپروژه علوم داده و هوش مصنوعی، چنین پروسه‌ای رو طی می‌کنه تا به نتیجه برسه:

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

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

قدم اول: طرح مساله

مساله ما اینجا اینه که «چطور می‌تونیم به کمک یک نرم‌افزار، به صورت همزمان زبان اشاره رو ترجمه کنیم؟». خب، قراره به این نیاز خاص پاسخ بدیم. یکی از پروسه‌های خیلی مرسوم و البته الزامی هر تحقیق علمی‌ای، طرح سوالاته.

سوالات ما به این شکل میشن که:

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

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

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

پس نتیجه این شد که:

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

حالا وقتشه بریم سروقت مرحله دوم :)

مرحله دوم: جمع‌آوری داده اولیه

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

جواب خیر بود :) لایبرری خاصی به اسم mediapipe وجود داره که به شما کمک می‌کنه تا مختصات ۲۱ نقطه از دستتون رو پیدا کنید به این شکل:

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

اما هنوز یک مشکل بزرگ دیگر وجود داشت. این که چطور می‌تونم حروف اشاره فارسی رو یاد بگیرم؟ خب اینجا دوستی به کمکم آمد. خانم آرزو زمانی که قبل‌تر خودشون هم پروژه‌ای به این شکل انجام داده بودن، این راهنما رو برای من فرستادن:

مرحله سوم و چهارم: پیش‌پردازش و تعریف پروسه پردازش داده

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

بعد از اون، با استفاده از متدهای یادگیری ماشین کلاسیک (و نه عمیق) و کتابخونه scikit learn شروع به آموزش یک مدل کردم و خب نتیجه رو می‌تونید در اولین تصویر این مقاله ببینید :)

مرحله پنجم: آزمایش

پس از نوشتن کدهای لازم، کدی نوشتم که مدل آموزش‌دیده رو لود کنه، سپس عکس‌ها رو با mediapipe پردازش کنه، مختصات دست رو بگیره و اون رو به مدل بده. در نهایت، مدل هم باید پیش‌بینی می‌کرد که این کدوم یکی از حروف اشاره فارسیه.

بردن پروژه به وب

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

الان شما هم می‌تونید تشریف ببرید و ازش استفاده کنید و به من فیدبک بدید.


سورس کد

سورس کد پروژه فارسی هنوز منتشر نشده، ولی اگر خیلی مشتاق هستید که ببینید چه پروسه‌ای در کل طی شده، می‌تونید در گیتهاب من، سورس کد پروژه مشابه برای حروف انگلیسی رو ببینید:

https://github.com/prp-e/asl_translator



در کل، پروژه‌های کاربردپذیری برای من جالبن. این که چطور میشه یک نرم‌افزار بسیار بسیار ساده رو طوری تغییر داد که همون سادگی رو برای همه حفظ کنه، پروسه سخت و در عین حال لذتبخشیه. پروژه بالا، یکی از پروژه‌های شاید بگم اولیه‌ای بود که در این زمینه انجام دادم و حقیقتا از این که چنین پروژه‌ای در کارنامه‌م دارم، کاملا راضیم.

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

در نهایت، اگر این مطلب طولانی براتون مفید بود، می‌تونید یک قهوه هم مهمونم کنید:

https://www.coffeete.ir/haghiri



برنامه نویسیهوش مصنوعیکاربردپذیری
مهندس سخت افزاری که آهنگسازی میکنه و عاشق ادبیاته :) وبگاه شخصی : haghiri75.com
شاید از این پست‌ها خوشتان بیاید