بایگانی برچسب: s

با موسیقا، رویای خود را بنوازید!

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

موسیقا، پلتفرمی مبتنی بر تکنولوژی هوش مصنوعی زایا یا Generative AI است که به شما کمک می‌کند تا آنچه در ذهن دارید را با چند کلیک، به موسیقی آن هم در ژانرهای مختلف مانند امبینت، الکترونیک، پاپ و … تبدیل کنید.

نحوه استفاده از موسیقا

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

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

پس از دانلود مدل، یکی از پرامپت‌ها (داخل کادرهای زردرنگ) را انتخاب کرده و یا پرامپت مورد نظر خود را نوشته، سپس دکمه Let’s Party را بفشارید.

بسته به سخت‌افزار خود، صبر کنید تا موسیقی مورد نظرتان تولید شود!

نمونه موسیقی تولید‌شده با موسیقا

حامیان پروژه

شرکت محترم ایران‌سرور، از نیمه دوم سال ۱۴۰۲ هجری خورشیدی، با تامین زیرساخت برای پروژه‌های مانی، وکنتور و موسیقا به نخستین و بزرگترین حامی این استارتاپ تبدیل شده است.

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

Share

مارال اینجاست، مدل ۷ میلیارد پارامتری با پشتیبانی از زبان فارسی

در دنیایی که AI و بخصوص از نوع Generative به شدت در اون مهم شده، یکی از مسائل بزرگی که باهاش روبرو هستیم، چیرگی زبان انگلیسی بر جویه که ساخته شده.

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

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

مارال هفت میلیارد پارامتری و مزایای آن

در تابستان امسال یا دقیق‌تر بگم روز ۱۵ تیر ۱۴۰۲، من رویدادی با نام Summertime AI برگزار کردم. رویداد برای معرفی چندین ابزار هوش مصنوعی بود و من اشاره‌ای به ابزاری به اسم «مارال» کردم.

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

حقیقتا GPT2 هرقدر هم ساختار خوبی داشت، ظاهرا مدل مناسبی برای این موضوع نبود!

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

مارال چیه؟

مارال، یک مدل بزرگ زبانی یا LLM بر مبنای مدل Mistral 7B (لینک) و تیو‌ن‌شده برای زبان فارسیه. این مدل، به صورت «پیروی از دستورالعمل» یا Instruction Following کار می‌کنه و نتایجی که تولید می‌کنه هم تقریبا هم‌ارز GPT-3.5 هستند.

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

همچنین مدل و جزییاتش در این لینک موجودند.

مزایای مارال نسبت به مدل‌های فارسی قبلی چیه؟

برای درک این موضوع، باید تا حد زیادی عقب بریم. ببینیم اصلا از کِی، بحث پردازش زبان طبیعی یا NLP فارسی، خیلی داغ شد. راستش رو بخواهید از زمانی که شخصا به یاد دارم، بحث پردازش و نمایش زبان فارسی، بحث داغی بود.

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

اما بحث Text Generation چطور؟ این بحث به صورت خاص در همون سال‌های ۲۰۱۶ تا ۲۰۱۸ که در دنیا مدل‌های LSTM و GPT-2 خیلی مطرح بودند، پا گرفت. بسیاری از اشخاص و شرکت‌های ایرانی، به سمت تولید مدل رفتند. در ادامه، دوتا از این مدل‌ها که «اختصاصا» برای زبان فارسی ساخته شدند رو بررسی و مشکلاتشون هم مطرح می‌کنم.

مدل‌های تجاری

در حال حاضر، تنها مدلی که به صورت تجاری در دسترسه، مدل وبسایت «خودنویس»ئه که خب، این مدل علیرغم این که خروجی‌های بسیار خوبی می‌تونه تولید کنه، تجاریه و نمیشه خیلی بررسی دقیقی روش داشت.

علاوه بر اون، خروجی‌هایی که تولید می‌کنه من رو یاد خروجی مدل‌هایی مانند GPT NeoX 20B و GPT J 6B میندازه و خب با توجه به قدمت این وبسایت، این موضوع کاملا طبیعیه.

یکی از مشکلاتی که مدل‌هایی مثل GPT J دارند، اینه که علاقه خاصی به تکرار خودشون دارند، البته این مشکل تا حدی هم به Tokenizer های مدل‌ها برمی‌گرده که برای زبان فارسی، مناسب‌سازی نشدند.

مدل‌های آزاد

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

  • مدل ParsGPT: این مدل، دقیقا GPT2 اون هم نسخه ۱۴۲ میلیون پارامتری بود که روی دیتای فارسی ترین شده، گرچه دقت نسبتا خوبی در تولید محتوای فارسی داره، اما دو تا مشکل بزرگ داشت. اول، این که طبق معمول عادت به تکرار خودش داره (این مساله رو در ادامه در موردش صحبت خواهم کرد) و دوم این که از یه جایی به بعد، دقیقا مطالب بی‌ربط به پرامپتی که داده شده تولید می‌کنه. مثلا ممکنه از یه مطلبی پیرامون هوش مصنوعی، برای شما متن یک خبر مرتبط با وزارت خارجه بورکینافاسو تولید کنه!
  • مدل GPT2 Medium Persian: این مدل باز کمی بهتر بود. مدل بزرگ‌تر و با حدود ۳۰۰ میلیون پارامتر. اما مشکل به طور واضح، دیتایی بود که مدل باهاش pretrain شده. به قول معروف روی «آشغال‌های سئوشده وب فارسی» ترین شده و احتمال این که مطالب خلاف واقع تولید کنه بسیار بالاست. گذشته از این، هنوز مشکل تولید محتوای بی‌ربط هم در این یکی مدل به چشم میخورد.

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

و اگر بخواهیم مزایای مارال رو نسبت به مدل‌های پیشین بگیم:

  • دیتاست بهتر
  • پارامترهای بیشتر
  • مدل پایه جدیدتر
  • خروجی‌های بهتر

خواهند بود.

مزایای مارال نسبت به مدل پایه‌ش (Mistral 7B) چیه؟

اولین روزی که از میسترال استفاده کردم متوجه شدم نسبت به مدل‌های قبلی مثل LLaMa, LLaMa2, StableLM 7B و Vicuna و امثالهم، درک بهتری از الفبای فارسی/عربی داره.

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

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

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

در حال حاضر چه مشکلاتی ممکنه در استفاده از مارال پیش بیاد؟

  • مدل در هذیان‌گویی (Hallucination) بسیار خوبه. البته، این مشکل تقریبا تمام مدل‌های زبانیه و با گذر زمان، میشه حلش کرد.
  • مدل علاقه زیادی به تکرار خودش داره 😁
  • نتایج مدل در حال حاضر خیلی factual نیستند و می‌تونه misinformation تولید کنه.
  • مدل خیلی بزرگه و با همه سخت‌افزارها قابل اجرا نیست (البته با کد ۸ بیتی که ارائه کردیم قابل اجرا میشه)
  • فرمت پرامپتش، کمی مناسب نیست و نیازه که شروع و پایان جملات به مدل آموزش داده شه.

چه چیزی برای توسعه بهتر مارال لازمه؟

  • دیتاست بهتر (نه الزاما بزرگتر) و حتی شاید دیتاست‌های تخصصی
  • ترین شدن tokenizer روی زبان فارسی

چطور از مارال استفاده کنم؟

چنانچه قصد دارید از مارال استفاده کنید، کدهای اجرای مارال روی GPU رو در این لینک قرار دادیم. می‌تونید این کدها رو روی سیستم خودتون یا در Google Colab اجرا کنید.

جمع‌بندی

پس از این که یک ترین موفق روی Stable Diffusion و ساخت مدل «مانی» که البته در این مطلب در موردش توضیح داده بودم، باعث شد که پلتفرم هوش مصنوعی مانی رو راه‌اندازی کنم و به نوعی یک AI company تشکیل بدم، مسیرم به شکلی تغییر کرد که پشتیبانی بهتر و بهتر از زبان شیرین فارسی رو بتونم به این مدل‌ها اضافه کنم.

در حال حاضر، کاربردهای زیادی برای مدل بزرگ زبانی فارسی مانند مارال میشه متصور شد. گذشته از ربات‌های پشتیبان (که با متد RAG ساخته میشن) میشه به کاربردهای بسیار بیشتری هم برای این مدل فکر کرد. دوست دارم بدونم شما چه فکری در مورد این مدل دارید؟

در پایان هم ممنونم از وقتی که گذاشتید و این مطلب رو خوندید. امیدوارم این مطلب، برای شما مفید بوده باشه. موفق و موید باشید 🙂

Share

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

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

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

هوش مصنوعی در خدمت انگلیسی‌زبان‌ها

در سال‌های اخیر، با ارائه مدل‌های زبانی که در تولید متن (Text Generation) و طبقه‌بندی متن (Text Classification) و خلاصه‌سازی متن (Text Summerization) می‌تونن به ما کمک کنند یک ویژگی کاملا مشهوده. این مدل‌ها عموما عمده داده‌ای که دیدن، به زبان انگلیسی بوده. مگر این که مدل، از مدل‌های بسیار بزرگ (مثل GPT-3 یا BLOOM) بوده باشه که باز هم چیزی در حدود ۹۶-۹۷ درصد این داده ورودی، انگلیسی بوده.

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

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

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

مشکلاتی که انگلیسی‌زبان‌ها مطرح کردند

سانسورشدگی در خروجی‌های مدل

مطمئنا در یک سال اخیر، شما هم با ChatGPT عزیز کار کردید. احتمالا هم خیلی وقت‌ها، متوجه شدید که وقتی ازش سوالی می‌کنید، به شما میگه «متاسفانه به عنوان یک مدل زبانی بزرگ قادر نیستم در فعالیت غیرقانونی به شما کمک کنم».

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

جهت‌دار بودن خروجی‌های مدل‌های زبانی بزرگ

بیایید فرض کنیم که کودکی وجود داره که هر روز به اسم «ناهار» بهش یک غذای خاص داده شده و نتونسته غذایی جز اون رو در وعده «ناهار» تجربه کنه. مثلا هرروز ساعت ۱۲ ظهر به این کودک شما یک عدد ساندویچ هات‌داگ دادید. حالا نتیجه چی میشه؟

کافیه به این کودک لیستی از غذاها نشان بدیم و ازش بخواهیم که برای وعده ناهار امروز یکی رو انتخاب کنه. به نظرتون این کودک چه چیزی رو انتخاب می‌کنه؟

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

به همین خاطر هم مدل‌های زیادی وجود داره که افراد روی داده کمتر جهت‌دار (مثل داده‌هایی که از بریتانیکا و ویکی‌پدیا میشه به دست آورد) آموزش دادند. حتی مدل‌هایی مثل Pygmalion دقیقا به خاطر همین موضوع جهت‌دار نبودن و سانسور نداشتن، از فضاهایی مثل Google Colab منع شدن!

برای زبان فارسی چه کاری می‌تونیم بکنیم؟

و حالا بحث ما می‌رسه به زبان شیرین فارسی و این که چه کاری از دستمون برای این زبان برمیاد؟ ابتدا باید ببینیم که این مدل‌ها چطوری کار می‌کنن!

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

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

حالا سوال اینه که ما با این دانش، باید چی کار کنیم تا بتونیم زبان فارسی رو به چنین مدل‌هایی وارد کنیم؟

جمع‌آوری/تولید داده

همونطور که قبلتر هم توضیح داده بودم، یکی از سخت‌ترین بخش‌های هر پروژه هوش مصنوعی، جمع‌آوری یا تولید داده مورد نظرمونه (لینک) و خب طبیعیه که وقتی ما می‌خواهیم روی موضوعات خاصی تمرکز داشته باشیم، جمع‌آوری و تولید این داده سخت‌تر هم میشه.

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

راه دیگر، استفاده از روش جمع‌سپاری و درخواست از یک جامعه‌ست برای تولید داده مورد نظر. یعنی مثلا یک پلتفرم ایجاد کنیم و از مردم بخواهیم که مثلا هرکسی یک پاراگراف در مورد یه موضوعی بنویسه. به این شکل در مدت کوتاهی، می‌تونیم به یک حجم خوبی از داده برسیم (مثل کاری که Mozilla Common Voice انجام می‌ده).

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

مدل‌های پایه

بعد از جمع‌آوری داده‌های مکفی، لازمه ذکر کنم که ما به مدل پایه هم نیاز داریم. مدل‌هایی مثل GPT-3 که امکان بازآموزی ندارند (چون اوپن سورس نیستند) و اگر داشته باشند هم این بازآموزی باید روی بستر OpenAI انجام بشه که طبیعتا خیلی گزینه منطقی و مناسبی نیست. مدل‌هایی مثل BLOOM یا Falcon 40B هم بسیار بزرگتر از این هستند که بتونیم حتی با داشتن حساب کاربری روی Google Colab Pro Plus آموزششون بدیم.

پس چی می‌مونه؟ مدل‌های کوچکتر که دقت خوبی دادند. مدل‌هایی مثل GPT-J, GPT-NeoX, LLaMa, … می‌تونن پرفرمنس خوبی در این زمینه داشته باشند. تلاش‌هایی در این جهت داره میشه و به زودی در موردش در همین بلاگ خواهم نوشت 🤩

سخن آخر

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

اما نکته اینه که در دنیای امروز، در سال ۱۴۰۲ خورشیدی، در ۲۰۲۳ میلادی یا هرچی که شما قبول دارید، حفظ زبان‌ها، خواه فارسی خواه عربی، خواه ترکی خواه کردی، مستلزم اینه که ماشین‌ها درک خوبی از اون زبان داشته باشند. به همین خاطر این پست بلاگ نوشته شد تا این نگرانی به گوش سایر افرادی که ممکنه دغدغه مشابه داشته باشند، برسه.

امیدوارم شاد و خندون و موفق باشید 🙂

Share

مصاحبه با محمدرضا حقیری، مهندس هوش مصنوعی – ابزارهای هوش مصنوعی ما را به جهانی هل می‌دهند که مردم در آن هوشمندانه‌تر کار می‌کنند، نه سخت‌تر

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

مصاحبه با محمدرضا حقیری، مهندس هوش مصنوعی

ما با محمدرضا حقیری، توسعه‌دهنده‌ای از ایران که هم‌اکنون مشغول کار بر روی یک مدل متن به تصویر متن‌باز به نام مانی است، صحبت کردیم.

او دانشش درباره فناوری‌هایی که برای توسعه این مدل استفاده کرده را با ما به اشتراک گذاشته است. هوش مصنوعی چندمدلی او، از Stable Diffusion و Dream Booth استفاده می‌کند.

برای درک بهتر مطلب، مثل همون متن اصلی، سوالات و نظرات اون‌ها رو بولد و پاسخ‌های خودم رو عادی نوشتم.

لطفا خودت رو برای خوانندگان ما معرفی کن. چه کارهایی کردی که به اینجا رسیدی؟ و چطور؟

من محمدرضا حقیری هستم، متولد ۹ خرداد ۱۳۷۵ (۳۰ می ۱۹۹۶) در تهران، ایران. من همیشه علاقه وافری به ساختن چیزهای مختلف داشتم و این علاقه در حوزه علوم کامپیوتر بیشتر و بیشتر شد. در سن ۱۲ سالگی برنامه‌نویسی رو شروع کردم و اولین زبانی که یادگرفتم هم ویژوال‌بیسیک ۶ بود. یادمه اولین برنامه‌ای که نوشتم، ماشین حسابی بود که فشاری که یک جرم به سطح وارد می‌کنه رو محاسبه می‌کرد.

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

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

در حال حاضر روی مدل متن به تصویری به اسم Mann-E کار می‌کنی. می‌تونی یکم در موردش توضیح بدی و بگی چطور کار می‌کنه؟

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

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

اگر دوست دارید بدونید چطور می‌تونید از مانی استفاده کنید، می‌تونید به گیتهاب من مراجعه کنید. یک دفترچه یادداشت جوپیتر اونجا هست که می‌تونه به Google Colab وارد بشه. حجم زیادی از کد هم از دید کاربر مخفی شده که حسی مشابه Midjourney یا Dall-E داشته باشه.

تو وبلاگت اشاره کردی که مدل بر مبنای Stable Diffusion ساخته شده. چه فناوری‌هایی برای این هوش مصنوعی استفاده کردی؟

این چیزیه که من بهش میگم «سوال مورد علاقه‌م». می‌تونم ساعت‌ها در مورد فناوری‌هایی که استفاده کردم، صحبت کنم. اول بذارید یک تاریخچه‌ای براتون بگم. وقتی اکثر تولیدکنندگان تصویر خوب «آزاد» نبودند (در مصاحبه گفتم free و ظاهرا یادم رفته مشخص کنم free as in freedom) تنها پایه و مبنای خوب برای یک تولیدکننده اثر هنری با کمک هوش مصنوعی VQGAN بود. یادمه که اگر نتایجش رو با CLIP ترکیب می‌کردی می‌تونست نتایج خوبی ارائه بده. در واقع این یک بازی انکودر-دیکودر بین دوتا مدل هوش مصنوعی بود.

ولی به قدر کافی خوشحال‌کننده نبود، مخصوصا این که midjourney در همون نسخه‌ها هم تصاویری تولید می‌کرد که انگار همین الان از ذهن یک هنرمند چیره‌دست بیرون آمده. پس من چه کردم؟ شخصا به این فکر بودم که چه اتفاقی می‌افتاد اگر یک نسخه متن‌باز از Midjourney داشتیم؟ و همزمان افرادی در شرکت Stability AI هم فکر مشابهی داشتند. وقتی انتشار Sable Diffusion رو اعلام کردند، من واقعا خوشحال شده بودم. کانسپت رو واقعا دوست داشتم با خودم گفتم که این به درد پروژه من هم میخوره! اینجا دقیقا جایی بود که من رفتم هرچی مقاله و تحقیق در مورد Stable Diffusion بود رو خوندم. این برای من یک دنیا ارزش داشت، چون بالاخره یک مدل تولید تصویر بسیار خوب داشت منتشر می‌شد.

این Stable Diffusion فناوری ابتدایی من بود. بی‌نهایت دوستش داشتم. همیشه تلاش می‌کردم بهترین نتایج رو ازش بگیرم. از prompt engineering صرف بگیر تا نوشتن کد‌هایی که بتونه برای من نتایج بهتری ازش بگیره. در ماه‌هایی که از انتشار نسخه اولیه‌ش گذشت، دو تا اتفاق خیلی بزرگ افتاد. اول این که Dream Booth برای Stable Diffusion ریلیز شد ( و صادقانه بخوام بگم، فاین تیون کردن Stable Diffusion رو به شدت ساده کرده) و همزمان RunwayML هم ورژن ۱.۵ از Stable Diffusion رو منتشر کرد. من مواد اولیه اصلی برای ساخت Midjourney متن‌باز رو داشتم!

بخوام خلاصه بگم: هسته اصلی Stable Diffusion ئه، از چک‌پوینت‌های نسخه ۱.۵ ای که runwayml ساخته استفاده کردم و تیون/ترین کردن با Dream Booth انجام شده. اینا Mann-E رو ممکن کردند. همچنین زبان‌های مورد استفاده هم باید بگم که عمدتا از پایتون استفاده کردم و کمی هم کد روبی برای توسعه وب نوشتم. و این تمام چیزیه که من استفاده کردم.

چه تفاوتی با Dall-E, Open Journey و باقی مدل‌ها داره؟

این سوال سختیه، بخصوص که در طول سال گذشته هزاران مدل با تکنیک‌های Textual Inversion و Dream Booth منتشر شدند. ولی اگر بخوام خلاصه بگم که چه فرقی با Dall-E داره، باید بگم که مانی به اون اندازه گرون نیست. برای استفاده از مانی، فقط کافیه که Google Colab رو راه‌ بندازید، نوت‌بوک رو واردش کنید و تمام! می‌تونید بی‌نهایت تصویر باهاش بسازید. این رو با Dall-E مقایسه کنید که به شما ۵۰ تا تصویر رایگان می‌ده و بعدش باید هزینه پرداخت کنید (که البته به نظرم مدل درآمدی بدی نیست).

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

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

روی مدلی به نام Open Journey کار می‌کردی ولی اسمشو عوض کردی. می‌تونی کمی در موردش بگی؟

مانی اول کار، اسم مدل نبود؛ بلکه اسم استارتاپی بود که در تابستان ۲۰۲۲ برای همین کار راه انداخته بودم. اسم مدل Open Journey بود که اشاره به Open Source Midjourney داشت. بعدا، فهمیدم که یک نفر از تیم میدجرنی از تیم prompthero خواسته که اسم مدلشون (که فکر کنم چیزی مثل midjourney-v4-style-stable-diffusion یا چنین چیزی بود) رو عوض کنند و اون‌ها (یعنی prompthero) هم اسم مدل رو به OpenJourney تغییر دادند. من ازشون درخواست کردم که اسم مدل رو عوض کنند ولی از اونجایی که ترجیحم این بود که اون استارتاپ رو در اون برهه زمانی متوقف کنم، اسم مدل رو به مانی تغییر دادم.

و البته یک اتفاق خوشحال‌کننده هم افتاد. یک نفر لینک قدیمی به مدل من (که هنوز اسم رو Open Journey درج کرده بود) رو در هکرنیوز پست کرده بود و وبسایت من هم از لحاظ تعداد بازدیدکننده ترکید. من اون صفحه رو به صفحه درست، ری‌دایرکت کردم و فکر کنم این «ناخواسته‌ترین دیده‌شدن»ی بود که من می‌تونستم از یک پروژه متن‌باز بگیرم.

فکر می‌کنی آینده هوش مصنوعی چطوریه؟ حرف و حدیث در مورد موضوع خیلی زیاده و اکثرا ریشه در محصولات شرکت OpenAI مثل ChatGPT داره. اتفاق بعدی چیه؟

باور دارم که هوش مصنوعی آینده‌ست. برخلاف چیزی که سال ۲۰۲۱ اومد و یه فازی ساخت و رفت (و بله، منظورم متاورس زاکربرگه). هوش مصنوعی واقعی و آینده‌داره. من دارم به چشم می‌بینم که افراد زیادی از این ابزارها برای تولید پست‌های بلاگ، کپی‌رایتینگ، تولید شعار برای شرکت و استارتاپ، تولید آیکون و تصویر شاخص و حتی تولید کد استفاده می‌کنند. این خیلیه، بخصوص با وجود ابزارهایی مثل GPT-3 یا ChatGPT حتی می‌تونه رایج‌تر هم بشه. از طرف دیگر قضیه هم که بخواهیم نگاه کنیم، ابزارهای متن‌بازی مثل BLOOM, BLOOMZ, Flan-T5, GPT-Neo و … رو داریم. افراد می‌تونند این مدل‌ها و API رو متناسب با نیازهای خودشون، تغییر بدند.

و باور دارم که ابزارهای هوش مصنوعی ما را به جهانی هل می‌دهند که مردم در آن هوشمندانه‌تر کار می‌کنند، نه سخت‌تر. می‌دونی، تو می‌تونی شونزده ساعت از بیست و چهار ساعت شبانه روز رو صرف توسعه یه کمپوننت تو پروژه ری‌اکتیت کنی، درسته؟ این خیلی خوبه که شغلت و کاری که می‌کنی رو دوست داره ولی حدس من اینه که این ماجرا برای کارفرما یا سرمایه‌گذار هیچ اهمیتی نداره، بخصوص وقتی می‌فهمن که با ۱۶ دقیقه prompt engineering می‌تونستی همون نتیجه رو از GPT-3 با کمی ویرایش کد بگیری. برای من، این یک دنیای بهتره.

در پایان هم از تو، الکساندر؛ تشکر می‌کنم که اومدی سراغم.

سخن آخر

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

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

Share

چگونه رمز موفقیت میدجرنی شکسته شد؟ نخستین دیدار با مانی ۴

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

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

تاریخچه مانی

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

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

اون موقع خیلی راضی نبودم و بیشتر میخواستم، اما حقیقتا ابزار آزاد و متن‌باز خوب دیگری در دسترس نبود که بخوام روی اون کار کنم تا این که با Latent Diffusion آشنا شدم که تصاویر قشنگ‌تر و بهتری تولید می‌کرد اما اون هم هنوز خیلی جای کار داشت.

مدت‌های زیادی، در نظر داشتم که پروژه «مانی» رو پیش ببرم اما پایه مناسبی نداشتم. اون‌هایی که می‌شد به راحتی به قولی پیاده‌سازی یا حتی Fine Tune بشند خروجی خوبی نداشتند و اون‌هایی که می‌تونستند خروجی‌های خوبی تولید کنند هم آموزش دادن و فاین‌تیون کردنشون منابع بسیار بسیار زیادی می‌خواست.

ظهور Stable Diffusion

اوضاع در حدود مردادماه امسال، خیلی عوض شد. یک‌باره شرکتی به اسم Stability AI (لینک) تصمیم گرفت یک مدل تولید تصویر متن‌باز ارائه کنه به اسم Stable Diffusion که خب این خودش می‌تونست یک نقطه عطف در تولید تصویر و در کل اثر هنری به کمک هوش مصنوعی محسوب بشه.

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

اما به خوبی Midjourney نبود…

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

البته این نگرانی من نبود، عمدتا نگرانی افرادی بود که به عنوان «مشتری» سراغ این پروژه می‌آمدند و میخواستند از این پروژه استفاده تجاری کنند و خب ظاهرا نُرمی در بین هموطنانمون وجود داره که با علم به این که کجا زندگی می‌کنیم و با چه امکاناتی چی توسعه می‌دیم؛ همچنان انتظار دارند در حد و اندازه غول‌ها ظاهر بشیم 🙂

خلاصه این قضیه خیلی باعث شد به من بربخوره 😁 و به همین خاطر یک دیتاست از تصاویری که در میدجرنی تولید شده بود رو برداشتم، به همراه متون ورودیشون (دیتاست حدود ۱۰۰۰ تصویر) و آخرین نسخه مانی (لینک) رو ساختم. خروجی‌ها واقعا خوب شده بودند اون هم فقط با هزار تصویر. اما یک مشکلی بود، تنوع خروجی به شکل میدجرنی نبود تا این که کمی در دیسکورد میدجرنی، چرخیدم و نتایج جالبی دستم آمد 🙂

چگونه رمز موفقیت میدجرنی شکسته شد؟

خارجی‌ها یه اصطلاح جالبی دارند. وقتی میخوان ببینن چیزی چطور کار می‌کنه میگن Let’s look under the hood یا «بذار یه نگاه به زیر کاپوت بندازیم». اما مشکل اینجاست که میدجرنی کاپوتش جوش داده شده. پس چطور میشه فهمید اون زیر چه خبره؟

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

اول، داشتم دنبال مدل‌هایی می‌گشتم که بر اساس روش کار میدجرنی ساخته شده باشند. نخستین چیزی که دیدم OpenJourney از Prompthero بود که خب کارم رو تا حد زیادی راه انداخت و تصاویر خوبی بهم داد (که حتی بعضیاش رو برای تست و بهبود مانی هم استفاده کردم). اما هنوز به خود میدجرنی، نرسیده بودم. پس باید چه کار می‌کردم؟

میدجرنی یک مدل نیست، چند مدله!

خب یکی از چیزهایی که در مورد میدجرنی خیلی جالبه اینه که همیشه در آپدیت‌هاش مدعی میشه که اضافه کردن یک کلمه یا عبارت جدید (مثلا Double Exposure) در متون ورودی می‌تونه نتیجه‌های جدیدتر و بهتری برای شما تولید کنه.

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

خب یکی از راه‌هایی که میشه این حرکت رو زد اینه که چندین مدل روی چندین قضیه متفاوت ترین/فاین‌تیون بشه و بعد با یک if ساده، ورودی‌ها رو به اون‌ها فرستاد. اما سوال اینه که من چه کردم؟ آیا چندین مدل ترین کردم؟ خیر.

ترکیب چند مدل با هم و نتایج آن‌ها

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

حالا اگر این مدل‌ها ساختار مشابهی داشته باشند، این امکان وجود داره که اون‌ها رو با هم ترکیب کنیم و نتیجه‌های بهتری بگیریم. خب کاری که کردم این بود که اول از همه مانی رو با Open Journey و یکی دو مدل دیگه ترکیب کنم (و اسم این مدل رو new_mann_e_2 گذاشتم) و بعد یک سری مقایسه با openjourney انجام دادم.

اما حالا نیاز بود که کمی از خوبی‌های میدجرنی رو هم اینجا داشته باشیم 😁 پس حالا چه کردم؟ هیچی. آمدم و وزن‌های مانی جدید و اوپن‌جرنی رو با هم ترکیب کردم.

نتایج آزمایش‌ها

متن‌های ورودی همونطوری که مشخصه یک منظره (در سبک wasteland و cyberpunk) یک چهره (در سبک و سیاق نقاشانی چون Alphonse Mucha) و یک وسیله نقلیه (نقاشی فانتزی) بودند و مقدار seed (که تعیین‌کنندگی خوبی در جزییان نقاشی داره) در هر سه تصویر، یکی نگه داشته شد.

می‌تونم بگم به جرات مانی ۴ – که در حال حاضر در حال کار روش هستم – با متد «چند مدل» به خوبی تونسته از پس خودش بربیاد و این یعنی که همه چیز چقدر خوب داره پیش میره و با یکم تغییر و یکم ترکیبات جدید، می‌تونه نتایج به شدت بهتری هم بهم بده.

فاین تیون کردن مانی با داده‌های شما

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

اما مانی رو میشه به کمک Dream Booth فاین‌تیون کرد و احتمالا بعدتر در مورد اون هم خواهم نوشت. ولی اگر شما ایده یا دیتایی دارید، می‌تونید به من بگید تا در نسخه ۴ اضافه کنم و مدل بهتری در نهایت ارائه کنم.

جمع‌بندی و سخن آخر

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

این یکی از وجوه این مطالعه/تحقیق بود و وجه دیگرش هم این که چطور ترکیب وزن‌ها و بایاس‌های چند مدل مختلف (که البته از معماری یکسانی تبعیت می‌کنند) می‌تونه در نتیجه اونها تغییر ایجاد کنه.

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

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

یادتان هم نره که یادگیری مستمر به بهبود زندگی شما در هر شرایطی کمک می‌کنه و همیشه شما رو می‌تونه به شخص بهتری تبدیل کنه ✌️

Share

پروژه OCR فارسی و چالش‌های آن

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

پروژه پلاک‌خوان یا Automated Number Plate Recognition که بهش ANPR هم می‌گن، من رو تشویق و تحریک کرد که یک پروژه نویسه‌خوان نوری یا همون OCR فارسی هم پیش ببرم. اما پیش‌برد پروژه OCR تا حد زیادی به تعویق افتاد چرا که درگیر توسعه محصول در استارتاپی بودم. اما از عید نوروز ۱۴۰۱ خیلی جدی‌تر به پیاده‌سازی یک OCR فارسی درست و حسابی فکر کردم. گرچه این پروژه رو تا حد زیادی به عبارتی Hold کردم، اما خب نتایج جالبی تا الان ازش به دست آمده که حیف بود در این مطلب وبلاگ در موردش ننویسم.

پروژه OCR فارسی و چالش های آن

شروع پروژه: درک کارکرد OCR

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

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

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

پروسه انجام پروژه OCR فارسی

فاز اول: تصمیم‌گیری

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

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

حالا که می‌دونم یکی از دلایلی که OCR فارسی رو توسعه می‌دم، اینه که از زبان فارسی حفاظت و صیانت کنم (و قطعا وقتی از حروف فارسی استفاده کنم برای زبان‌های دیگری مثل کُردی، عربی و … هم قابل استفاده خواهد بود) نیاز بود بررسی کنم که چه ابزارهایی در اختیار دارم. اولین ابزاری که به نظرم رسید، بهترین زبان برنامه‌نویسی دنیا بود (😁) یعنی پایتون! خب بررسی پایتون رو در یک بخش جداگانه توضیح میدم ولی فعلا پایتون رو در نظر داشته باشید. در پایتون PyTorch و OpenCV هم داریم که خب یعنی هر آنچه برای کارهام نیاز بود در یک پکیج داشتم.

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

فاز دوم: ابزارهای مورد استفاده برای پیاده‌سازی پروژه OCR فارسی

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

  • پایتون: همونطور که گفتم پایتون، بهترین زبان برنامه‌نویسی دنیا؛ حداقل در این قسمت ماجرا بود. پایتون زبان راحتیه و رسیدن به نتیجه درست و حسابی بهش نسبتا آسون. به همین خاطر پایتون رو انتخاب کردم. گذشته از این بسیاری از ابزارهای هوش مصنوعی و یادگیری ماشین هم در پایتون قابل استفاده هستند.
  • OpenCV: ابزار OpenCV یا Open Computer Vision که معرف حضور همه هست. این ابزار، کلی تابع و کلاس و … برای پردازش تصویر با متدهای کلاسیک یادگیری ماشین رو در خودش جای داده و گذشته از اون، پایه بسیاری از کتابخانه‌های مدیریت و ویرایش تصاویر دیگر مانند Pillow هم هست.
  • زرنویس: ابزار زرنویس (لینک) ابزاری بود که چند وقت پیش برای نوشتن متن فارسی روی تصاویر به کمک Pillow نوشتم.
  • PyTorch: کتابخانه PyTorch هم که باز معرف حضور هست. یکی از بهترین ابزارها برای پیاده‌سازی پروژه‌های یادگیری عمیق.
  • الگوریتم YOLOv5: الگوریتم YOLOv5 (لینک) هم یکی از بهترین الگوریتم‌های تشخیص اشیا یا Object Detection محسوب میشه و خب با کارهای Ultralytics کار باهاش شدیدا راحت هم شده.
  • ابزار LabelImg: ابزار LabelImg (لینک) هم یک ابزار مناسب برای برچسب زدن به تصاویر برای YOLOv5 (و در کل الگوریتم یولو) به حساب میاد.

پروژه OCR فارسی و چالش های آن

فاز سوم: جمع‌آوری داده‌های مناسب برای پروژه و آموزش مدل

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

  • بخش اول – تشخیص اعداد فارسی: در این بخش تا حد زیادی تنبلی کردم و به جای استخراج اعداد از متون، با استفاده از زرنویس و چند فونت فارسی آزاد، حدود صدتا تصویر که در هر کدوم اعداد ۴-۵ رقمی بودند تولید کردم. بعد از اون، اعداد رو لیبل کردم و بعد از لیبل کردن اون‌ها، رفتم سراغ ترین کردن مدل YOLOv5 با استفاده از داده‌ای که از اعداد به دست آورده بودم. این مدل خوب کار کرد، گرچه روی چندین فونت خاص خیلی خوب کار می‌کرد و روی چندین فونت اصلا کار نمی‌کرد. این موارد رو بعدتر در قسمت های آتی توضیح خواهم داد.
  • بخش دوم – تشخیص حروف فارسی: این بخش، یکم چالشی‌تر شد. چطور؟ از اونجا که رندم تولید کردن کلمات فارسی که تمامی حالات حروف درشون باشه (مثلا هم ک توش باشه هم کـ هم ـکـ) کار آسونی نبود. به همین خاطر کاری که کردم چه بود؟ این بود که از دیتاست شتر (لینک) استفاده کردم و حدود ۱۰۰ تا تصویر رو جدا کردم و شروع کردم لیبل زدن و ترین کردن مدل. اینجا نتیجه بهتر بود و می‌تونست فونت‌های بیشتری رو تشخیص بده. گرچه در این مورد خاص، یک سری حروف مثل ث و ژ با دقت کمتری شناخته می‌شدند.
  • بخش سوم – تشخیص بلاک‌های کلمات: دقیقا جایی که چالش داشتم، اینجا بود. لیبل زدن متون طولانی یکم دردسرش زیاد بود. به همین خاطر ابتدا اومدم متون رو «خط به خط» لیبل زدم و خط‌ها رو جدا کردم. بعد از اون با استفاده از Contour های موجود در عکس کلمات رو جدا کنم و به مدل تشخیص حروف بدم که خب اون هم خودش یکم داستان‌های خاص خودش رو داشت. به هرحال، تا اینجای کار، مدل تشخیص اعداد و حروف به خوبی کار می‌کرد و نیاز بود این اتفاق هم بیفته. اما خب متاسفانه این اتفاقه افتادنش یکم سخت بود. نمی‌گم ناممکن اما خب سخته. به همین خاطر، فعلا پروژه در همین مرحله hold شده.

جمع‌بندی و نتایج پروژه

در نهایت ببینیم چه چیزهایی الان داریم و چه چیزهایی نداریم؟ تا نتایج پروژه رو بتونیم بهتر و بهتر و بهتر بررسی کنیم 😁 اول از همه ببینیم چیا رو داریم؟ خب در حال حاضر دو مدل خوب برای تشخیص اعداد و حروف فارسی داریم. این مدلها دارن با دقت‌های خوبی کار می‌کنن اما نیاز دارند که یکم بهتر بشن (یعنی در اینجا نیاز داریم که کمی Fine Tuning روی مدل‌های فعلی یا مدل‌های YOLOv5 و … انجام بدیم) و مدلی برای تشخیص خط و کلمه داریم که درست کار نمی‌کنه. در واقع بخواهیم بهتر ببینیم: چیزی که داریم تشخیص نسبتا با دقت حروف و اعداده و چیزی که نداریم تشخیص کلمات به صورت بلاکه.

پروژه OCR فارسی و چالش های آن

کارهای آینده

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

  • تغییر مدل: یا نوشتن مدل از بتدا با روش‌های Probabilistic یا استفاده از متدهای Instance segmentation
  • تشخیص بهتر بلاک‌های کلمات و شماره (یا با استفاده از Object Detection یا استفاده از سایر متدها)
  • اضافه کردن هسته این کار به یکی از OCR های مشابه مانند EasyOCR یا PaddleOCR

سخن نهایی

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

 

Share

نصب کتابخانه tensorflow روی Raspberry Pi

حدود بهمن یا اسفند سال ۱۳۹۹ بود که من، یک عدد رزبری پای ۴ مدل B (لینک) خریداری کردم که باهاش یه سری ایده رو عملی کنم. از وقتی که این دستگاه رو خریدم، مدت زیادی تقریبا گذشته اما خب چند هفته اخیر، شدیدا با این دستگاه در حال کشتی گرفتن و تست ایده‌های مختلف هستم. یکی از ایده‌های من پروژه‌ای بود که تا حد زیادی به هوش مصنوعی (و بخصوص tensorflow) نیازمند بود. مشکلی که داشتم این بود که در خود مخازن PyPi ای که روی رزبری پای در دسترسه، هیچ ساخت درستی از tensorflow وجود نداره.

اما خب، نمیشه در دنیای تِک ناامید شد؛ به همین خاطر دنبال راهکار و راه حلی گشتم که بتونم تنسرفلو رو روی رزبری پای داشته باشم. یکم سخت‌تر از حالت عادی (که استفاده از pip بود) شد اما ارزشش رو داشت. چون تونستم بدون مشکل مدلی که مدنظر داشتم رو لود و استفاده کنم. همچنین لازمه ذکر کنم که در این مطلب قراره یاد بگیریم چطور خود تنسرفلو رو نصب کنیم و به TFLite کاری نداریم.

رزبری پای چیه؟

رزبری پای (Raspberry Pi) یک کامپیوتر تک‌برد (SBC یا Single Board Computet) محسوب می‌شه که توسط یک بنیاد غیرانتفاعی به همین اسم در بریتانیا طراحی شده (البته تولیدش مثل عمده محصولات دیگر، در کشور چین انجام میشه). این بردها معمولا یک پردازنده ARM دارند و می‌شه روی اونها سیستم‌عامل نصب کرد. خیلی‌هاشون هم ورودی/خروجی عام‌منظوره (General Purpose Input/Output) یا همون GPIO دارند که می‌تونن رابطی بین این کامپیوتر و قطعات الکترونیکی دیگر باشند.

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

تنسرفلو چیه؟

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

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

نصب Tensorflow روی Raspberry Pi

قبل از هرچیزی باید بگم که من این پروسه رو روی Raspberry Pi 4 Model B (با رم ۲ گیگابایت) و سیستم عامل Raspberry Pi OS نسخه Bullseye (بله درست حدس زدید، سیستم‌عامل رزبری پای دبیانه 😁 و صدالبته که می‌تونید توزیع‌های دیگری هم روش نصب کنید) و ویرایش ۶۴ بیتی طی کردم. بسته به مدل رزبری شما و سیستم‌عاملتون، این پروسه می‌تونه متفاوت باشه.

نصب نرم‌افزارهای پایه

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

sudo apt update

و صدالبته بهتره که خود سیستم‌عامل هم بروزرسانی‌های آخرش رو دریافت و نصب کنه:

sudo apt full-upgrade

پس از این که این مراحل انجام شد، تعداد زیادی نرم‌افزار رو به این شکل نصب می‌کنیم:

sudo apt install gfortran libhdf5-dev libc-ares-dev libeigen3-dev libatlas-base-dev libopenblas-dev libblas-dev liblapack-dev

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

نصب و بروزرسانی بسته های پایتونی

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

pip3 install pybind11
pip3 install Cython==0.29.21
pip3 install h5py==2.10.0

و سپس بسته setuptools رو هم بروزرسانی می‌کنیم:

pip3 install --upgrade setuptools

و این یکی رو هم نصب می‌کنیم (چرا که باید فایل تنسرفلو رو با این بزرگوار دانلود کنیم)

pip3 install gdown

دانلود و نصب Tensorflow

خب ابتدا به کمک gdown فایل wheel (فایل‌های wheel فایل‌هایی هستند که pip می‌فهمه باید نصبشون کنه) مربوط به نسخه مورد نظر تنسرفلو رو دانلود می‌کنیم:

gdown https://drive.google.com/file/d/1YpxNubmEL_4EgTrVMu-kYyzAbtyLis29

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

سپس کافیه که با اجرای این دستور:

pip3 install <TENSORFLOW WHL FILE>.whl

نصب رو انجام بدید.

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

جمع‌بندی

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

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

در پایان، ضمن تشکر از این که وقت گذاشتید و این مطلب رو خوندید، باید بگم که هنوز می‌تونید من رو به یک فنجان قهوه مهمان کنید 🙂

Share

پروژه خودروی خودران – قسمت دوم

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

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

اتصال دوربین به شبکه جهت عکس‌برداری

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

بعد از این که گوشی رو شارژ کردم و به عبارتی به زندگی برش گردوندم، نرم‌افزار Droid Cam رو روش نصب کردم. با کمک این نرم‌افزار، به سادگی میشه گوشی رو به یک دوربین تحت شبکه تبدیل کرد و این یعنی این که حجم زیادی از دردسرهای مرتبط با اتصال دوربین به بوردهایی مثل آردوینو و ESP اینجا کنار رفته. بعد از این که این نرم‌افزار نصب شد و گوشی هم روی شاسی قرار گرفت، کدی نوشتم که به گوشی وصل شه و بتونه در حالات مختلف، عکس‌برداری کنه. کد مرتبط از این لینک در دسترسه.

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

برای این که پروژه هوش مصنوعی به خوبی بتونه از پس کاری که می‌خواهیم بربیاد، نیازمند داده‌های زیادی هستیم. اصولا این دید وجود داره که «هرچی داده بیشتر، بهتر». این دید گرچه بعضی جاها می‌تونه خطرناک باشه (مثل زمانی که overfit می‌شیم و …) اما عموما دید درستیه. به همین خاطر، ماشین رو راه انداختم و با استفاده از اون کدی که نوشته بودم، شروع کردم عکس برداری. نمونه‌ای از این عکس‌ها رو در اینجا می‌بینید:

پروژه خودروی خودران - قسمت دوم

بعد از این که این عکس‌ها گرفته شد، نیاز بود یک مدل هوش مصنوعی درست بشه. حقیقت اینه که به جای کد زدن برای درست کردن مدل، از «ماشین قابل آموزش» گوگل (لینک) استفاده کردم و یه مدل تشخیص تصویر درست کردم و اون رو در یک کد وارد کردم (لینک کد). بعد از این که از عملکرد نسبی این قضیه مطمئن شدم، یک کد دیگر نوشتم که دستورات خودران رو اجرا کنه (لینک کد خودران) که البته خیلی هم خوب نبود :))

نمونه عملکرد خودران

جمع‌بندی

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

Share

پروژه خودروی خودران – قسمت اول

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

بعد از چند هفته تحقیق و تفحص، اول تصمیمم بر این بود که یک ماشین کنترلی تهیه کنم و شروع کنم روی اون کار کردن. ولی موضوعات مهمی اینجا مطرح می‌شدند. اولین و مهم‌ترین موضوع – که پیش‌تر هم بهش برخورده بودم – این بود که ماشین‌های کنترلی، عموما شاسی بزرگ و قوی ندارند و چیزی که من نیاز داشتم، یک شاسی بزرگ برای جا دادن وسایلی بود که نیاز داشتم. به همین خاطر مدتی باز تحقیق کردم که چه چیزی می‌تونم تهیه کنم که این مشکل رو نداشته باشه؟ بعد از اون در مورد درایور موتور نیاز بود تحقیق کنم. بعد از این موضوعات، این که چطور مدل هوش مصنوعی رو روش مستقر کنم و … . در ادامه این مطلب، قراره با هم بخش رباتیک (مکانیکی و الکترونیکی به طور خاص) رو بررسی کنیم و بعد بریم سروقت بخش نرم‌افزاری ماجرا 🙂

پروژه خودروی خودران - قسمت اول

شاسی مورد نیاز

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

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

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

درایور موتور

وقتی از موتورهای DC و بخصوص موتورهای Brushed استفاده می‌کنیم، نیازمند درایور هستیم (اگر براتون سواله که چرا، می‌تونید این ویدئو رو ببینید). به همین جهت، چیزی که نیاز داشتم یک درایور مناسب برای چنین موتوری بود. تصمیم من این شد که از L298N استفاده کنم. این درایور رو یادمه که در درس ریزپردازنده بهمون درس داده بودند و گزینه آشنایی برام بود. علاوه بر این، چندتایی از این درایور در وسایل الکترونیکیم داشتم. پس همه چیز تحت کنترل بود و کل مجموعه رو شروع کردم سوار کردن. اما مساله مهم دیگر چی بود؟ درسته؛ کنترل از راه دور 🙂

پروژه خودروی خودران - قسمت اول

کنترل از راه دور

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

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

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

دوربین

همونطور که در بخش قبلی گفتم، به ESP8266 به این راحتیا نمیشه دوربین متصل کرد. نتیجه این شد که تصمیم گرفتم از یک گوشی اندرویدی استفاده کنم. اول کمی در فروشگاه‌های اینترنتی و … جست و جو کردم و دنبال گوشی‌های اندرویدی ارزون قیمت گشتم. اما یادم افتاد که گوشی قبلی خودم یعنی Samsung Galaxy J7 ای که دارم، دوربین خوبی داره. گذشته از اون، میشه با استفاده از Droid Cam و نرم‌افزارهای مشابه، تصویر رو به کد پایتونی فرستاد و اونجا پردازش‌های لازم رو روش انجام داد.

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

پروژه خودروی خودران - قسمت اول

در آینده چه خواهیم خواند؟

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

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

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

Share

ایده هایی برای پروژه های بینایی ماشین

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

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

ایده های مرتبط با تشخیص چهره

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

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

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

همه ایده‌های بالا، به سادگی قابل انجام هستند. فقط کافیه که کار با کتابخانه‌ها و تئوری پردازش تصویر رو بلد باشید. شاید دو سه روزه بتونید یکی از این پروژه‌ها رو به ثمر برسونید 😁

ایده‌ های مرتبط با تشخیص کرکتر

نتایج آزمایش روی دیتاست آزمایشی

تشخیص نوری نویسه یا Optical Character Recognition که به اختصار به اون OCR هم گفته می‌شه، یکی از شاخه‌های پرطرفدار دیگر در حوزه بینایی ماشین می‌تونه به حساب بیاد. پروژه‌هایی که در این حوزه انجام می‌شن به شدت کاربردی هستند و طبیعیه که در حوزه‌های مختلفی کاربرد خواهند داشت. در اینجا تعدادی از ایده‌هایی که می‌تونید روش کار کنید رو اینجا فهرست کردم:

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

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

ایده های مرتبط با پزشکی

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

بینایی ماشین هم استثناء نیست و طبیعتا می‌تونه خیلی به کمک افراد بیاد. در این بخش، تعداد زیادی از ایده‌هایی که می‌تونه به پزشک‌ها در شناخت بهتر مشکلات بیمارهاشون کمک کنه رو فهرست کردم و خب بد نیست اگر شما هم سراغش برید و سعی کنید یکیش رو پیاده کنید (این بخش می‌تونه برای دانشجویان مهندسی پزشکی و پزشکی؛ بسیار مفید باشه)

  • تشخیص نوع تومور مغزی (تصویر این بخش، پروژه‌ای که خودم انجام دادم)
  • تشخیص رتینوپاتی دیابتی در اشخاص مبتلا به دیابت
  • تشخیص MS و مراحل مختلف اون بر اساس MRI
  • تشخیص سلول‌های سرطانی
  • تشخیص میزان درگیری ریه در بیماری‌های تنفسی (مانند COVID-19)
  • تشخیص ناهنجاری‌های پوستی
  • تشخیص آسیب‌های استخوان
  • تشخیص آسیب‌دیدگی‌ها و پوسیدگی‌های دندان

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

سایر حوزه‌ها

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

تشخیص حرکت یا Action Detection

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

خودروهای خودران

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

مصرف انرژی

حوزه انرژی هم حوزه جالبی می‌تونه برای پروژه‌های بینایی ماشین باشه. برای مثال OCR ای که بتونه دیتای کنتور گاز/برق رو به متن تبدیل کنه و اون رو با یک مرکز محاسبه قیمت، چک کنه و قیمت رو به ما اعلام کنه. همچنین می‌شه عکس‌های حرارتی از خانه‌ها و … تهیه کرد و با استفاده از بینایی ماشین دقیقا بررسی کرد که کجاها انرژی بیشتری داره از دست میره و … .

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

کشاورزی

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

ضمن این که امنیت زمین کشاورزی و گلخانه، بررسی نور و رنگ و … هم می‌تونن اینجا کاربردی باشند.

جمع‌بندی مطلب

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

 

Share