تشخیص زبان اشاره با پایتون – راهنمای کاربردی
در این مطلب، روش تشخیص زبان اشاره با پایتون مورد بررسی قرار گرفته است. برای درک بهتر موضوع، فرض میشود که فرد در یک زمین فوتبال در حال فعالیت است، ناگهان فرد دیگری از راه میرسد و با استفاده از زبان اشاره، چیزی میگوید. در این حالت، چند راهکار کلی برای شخص اول که به زبان اشاره آشنا نیست، وجود دارد؛ این راهکارها در ادامه بیان شدهاند.
- هر علامتی را برای فهمیدن معنی آن به طور جداگانه گوگل کند.
- لیست علائم مربوط به زبان اشاره را جستجو و هر علامت را از میان آنها شناسایی کند.
- دوربین گوشی هوشمند اندرویدی خود را باز کند و با استفاده از آن، به صورت آنی جملات بیان شده به زبان اشاره را شناسایی کند.
در این مطلب، هدف پیادهسازی راهکاری است که سناریو را تغییر دهد و به راهکار سوم بیان شده در بالا نزدیک است. در اینجا، فرض شده است که فرد در زمینه «هوش مصنوعی» (Artificial Intelligence) دانش گستردهای ندارد و نمیتواند یک پروژه خیلی پیچیده بسازد؛ بنابراین، از ورود به مباحث خیلی تخصصی اجتناب شده است. طی این مطلب از یک تشخیصدهنده زبان اشاره با استفاده از پایگاه داده زبان اشاره MNIST استفاده شده است.
ایده کلی، ساخت مدلی است که بتواند تشخیص دهد چه الفبایی به یک زبان اشاره ارجاع دارد.
«شبکه عصبی پیچشی» (Convolutional Neural Network | Convnet)، اخیرا به یکی از محبوبترین انواع «شبکههای عصبی مصنوعی» (Artificial Neural Networks) مبدل شده است و در بسیاری از پروژههای «بازشناسی تصویر» (Image Recognition)، «تشخیص چهره» (Face Detection) و به طور کلی، «پردازش تصویر» (Image Processing) مورد استفاده قرار میگیرد.
شبکه عصبی پیچشی در واقع بخشی از «شبکههای عصبی پیشخور عمیق» (Deep Feed-Forward Neural Networks) محسوب میشود و میتواند بسیاری از وظایف را در مدت زمان بهتر و با صحت بیشتری نسبت به «دستهبندها» (Classifiers) انجام دهد.
در این مطلب، تمرکز اصلی بر پیادهسازی یک شبکه عصبی پیچشی با استفاده از کتابخانه «پایتورچ» (Pytorch) است. پایتورچ، «کتابخانه متنباز» (Open Source) بر پایه کتابخانه «تورچ» (Torch) است. این کتابخانه محبوب «زبان برنامهنویسی پایتون» (Python Programming Language)، در حوزههای «بینایی کامپیوتری» (Computer Vision) و «پردازش زبان طبیعی» (Natural Language Processing | NLP) کاربرد دارد.
برای انجام پروژه تشخیص زبان اشاره با پایتون، ابتدا باید همه کتابخانههای پایتون مورد نیاز را «وارد» (ایمپورت | Import) کرد. کد لازم برای انجام این کار، در ادامه آمده است.
مجموعه دادهای که در اینجا استفاده خواهد شد، یعنی مجموعه داده زبان اشاره MNIST، دارای یک آرایه تکبُعدی برای هر تصویر است. اگر کاربر بخواهد به درستی با شبکه عصبی پیچشی کار کند، نیاز به تغییر شکل این آرایه به قالب دوبُعدی دارد. در این مثال مشخص، ۷۸۴ پیکسل از هر تصویر موجود است که میتوان آن را به 28*28 تغییر شکل داد. قطعه کد لازم برای این کار، در ادامه ارائه شده است.
در اینجا، یک تابع اولیه ساخته شده است که کمک میکند تا تغییر شکل انجام شود. این تابع، مجموعه داده و ابعاد تصویر را دریافت و مجموعه داده تغییر شکل داده شده را در خروجی باز میگرداند.
در صورتی که کاربر با (1,28,28) سردرگم شود، باید توجه داشته باشد که ۱ صرفا لایه را نمایش میهد. برای مثال، سه لایه در تصویر RGB و یک لایه در تصویر سیاه و سفید وجود دارد. در اینجا، صرفا مولفه قرمز تصویر وجود دارد. اکنون، میتوان آن را روی مجموعه داده اعمال کرد؛ سپس آن را به ویژگیها (x) و برچسبها (y) تقسیم کرد و «تنسورها» (Tensors) را ساخت.
تانسورها در واقع ساختارهای داده پایتورچ هستند که مانند آرایهها کار میکنند و تنها تفاوتهای اندکی با آن دارند. برای مثال، تانسورها میتوانند با GPU کار کنند.
سپس، نیاز به تعریف فراپارامترها است. در ادامه، این فراپارامترها بیان شدهاند.
- «دوره» (Epoch) اساسا میزانی است که شبکه آموزش خواهد دید (باید پیرامون بیشبرازش هوشیار بود).
- «دسته» (Batch)، تعداد نمونههای آموزشی است که در یک تکرار به شبکه خوراک داده میشوند.
- «نرخ یادگیری» (Learning Rate) مشخص میکند که شبکه چقدر سریع تنظیم میشود و یاد میگیرد.
در ادامه، چگونگی تنظیم فراپارامترهای بیان شده، در زبان برنامهنویسی پایتون، نشان داده شده است.
فراپارامترها و تنظیمات مناسب آنها، در آموزش دیدن درست مدل و ارائه خروجیهای دارای صحت مناسب، تأثیر قابل توجهی دارند. تنظیم کردن درست این فراپارامترها نیز نیازمند ترفندهای خاصی است.
با تجربه کردن این کار، کاربر میتواند توانایی خود را برای تنظیم فراپارامترها بهبود ببخشد. اکنون، معماری شبکه تعریف میشود. چنانکه پیش از این نیز بیان شد، از شبکه عصبی پیچشی پایهای استفاده میشود. بنابراین، به صورت زیر عمل شده است.
- توقف در سه conv layers با maxpool در اولین دو لایه پیچشی، اتفاق میافتد.
- همچنین، یک dropout layer پس از سومین لایه پیچشی conv layer اضافه شده است که در بحث «بیشبرازش» (Overfitting) کمک میکند و داشتن آن اساسا خوب است.
- در اینجا، ۲۶، تعداد خروجیها (یا تعداد کلاسها را) برای مجموعه داده مورد استفاده تعیین میکند. این مورد ممکن است بسته به شکل مجموعه داده، متفاوت باشد.
- از «logsoftmax» نیز استفاده میشود. این مورد در واقع «تابع فعالسازی» (Activation Function) است.
همچنین، دو تابع سفارشی نیز اضافه میشود. این توابع عبارتند از: «آزمون» (Test) و ارزیابی (Evaluate). هر دو این توابع، بازخوردهایی پیرامون عملکرد شبکه ارائه میکنند.
- تابع آزمون (Test)، تعداد پیشبینیهای صحیح را مقایسه و صحت را چاپ میکند.
- تابع ارزیابی (Evaluate)، صحت را محاسبه و مقدار آن را باز میگرداند. این کار برای ثبت سوابق در هنگام آموزش دادن مدل، مفید است.
اکنون که شبکه آموزش دیده است، میتوان نگاهی به کارایی شبکه داشت.
در تصویر زیر، میتوان موازنه بین صحت و زیان را در مدل مشاهده کرد.
- خط آبی، «تابع زیان» (Loss Function) را نشان میدهد.
- خط نارنجی، صحت را نشان میدهد.
در اینجا، دیکشنری الفبایی ساخته شده است؛ بنابراین، خروجی را میتوان راحتتر بررسی کرد. به این شکل میتوان حروف واقعی را به جای ارائه برچسبهای عددی، مشاهده کرد.
اکنون، زمان آن فرا رسیده است تا کاربر بررسی کند که مدل چقدر خوب روی مجموعه داده تست عمل میکند. توصیه میشود که مخاطبان حتما همه خطهای کد را بررسی کنند و بیاموزند و از صرفا کپی کردن خودداری کنند. این کار کمک میکند تا فرد درک خوبی از برنامه به دست آورد.
این خروجی بسیار خوب است و در واقع، کاربر توانسته است ۸۵ مورد از ۱۰۰ مورد علائم زبان اشاره را به درستی تشخیص دهد. همچنین، میتوان با تغییر فراپارامترها و انجام آزمایشهای تصادفی روی لایهها، صحت بیشتری به دست آورد.
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشود:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- مجموعه آموزشهای دادهکاوی یا Data Mining در متلب
- مجموعه آموزشهای هوش مصنوعی
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- شناسایی دست خط با رگرسیون لجستیک در پایتون — راهنمای کاربردی
- یادگیری ماشین با پایتون — به زبان ساده
- آموزش یادگیری ماشین با مثالهای کاربردی — مجموعه مقالات جامع وبلاگ فرادرس
^^
سلام. بسیار بسیار سپاسگذارم از توضیحات خوبتون. من سورس کامل برنامه را برای پایان نامه ام احتیاج دارم. امکان داره که سورس کامل را برام ایمیل کنید؟
چون وقتی خطهای برنامه که در این صفحه وجود داره را در پایتون مینویسم ارور میده.