مدت بسیار بسیار زیادی بود که اینجا مطلبی نمینوشتم چون حقیقتا درگیر توسعه پلتفرم هوش مصنوعی مانی بودم (قبلتر هم اینجا در موردش نوشته بودم). و خب همین باعث شد که مدتی نسبتا طولانی، از دنیای بلاگ و بلاگنویسی دور باشم. اما خب همیشه هم در روی یک پاشنه نمیچرخه و گاهی هم لازمه دست به قلم شد. به همین خاطر آمدم اینجا مجددا تا در مورد چیرگی زبان انگلیسی در دنیای هوش مصنوعی و این که چرا باید نگران این موضوع باشیم بنویسم.
خواهشی که از خوانندگان این بلاگ دارم اینه که این پست رو از دید یک شخص دغدغهمند زبان فارسی بخونید و نه از دید یک مهندس کامپیوتر. چرا که بیشتر دغدغهها، از جنس دغدغه زبانی و فرهنگیه. حتی اگر زبان اول و مادری شما فارسی نیست، ازتون میخوام که این متن رو دقیقا با این دید بخونید که جای زبان شما هم در دنیای هوش مصنوعی، خالیه. پس بزنید بریم 🙂
هوش مصنوعی در خدمت انگلیسیزبانها
در سالهای اخیر، با ارائه مدلهای زبانی که در تولید متن (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, … میتونن پرفرمنس خوبی در این زمینه داشته باشند. تلاشهایی در این جهت داره میشه و به زودی در موردش در همین بلاگ خواهم نوشت 🤩
سخن آخر
در نهایت، باید بگم یکی از مهمترین عواملی که افراد یک جامعه رو کنار هم نگه میداره، زبانشونه. در روزگاران گذشته، حفظ زبان منوط به تاریخنگاری و شعر و … بوده. کمی گذشت، زبانها با نثر و رمان خودشون رو حفظ کردند و بعد از اون وارد عصر رسانه و جراید شدیم.
اما نکته اینه که در دنیای امروز، در سال ۱۴۰۲ خورشیدی، در ۲۰۲۳ میلادی یا هرچی که شما قبول دارید، حفظ زبانها، خواه فارسی خواه عربی، خواه ترکی خواه کردی، مستلزم اینه که ماشینها درک خوبی از اون زبان داشته باشند. به همین خاطر این پست بلاگ نوشته شد تا این نگرانی به گوش سایر افرادی که ممکنه دغدغه مشابه داشته باشند، برسه.
متنی که در ادامه میخوانید، ترجمه فارسی مصاحبه من با یک شرکت آلمانیه که یک رسانه هم برای انجام مصاحبه و تولید محتوا در مورد مسائل مرتبط با نرمافزار، کامپیوتر، هوش مصنوعی و … دارند. مصاحبه به زبان انگلیسی اینجا و مصاحبه به زبان آلمانی اینجا در دسترسند.
مصاحبه با محمدرضا حقیری، مهندس هوش مصنوعی
ما با محمدرضا حقیری، توسعهدهندهای از ایران که هماکنون مشغول کار بر روی یک مدل متن به تصویر متنباز به نام مانی است، صحبت کردیم.
او دانشش درباره فناوریهایی که برای توسعه این مدل استفاده کرده را با ما به اشتراک گذاشته است. هوش مصنوعی چندمدلی او، از 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 (هوش مصنوعی مولد) به صورت آزاد/متنباز کار میکنه و خب حیف بود که الان که موقعشه، منتشرش نکنم.
خلاصه که ازتون ممنونم بابت وقتی که گذاشتید و خوندید. اگر به چنین مطالبی علاقمندید، میتونید من رو در ویرگول هم دنبال کنید و اونجا هم مطالب مشابهی رو مطالعه کنید. ممنونم بابت وقتی که گذاشتید و خوندید.
پس از یک مدت طولانی ننوشتن، بالاخره برگشتم تا بخوام در مورد مانی صحبت کنم. فکر کنم مدتهای طولانیه که این پروژه رو شروع کردم ولی خب هربار به یک دلیل خاصی، از نوشتن محتوای فارسی در موردش صرف نظر کرده بودم. اما این بار آمدم تا با قدرت در مورد مانی، میدجرنی، دالی و سایر دوستانی که به کمک هوش مصنوعی برای شما نقاشی جنریت میکنن صحبت کنم.
ابتدا بذارید کمی از میدجرنی صحبت کنم.میدجرنی یک ابزار هوش مصنوعیه که در پیامرسان اجتماعی دیسکورد داره استفاده میشه و مردم با کمکش تصاویر جذابی تولید میکنند. میدجرنی، همیشه چند مرحله از باقی تولیدکنندگان تصویر جلوتر بود و همین باعث شده بود که خیلیها حتی از من بپرسند «چرا مثل اون تصویر تولید نمیکنی؟» و در نهایت من هم به این نتیجه رسیدم که باید ته و توی این مدل خاص رو دربیارم و مانی رو بهش نزدیک یا ازش بهتر کنم. در این پست، قصد دارم در مورد پروسه کارم بنویسم.
تاریخچه مانی
پارسال همین موقعها (حوالی شروع سال نوی میلادی، در این حد که حتی یادمه که جنگ اکراین هم حتی شروع نشده بود) در خیلی از شبکههای اجتماعی میدیدم که دوستان دیگری دارند با کمک هوش مصنوعی، نقاشی تولید میکنند و خب حقیقتا من هم با خودم گفتم که بهتره من هم سراغ این قضیه برم.
اون موقع، ابزاری به اسم 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 نزدیک یا ازشون بهتر باشند.
این یکی از وجوه این مطالعه/تحقیق بود و وجه دیگرش هم این که چطور ترکیب وزنها و بایاسهای چند مدل مختلف (که البته از معماری یکسانی تبعیت میکنند) میتونه در نتیجه اونها تغییر ایجاد کنه.
خب باید بگم که این فاز آکادمیک و تحقیقاتی به خوبی پیش رفته و کمی جای توسعه و تحقیق فنی برای این پروژهها باقی میمونه که در آیندهای نه چندان دور، بروزرسانیهای اون هم منتشر میشه.
در نهایت بگم که اگر دوست دارید محتوای مشابه و به زبان انگلیسی بخونید میتونید بلاگ انگلیسی من، اگر دوست دارید محتوای سابق من رو بخونید ویرگول من (بنا به پارهای از اتفاقات دیگر در ویرگول نمینویسم) و اگر هم علاقمند به بینایی ماشین هستید جامعه بینایی ماشین رو بخونید.
یادتان هم نره که یادگیری مستمر به بهبود زندگی شما در هر شرایطی کمک میکنه و همیشه شما رو میتونه به شخص بهتری تبدیل کنه ✌️
احتمالا در جریان باشید که مدت نسبتا زیادیه که وارد حوزه پردازش تصویر و بینایی ماشین شدم (برای مثال نقشه راه بینایی ماشین رو میتونید از اینجا بخونید) و حتی یک کانال تلگرامی کوچک برای انتقال دانش و تجربه در این زمینه راه انداختم که اسمش رو جامعه بینایی ماشین گذاشتم (که میتونید اینجا در موردش بخونید). چند ماه پیش، یکی از دوستانم ایدهای مطرح کرد. این ایده، در مورد خوندن پلاک ماشین و ثبتش در یک پایگاه داده با کمک هوش مصنوعی بود (که این پروژه هم انجام شد و اینجا در مورد این پروژه هم توضیح دادم).
پروژه پلاکخوان یا Automated Number Plate Recognition که بهش ANPR هم میگن، من رو تشویق و تحریک کرد که یک پروژه نویسهخوان نوری یا همون OCR فارسی هم پیش ببرم. اما پیشبرد پروژه OCR تا حد زیادی به تعویق افتاد چرا که درگیر توسعه محصول در استارتاپی بودم. اما از عید نوروز ۱۴۰۱ خیلی جدیتر به پیادهسازی یک OCR فارسی درست و حسابی فکر کردم. گرچه این پروژه رو تا حد زیادی به عبارتی Hold کردم، اما خب نتایج جالبی تا الان ازش به دست آمده که حیف بود در این مطلب وبلاگ در موردش ننویسم.
شروع پروژه: درک کارکرد 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 (و در کل الگوریتم یولو) به حساب میاد.
فاز سوم: جمعآوری دادههای مناسب برای پروژه و آموزش مدل
من همیشه در پروژههای هوش مصنوعی، علم داده، یادگیری ماشین و … یک حرف ثابت رو تکرار میکنم. اون حرف چیه؟ این که جمعآوری و پیشپردازش داده مورد استفاده در پروژه، سختترین بخش کاره. در این پروژه هم همینطور بود. اولین گامی که داشتم این بود که بیام و خود پروژه رو فازبندی کنم. چطوری؟ اینطوری که بیام کار رو بخش به بخش ببرم جلو و برای هربخش، جدا پلن بچینم. به همین خاطر به چند بخش ریز تقسیمش کردم که دقیقا بنبستم در یکی از این بخشها بود.
بخش اول – تشخیص اعداد فارسی: در این بخش تا حد زیادی تنبلی کردم و به جای استخراج اعداد از متون، با استفاده از زرنویس و چند فونت فارسی آزاد، حدود صدتا تصویر که در هر کدوم اعداد ۴-۵ رقمی بودند تولید کردم. بعد از اون، اعداد رو لیبل کردم و بعد از لیبل کردن اونها، رفتم سراغ ترین کردن مدل YOLOv5 با استفاده از دادهای که از اعداد به دست آورده بودم. این مدل خوب کار کرد، گرچه روی چندین فونت خاص خیلی خوب کار میکرد و روی چندین فونت اصلا کار نمیکرد. این موارد رو بعدتر در قسمت های آتی توضیح خواهم داد.
بخش دوم – تشخیص حروف فارسی: این بخش، یکم چالشیتر شد. چطور؟ از اونجا که رندم تولید کردن کلمات فارسی که تمامی حالات حروف درشون باشه (مثلا هم ک توش باشه هم کـ هم ـکـ) کار آسونی نبود. به همین خاطر کاری که کردم چه بود؟ این بود که از دیتاست شتر (لینک) استفاده کردم و حدود ۱۰۰ تا تصویر رو جدا کردم و شروع کردم لیبل زدن و ترین کردن مدل. اینجا نتیجه بهتر بود و میتونست فونتهای بیشتری رو تشخیص بده. گرچه در این مورد خاص، یک سری حروف مثل ث و ژ با دقت کمتری شناخته میشدند.
بخش سوم – تشخیص بلاکهای کلمات: دقیقا جایی که چالش داشتم، اینجا بود. لیبل زدن متون طولانی یکم دردسرش زیاد بود. به همین خاطر ابتدا اومدم متون رو «خط به خط» لیبل زدم و خطها رو جدا کردم. بعد از اون با استفاده از Contour های موجود در عکس کلمات رو جدا کنم و به مدل تشخیص حروف بدم که خب اون هم خودش یکم داستانهای خاص خودش رو داشت. به هرحال، تا اینجای کار، مدل تشخیص اعداد و حروف به خوبی کار میکرد و نیاز بود این اتفاق هم بیفته. اما خب متاسفانه این اتفاقه افتادنش یکم سخت بود. نمیگم ناممکن اما خب سخته. به همین خاطر، فعلا پروژه در همین مرحله hold شده.
جمعبندی و نتایج پروژه
در نهایت ببینیم چه چیزهایی الان داریم و چه چیزهایی نداریم؟ تا نتایج پروژه رو بتونیم بهتر و بهتر و بهتر بررسی کنیم 😁 اول از همه ببینیم چیا رو داریم؟ خب در حال حاضر دو مدل خوب برای تشخیص اعداد و حروف فارسی داریم. این مدلها دارن با دقتهای خوبی کار میکنن اما نیاز دارند که یکم بهتر بشن (یعنی در اینجا نیاز داریم که کمی Fine Tuning روی مدلهای فعلی یا مدلهای YOLOv5 و … انجام بدیم) و مدلی برای تشخیص خط و کلمه داریم که درست کار نمیکنه. در واقع بخواهیم بهتر ببینیم: چیزی که داریم تشخیص نسبتا با دقت حروف و اعداده و چیزی که نداریم تشخیص کلمات به صورت بلاکه.
کارهای آینده
در این بخش بهتره به این فکر کنیم که چه کارهایی در آینده میشه برای بهبود این پروژه انجام داد. در لیست زیر به این مسائل میپردازیم که دقیقا چه کارهایی لازمه انجام بشه.
تغییر مدل: یا نوشتن مدل از بتدا با روشهای Probabilistic یا استفاده از متدهای Instance segmentation
تشخیص بهتر بلاکهای کلمات و شماره (یا با استفاده از Object Detection یا استفاده از سایر متدها)
اضافه کردن هسته این کار به یکی از OCR های مشابه مانند EasyOCR یا PaddleOCR
سخن نهایی
در پایان باید از شما بابت زمانی که گذاشتید و این متن نسبتا بلند بالا رو خوندید، متشکرم. در حال حاضر، شما میتونید کدهایی که برای این پروژه نوشتم رو اینجا بخونید و اگر لازم بود، کمکی به پروژه کنید. اگر هم نه که میتونید از مدلها و دفترچههای ژوپیتری که قرار دادم استفاده کنید. همچنین، اگر دوست دارید مطالبی مشابه این وبلاگ بخونید میتونید به ویرگول من (لینک) مراجعه کنید.
حدود بهمن یا اسفند سال ۱۳۹۹ بود که من، یک عدد رزبری پای ۴ مدل 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
پس از این که این مراحل انجام شد، تعداد زیادی نرمافزار رو به این شکل نصب میکنیم:
عمده این نرمافزارها رو بر اساس پیامهای خطایی که دریافت میکردم پیدا کردم، چرا که وقتی شما روی سیستم دسکتاپ یا لپتاپ خودتون تنسرفلو نصب میکنید، بسیاری از اینها (متناسب با معماری پردازنده) پیشتر نصب شدند اما سیستمعاملهایی که روی رزبری نصب میکنیم چنین حالتی ندارند. بهرحال، همه نرمافزارهای پایهای که نیازه از مخزن دبیان نصب بشه، در این دستور موجوده (طبیعتا اگر نیاز به بسته دیگری باشه بعدا این مطلب ویرایش میشه)
نصب و بروزرسانی بسته های پایتونی
خب ما تعدادی پیشنیاز پایتونی هم داریم (که اینها رو اکثرا حتی در وبسایت تنسرفلو هم میشه پیدا کرد) که با دستورات زیر نصبشون میکنیم:
توجه کنید که اگر این دستور کار نکرد هم جای نگرانی نیست، میتونید این لینک رو باز کنید و فایل رو خودتون دانلود کنید.
سپس کافیه که با اجرای این دستور:
pip3 install <TENSORFLOW WHL FILE>.whl
نصب رو انجام بدید.
ضمنا، از اونجایی که ممکنه بعدتر نسخهها تغییر کنن، بهتره که این صفحه رو هم هر چند وقت یه بار چک کنید تا اگر نیاز بود نسخه تنسرفلو رو تغییر بدید، فایل مربوطه رو دانلود کنید.
جمعبندی
مدتهای زیادی میشه که دوست دارم در مورد پروژههایی که در حوزه «اینترنت چیزها» یا همون IoT انجام میدم هم بنویسم. اما متاسفانه پروژههای سختافزاری، وقت زیادی از آدم میگیرن و وقتی وقت آزاد زیادی نداشته باشید، معمولا به پروژههای سختافزاریتون هم آنچنان نمیتونید رسیدگی کنید. به همین خاطر مدتی میشه که در تلاشم تا پروژههای شخصی و صدالبته کاریم در حوزه بینایی ماشین رو با IoT ترکیب کنم و به این شکل این حوزه رو هم وارد کارهای روتین و اصلیم کنم که وقت هم همیشه براشون باشه 😁
تست چند پروژه بینایی ماشین روی Raspberry Pi شروعی برای این دوران از زندگی منه. راستی، اگر دوست دارید نقشه راه بینایی ماشین رو داشته باشید میتونید بیایید اینجا، اگر دنبال ایده برای پروژهها هستید هم اینجا رو بخونید. حتی میتونید به ما در جامعه بینایی ماشین هم ملحق بشید و اشتراک تجربه و دانش کنید.
در قسمت قبلی (لینک) در مورد این که چرا پروژه خودران رو آغاز کردم و این که چند فاز و چند مرحله داره، نوشتم. در این قسمت، در مورد پیادهسازی صحبت میکنم و صد البته، مشکلی که این خودرو در تشخیص مسیر داشت. لازمه به ذکره که این قسمت، آخرین قسمت از مطالبم در مورد این پروژه نخواهد بود و در آینده؛ قطعا باز هم ازش مینویسم. اما در حال حاضر، ترجیح دادم که پروژه خودران رو به حالت Hold در بیارم. در ادامه در این مورد هم توضیحات لازم رو خواهم داد.
بگذریم، در قسمت قبلی پلن رو توضیح دادم، بعدش هم گفتم که قراره چطوری خودروی خودران رو بسازیم و چی کارا بکنیم. کمی هم در مورد سختافزارش توضیح دادم. در این قسمت، قراره که در مورد نرمافزار و هوش مصنوعیای که در این پروژه استفاده شده، صحبت کنم. در نهایت هم یک ویدئو ازش آپلود میکنم که ببینید چقدر هنوز مشکل داره 😁
اتصال دوربین به شبکه جهت عکسبرداری
همونطوری که پیشتر در مطلبی در همین وبلاگ گفتم (لینک) یکی از بهترین ابزارها برای جمعآوری داده مرتبط با پروژههایی مثل همین خودروی خودران، دوربین یا میکروفن خود شماست. نکته مهم و قابل توجه اینه که در پروژه خودران، نمیشه به دادههای خارجی اتکا کرد چرا که خیلیهاشون اصلا اونطوری که ما پلن چیدیم، نیستن. به همین خاطر، من گوشی قدیمی خودم (سامسونگ گلکسی J7 که شاید حدود ۴ سال گوشی من بود) رو به عنوان دوربین در این پروژه انتخاب کردم.
بعد از این که گوشی رو شارژ کردم و به عبارتی به زندگی برش گردوندم، نرمافزار Droid Cam رو روش نصب کردم. با کمک این نرمافزار، به سادگی میشه گوشی رو به یک دوربین تحت شبکه تبدیل کرد و این یعنی این که حجم زیادی از دردسرهای مرتبط با اتصال دوربین به بوردهایی مثل آردوینو و ESP اینجا کنار رفته. بعد از این که این نرمافزار نصب شد و گوشی هم روی شاسی قرار گرفت، کدی نوشتم که به گوشی وصل شه و بتونه در حالات مختلف، عکسبرداری کنه. کد مرتبط از این لینک در دسترسه.
عکسبرداری و آموزش مدل هوش مصنوعی
برای این که پروژه هوش مصنوعی به خوبی بتونه از پس کاری که میخواهیم بربیاد، نیازمند دادههای زیادی هستیم. اصولا این دید وجود داره که «هرچی داده بیشتر، بهتر». این دید گرچه بعضی جاها میتونه خطرناک باشه (مثل زمانی که overfit میشیم و …) اما عموما دید درستیه. به همین خاطر، ماشین رو راه انداختم و با استفاده از اون کدی که نوشته بودم، شروع کردم عکس برداری. نمونهای از این عکسها رو در اینجا میبینید:
بعد از این که این عکسها گرفته شد، نیاز بود یک مدل هوش مصنوعی درست بشه. حقیقت اینه که به جای کد زدن برای درست کردن مدل، از «ماشین قابل آموزش» گوگل (لینک) استفاده کردم و یه مدل تشخیص تصویر درست کردم و اون رو در یک کد وارد کردم (لینک کد). بعد از این که از عملکرد نسبی این قضیه مطمئن شدم، یک کد دیگر نوشتم که دستورات خودران رو اجرا کنه (لینک کد خودران) که البته خیلی هم خوب نبود :))
نمونه عملکرد خودران
جمعبندی
همونطوری که دیدید، این پروژه هنوز زیادی جوانه و هنوز هم مشکلاتی داره. کدهایی که تا الان براش زدم، همه در گیتهاب شخصی من موجودند (لینک) و میتونید خودتون برای پروژههاتون ازش استفاده کنید. همچنین اگر ایدهای برای بهبود عملکرد کد دارید هم ممنون میشم Pull Request ارسال کنید. در آینده هم احتمالا کمی بیشتر روی این پروژه کار خواهم کرد و ایدههای بیشتری رو به آزمایش خواهم گذاشت. در نهایت، از این که وقت میذارید و این وبلاگ رو میخونید، ازتون ممنونم 🙂
مدتی پیش بود که در همین وبلاگ، در مورد خودروهای خودران نوشتم (لینک) و بعدتر حتی در مطلب ایدههایی برای پروژههای بینایی ماشین، در موردش صحبت کردم. چند وقت پیش، ویدئوهای زیادی از افرادی دیدم که در سالهای گذشته، خودروی خودران خودشون رو ساختند. چیزی که نظرم رو جلب کرد، این بود که این پروژهها عمدتا تبدیل خودروهای اسباببازی به خودروی خودران بود. نتیجتا تصمیم گرفتم تا روی موضوع کمی بیشتر فکر کنم و شروع کنم به طراحی پروژه خودروی خودران خودم.
بعد از چند هفته تحقیق و تفحص، اول تصمیمم بر این بود که یک ماشین کنترلی تهیه کنم و شروع کنم روی اون کار کردن. ولی موضوعات مهمی اینجا مطرح میشدند. اولین و مهمترین موضوع – که پیشتر هم بهش برخورده بودم – این بود که ماشینهای کنترلی، عموما شاسی بزرگ و قوی ندارند و چیزی که من نیاز داشتم، یک شاسی بزرگ برای جا دادن وسایلی بود که نیاز داشتم. به همین خاطر مدتی باز تحقیق کردم که چه چیزی میتونم تهیه کنم که این مشکل رو نداشته باشه؟ بعد از اون در مورد درایور موتور نیاز بود تحقیق کنم. بعد از این موضوعات، این که چطور مدل هوش مصنوعی رو روش مستقر کنم و … . در ادامه این مطلب، قراره با هم بخش رباتیک (مکانیکی و الکترونیکی به طور خاص) رو بررسی کنیم و بعد بریم سروقت بخش نرمافزاری ماجرا 🙂
شاسی مورد نیاز
پس از این که تصمیم گرفتم حتما یک پروژه خودروی خودران داشته باشم، یکی از مواردی که بهش خیلی فکر میکردم، این بود که حتما یه شاسی مناسب تهیه کنم. اول، همونطوری که ابتدای مطلب گفتم، به ماشینهای کنترلی اسباببازی فکر میکردم. ماشین کنترلی، یک سری ویژگی خوب داره. مثل چی؟ مثل این که موتورها روش سوار شدند، احتمالا درایور مناسب موتور داره، جا باتری داره و … . اما خب این هم باید در نظر گرفت که برد کنترل ماشین پیشاپیش متناسب با همون شاسی خودش ساخته شده و نمیشه خیلی هم دستکاریش کرد.
مورد بعدی که بهش فکر میکردم، این بود که شاسی رو از بیخ و بن بسازم. حقیقت اینه که ساخت شاسی، بیش از اندازه پروسه مکانیکی و وقتگیریه. بخصوص این که تجربه زیادی در اون زمینه خاص ندارم و نیاز بود که حجم زیادی آزمون و خطا صورت بگیره. مهمترین ویژگی خودروی خودران برای من، این بود که قابلیت کنترل از راه دور داشته باشه و همچنین بتونیم روی اون، یک مدل هوش مصنوعی سوار کنیم. به همین خاطر، تصمیم گرفتم که یک شاسی آماده ربات بخرم. شاسیای که خریداری کردم، یک شاسی برای رباتهای دانشآموزی بود که از پاساژ عباسیان (واقع در خیابان جمهوری تهران) خریداری شد.
بعد از خرید شاسی، نیازمند این بودم که موتور رو به شکلی راه بندازم. راهی که خود آقای فروشنده پیشنهاد میکرد این بود که از یک ترانزیستور به همراه باتریهای معمولی استفاده بشه، اما ترجیح من این بود که از یک درایور خوب استفاده کنم که در بخش بعدی، در موردش توضیح خواهم داد.
درایور موتور
وقتی از موتورهای DC و بخصوص موتورهای Brushed استفاده میکنیم، نیازمند درایور هستیم (اگر براتون سواله که چرا، میتونید این ویدئو رو ببینید). به همین جهت، چیزی که نیاز داشتم یک درایور مناسب برای چنین موتوری بود. تصمیم من این شد که از L298N استفاده کنم. این درایور رو یادمه که در درس ریزپردازنده بهمون درس داده بودند و گزینه آشنایی برام بود. علاوه بر این، چندتایی از این درایور در وسایل الکترونیکیم داشتم. پس همه چیز تحت کنترل بود و کل مجموعه رو شروع کردم سوار کردن. اما مساله مهم دیگر چی بود؟ درسته؛ کنترل از راه دور 🙂
کنترل از راه دور
برای کنترل از راه دور، امکان این بود که از رادیو یا مادون قرمز استفاده بشه. همونطوری که در ماشینهای کنترلی اسباب بازی این اتفاق میافتاد. اما میخواستم که پروژه کمی بهتر و باحالتر بشه، به همین خاطر تصمیم گرفتم که این کنترل رو از طریق وایفای انجام بدم. به همین خاطر هم یک ماژول NodeMCU ESP8266 رو از گنجه بیرون کشیدم و شروع کردم به سیمکشی. اما نکته این بود که از گذشته در یادم مونده بود که این ماژول خاص، ولتاژ خروجی بالایی نداشت و نیازمند کمی تغییر بود. برای این که این مشکلات دوباره پیش نیان، کمی در مستندات خود ماژول چرخ زدم و آموزشهای مربوط به راهاندازی موتور رو خوندم.
بعد از این که موتور با موفقیت راهاندازی شد، چندین تابع نوشتم که عملیات جلو، عقب، چپ، راست رو داشته باشه. یک تابع دیگر هم نوشتم که همزمان موتورها رو خاموش کنه. بعد از اون، یک وبسرور کوچک روی ESP راه انداختم که اون توابع رو اجرا کنه و موتورها رو بچرخونه. بعد از این که این موارد رو تست کردم یک سری باگ ریز داشتم که رفعشون کردم. در نهایت، تصمیم گرفتم که منبع قدرت موتورها و ماژول رو جدا کنم و به همین خاطر یک پاوربانک کوچک هم به این ترکیب اضافه شد.
بعد از کنترل از راه دور، چیزی که باقی میمونه، اینه که چطور میتونیم ورودی تصویری رو تهیه کنیم. به هرحال همونطوری که قبلتر توضیح داده بودم، خودروی خودران نیازمند اینه که ورودی رو از محیط بگیره. ماژول ESP به این راحتیا به دوربین متصل نمیشه، بشه هم ران کردن یک مدل و سیستم هوش مصنوعی روش به شدت کند و سخت خواهد بود. به همین خاطر، تصمیم گرفتم که هوش مصنوعی رو جای دیگه سوار کنم و دوربین صرفا داده رو به اون سیستم ارسال کنه.
دوربین
همونطور که در بخش قبلی گفتم، به ESP8266 به این راحتیا نمیشه دوربین متصل کرد. نتیجه این شد که تصمیم گرفتم از یک گوشی اندرویدی استفاده کنم. اول کمی در فروشگاههای اینترنتی و … جست و جو کردم و دنبال گوشیهای اندرویدی ارزون قیمت گشتم. اما یادم افتاد که گوشی قبلی خودم یعنی Samsung Galaxy J7 ای که دارم، دوربین خوبی داره. گذشته از اون، میشه با استفاده از Droid Cam و نرمافزارهای مشابه، تصویر رو به کد پایتونی فرستاد و اونجا پردازشهای لازم رو روش انجام داد.
برای سوار کردن گوشی موبایل هم یک پایه دوربین قدیمی رو برداشتم، پایههاش رو جدا کردم و سپس پایه و گوشی رو همراه هم روی شاسی چسبوندم. در حال حاضر، بخش سختافزاری خودروی خودران، کاملا آمادهست!
در آینده چه خواهیم خواند؟
بخش بزرگی از پروژه خودروی خودران من، مربوط به سختافزارش بود چرا که داشتم این قسمت رو هم خودم طراحی و پیادهسازی میکردم. نتیجه این شد که این مورد خیلی طول کشید (چندین هفته مطالعه، چند ماه تهیه ابزارها و یکی دو هفته هم سوار کردن قطعات روی هم) و خب فازهای نرمافزاری – که به نظر خودم جذابترین قسمتهای این کار هستند – هنوز باقی ماندند. نخستین فاز اینه که کد پایتونی نوشته بشه که بتونه تصویر رو از Droid Cam بخونه و به ما نمایش بده.
علاوه بر اون، نیازمند فرایندی برای تصویربرداری از محیط هستیم. پس از انجام این دو مورد، نیاز داریم که یک سیستم هوش مصنوعی آموزش بدیم که درست و حسابی مسیر رو تشخیص بده. بعدش کافیه سیستم هوش مصنوعیمون رو طوری تغییر بدیم که به صورت کاملا خودکار به ESP وصل شه و درخواستهاش رو به اون بفرسته و خودروی ما رو به حرکت دربیاره!
از این که وقت گذاشتید و این مطلب رو خوندید، ازتون متشکرم. برای کسب اطلاعات بیشتر و جزییات جذابتر، لطفا منتظر قسمت دوم این مطلب باشید.
چندی پیش، در مورد پیشنیازهای یادگیری بینایی ماشین در همین وبلاگ نوشته بودم (لینک) و بعد از اون هم در مطلبی در ویرگول، در مورد این که چرا موجودیتی به اسم «جامعه بینایی ماشین» رو راه انداختم (لینک) صحبت کردم. پس از انجام چندین پروژه و تولید چندین محتوا پیرامون این موضوع، امروز در این پست قراره که ایده هایی که شما میتونید در پروژه های بینایی ماشین و پردازش تصویر خودتون به کار بگیرید رو بررسی کنیم.
توجه داشته باشید که در این پست، فرض رو بر این گذاشتیم که شما با هوش مصنوعی، پایتون، بینایی ماشین و … آشنایی لازم و کافی رو دارید و حالا قصد دارید یک پروژه جدی باهاش انجام بدید اما نمیدونید باید چی کار کنید. اگر آشنایی ندارید هم مشکلی نیست، میتونید این مطلب رو صرفا برای ایجاد علاقه و یا رفع کنجکاوی بخونید 😁
ایده های مرتبط با تشخیص چهره
تشخیص چهره، همیشه یکی از پرطرفدارترین شاخههای پردازش تصویر و بینایی ماشین بوده است. چرا که با استفاده از تشخیص چهره، میتوانیم عملیات جالبی انجام دهیم و پروسههای زیادی از یک کار بزرگتر را، خودکار کنیم. همچنین میتوانیم امنیت خانه و محل کار و … را نیز با استفاده از تشخیص چهره تامین کنیم.
در لیست زیر، تعدادی از پروژههای مرتبط با تشخیص چهره رو برای شما فهرست کردهام:
حضور و غیاب مبتنی بر چهره
دوربین امنیتی (به این شکل که وقتی شخص ناشناسی وارد حریم دوربین شد از طریق ایمیل یا SMS و … به شما اطلاع بده)
قفل هوشمند ( به شکلی که اگر شما رو دید در رو باز کنه و در غیر این صورت، یک سیستم مانند دزدگیر یا سیستم امنیت خونه رو راهاندازی کنه)
تشخیص حالت و احساسات چهره
تشخیص خوابآلودگی (مثلا در یک کلاس این پروژه میتونه کاربردی باشه).
همه ایدههای بالا، به سادگی قابل انجام هستند. فقط کافیه که کار با کتابخانهها و تئوری پردازش تصویر رو بلد باشید. شاید دو سه روزه بتونید یکی از این پروژهها رو به ثمر برسونید 😁
ایده های مرتبط با تشخیص کرکتر
تشخیص نوری نویسه یا Optical Character Recognition که به اختصار به اون OCR هم گفته میشه، یکی از شاخههای پرطرفدار دیگر در حوزه بینایی ماشین میتونه به حساب بیاد. پروژههایی که در این حوزه انجام میشن به شدت کاربردی هستند و طبیعیه که در حوزههای مختلفی کاربرد خواهند داشت. در اینجا تعدادی از ایدههایی که میتونید روش کار کنید رو اینجا فهرست کردم:
تشخیص و استخراج شماره پلاک (که پیشتر در موردش نوشتم – لینک)
تشخیص و حل مسائل ریاضی/فیزیک (که این هم پیشتر در مورد نوشتم – لینک)
تشخیص دستخط فارسی
تشخیص خط نستعلیق (و در کل خوشنویسی) فارسی
تشخیص نسخه پزشکی (نکته جالب اینه که در نسخ پزشکی، بسیاری از خطخطیهایی که میبینید در واقع روش مصرف و دوزاژ دارو هستند، که طبق کدگذاری خاصی نوشته میشن).
البته باید این نکته رو هم عرض کنم خدمتتون که دنیای OCR خیلی گستردهست. تقریبا هرجایی که شما با نوشتن سر و کار داشته باشید، میتونید از OCR هم اونجا استفاده کنید. خیلی چیزا اینجا به خلاقیت و نیازهای خودتون برمیگرده. اگر ایده دیگری داشتید، میتونید در بخش نظرات همین مطلب با من به اشتراک بذارید.
ایده های مرتبط با پزشکی
هوش مصنوعی در علم پزشکی، جایگاه خاصی در سالهای اخیر داشته. چرا که همه دانشمندان کامپیوتر و همچنین پزشکی، دریافتند که با استفاده از راهحلهای هوشمند، میتونند به حد قابل توجهی، خطاهای پزشکی رو کاهش بدند. همچنین تحقیقات دارو و واکسن هم به شدت سریعتر میتونن انجام بدند. برای مثال، همین دنیاگیری ویروس کرونا که در سال ۲۰۱۹ آغاز شد و کماکان ادامه داره رو بررسی کنیم، بارها از این که از هوش مصنوعی برای پیدا کردن ترکیبات دارویی موثر بر ویروس استفاده شده، صحبت کردند. همچنین در پروسه ساخت واکسن هم بسیاری از مراحل رو به ماشین سپردند و به هوش ماشینی اعتماد کردند. شاید یکی از دلایلی که واکسن این بیماری انقدر سریع ساخته شد، استفاده از همین راهکارهای هوشمند در تولید بوده.
بینایی ماشین هم استثناء نیست و طبیعتا میتونه خیلی به کمک افراد بیاد. در این بخش، تعداد زیادی از ایدههایی که میتونه به پزشکها در شناخت بهتر مشکلات بیمارهاشون کمک کنه رو فهرست کردم و خب بد نیست اگر شما هم سراغش برید و سعی کنید یکیش رو پیاده کنید (این بخش میتونه برای دانشجویان مهندسی پزشکی و پزشکی؛ بسیار مفید باشه)
تشخیص نوع تومور مغزی (تصویر این بخش، پروژهای که خودم انجام دادم)
تشخیص رتینوپاتی دیابتی در اشخاص مبتلا به دیابت
تشخیص MS و مراحل مختلف اون بر اساس MRI
تشخیص سلولهای سرطانی
تشخیص میزان درگیری ریه در بیماریهای تنفسی (مانند COVID-19)
تشخیص ناهنجاریهای پوستی
تشخیص آسیبهای استخوان
تشخیص آسیبدیدگیها و پوسیدگیهای دندان
طبیعتا اینها، همه کارهایی که میتونیم در حوزه پزشکی با کمک بینایی ماشین و پردازش تصویر انجام بدیم نیستن و این دامنه میتونه به شدت گستردهتر باشه. طبیعیه که گستردگی این دامنه به خلاقیت خودتون و نیازهاتون برمیگرده. همچنین طبیعتا اگر شما دانشجوی مهندسی پزشکی یا رشته پزشکی و رشتههای مرتبط باشید، احتمالا ایدههای بهتری خواهید داشت.
سایر حوزهها
چندین و چند حوزه دیگر هست که خب مثل باقی حوزههای پوشش داده شده در این مطلب، نمیشه ایدههای پروژههای بینایی ماشین و پردازش تصویرشون رو فهرست کرد. به همین خاطر، توضیح اجمالی راجع به هر کدوم میدم تا شما ببینید که کدوم حوزه رو بیشتر دوست خواهید داشت و در کدوم حوزه ممکنه بتونید ایدهپردازی بهتری داشته باشید.
تشخیص حرکت یا Action Detection
این حوزه به طور خاص، میتونه برای کارهایی مثل تشخیص و ترجمه همزمان زبان اشاره (لینک)، تشخیص حرکات ورزشی و یا تشخیص «نیت» افراد بشه. برای مثال، میتونیم سیستمی بسازیم که حرکات بعدی فرد در یک نبرد تن به تن (مثل مسابقه بوکس) رو پیشبینی کنه و به مربیها و نوآموزهای اون رشته اطلاع بده.
خودروهای خودران
خودروهای خودران یا Self-Driving که پیشتر هم ازشون در همین وبلاگ صحبت کرده بودم (لینک) میتونن با استفاده از بینایی ماشین و پردازش تصویر، تابلوهای راهنمایی، رفتار سایر رانندگان، موانع در مسیر و … رو تشخیص بدند. این حوزه البته پیچیدگی زیادی داره اما کار کردن روی بخشهای مختلفش میتونه برای یادگیری جوانب مختلف ماجرا جذاب و جالب و مفید باشه.
مصرف انرژی
حوزه انرژی هم حوزه جالبی میتونه برای پروژههای بینایی ماشین باشه. برای مثال OCR ای که بتونه دیتای کنتور گاز/برق رو به متن تبدیل کنه و اون رو با یک مرکز محاسبه قیمت، چک کنه و قیمت رو به ما اعلام کنه. همچنین میشه عکسهای حرارتی از خانهها و … تهیه کرد و با استفاده از بینایی ماشین دقیقا بررسی کرد که کجاها انرژی بیشتری داره از دست میره و … .
این پروژهها به خودی خود شاید جالب به نظر نرسن اما ترکیبشون با IoT و هوشمندسازی در سطوح دیگر، طبیعتا میتونه جذاب و حتی پولساز هم باشه.
کشاورزی
این هم گفتن نداره، شما کافیه که یک سری عکس هوایی از زمینهای کشاورزی داشته باشید. احتمالا خیلی راحت بتونید سیستمی توسعه بدید که آفات رو شناسایی کنه. همینطور میتونید نوع خاک و … هم از روی این عکسها طبقهبندی کنید و پیشنهاد بدید که چه محصولی در این زمین کشت بشه بهتره. در حوزه مصرف انرژی هم میتونید یکی از پروژهها رو بردارید بیارید اینجا و ازش بهرهبرداری کنید. چی از این بهتر؟
ضمن این که امنیت زمین کشاورزی و گلخانه، بررسی نور و رنگ و … هم میتونن اینجا کاربردی باشند.
جمعبندی مطلب
در این مطلب، ایدههایی که میتونید بعنوان یک پروژه تفریحی یا جدی پیادهسازی کنید رو بررسی کردیم. همچنین این ایدهها، به جز این که میتونن رزومه خوبی برای شما بسازند طبیعتا میتونن پایه یک کسب و کار و یا یک استارتاپ باشند که شانس خوبی برای به پول رسیدن داره. به همین خاطر هم ممنون میشم اگر هر کدوم از این ایدهها رو پیادهسازی کردید در بخش کامنت همین مطلب در موردش بنویسید و به من اطلاع بدید تا ببینم چه کردید.
همچنین لازم به ذکره که اگر دوست دارید مطالب فنی/علمی دیگری از من بخونید، میتونید به ویرگول من هم مراجعه کنید. در پایان هم بابت وقتی که گذاشتید، ازتون تشکر میکنم و امیدوارم در آینده باز هم بتونم در این وبلاگ، مطلب بنویسم.
مدتها پیش، من شروع به نوشتن پیرامون بینایی ماشین و پردازش تصویر کردم (برای مثال، یکی از نتایجی که از این موضوع گرفتم راهاندازی جامعه بینایی ماشین بود) و کم کم تلاشم بر این شد که هوش مصنوعی و یادگیری عمیق و یادگیری ماشین و … هم وارد ماجرا کنم چرا که دونستن OpenCV و به طور کلی بینایی ماشین، چیز خاصی نیست و دانش خاصی به ما اضافه نمیکنه. البته اشتباه نکنید، این که شما یک ابزار خوب مثل OpenCV و کار باهاش رو بلد باشید، خیلی هم خوبه اما کافی نیست.
خلاصه پس از مدتی، شروع کردم به مطالعه الگوریتمهای مختلفی که برای تشخیص اشیا و یا مکانیابی اشیا نوشته شده بودند، اونها رو مطالعه کردم و یکی یکی این ابزارها رو سعی کردم امتحان کنم تا ببینم هرکدوم چطور دارند کار میکنند و … . در این میان با YOLO و مفهومی که داشت، آشنا شدم ولی مشکلاتی سر راه بود که در همین مطلب بهشون اشاره میشه. اما نسخه ۵ یولو، یه جورایی شد رفیق راهم (که خب توضیح دادم چرا دوستش دارم) و در بسیاری از پروژهها مثل حل مسائل ریاضی و همچنین تحلیل مدارات الکتریکی، کمک بسزایی به پیشبرد پروژه کرد.
حالا اگر نوبتی هم باشه، نوبت یک پروژه جدید و باحال دیگره که با YOLOv5 انجام بشه. در اینجا لازمه اشاره کنم که مدلهای هوش مصنوعی صرفا ابزار هستند و گاهی ما ممکنه اصلا نیازی به هوش مصنوعی برای حل مساله نداشته باشیم. مورد بعدی این که ما از ابزار چطور، کجا و چگونه استفاده کنیم خودش امر مهمیه و عموم مقالات مهندسی، پایاننامههای رشتههای مهندسی و …؛ همه در این تلاش هستند که یا این ابزارها را بهینه کنند یا این که روش مناسبی برای استفاده از این ابزارها پیدا کنند.
پروژهای که این بار انجام دادم چه بود؟ این پروژه این بار سامانه تشخیص پلاک خودرو با کمک YOLOv5 است که در نگاه اول، به نظر چیز سادهای میرسه اما در عمل خیلی ساده نیست و در حین پیادهسازی، نیاز داشتم که سادهترش کنم. اما بذارید ایده کلی رو با هم بررسی کنیم. ایده کلی ما این بود که سیستمی داشته باشیم که حضور و غیاب به کمک پلاک خودرو را ممکن کند. حالا این مورد کجاها میتونه استفاده بشه؟ خیلی جاها. پارکینگهای عمومی، جاهایی که خودروها تا ثبت نشده باشند نمیتونن وارد باشن، پلیس راهنمایی و رانندگی و … .
در این پست، با هم به تفصیل به بررسی این پروژه میپردازیم و میبینیم که این پروژه بینایی ماشین چطور انجام شده. سعی کردم که مطلب تا حد خوبی فرمتی مشابه تحقیقات و پایاننامههای دانشگاهی هم داشته باشه تا دوستانی که نیازمند نوشتن چنین مطلبی هستند هم بدون تغییرات زیاد بتونن از مطالب این پست خاص استفاده کنند.
طرح کلی مساله
مساله کلی ما در اینجا اینه که نرمافزاری توسعه بدیم که بتونه نوشته روی پلاک خودروهای ما رو بخونه و اون رو با محتوایی که در یک دیتابیس خاص داریم، تطابق بده. در اینجا ما میتونیم سناریویی فرضی داشته باشیم به این شکل که «فرض کنیم یک پارکینگ داریم که خودروها باید قبل از حضور، پلاکشون رو ثبت کنند و موقع ورود، پلاک خوانده میشه و چنانچه مطابقتی بیش از ۷۰٪ با حداقل یکی از پلاکهای درون دیتابیس پارکینگ داشت؛ مجوز ورود صادر خواهد شد». این سناریوی فرضی به ما کمک میکنه که در ادامه، بهتر پیادهسازی رو انجام بدیم.
پس مشخصا ما نیاز به سیستمی داریم که بتونه تصویر از پلاک دریافت کنه، محتوای متنی تصویر رو استخراج کنه و اون رو با متونی که پیشتر در یک دیتابیس ذخیره کردیم تطابق بده و خروجی مورد نظر ما (مجوز ورود) رو صادر کنه. برای این که بتونیم فرایندی که میخواهیم رو سادهتر کنیم، در اینجا چند مورد لحاظ شده:
محتوای متنی پلاک فقط محدود به اعدادیه که درون پلاک داریم.
برای سادگی بیشتر پروژه، بخش سختافزاری سیستم در نظر گرفته نشده.
برای سادگی باز هم بیشتر، از قسمت دیتابیس و تطابق چشمپوشی کردیم.
در واقع، پیادهسازی پیش روی شما صرفا پیادهسازی از نویسهخوان نوری (OCR) و در حقیقت قسمت مرتبط با بینایی ماشین و YOLOv5 در این پروژه بوده که خود همان هم، بخش زیادی از این پروژه رو شامل میشد.
کارهای پیش تر انجام شده
در این بخش، کارهایی که پیشتر در این زمینه انجام شدند رو با هم بررسی میکنیم. چرا که در بخش انتخاب ابزار احتمالا نیاز به این داشته باشیم که به این قسمت برگردیم و مواردی رو بررسی کنیم. به هرحال در طی جستجوهای انجام شده توسط شخص من، دو پروژه خیلی نظرم رو جلب کردند که در ادامه به معرفی اونها میپردازم.
پلاک خوان دیوار
وبسایت یا اپلیکیشن دیوار برای خیلی از ماها، نام آشناییه. خیلی از افراد هستند که از طریق این اپلیکیشن اقدام به خرید و فروش خودرو هم میکنند و برای تامین امنیت صاحبان خودرو در این پلتفرم، اقدام به طراحی و تولید مدل مشابهی کردند که بهشون کمک کنه تا بتونند پلاکها رو با قالب مناسب وبسایت دیوار، جایگزین کنند تا همه قادر به دیدن پلاک خودروها نباشند. دوستانی که در این پروژه در دیوار همکاری داشتند خوشبختانه مراحل کارشون رو خیلی دقیق و جالب در این پست ویرگولیشون، توضیح دادند و به نظرم بد نیست که همینجا توقف کوچکی کنید و پست این دوستان رو مطالعه کنید؛ سپس برگردید و ادامه این پست رو بخونید.
مراحل اولیه پروژه مورد بحث در همین پست – تلاش برای بازسازی پلاکخوان دیوار
پروژه تشخیص پلاک با پایتون (با استفاده از OpenCV و KNN)
این یکی پروژه هم یکی از پروژههای خوبی در زمینه بینایی ماشین و تشخیص پلاکه که یکی از کاربران آپارات، با پیروی از یک شخص خارجی – که در یوتوب کار مشابهی انجام داده – پیادهسازیش کرده. یک ویدئوی دو ساعت و نیمه که به نظرم ارزش دیدن و فکر کردن داره.
در بخش بعدی، اشاره خواهم کرد که چرا این روش رو اتخاذ نکردم و ترجیح دادم که از YOLOv5 استفاده کنم. برای دیدن این ویدئو، میتونید از این لینک استفاده کنید.
انتخاب ابزار و تکنولوژی
در این بخش، به تفصیل قراره تمامی ابزارهایی که پیش روی ما بود رو بررسی کنیم. در واقع این یکی از روتینهای تحقیقات علمیه که قبل از توضیح کامل ابزاری که استفاده کردیم، توضیح بدیم چرا از یک سری از ابزارها، استفاده نکردیم. این مورد به افرادی که بعد از ما قراره روی اون موضوع کار کنند کمک میکنه تا اول سراغ ابزارهایی که قدیمی شدند یا به هر دلیلی «به درد نخور» هستند نرن و دوم اگر قرار باشه ابزار متفاوتی از ما رو انتخاب کنند، بتونن یکی از همینها رو بررسی کنند (حالا ممکنه اصلا کل بررسی سر به درد نخور بودن ابزار باشه!).
استفاده از Tesseract
تسرکت یکی از نرمافزارهای آزاد مشهور در زمینه OCR محسوب میشه که امتیازات ویژه خودش رو هم داره. برای مثال شاید بشه گفت بزرگترین امتیازش اینه که بدون مشکل روی همه سیستمعاملهای مرسوم دنیا نصب و اجرا میشه و مهم نیست شما مک داشته باشید یا ویندوز یا گنو/لینوکس؛ به سادگی میتونید اجراش کنید و ازش استفاده کنید. مورد بعدی که باعث میشه افراد به سمت تسرکت برن هم اینه که کتابخونهای برای استفاده مستقیم در پایتون داره و این خودش یک امتیاز بزرگه که نرمافزاری که به صورت stand-alone اجرا میشه رو بشه با یک wrapper ساده وارد زبان برنامهنویسی مورد علاقمون کنیم.
در عین حال تسرکت مدعیه که زبانهای مختلفی – من جمله فارسی – رو پشتیبانی میکنه و اینجا میخوایم دلیل عدم استفاده از این ابزار رو دقیقا در همینجا پیدا کنیم. تسرکت، نیاز داره که با فونتهای مختلف آموزش داده بشه و پیدا کردن فونتی مشابه فونتهای مورد استفاده در پلاک خودروهای ایران، کاری تقریبا ناممکنه. البته بعضی از تایپفیسها مثل تایپفیس فونت رویا تقریبا به فونت مورد استفاده در پلاک خودروهای ایران نزدیکه و شاید بشه باهاش کاری کرد. اما این بحث آموزش تسرکت و نتیجه نگرفتن احتمالی باعث خط خوردن تسرکت از لیست شد.
استفاده از KNN
خود کتابخانه OpenCV تابعی برای آموزش یک طبقهبند KNN یا K-Nearest Neighbor ارائه میکنه که در ویدئویی که در بخش قبل لینک دادیم هم استفاده شده. این مورد هم مشکلات خاص خودش رو داشت و از لیست حذف شد. یکی از واضحترین دلایل این بود که ممکن بود این روش خاص، در اعداد شبیه به هم کمی مشکل ایجاد کنه. در کل، علیرغم این که الگوریتم K نزدیکترین همسایه، الگوریتم مورد اطمینانی در یادگیری ماشین کلاسیک محسوب میشه، ریسک خطای مدل نهایی رو هم میتونه بالا ببره.
استفاده از EasyOCR
کتابخانه EasyOCR یکی از محبوبترین کتابخانهها در میان مهندسین بینایی ماشین در دنیاست. یکی از دلایلش اینه که با سرعت خوبی (بخصوص با داشتن GPU) میتونه متون رو تشخیص بده و از همه مهمتر، دور متون مورد نظر ما Bounding Box قرار بده. این کتابخانه هم زبانهای زیادی مثل انگلیسی، آلمانی، نروژی و … رو پشتیبانی میکنه اما نقطه قوتش نسبت به Tesseract اینجاست که در زبانهای فارسی و عربی هم بدون نیاز به استفاده از فونت و …؛ میتونه تشخیص خوبی بده.
با این وجود، مدلی که EasyOCR ازش استفاده میکنه هنوز به خوبی برای زبان فارسی fine-tune نشده و پروژه حال حاضر رو نمیتونه به سرانجام برسونه. به همین دلیل، این ابزار هم از لیست ابزارهای مورد استفاده در پروژه ما، خط میخوره. البته این هم باید اشاره کرد که EasyOCR نرمافزاری آزاده که میشه بهش کمک کرد و بهبودش بخشید (روشش رو اینجا میتونید پیدا کنید).
استفاده از سیستمها و سرویسهای OCR ایرانی
در سالهای اخیر، با توجه به این که افراد زیادی به خوندن کتابها و جزوههای الکترونیکی و اسکنشده روی آوردن، خیلی از شرکتها و گروههای فعال در زمینه متنکاوی و … هم بیکار نبودند و سیستمهای OCR خوبی توسعه دادند که به صورت خاص، برای زبان فارسی کار میکنند.
اما دو مشکل بزرگ اینجا داشتیم. اولین مشکل این که اکثر این سرویسها آنلاین هستند و خیلی از کاربران نهایی این پروژه (مثل یک سازمان دولتی) احتمالا حاضر به این نمیشه که دادههای خودروهاش و کارمندانش رو به یک سرور شخص ثالث ارسال کنه. مشکل دوم هم این بود که اکثر نسخههای آفلاین گرونقیمت هستند. البته شاید بشه مشکل سومی هم اینجا لحاظ کرد و اون اینه که خیلیهاشون امکان این که در یک کد پایتونی بشه ازشون استفاده کرد هم فراهم نمیکنند. پس این گزینه هم کاملا از لیست ما خط خورد.
توسعه CNN اختصاصی
این روش همیشه برای من نقش پلن ب رو داره که اگر مدلی مثل YOLOv5 برای نیازم پاسخگو نبود، سراغش بیام. اما چرا در این پروژه سراغش نرفتم؟ چون که توسعه برای OCR میتونست به شدت زمان، هزینه و انرژی مصرف کنه و حقیقتا چون این پروژه قرار نبود پروژه پولساز باشه یا برای هدفی مثل پایاننامه و … انجام بشه، ارزش این که شبکه عصبی اختصاصی براش توسعه بدیم رو نداشت.
استفاده از YOLOv5
در نهایت، لازم بود که از مدلی مثل YOLOv5 استفاده بشه برای این که بتونیم OCR مخصوص پلاک رو توسعه بدیم. چرا YOLOv5 و چرا سایر نسخههای یولو نه؟ پیشتر این مورد رو به تفصیل توضیح دادم اما توضیح کوتاه ماجرا میشه سهلالوصول بودن نتیجه transfer learning و fine-tuning این مدل خاص. این مدل، یعنی YOLOv5 به سادگی میتونه روی سیستم شخصی من (مکبوک پرو آخر ۲۰۱۹ با سیستم عامل مک) و روی گوگل کولب اجرا بشه. همچنین انتقالش به سایر سیستمها هم راحت انجام میشه و از این نظر، خیالم میتونست راحت باشه.
گذشته از بحث سختافزار و پلتفرم، YOLOv5 به شدت سریع و با دقته، و این مورد میتونه خودش یک امتیاز مثبت بزرگ برای استفاده از این مدل خاص در کاری مثل پروژه خواندن پلاک با YOLOv5 باشه!
جمعآوری و پیشپردازش داده مورد نیاز
بعد از این که ابزارها و تکنولوژیهای مورد نیازمون رو پیدا کردیم، لازم بود تا دادههای مورد نیاز پروژه هم پیدا کنیم. اولین و سادهترین راه (مطابق این مطلب) این بود که خودمون دست به کار شیم و از پلاک خودروها، عکاسی کنیم. اما این قضیه میتونه دردسرساز بشه چرا که خیلیها خوششان نمیاد که کسی از ماشینشون عکاسی کنه. به همین دلیل، در اینترنت جستجو کردم و به دیتاست مورد استفاده در این مطلب رسیدم. در این دیتاست ۳۱۷ عکس از پلاک خودروهای ایران وجود داره که این خودش عالیه! یک حجم خوب از پلاک خودرو که میدونیم دردسری هم برای ما ایجاد نمیکنه.
پس از این که دادههای مورد نظر خریداری و دانلود شد، نوبت به لیبل زدن بود. لیبلهای ما اعداد ۰ تا ۹ بودند و گذشته از اون، برای این که داده تستی کافی داشته باشیم و مراحل پیادهسازی سریعتر پیش بره، فقط ۷۵ تا عکس رو با کمک labelImg لیبل کردیم.
پیادهسازی پروژه
پس از این که ایده کلی، ابزار و داده برچسبزدهشده رو داشتیم، نوبتی هم باشه نوبت آموزش دادن YOLOv5 برای اینه که کار ما رو به درستی انجام بده. حقیقتا، YOLOv5 و ابزارهای مشابه، خودشون یک دور آموزش دیدند و ما فقط به قولی اونها رو fine-tune میکنیم که کاری که ما بخواهیم رو انجام بدن (در نظر بگیرید که ما در دوران ابتدایی و راهنمایی خیلی چیزا رو یاد گرفتیم، در دبیرستان رفتیم سراغ ریاضی و تجربی و اختصاصی اونها رو یاد گرفتیم و بعد در دانشگاه مثلا مهندسی خوندیم که یک فرم خاصتر از ریاضیه. دقیقا مشابه همین فرایند اینجا برای آموزش YOLOv5 هم داره صورت میگیره) و الان فقط کافیه که دیتا و کدهای مورد نیازمون رو در یک سیستم مناسب پروژههای هوش مصنوعی بارگذاری کنیم و سپس مراحل آموزش رو طی کنیم.
دادههای ما روی Google Colab آپلود شدند چرا که آموزش YOLOv5 نیازمند داشتن GPU است. بعد از اون، آموزش به این صورت شکل گرفت که هفتصد و پنجاه epoch (یا نسل) طول کشید، سایز batch ما ۳۲ بود، اندازه تصویر به ۴۱۶ د ۴۱۶ پیکسل تغییر کرد (اسکریپتی که برای آموزش YOLOv5 توسط تیم Ultralytics ارائه شده خودش امکان تغییر سایز رو فراهم کرده) و مدل پایه مورد استفاده yolov5m بود که با ۲۱.۲ میلیون پارامتر آموزش داده شده. پس از حدود ۳ ساعت و ۴۰ دقیقه، مدل ما آماده بود و نیاز داشتیم که تستش کنیم.
نتایج آزمایش
نتیجه آزمایش روی دیتاست آموزش
همین عکس که در ابتدای مطلب هم ازش استفاده شده، عکسیه که در دیتاست آموزشی موجود بود و درستی کار مدل رو تایید میکرد. جدول زیر هم میزان دقت رو به درستی به ما نشون میده:
نتیجه آزمایش روی دیتاست آزمایشی
در جدول زیر هم به صورت مرتب شده میتونیم میزان دقت این مدل رو هم ببینیم. همچنین با یک تابع ساده، پلاک رو به شکل درستش (مبتنی بر ستون xmin) مرتب کردیم تا با پلاک اصلی تطبیق بدیم:
جمعبندی و نتیجهگیری
در اینجا لازمه که پروسههایی که طی شده رو یک بار دیگه بررسی کنیم تا به یک جمعبندی روی پروژه برسیم:
ابتدا تصمیم گرفتیم سیستمی طراحی کنیم که حضور و غیاب یا رفت و آمد رو بتونه مبتنی بر پلاک خودروهای حاضر در یک محل خاص، بررسی کنه.
سپس تصمیم اولیه رو با حذف پروسه دیزاین سختافزاری و همچنین حذف حروف مورد استفاده در پلاک سادهسازی کردیم.
پس از سادهسازی، ابزارهای متنوعی رو مطالعه کردیم و سپس YOLOv5 رو به عنوان ابزار اصلی خودمون انتخاب کردیم.
دیتاستی رو تهیه کردیم و برچسب زدیم.
مدل YOLOv5 رو مطابق نیاز و با دادههای خودمون آموزش دادیم.
در کل، این پروسه گرچه پروسه نسبتا وقتگیر و سختی بود، اما نتیجه به دست آمده واقعا راضیکننده و خوبه. در حال حاضر پروژه ما در حالی قرار داره که میتونه به سادگی با ارتباط با یک سیستم سختافزاری، کاری که براش در نظر گرفته شده رو انجام بده. البته هنوز ضعفهایی متوجه این پروژه هست که در بخش بعدی در موردشون بحث خواهیم کرد.
کارهای آینده
در این قسمت، کارهایی که در آینده میشه برای این پروژه انجام داد رو با هم یک بررسی اجمالی میکنیم:
توسعه سیستم برای خواندن حروف وسط پلاک (چالشهای خاصی در این زمینه وجود داره، مثلا حرف ژ در پلاک خودرو معمولا به شکل ویلچر چاپ میشه)
توسعه سیستم برای خواندن پلاکهای غیرشخصی (پلاکهای عمومی و تاکسی عموما زرد، پلاک وزارت دفاع آبی، پلاک سپاه و نیروی انتظامی سبز پررنگ، ارتش سبز خاکی، دیپلماتیک آبی آسمانی و پلاک خودروهای دولتی قرمز هستند)
توسعه سیستم برای تشخیص و خواندن پلاکهای منطقه آزاد
توسعه سیستم برای تشخیص و خواندن پلاکهای گذر موقت
توسعه سیستم سختافزاری و قرار دادن مدلهای هوش مصنوعی در سختافزار مناسب
مجوز نشر
این پست وبلاگ، تحت پروانه مستندات آزاد گنو یا GNU Free Document License منتشر شده و بازنشر و استفاده از محتویاتش کاملا آزاده. فقط توجه لازم داشته باشید که دیتاستی که برای آموزش استفاده شده آزاد نیست و این آزادی در استفاده شامل بخشهایی از این مطلب میشه که مسولیتش با منه (به طور کلی هرچی که شما در این پست خوندید)
سخن آخر
این پست برخلاف پستهای دیگر این وبلاگ به شدت طولانی شد و از بابت این که وقت زیادی برای خوندنش گذاشتید، واقعا از شما متشکرم. در پایان جا داره از شما دعوت کنم که به ویرگول من هم سر بزنید تا اونجا موارد فنی و تجربیات دیگر من رو بخونید. همچنین، اگر این مطلب برای شما مفید بود کافیه که روی تصویر زیر کلیک کنید و من رو به یک فنجان قهوه به انتخاب خودتون مهمان کنید 🙂
دقیقا دو هفته پیش، در نسخه انگلیسی وبلاگ در مورد YOLOv5 نوشتم (لینک) و توضیح دادم که چرا این مدل هوش مصنوعی برای تشخیص اشیاء رو دوست دارم (و حتی چرا شما باید دوستش داشته باشید) و خب طبیعتا دوست داشتم یک پروژه خیلی خیلی ساده و در عین حال باحال هم با این مدل انجام بدم.
ایدههای زیادی در سر داشتم. برای مثال ایده بازی Red Light – Green Light که در سریال اسکوییدگیم همه دیدیم. اما این ایده علیرغم خوب بودنش، آنچنان کاربردی نبود. پس تصمیم من برآن شد که یک نرمافزار دیگر توسعه بدم. نرمافزاری که هم چالش داشته باشه، هم در نهایت یک کاربرد درست ازش بشه درآورد.
نمیدونم شما یادتونه یا نه، اما نرمافزار سیمبولب، دروانی خیلی خاص و معروف شد. به همین خاطر، تصمیم من هم این شد که سیمبولب رو دوباره بسازم و بعد از این که نتایج مورد نظرم رو گرفتم در موردش وبلاگ بنویسم. پس این شما و این ماجرایی که من داشتم تا این نرمافزار رو بسازم.
گام اول: طرح مساله
در هر پروژهای، اولین گام اینه که مطرح کنیم چه مشکلی رو باید حل کنیم. یا به قول دنیل کوهن Look for the pain. خب دردی که ما اینجا به دنبال حل کردنش بودیم، چی بود؟ این که بسیاری از دانشآموزا و دانشجوها سر ریاضی عمومی یا Calculus مشکل دارند. این مشکل ریشهش کجاست؟ برای من شخصا مهم نیست که این ریشه رو بررسی کنم (البته به معنای این نیست که نظری در موردش ندارم، اما از حوصله این مطلب خارجه).
حالا درد این که بسیاری از دانشجوها و دانشآموزها مشکل دارند، چطور میشه براشون یک مسکن خوب تجویز کرد؟ بعنوان یک مهندس هوش مصنوعی، یا بهتر بگم مهندس بینایی ماشین در ذهنم این ایده چرخید و اون این بود که:
یک نرمافزار هوش مصنوعی وجود داشته باشه که از روی عکس مساله، پاسخ نهایی یا راهحل رو به افراد بده.
و این پروژه، در نظر پروژه بسیار بسیار بزرگی بود اما در نهایت، پروژه سادهای شد. در ادامه، در راهی که طی شد توضیح خواهم داد.
گام دوم: انتخاب ابزار
گام دوم برای من، انتخاب ابزار بود. اول از همه میخواستم برم سراغ OCR های آماده برای تشخیص مسائل پارامتری مثل x و y و … . اما بعد دیدم که اینجا علاوه بر حروف و اعداد، نشانهها هم هستند. ضمن این که به شکلی باید توان و … هم تشخیص داد. پس کمی پروژه رو نگه داشتم تا به ابزارها فکر کنم.
بعد از مدتی تحقیق و تفحص، به دارکنت رسیدم که برای ترین کردن YOLOv3 و YOLOv4 استفاده میشه و خب دارکنت مشکلات زیادی هم با خودش به همراه داره. برای مثال کاملا در سیپلاسپلاس نوشته شده و روی سیستمهای مختلف باید از نو کامپایل بشه. با CPU درست کار نمیکنه. کامپایل کردنش روی مک یا ویندوز دردسره و انتقال دادنش به Google Colab هم میتونه تا حد زیادی مشکلساز بشه.
بعد از اون الگوریتم YOLOv5 رو کشف کردم. تقریبا همه مراحل کاملا پایتونی پیش میرفت و این عالی بود. کم کم دیدم که میشه بعد از ترین کردن قضیه، از pytorch هم استفاده کرد و اشیاء رو تشخیص داد و از اون بهتر این بود که در تشخیص اشیاء، میشد خروجی pandas هم گرفت که مختصات شیء مورد نظر به همراه لیبلش در اون data frame خاص موجود بودند. پس به این شکل تشخیص این که ما با چه چیزی روبرو هستیم هم سادهتر از گذشته میشد.
وقتی این ابزار رو با چند چیز مختلف تست کردم، نوبت این رسید که در این پروژه حتما ازش استفاده کنم. اما این تمام ماجرا نیست. دقیقا وقتی که سمت OCR ماجرا هندل میشد، یک بحث خیلی مهم میموند. بحث این که چطوری باید مساله حل بشه؟ برای حل مساله هم از Wolfram Alpha گفتم کمک میگیرم.
خب حالا نوبتی هم باشه، نوبت اینه که دادههای مورد نیاز رو جمع کنیم. قبلتر در مورد راههایی که شما میتونید برای جمعآوری داده استفاده کنید، صحبت کردم و میتونید از اینجا بخونیدش.
نمونه دادههای استفاده شده در این پروژه
گام سوم: جمعآوری داده
برای جمعآوری دادهها، نیازمند این بودم که روی چند سطح مختلف (وایتبرد، کاغذ A4 و همچنین کاغذ خطدار) و با چند دستخط مختلف، مسائل ریاضی رو بنویسم. بعد از نوشتن مسائل ریاضی، از دوستانم خواهش کردم که روی صفحات مختلف و همچنین وایتبرد، مسائل ریاضی رو بنویسند.
بعد از این که مسائل ریاضی رو روی این سطوح و با دستخطهای مختلف داشتم، نوبت عکاسی ازشون بود. از هر بار نوشتن، چندین عکس از چند زاویه گرفتم. چرا که زوایای مختلف باعث میشن توزیع نور هم در تصاویر یکسان نباشه و این خودش یک مرحله data augmentation رو برای من کاهش میداد.
حالا یه حجم زیادی داده دارم، باید بعدش چی کار کنم؟ پاسخ سادهست. الان زمانیه که ما وارد مرحله پیشپردازش داده میشیم.
گام چهارم: پیشپردازش داده
بعد از این که ما دادههای مورد نیاز خودمون رو جمع کردیم، نیازمند اینیم که داده رو پیشپردازش کنیم. به طور کلی، پیشپردازش داده به پروسهای گفته میشه که در اون قراره داده ها تمیز بشن، تغییر کنند (یا به قولی data augmentation رخ بده)، برچسب زده بشن و دادههای غیرلازم (یا همون نویز) دور ریخته بشه.
اولین مرحله برای من اینجا، تکه تکه کردن عکس بود. شاید فکر کنید که برای تکه تکه کردن عکس، از ابزار خاصی استفاده کردم یا کدی زدم. باید بگم که خیر، ابزارم دقیقا ادوبی فتوشاپ و ابزار Slice بود. بعدش با قابلیت save for web آمدم و عکسهای قطعهقطعه شده رو ذخیره کردم. پس از ذخیره نهایی عکسها، نیاز بود که عکسها برچسب زده بشن.
برچسبها، در مرحله آموزش مدل، به ما کمک میکنند که اشیاء رو در تصاویر پیدا کنیم. این برچسبها در مراحل بعدتر به کمک ما میان تا بتونیم مسائل یافت شده رو به ولفرامآلفا بدیم تا برامون حلش کنه. پس لازم بود که این اتفاقات بیفته.
گام پنجم: آموزش مدل YOLOv5
و اما گام یکی مونده به آخر دقیقا این بود که مدل آموزش داده بشه. آموزش این مدل با pytorch به شدت سرراست و راحته و کلش اجرا کردن یک دستور در ترمیناله. باز با این حال، مشکلات عدیدهای داشتم. برای مثال روی لپتاپ شخصی چون GPU مناسب نداشتم، آموزش به شدت طولانی میشد. آموزش رو به Google Colab منتقل کردم و چون پلن رایگان داشتم، اونجا هم یک سری داستان جدیدتر پیش آمد. اما بهرحال هرطور که شد، مدل آموزش داده شد و نتایج خوبی هم ازش گرفتم.
در مورد آموزش مدل و نحوه کار اون به زودی محتوای آموزشی جدیدی تولید خواهد شد که به تفصیل در اون توضیح میدم چطور میتونید YOLOv5 رو خودتون آموزش بدید و باهاش کار کنید. در حال حاضر، توضیح مراحل آموزش تا حد زیادی از حوصله این پست وبلاگ خارجه.
و گام نهایی: آزمایش مدل و نوشتن رابط ولفرام آلفا
پس از این که مدل آموزش داده شد، نیاز بود چندین خط کد پایتون نوشته شه برای چند منظور. اول این که وزنهایی که لازم بود از مدل آموزشدادهشده، لود کنه. دوم این که یک عکس رو از ورودی بگیره و مراحل inference رو روش انجام بده و در نهایت، اگر کاربرخواست اون رو بفرسته به ولفرام آلفا و مرورگر رو براش باز کنه.
برای این مرحله، برخلاف باقی مراحل وقت زیادی نذاشتم ولی با این حال کدش (بدون وزنها) در گیتهاب شخصی من موجوده و میتونید نگاهی بندازید. البته که به زودی گیتهاب بروزرسانی میشه و شما قادر خواهید بود که وزنها رو هم دانلود کنید. اما فعلا وزنها در دسترس نیستند.
در نهایت هم برای این که عملکرد قضیه رو ببینید، این ویدئو کوتاه رو میتونید تماشا کنید که هم inference رو تست میکنیم هم حل مساله با ولفرام رو:
جمعبندی و مشکلات این نرمافزار
این پروژه به عنوان یک پروژه تفریحی، واقعا تفریح خوب و سالمی بود و کلی یادگیری برای من داشت. یادگیری دقیقتر و عمیقتر YOLOv5، یادگیری دقیقتر و عمیقتر PyTorch و از همه مهمتر درگیر شدن با چند مساله و به قولی، دردهای دنیای واقعی. از نتیجه کاملا راضی بودم و هستم، اما فکر نکنم در آینده این پروژه خیلی برام راضیکننده باشه.
احتمالا بعد از مدتی به این پروژه برگردم و بزرگترین مشکلش – یعنی شباهت زیاد ورودیها به هم – رو طور دیگری هندل کنم. برای این که ببینیم یه چیزی در پوزیشن توان یه چیز دیگه قرار گرفته یه چارهای بیاندیشم و … . خلاصه که راه برای بهبودش زیاده و این بهبودها رو شخصا پیگیر هستم که در این پروژه اعمال کنم. شاید هم لازم باشه داده ورودی رو افزایش داد یا حتی مدل مورد استفاده رو عوض کرد.
در نهایت، از شما بابت وقتی که برای خوندن این مطلب گذاشتید، ممنونم. امیدوارم که این مطلب مفید واقع شده باشه و به دردتون خورده باشه. ضمن این که اگر به این تیپ مسائل و مطالب علاقمند هستید، میتونید من رو در ویرگول هم دنبال کنید و اونجا هم مطالبم رو بخونید. اگرچه در ویرگول عمده مطالبم مرتبط با بیزنس، موفقیت و ایناست.
در نهایت از شما خواهش میکنم که اگر این مطلب براتون مفید بود، یک قهوه به انتخاب خودتون مهمانم کنید تا موقع نوشیدن قهوه به یادتون باشم و از این دست مطالب، بیشتر تولید کنم.
وبلاگ شخصی محمدرضا حقیری، برنامهنویس، گیک و یک شخص خوشحال