تشخیص زبان اشاره با پایتون — راهنمای کاربردی

۷۷۸ بازدید
آخرین به‌روزرسانی: ۳۱ خرداد ۱۴۰۲
زمان مطالعه: ۵ دقیقه
تشخیص زبان اشاره با پایتون — راهنمای کاربردی

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

  1. هر علامتی را برای فهمیدن معنی آن به طور جداگانه گوگل کند.
  2. لیست علائم مربوط به زبان اشاره را جستجو و هر علامت را از میان آن‌ها شناسایی کند.
  3. دوربین گوشی هوشمند اندرویدی خود را باز کند و با استفاده از آن، به صورت آنی جملات بیان شده به زبان اشاره را شناسایی کند.

در این مطلب، هدف پیاده‌سازی راهکاری است که سناریو را تغییر دهد و به راهکار سوم بیان شده در بالا نزدیک است. در اینجا، فرض شده است که فرد در زمینه «هوش مصنوعی» (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) کرد. کد لازم برای انجام این کار، در ادامه آمده است.

1import numpy as np
2import pandas as pd
3import torch
4import torch.nn as nn
5import torch.nn.functional as F
6import torch.optim as optim
7from torch.autograd import Variable
8import matplotlib.pyplot as plt
9%matplotlib inline

مجموعه داده‌ای که در اینجا استفاده خواهد شد، یعنی مجموعه داده زبان اشاره MNIST، دارای یک آرایه تک‌بُعدی برای هر تصویر است. اگر کاربر بخواهد به درستی با شبکه عصبی پیچشی کار کند، نیاز به تغییر شکل این آرایه به قالب دوبُعدی دارد. در این مثال مشخص، ۷۸۴ پیکسل از هر تصویر موجود است که می‌توان آن را به 28*28 تغییر شکل داد. قطعه کد لازم برای این کار، در ادامه ارائه شده است.

1def reshape_to_2d(data, dim):
2    reshaped = []
3    for i in data:
4        reshaped.append(i.reshape(1, dim, dim))
5    return np.array(reshaped)
6train_data = reshape_to_2d(data, 28)
7test_data = reshape

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

تشخیص زبان اشاره با پایتون -- راهنمای کاربردی

در صورتی که کاربر با (1,28,28) سردرگم شود، باید توجه داشته باشد که ۱ صرفا لایه را نمایش می‌هد. برای مثال، سه لایه در تصویر RGB و یک لایه در تصویر سیاه و سفید وجود دارد. در اینجا، صرفا مولفه قرمز تصویر وجود دارد. اکنون، می‌توان آن را روی مجموعه داده اعمال کرد؛ سپس آن را به ویژگی‌ها (x) و برچسب‌ها (y) تقسیم کرد و «تنسورها» (Tensors) را ساخت.

تانسورها در واقع ساختارهای داده پای‌تورچ هستند که مانند آرایه‌ها کار می‌کنند و تنها تفاوت‌های اندکی با آن دارند. برای مثال، تانسورها می‌توانند با GPU کار کنند.

1x = torch.FloatTensor(data)
2y = torch.LongTensor(labels.tolist())
3test_x = torch.FloatTensor(test_data)
4test_y = torch.LongTensor(labels_test.tolist())

سپس، نیاز به تعریف فراپارامترها است. در ادامه، این فراپارامترها بیان شده‌اند.

  • «دوره» (Epoch) اساسا میزانی است که شبکه آموزش خواهد دید (باید پیرامون بیش‌برازش هوشیار بود).
  • «دسته» (Batch)، تعداد نمونه‌های آموزشی است که در یک تکرار به شبکه خوراک داده می‌شوند.
  • «نرخ یادگیری» (Learning Rate) مشخص می‌کند که شبکه چقدر سریع تنظیم می‌شود و یاد می‌گیرد.

در ادامه، چگونگی تنظیم فراپارامترهای بیان شده، در زبان برنامه‌نویسی پایتون، نشان داده شده است.

1epochs = 50
2batch_size = 100
3learning_rate = 0.001

فراپارامترها و تنظیمات مناسب آن‌ها، در آموزش دیدن درست مدل و ارائه خروجی‌های دارای صحت مناسب، تأثیر قابل توجهی دارند. تنظیم کردن درست این فراپارامترها نیز نیازمند ترفندهای خاصی است.

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

  • توقف در سه conv layers با maxpool در اولین دو لایه پیچشی، اتفاق می‌افتد.
  • همچنین، یک dropout layer پس از سومین لایه پیچشی conv layer اضافه شده است که در بحث «بیش‌برازش» (Overfitting) کمک می‌کند و داشتن آن اساسا خوب است.
  • در اینجا، ۲۶، تعداد خروجی‌ها (یا تعداد کلاس‌ها را) برای مجموعه داده مورد استفاده تعیین می‌کند. این مورد ممکن است بسته به شکل مجموعه داده، متفاوت باشد.
  • از «logsoftmax» نیز استفاده می‌شود. این مورد در واقع «تابع فعال‌سازی» (Activation Function) است.

تشخیص زبان اشاره با پایتون -- راهنمای کاربردی

همچنین، دو تابع سفارشی نیز اضافه می‌شود. این توابع عبارتند از: «آزمون» (Test) و ارزیابی (Evaluate). هر دو این توابع، بازخوردهایی پیرامون عملکرد شبکه ارائه می‌کنند.

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

اکنون که شبکه آموزش دیده است، می‌توان نگاهی به کارایی شبکه داشت.

1sample = 30
2pixels = test_data[sample].reshape(28, 28)
3sns.heatmap(data=pixels)
4lab = labels_test[sample]
5test_sample = torch.FloatTensor([test_data[sample].reshape(1, 28, 28).tolist()])
6test_var_sample = Variable(test_sample)
7net_out_sample = net(test_var_sample)
8
9print("Prediction: {}".format(letter_count[torch.max(net_out_sample.data, 1)[1].numpy()[0]]))
10print("Actual Label: {}".format(letter_count[lab]))

در تصویر زیر، می‌توان موازنه بین صحت و زیان را در مدل مشاهده کرد.

تشخیص زبان اشاره با پایتون -- راهنمای کاربردی

1plt.figure(figsize=(10,8))
2plt.plot(loss_log[2:])
3plt.plot(acc_log)
4plt.plot(np.ones(len(acc_log)), linestyle='dashe

در اینجا، دیکشنری الفبایی ساخته شده است؛ بنابراین، خروجی را می‌توان راحت‌تر بررسی کرد. به این شکل می‌توان حروف واقعی را به جای ارائه برچسب‌های عددی، مشاهده کرد.

1import string
2letter_count = dict(zip( range(0,26),string.ascii_lowercase))

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

تشخیص زبان اشاره با پایتون -- راهنمای کاربردی

1Prediction: h
2Actual Label: h
3predictions = net(Variable(test_x))
4net.test(torch.max(predictions.data, 1)[1], test_y)
5Correct predictions:  6120 /  7172 (0.853318)

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

اگر مطلب بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شود:

^^

بر اساس رای ۸ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Towards Data Science
۱ دیدگاه برای «تشخیص زبان اشاره با پایتون — راهنمای کاربردی»

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

نظر شما چیست؟

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